2012-07-21 9 views
16

numaralı dış değişken kullanıldı Öğretmen modelimde kategoriler dizisini döndüren bir işlev var.Yii gridview

getCaterogies() { 
    return array('1' => 'short tempered', '2' => 'funny', '3' => 'visionary', ...); 
} 

ben veritabanında dizinleri saklanması ve buna tekabül eden dizinin değerini kullanarak her yerde değerlerini gösteren ediyorum ..

$categories = $teacher->categories; 
$category = $categories[$teacher->category]; 

Birinin beni dizeleri depolamak için değil önerdi çünkü bir kez yapıyorum statüs olan bir veritabanı yerine tamsayı değerleri depolayın ve dönüştürmeyi veritabanında saklayın veya ht modelinde tanımlayın. Dizelerle ilgili problem, karşılaştırmalarda insan hatalarına daha eğilimli olmalarıdır. Belki de durum duyarlılığı nedeniyle.

Şimdi karşı karşıya olduğum sorun, gridview değerlerini görüntülerken, 2 satırını bir değer alanına yazmam gerekiyor, ancak bu bir ifadedir ve dış değişkenler de almaz.

Bunu gridview için nasıl çalıştırabilirim?

cevap

45

Sen $row, $data params alabilir değeri olarak anonim işlevini kullanabilirsiniz satır numarası (sıfır tabanlı) ve $data, satır için veri modelini içerir.

Böylelikle yalnızca içinde tanımlanmış olabilir.

$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'columns'=>array(
     array(
      'name'=>'..', 
      'value'=>function($data,$row){ 
       $categories = $teacher->categories; 
       return $categories[$data->category]; 
      }, 
     ), 
    ), 
)); 

Ve dışarıdan kullanmak istiyorsanız, güvenebileceğiniz PHP en use: bu şekilde dizinin hesaplama sadece bir kez olacak çünkü ben şahsen, ikincisini öneriyoruz

$categories = $teacher->categories; 
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'columns'=>array(
     array(
      'name'=>'..', 
      'value'=>function($data,$row) use ($categories){ 
       return $categories[$data->category]; 
      }, 
     ), 
    ), 
)); 

ve her durumda kullanılacaktır.

+4

bir çekicilik gibi çalışır ..both solutions..thankyou ..:) –

+0

İpucu: Gerekirse - söz konusu kayıt için farklı gridview sütunlarında yazdırmak istediğiniz birden fazla değeri döndürmek için bir model işlevini (her kayıt için) aramak isteyebilirsiniz. Her sütunda işlevi çağırmak yerine, ilk sütuna göre arama yapabilir ve sonuçla birlikte $ kategorilerini güncelleyebilirsiniz. Diğer sütunlar bu yüzden sadece $ kategorilerinden okuyabilir. Bunu yapmak için, parametreyi referans ile 'kullanın' (dahil edildiğinde, parametrenin önüne bir ampersan (&) ekleyin). 'value' => function ($ data, $ row) kullanımı (& $ category) { $ category = ... }, –

2

tek bir çizgide

$categories = $teacher->categories; 
$category = $categories[$teacher->category]; 

yazabilirsiniz: Bu, bir daha semantik kullanmasına izin

class ModelClass 
{ 
    const STATUS_SHORT_TEMPERED = 1; 
    const STATUS_FUNNY = 2; 
    const STATUS_VISIONARY = 3; 
} 

:

Ayrıca
$category = $teacher->categories[$teacher->category];  

, sana başka bir çözüm kullanmaya önermek

ModelClass::STATUS_FUNNY; 
yerine Ayrıca daha az anlamsal

2; 

ait

, bu şekilde dizinizi oluşturabilirsiniz: $row tuttuğu yerde

getCaterogies() { 
    return array(
     ModelClass::STATUS_FUNNY => 'status funny', 
     ... 
    ); 
} 
+0

const önerileriniz için çok teşekkür ederim .. –

+0

'$ category = $ teacher-> category [$ teacher-> category];' wirk, çünkü modeldeki dinamik alıcı ve alıcı Bana geri dönüyor .. –

+2

zaman ve önerileriniz için teşekkür ederim, ama aradığım şey diğer kişi tarafından tam olarak cevaplandı ve diğer birçok durumda bu çözümlere ihtiyacım olabilir. Bu durumda çözümünüz mükemmel çalışıyor, ama latr Ben bu tür 'use' stuff..stackoverflow bana ihtiyacım var izin vermeyebilir .. :( –