2011-12-08 6 views
7

Chciałbym podać nazwę jakiejś kategorii na stronie main.php mojego layoutu. Ponieważ układ nie ma żadnego związanego kontroler lub model, życzę, aby utworzyć metody statyczne jak to w kategorii modeluYii - jak odzyskać dane modelu na stronie układu?

public static function getHeaderModels() 
{ 
    // get all models here 
    return $models; 
} 

a następnie w głównym układzie

<?php 
$models = Category::getHeaderModels(); 
foreach($models as $model) 
{ 
    // .... 
} 
?> 

Moje pytanie brzmi: bardzo podstawowy: Jak mogę odzyskać nazwy kategorii z modelu?

Oto pełny model:

class Category extends CActiveRecord { 


    public static function model($className=__CLASS__) { 
     return parent::model($className); 
    } 

    public function tableName() { 
     return 'category'; 
    } 

    public function rules() { 
     return array(
      array('parent_id', 'numerical', 'integerOnly' => true), 
      array('name', 'length', 'max' => 255), 
      array('id, parent_id, name', 'safe', 'on' => 'search'), 
     ); 
    } 

    public function relations() { 
     return array(
      'users' => array(self::MANY_MANY, 'User', 'categories(category_id, user_id)'), 
     ); 
    } 

    public function scopes() 
    { 
     return array(
      'toplevel'=>array(
       'condition' => 'parent_id IS NULL' 
      ), 
     ); 
    } 

    public function attributeLabels() { 
     $id = Yii::t('trans', 'ID'); 
     $parentId = Yii::t('trans', 'Parent'); 
     $name = Yii::t('trans', 'Name'); 

     return array(
      'id' => $id, 
      'parent_id' => $parentId, 
      'name' => $name, 
     ); 
    } 

    public function search() { 
     $criteria = new CDbCriteria; 
     $criteria->compare('id', $this->id); 
     $criteria->compare('parent_id', $this->parent_id); 
     $criteria->compare('name', $this->name, true); 

     return new CActiveDataProvider(get_class($this), array(
       'criteria' => $criteria, 
      )); 
    } 


     public static function getHeaderModels() { 

      //what sintax should I use to retrieve the models here ? 

      return $models; 

     } 

Odpowiedz

19

Może być to odpowiedź może pomóc. Najpierw musisz utworzyć Widget, aby móc go efektywniej wykorzystać.

Najpierw Utwórz nowy widget. Powiedzmy, że nazywa się CategoryWidget. Umieść ten widget w katalogu komponentów protected/components.

class CategoryWidget extends CWidget { 

    public function run() { 
     $models = Category::model()->findAll(); 

     $this->render('category', array(
      'models'=>$models 
     )); 
    } 
} 

Następnie utwórz widok tego widgetu. Nazwa pliku to category.php. stawia pod protected/components/views

category.php

<?php if($models != null): ?> 
<ul> 
    <?php foreach($models as $model): ?> 
    <li><?php echo $model->name; ?></li> 
    <?php endforeach; ?> 
</ul> 
<?php endif; ?> 

Następnie nazwać ten widget z głównego układu.

main.php

// your code ... 

<?php $this->widget('CategoryWidget') ?> 

... 
6

Jeśli się nie mylę, można również przekazać wszelkie dostępne zmienną w widoku, na układzie. Po prostu robisz to z widoku, który ma twoją zmienną. To jest haczyk: trzeba zadeklarować zmienną, która otrzyma swoją wartość, w sterowniku, tak:

<?php 

class MyController extends Controller 
{ 

    public $myvariable; 

Po tym, można przypisać model lub cokolwiek do tej zmiennej publicznej wewnątrz widzenia tak:

$this->myvariable = $modeldata; 

Po przypisaniu danych modelowych do atrybutu publicznego kontrolera, można łatwo wyświetlić go wewnątrz układu, np

echo $this->myvariable; 

Yii już robi to poprzez przypisanie pozycji menu do Kolumna2 menu paska bocznego, z pola widzenia, tak:

$this->menu=array(
    array('label'=>'List Item', 'url'=>array('index')), 
    array('label'=>'Manage Item', 'url'=>array('admin')), 
); 

Widać to w ogóle tworzyć widoki/aktualizuj że GII CRUD tworzy.

Powiązane problemy