2011-12-08 3 views
7

Desidero elencare alcuni nomi di Categorie nella mia pagina main.php di layout. Dato che il layout non ha alcun controller o modello associato, vorrei creare un metodo statico come questo su Categoria modello:Yii - come recuperare i dati del modello in una pagina di layout?

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

e poi nel layout principale

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

La mia domanda è molto semplice: Come posso recuperare i nomi di queste categorie dal modello?

Ecco il modello completo:

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; 

     } 

risposta

19

Può essere questa risposta può aiutare. Per prima cosa devi creare un Widget per poterlo usare in modo più efficace.

Primo Creare un nuovo widget. Lascia che il nome sia CategoryWidget. Metti questo widget sotto la directory dei componenti protected/components.

class CategoryWidget extends CWidget { 

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

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

Quindi creare una vista per questo widget. Il nome del file è category.php. Mettere sotto 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; ?> 

quindi chiamare questo widget dal layout principale.

main.php

// your code ... 

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

... 
6

Se non mi sbaglio, è anche possibile passare qualsiasi variabile disponibile in una vista, al layout. Lo fai dalla vista che ha la tua variabile. Questo è il problema: è necessario dichiarare la variabile che riceverà il vostro valore, nel controller, in questo modo:

<?php 

class MyController extends Controller 
{ 

    public $myvariable; 

Dopo questo, si assegnerà il vostro modello o qualsiasi altra cosa a questa variabile pubblica all'interno della vostra vista, come questo:

$this->myvariable = $modeldata; 

Dopo aver assegnato i tuoi dati del modello all'attributo pubblico del controller, si può facilmente visualizzare all'interno il layout pe

echo $this->myvariable; 

Yii già fa questo assegnando voci di menu per column2 menu laterale, dalla vista, in questo modo:

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

Lo si può vedere in tutta creare viste/aggiornamento che GII crud crea.