Меня очень бесило то, что opensef не поддерживает такую фишку: если создается
несколько пунктов меню для одного и того же компонента, то для них нельзя сделать
разные урлы.
Сразу оговорюсь, я использовал openSEF RC5 SP2. Про другие версии не знаю, поэтому, возможно, в них-то все работает нормально.
Приведу пример, само собою, про autobb.
Можно создать несколько пунктов меню, например, "Легковые автомобили", "Грузовики", "Автобусы" и "Мотоциклы". В настройках openSEF для них указываем урлы avto/, grusoviki/, avtobusy/ и moto/ соответственно. Но у всех пунктов меню теперь ссылка avto/. Т.е. openSEF смотрит только на option, не учитывая значение Itemid. Косяк.
Мириться с этим мне как-то не хотелось и я решил переписать openSEF "под себя". Минут пять поковырявшись, обнаружил, что разработчики эту функцию предусмотрели, но по какой-то причине, menu_id (внутренняя переменная, отвечающая за привязку к Itemid) перетирается. Очень похоже, что разработчики забыли вписать else.
Итак, файл administrator/components/com_sef/core/sef.rewriter.php
функция rewriteNoCache (строка ~134)
было так:
if (ereg( '&Itemid=([0-9]+)', $url, $matches )) {
$menu_id = $matches[1];
}
$query = "SELECT id FROM #__menu WHERE link = 'index.php?option=com_".$component."'";
$database->setQuery($query);
$temp_id = $database->loadResult();
if ( ( $temp_id != 1 ) && ( $temp_id != 99999999 ) && ( $temp_id != '' ) && ( $component != 'frontpage' ))
$menu_id = $temp_id;
Я дописал else и получилось так:
if (ereg( '&Itemid=([0-9]+)', $url, $matches )) {
$menu_id = $matches[1];
} else {
$query = "SELECT id FROM #__menu WHERE link = 'index.php?option=com_".$component."'";
$database->setQuery($query);
$temp_id = $database->loadResult();
if ( ( $temp_id != 1 ) && ( $temp_id != 99999999 ) && ( $temp_id != '' ) && ( $component != 'frontpage' ))
$menu_id = $temp_id;
}
Теперь в меню нормально показываются avto/, gruzoviki/ и т.д.
Если это действительно баг в openSEF, то возможно, userxp передаст разработчикам. Если нет, то может кто-нибудь подскажет другое решение?