в чем собственно баг:мы создаем массив $needles с ключами category и categories значения у которых полученный массив getPath() нашей категории
$needles = array();
$catids = array_reverse($category->getPath());
$needles['category'] = $catids;
$needles['categories'] = $catids;
потом мы вызываем функцию _findItem($needles), в которой передаем наш массив, и которая сообсвенно возвращает нам Itemid
сама функция берет все пункты меню нашего компонента и сравнивает их с отправленным нами массивом
// Prepare the reverse lookup array.
if (self::$lookup === null)
{
self::$lookup = array();
$component
= JComponentHelper::getComponent('com_content');
$items
= $menus->getItems('component_id', $component->id);
foreach ($items as $item)
{
if (isset($item->query) && isset($item->query['view']))
{
$view = $item->query['view'];
if (!isset(self::$lookup[$view])) {
self::$lookup[$view] = array();
}
if (isset($item->query['id'])) {
self::$lookup[$view][$item->query['id']] = $item->id;
}
}
}
}
if ($needles)
{
foreach ($needles as $view => $ids)
{
if (isset(self::$lookup[$view]))
{
foreach($ids as $id)
{
if (isset(self::$lookup[$view][(int)$id])) {
return self::$lookup[$view][(int)$id];
}
}
}
}
}
$item->query['view'] сравнивается с нашими ключами
то есть проблема в том, что если у нас есть два пункта меню для одной и той же категории, только один как "блог категории" (category), а второй как список "подкатегорий" (categories)
возвращается конечно же ид пункта меню view которого category, потому что он у нас идет первым в массиве, хотя например в моем случае нужно что возвращал ид пункта view у которого categories
думаю решение можно сделать отталкиваясь от того какой у нашего пункта view, если category, значить проверять сначала parent на такой же view (кто вник, тот поймет)