Joomla: поиск и навигация в иерархии меню

У меня есть простая иерархия меню на сайте Joomla 1.5:

[Newsletters] -> [publisher A] -> [Newsletter A1]
                               -> [Newsletter A2]
              -> [publisher B] -> [Newsletter B1]
                               -> [Newsletter B2]

При навигации по этой иерархии с использованием пунктов меню или хлебных крошек URL-адреса SEF соответствуют ожидаемым;

/newsletters/pubA.html
/newsletters/pubA/letterA1.html
/newsletters/pubA/letterA2.html
/newsletters/pubB.html
/newsletters/pubB/letterAB.html
/newsletters/pubB/letterAB.html

Однако, при навигации по иерархии с использованием ссылок внутри страниц, URL-адреса перепутались. Читайте дальше для более подробной информации:)

Страницы создаются компонентом. Я реализовал JRouter для генерации URL SEF. С включенным SEF я могу правильно перемещаться по иерархии, используя пункты меню и стандартные хлебные крошки.

Однако я также хочу перемещаться по ссылкам на самих страницах (например, путем ссылки на все информационные бюллетени издателя на странице издателя или путем ссылки на страницу издателя со страницы информационного бюллетеня). Это прекрасно работает при переходе от издателя к рассылке. Компонент вызывает

JRoute::_('index.php?option=' . $option . '&view=newsletter&newsletterid=' . $newsletterId );

и (правильно) генерирует URL как:

/newsletters/pubA/letterA1.html

Однако, когда пользователь находится на странице новостной рассылки и хочет вернуться на страницу издателя, все идет не так. По какой-то причине псевдоним издателя добавляется после псевдонима информационного бюллетеня в URL, как если бы он был ниже информационного бюллетеня в иерархии. Компонент вызывает

JRoute::_('index.php?option=' . $option . '&view=publisher&publisherid=' . $publisherId );

но это (неправильно) генерирует URL, как:

/newsletters/pubA/letterA1/pubA.html

Если я снова перейду к рассылке с вышеуказанного URL-адреса, то URL-адрес становится

/newsletters/pubA/letterA1/letterA1.html
/newsletters/pubA/letterA1/pubA.html
/newsletters/pubA/letterA1/letterA1.html
/newsletters/pubA/letterA1/pubA.html

(то есть, он не идет глубже, чем один или два сегмента (ов) "неправильно".)

Кроме того, обратите внимание, что навигация работает (то есть открывается нужная страница) - это просто странный URL-адрес.

Я не вижу, как я мог генерировать ожидаемые URL, как показано в верхней части; кажется, нет способа указать "относительно" того, каким должен быть "первый" сегмент. Должен ли я как-то подключиться к JSite:: getRouter ()?

Код маршрутизатора довольно прост. Это первый раз, когда я пишу роутер, чтобы я мог что-то испортить. Мне кажется подозрительным, что ParseRoute вызывается только с одним сегментом.

function ComponentBuildRoute(&$query)
{
  $segments = array();
  if (isset($query['view']))
  {
     if (isset($query['newsletterid']))
     {
        $alias = { figure out newsletter alias from newsletter id }
        $segments[] = $alias;
        unset($query['newsletterid']);
     }      
     else if (isset($query['publisherid']))
     {
        $alias = { figure out publisher alias from publisher id }
        $segments[] = $alias;
        unset($query['publisherid']);         
     }

    unset($query['view']);
  }

  return $segments;
}

function ComponentParseRoute($segments)
{
   $vars = array();

   $id = { try to retrieve newsletter id matching alias in $segments[0] }
   if (!empty($id))
   {
     $vars['view'] = 'newsletter';
     $vars['newsletterid'] = $id;    
     return $vars;
   }
   $id = { try to retrieve publisher id matching alias in $segments[0] }
   if (!empty($id))
   {
     $vars['view'] = 'publisher';
     $vars['publisherid'] = $id;    
     return $vars;
   }

   return $vars;
}

Я не хочу использовать абсолютный URL, потому что пункт меню издателя находится под меню новостных рассылок... очевидно, должен быть способ сделать это, как это поняли и пункты меню, и модули breadcrumb...

Спасибо

1 ответ

Возникла проблема с вашим ComponentBuildRoute. В блоке else if, где вы имеете дело с publisherid, вы отменяете рассылку новостей. Я не уверен, что это проблема, но ее устранение было бы первым шагом к решению этой проблемы.

Другие вопросы по тегам