Я уже вчера осилил эту таску. Увы, без жертв среди системных файлов движка не обошлось. Добавил что-то вроде этого в /classes/system/subsystems/cmsController/cmsController.php
public function setDirectElementId()
{
$parsed_uri = explode('/', trim($_SERVER["REQUEST_URI"]));
if (count($parsed_uri) == 3)
{
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
foreach($pages as $page)
{
if ($page->getAltName() == $parsed_uri[1])
{
$this->current_element_id = $page->getId();
$this->setCurrentMethod("object");
$this->setCurrentModule("catalog");
break;
}
}
}
}
и вызвал из analyzePath()
Редирект с /katalog/razdel/subrazdel/super-item/ и /super-item/ оказалось самой простой задачей ( /libs/root-src/index.php )
if ( ($currentMethod == "object") && ($currentModule == "catalog") )
{
if ( strpos($this_uri, '/katalog/') !== false )
{
$original_uri = $parsed_uri[count($parsed_uri) - 2]."/";
$buffer->redirect('http://'.$host."/".$original_uri, '301 Moved Permanently', 301);
}
}
Единственное, что меня смущает, так это реализация поиска id элемента по alt_name (через selector). Я перебираю все выбранные варианты в foreach, но может это как-то сделать с использованием where(), быстрее было бы?