Joomla: поиск и навигация в иерархии меню - PullRequest
0 голосов
/ 22 августа 2010

У меня есть простое иерархическое меню на сайте 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, потому что пункт меню издателя находится под меню информационных бюллетеней ... очевидно,Должен быть способ сделать это, так как пункты меню и модули хлебобулочных изделий поняли это ...

Спасибо

1 Ответ

0 голосов
/ 22 августа 2010

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

...