Коллеги!
Есть страница site.ru/katalog/razdel/subrazdel/super-item/
Задача:
При обращении к site.ru/super-item/ получить id страницы "/katalog/razdel/subrazdel/super-item/".
Эксперименты с getIdByPath - показали, что она умеет возвращать id только по полному пути, но не по последней части.
$hierarchy = umiHierarchy::getInstance();
$original_id = $hierarchy->getIdByPath('/super-item/', true, $errors_count);
- возвращает false.
Да, можно подключиться напрямую к БД и сделать необходимую выборку, но может есть решение средствами UMI? Не могу найти исходник getIdByPath, его бы чуть-чуть модифицировать или лучше сделать кастомный вариант на основе оригинала.
Получилось, спасибо!
$pages = new selector('pages');
$pages->types('hierarchy-type')->name('catalog', 'object');
$new_id = "";
foreach($pages as $page)
{
if ($page->getAltName() == $parsed_uri[1])
{
$new_id = $page->getId();
break;
}
}
Подскажите ещё, пож-та, как указать найденный $new_id, чтобы вместо 404 "бралась" и выводилась нужная страница? Контент страницы генерируется этим:
$globalVars = $cmsController->getGlobalVariables();
Если обращаться к site.ru/super-item/, то по понятным причинам генерируется notfound. Как сообщить $cmsController, чтобы он работал с найденным $new_id?
P.S. Работаю с файликом libs/root-src/index.php
Я уже вчера осилил эту таску. Увы, без жертв среди системных файлов движка не обошлось. Добавил что-то вроде этого в /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(), быстрее было бы?