Так как на сайте предусмотрено всего 2 языка, в базе есть таблицы в которых по 2 поля типа "caption_ua", "caption_en" и т.д.
Сделал функцию-хелпер:
public function getCaption($model)
{
if (Yii::app()->language=='uk') return $model->caption_ua;
if (Yii::app()->language=='en') return $model->caption_en;
}
Везде по коду где было, например:
заменил на:
echo MyHelpers::getCaption($model);
Не смейтесь, я только начинаю разбираться )))))
Подскажите, как сделать это дело “поэлегантней”?
Думал, может копать в сторону afterFind, но не совсем понятно как выдавать\подставлять нужное поле. а во вторых - боюсь такая огульная подстановка вылезет боком где-то, например, при редактировании статьи, создании и т.д.
Во-первых, в данном случае лучше подходит switch-case конструкция.
Во-вторых, я считаю вполне себе правильный подход в данной ситуации Вы выбрали с хелпером. Только я бы передавал в функцию вывода еще название поля и язык, например Lang::print($model, $caption, $lang=‘ua’) и уже дописывал “_lang”.
В-третьих, с afterFind вы сможете выводить только одиночные записи, а с хелпером уже и списки
Блин, я боялся что мои функции примут за быдлокод, оказалось, не всё так плохо )))) Спасибо.
Update
Ура, таки можно в Yii делать то, что можно и в обычном ПХП - обращаться к атрибутам как к элементам массива. В результате получит такую вот короткую функцию вместо 3-х коротких но с разными названиями:
public function getTranslation($model,$attribute='caption')
{
$lang=Yii::app()->language;
if ($lang=='uk') $lang='ua';
if (!$model->hasAttribute($attribute.'_'.$lang))
{throw new CHttpException(404,'Attribute is not valid!');}
else return $model[$attribute.'_'.$lang];
}