Yii - как получить данные модели на странице макета? - PullRequest
7 голосов
/ 09 декабря 2011

Я хочу перечислить некоторые названия категорий на моей странице макета main.php.Так как макет не имеет никакого связанного контроллера или модели, я хочу создать статический метод, подобный этому, для модели категории:

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

, а затем в основном макете

<?php
$models = Category::getHeaderModels();
foreach($models as $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;

        }

Ответы [ 2 ]

19 голосов
/ 09 декабря 2011

Может быть, этот ответ может помочь вам.Сначала вы должны создать виджет, чтобы использовать его более эффективно.

Сначала создайте новый виджет.Скажем, имя CategoryWidget.Поместите этот виджет в каталог компонентов protected/components.

class CategoryWidget extends CWidget {

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

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

Затем создайте представление для этого виджета.Имя файла - category.php.Поместите его в 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; ?>

Затем вызовите этот виджет из вашего основного макета.

main.php

// your code ...

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

...
6 голосов
/ 06 ноября 2012

Если я не ошибаюсь, вы можете также передать любую переменную, доступную в виде, в макет. Вы просто делаете это из представления, которое имеет вашу переменную. Это подвох: вам нужно объявить переменную, которая получит ваше значение, в контроллере, например:

<?php

class MyController extends Controller
{

    public $myvariable;

После этого вы назначите свою модель или что-то еще этой общедоступной переменной в вашем представлении, как это:

$this->myvariable = $modeldata;

После того, как вы присвоили данные своей модели общедоступному атрибуту контроллера, Вы можете легко отобразить его внутри макета, например,

echo $this->myvariable;

Yii уже делает это, назначая элементы меню в боковое меню column2, из вида, как это:

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

Вы можете видеть это во всех представлениях создания / обновления, которые создает gii crud.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...