Несколько моделей в одном контроллере

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Несколько моделей в одном контроллере

Сообщение vitalik1183 »

Ребят, вот как быть если есть модуль новостей, у каждой новости есть категория.
В представлении мы должны иметь возможность выбрать категорию(и) для новости.

На данный момент я в представление "посылаю" две модели: модель новости и модель со списком категорий.

А если будет необходимо иметь возможность работать с 5 моделями? Все 5 и посылать?
Yii2!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Несколько моделей в одном контроллере

Сообщение samdark »

Ну да.
fly2k
Сообщения: 155
Зарегистрирован: 2013.03.19, 05:31

Re: Несколько моделей в одном контроллере

Сообщение fly2k »

Конкретно для таких целей, я делаю статический метод в базовой модели(тут - новость), который возвращает массив удобоваримый для виджета селектора. Ну и во вьюхе формы(новости) юзать этот метод. Не совсем понимаю зачем модель со списком категорий? Список статусов, например, часто "хардкодед", без базы и без модели - та же фигня: главное определить функцию возвращающую список для селекторов и тд... можно сделать статической, а можно и нет... можно геттерами, чтобы потом обращаться к массиву как нить типа:

Код: Выделить всё

// где то в модели новости
public function getCategoriesLabels()
{
     // возвращаем массив: либо получаем из базы, либо задаем тут же, либо читаем из конфигоф - вариантов куча, и можно расширять
}
...
// где то во вьюхе что нить типа
echo $form->field($model, 'category')->widget(YourFavoriteWidget::classname(), [
    'items' => $model->categoriesLabels,
    ...
]);
если речь идет о хранении списка категорий в моделях, то можно просто хранить в базе serialized массив, а посредствам геттеров/сеттеров обеспечить работу с самим массивом, как с обычным атрибутом... скажем в бд таблице новостей есть поле categories_data, тогда будет что нить типа:

Код: Выделить всё

    // где то в модели новости
    public function getCategories()
    {
        $data = unserialize($this->categories_data);
        return new CategoriesModel($data); // если без модели, то просто return $data
    }

    public function setCategories($categories)
    {
        $this->categories_data = serialize(ArrayHelper::toArray($categories)); // если без модели то просто serialize($categories)
    }
тогда опять же во вьюху не нада отдельно модель списка категорий передавать - там всё будет доступно:
$model->categories - список категорий(массив или модель) к которым принадлежит именно эта новость
$model->categoriesLabels - массив всех возможных категорий в виде массива для виджетов-селекторов

Если юзать модель, то в $form->field указывать уже не $model, а $model->categories, а в контроллере дополнительно брать из поста эту модель(CategoriesModel) и присваивать её в $model->categories - всё прекрасо ловится и обрабатывается в пару строчек, так как имена моделей на поля вешаются как нада... в общем, мне понравилось :)

Это всё если категории НЕ в базе. Если на категории есть AR-модель, с таблицей в бд и тд, то почему не сделать pivotTable?

В общем, как по мне, так лучше лишний раз не нагружать вьюху параметрами без необходимости. Не знаю даже почему :)
// Yii2Rulez!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Несколько моделей в одном контроллере

Сообщение zelenin »

fly2k писал(а):Не совсем понимаю зачем модель со списком категорий?
ну спутал человек. наверняка у него массив с моделями категорий.
Ответить