Добрый день. Очень нужна помощь знатоков)
Сразу прошу прощения за простыню текста, но не представляю, как по другому объяснить проблему.
Делаю свой первый проект на October и данный ресурс просто мега находка, спасибо автору и всем, кто болеет за продвижение этой замечательной cms.
В чем собственно вопрос. Делаю сайт-портфолио с локализацией на два языка. Для перевода использовал plugin rainlab.translate и он отлично работает со всем контентом и переводом урл для страниц созданных в разделе CMS, но я ни как не могу победить перевод url для плагинов созданных по инструкции с этого сайта.
Бьюсь уже не первый день, пытался разобраться сам как мог, но в силу того, что совсем не программист, застрял и понятия не имею куда копать.
Что сделал. Для перевода slug у кастомных плагинов пытался использовать документацию и эту инструкцию, за исключением второго пункта, так как не смог вывести данные на странице без компонента, изменения делал в методе onRun самого компонента.
В итоге, если переключение языка включить на общих страницах сайта где не используются компоненты кастомных плагинов, то всё работает отлично, в том числе и при переходе на страницы с контентом генерируемым этими плагинами, все URL переведены и корректно отрабатывают. Но если переключение языка сделать находясь на одной из страниц, где работает плагин, то магия уже не происходит. Причём не происходит по разному.
Если переключаться с языка по умолчанию на второстепенный, то слаги категорий и статей останутся прежними (от языка по умолчанию), а контент выводится переведённый на второстепенный язык.
Если же переключаться со второстепенного языка, слаги категории и айтема остаются от второстепенного языка, а сам сайт выдаёт 404 ошибку.
Т.е. допустим есть страница категории на основном языке site.ru/категория/, она же есть на второстепенном языке site.ru/en/category/
Если на странице site.ru/категория/ переключить язык на второстепенный, то url будет site.ru/en/категория/, а контент переведётся, при этом страница site.ru/en/category/ тоже существует и показывает переведённый контент. Если же находясь на странице site.ru/en/category/ переключиться на основной язык, получаю url site.ru/category/ и 404 ошибку. Тоже самое будет и со страницей предмета, только теперь дублей страниц будет уже больше.
Т.е. переведённый контент откроется по адресам: site.ru/en/категория/предмет, site.ru/en/category/предмет/, site.ru/en/category/item/, site.ru/en/категория/item/ и 404-ю при обратном переключении языка если она не site.ru/en/категория/предмет.
Собственно что в коде:
в моделях Category и Item
public $implement = ['@RainLab.Translate.Behaviors.TranslatableModel'];
public $translatable = [
'name',
'description',
'seo_title',
'seo_desc',
'seo_keywords',
['slug', 'index' => true]
];
public static function translateParams($params, $oldLocale, $newLocale)
{
$newParams = $params;
foreach ($params as $paramName => $paramValue) {
$records = self::transWhere($paramName, $paramValue, $oldLocale)->first();
if ($records) {
$records->translateContext($newLocale);
$newParams[$paramName] = $records->$paramName;
}
}
return $newParams;
}
в Plugin.php:
use Backend;
use System\Classes\PluginBase;
use Event;
class Plugin extends PluginBase
{
public function boot()
{
Event::listen('translate.localePicker.translateParams', function($page, $params, $oldLocale, $newLocale) {
if (($page->baseFileName == 'cases-category') or ($page->baseFileName == 'cases-case')) {
return \WebDen\Cases\Models\Category::translateParams($params, $oldLocale, $newLocale);
return \WebDen\Cases\Models\Item::translateParams($params, $oldLocale, $newLocale);
}
});
Event::listen('translate.localePicker.translateQuery', function($page, $params, $oldLocale, $newLocale) {
if (($page->baseFileName == 'cases-category') or ($page->baseFileName == 'cases-case')) {
return \WebDen\Cases\Models\Category::translateParams($params, $oldLocale, $newLocale);
return \WebDen\Cases\Models\Item::translateParams($params, $oldLocale, $newLocale);
}
});
}
}
В компоненте Categoty:
public function defineProperties()
{
return [
'slug' => [
'title' => 'Ссылка категории',
'default' => '{{ :category }}',
],
'items' => [
'title' => 'Количество',
'description' => 'Определяет количество предметов на одной странице',
'default' => '10',
],
'sortOrder' => [
'title' => 'Сортировка',
'description' => 'Сортировать по дате публикации',
'type' => 'dropdown',
'default' => 'created at desc'
]
];
}
public function onRun()
{
$category = \WebDen\Cases\Models\Category::transWhere('slug', $this->property('slug'))->first();
if (empty($category)){
return $this->controller->run('404');
}
if($this->property('sortOrder') == 'created at asc'){
$this->page['items'] = Item::where('category_id', $category->id)->where('published', 1)->orderBy('created_at','asc')->paginate($this->property('items'));
}
if($this->property('sortOrder') == 'created at desc'){
$this->page['items'] = Item::where('category_id', $category->id)->where('published', 1)->orderBy('created_at','desc')->paginate($this->property('items'));
}
$this->page['category'] = $category;
$this->page['categories'] = \WebDen\Cases\Models\Category::orderBy('name', 'asc')->get();
$this->currentCategorySlug = $this->page['currentCategorySlug'] = $this->property('slug');
}
В компоненте Item:
public function defineProperties()
{
return [
'slugCategory' => [
'title' => 'Ссылка категории',
'default' => '{{ :category }}',
],
'slugItem' => [
'title' => 'Ссылка предмета',
'default' => '{{ :item }}',
]
];
}
public function onRun()
{
$category = \WebDen\Cases\Models\Category::transWhere('slug', $this->property('slugCategory'))->first();
if (empty($category)){
return $this->controller->run('404');
}
$item = \WebDen\Cases\Models\Item::where('category_id', $category->id)->transWhere('slug', $this->property('slugItem'))->first();
if (empty($item)){
return $this->controller->run('404');
}
$this->page['item'] = $item;
$this->page['categories'] = \WebDen\Cases\Models\Category::orderBy('name', 'asc')->get();
$this->currentCategorySlug = $this->page['currentCategorySlug'] = $this->property('slugCategory');
}
Подскажите, пожалуйста, куда копать, ибо уже киплю и сам не совладаю)