Спасибо за вопрос. Действительно, createUrl — не участвует в формировании action в форме. Так же он не участвует в виджетах, например GridView. Для этого пришлось немного переписать класс LangRequest, и переопределить в нем resolvePathInfo, а не resolveRequestUri. Изменения коснулись только пункта «Определения языка» и «Виджет переключения языков»(сменить Yii::$app->getRequest()->getUrl() на Yii::$app->getRequest()->getLangUrl()). Изменения внес в статью. Теперь в формах и виджетах урлы формируются корректно.
Сомневался в добавлении этого в статью. Добавлю комментом. Обычно делаем через таблицу связей. Типичный пример для блога и постов.
Таблица post(модель Post) — храним метаинформацию, которая не имеет отношения к контенту. То есть такие поля: id, owner_id, date_create, date_update.
Таблица post_lang(модель PostLang) — связь контента по языкам. Поля: id, post_id, lang_id, name, description. Соответственно поля post_id — это id из таблицы post, lang_id — это id из таблицы lang. name и description — контент на соответствующем языке.
В модель Post добавляем отношение:
public function getContent($lang_id=null)
{
$lang_id = ($lang_id === null)? Lang::getCurrent()->id: $lang_id;
Тогда в отображении, для текущего языка, контент можно получить так: $post->content->name; — заголовок поста, $post->content->description; — сам пост.
Или для контента на определенном языке, задав идентификатор языка($lang_id): $post->getContent($lang_id)->name; $post->getContent($lang_id)->description;
Таблица post(модель Post) — храним метаинформацию, которая не имеет отношения к контенту. То есть такие поля: id, owner_id, date_create, date_update.
Таблица post_lang(модель PostLang) — связь контента по языкам. Поля: id, post_id, lang_id, name, description. Соответственно поля post_id — это id из таблицы post, lang_id — это id из таблицы lang. name и description — контент на соответствующем языке.
В модель Post добавляем отношение:
public function getContent($lang_id=null)
{
$lang_id = ($lang_id === null)? Lang::getCurrent()->id: $lang_id;
return $this->hasOne(PostLang::className(), ['post_id' => 'id'])->where('lang_id = :lang_id', [':lang_id' => $lang_id]);
}
Тогда в отображении, для текущего языка, контент можно получить так: $post->content->name; — заголовок поста, $post->content->description; — сам пост.
Или для контента на определенном языке, задав идентификатор языка($lang_id): $post->getContent($lang_id)->name; $post->getContent($lang_id)->description;