Ребят, вот как быть если есть модуль новостей, у каждой новости есть категория.
В представлении мы должны иметь возможность выбрать категорию(и) для новости.
На данный момент я в представление "посылаю" две модели: модель новости и модель со списком категорий.
А если будет необходимо иметь возможность работать с 5 моделями? Все 5 и посылать?
Несколько моделей в одном контроллере
- vitalik1183
- Сообщения: 1675
- Зарегистрирован: 2014.07.01, 08:42
Re: Несколько моделей в одном контроллере
Конкретно для таких целей, я делаю статический метод в базовой модели(тут - новость), который возвращает массив удобоваримый для виджета селектора. Ну и во вьюхе формы(новости) юзать этот метод. Не совсем понимаю зачем модель со списком категорий? Список статусов, например, часто "хардкодед", без базы и без модели - та же фигня: главное определить функцию возвращающую список для селекторов и тд... можно сделать статической, а можно и нет... можно геттерами, чтобы потом обращаться к массиву как нить типа:
если речь идет о хранении списка категорий в моделях, то можно просто хранить в базе serialized массив, а посредствам геттеров/сеттеров обеспечить работу с самим массивом, как с обычным атрибутом... скажем в бд таблице новостей есть поле categories_data, тогда будет что нить типа:
тогда опять же во вьюху не нада отдельно модель списка категорий передавать - там всё будет доступно:
$model->categories - список категорий(массив или модель) к которым принадлежит именно эта новость
$model->categoriesLabels - массив всех возможных категорий в виде массива для виджетов-селекторов
Если юзать модель, то в $form->field указывать уже не $model, а $model->categories, а в контроллере дополнительно брать из поста эту модель(CategoriesModel) и присваивать её в $model->categories - всё прекрасо ловится и обрабатывается в пару строчек, так как имена моделей на поля вешаются как нада... в общем, мне понравилось
Это всё если категории НЕ в базе. Если на категории есть AR-модель, с таблицей в бд и тд, то почему не сделать pivotTable?
В общем, как по мне, так лучше лишний раз не нагружать вьюху параметрами без необходимости. Не знаю даже почему
Код: Выделить всё
// где то в модели новости
public function getCategoriesLabels()
{
// возвращаем массив: либо получаем из базы, либо задаем тут же, либо читаем из конфигоф - вариантов куча, и можно расширять
}
...
// где то во вьюхе что нить типа
echo $form->field($model, 'category')->widget(YourFavoriteWidget::classname(), [
'items' => $model->categoriesLabels,
...
]);
Код: Выделить всё
// где то в модели новости
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!
Re: Несколько моделей в одном контроллере
ну спутал человек. наверняка у него массив с моделями категорий.fly2k писал(а):Не совсем понимаю зачем модель со списком категорий?