Хлебные крошки (breadcrumbs), известные также как навигатор сайта, - полезный модуль Joomla. И, как всякий модуль, они могут привязываться ко всем или только определенным пунктам меню. Также можно отвязать их от всех или конкретных пунктов. Многие джумловоды желают скрыть навигатор на главной странице сайта, поскольку на ней он содержит только пункт "Главная" | "Home", к тому же без линка, не неся таким образом ни смысловой, ни функциональной нагрузки. Возможно, структура сайта предусматривает и другие страницы, на которых по тем или иным причинам есть смысл скрывать навигатор. Самым типичным примером является кастомная страница ошибки 404, которая, как я отмечаю в соответствующей статье, посвященной правилам ее создания и настройки, должна быть вписана в шаблон сайта, но при этом стоять как бы особняком. Навигатор на ней не только не нужен, но еще и идеологически вреден. Будем рассматривать именно эту страницу как частный случай, описывающий общий принцип отвязки хлебных крошек от определенного материала.

Стандартный метод через привязку модуля здесь не подходит, поскольку, как описано в упомянутой статье, пункт меню для страницы ошибки не создается. В принципе, таковой пункт создать все-таки можно (не привязывая к нему страницу, а чисто для привязки модулей - вот как раз навигатора в нашем случае). Тогда навигатор можно скрыть для этой страницы, выбрав пункт На всех страницах, кроме указанных | On all pages except those selected в списке Привязка модуля | Module Assignment на странице редактирования параметров модуля в админке сайта. Такой способ в данном случае вполне работает, при добавлении новых пунктов в разные меню breadcrumbs будут привязываться к ним автоматически, так что делать это каждый раз вручную не понадобится (в отличие от варианта Только на указанных страницах | Only on the pages selected, тут придется ручками добавлять каждый созданный пункт меню в модуль). Однако минус его - необходимость создания меню для материалов, когда другой нужды в них не наблюдается. Все эти меню добавляются как дополнительные табы в разделы Выбор меню | Menu Selection всех модулей и загромождают интерфейс. Особенно это проявляется в случае мультиязычности, когда приходится создавать меню для каждого языка отдельно, и, соответственно, количество табов в интерфейсах редактирования модулей возрастает пропорционально количеству языков.

Учитывая вышеприведенные доводы, предпочитаю альтернативное решение. Правда, оно потребует некоторых навыков чтения и редактирования PHP-кода. Однако, если точно следовать инструкции - то самых что ни на есть минимальных.

А начнем мы, как всегда, с поиска файла и места в его коде, куда будут вноситься изменения. Модуль хлебных крошек имеет отдельную позицию, которая задается в файле index.php активного шаблона. Находится он в папке templates\[my_template], и вместо [my_template] каждый подставляет папку своего шаблона. Откроем файл на редактирование и найдем вхождение модуля навигатора в его коде. Тут возможны варианты. Например, в поставляемых с Джумлой шаблонах Beez2 и Beez5 искомый кусок кода выглядит так:

<div id="breadcrumbs">
 
  <jdoc:include type="modules" name="position-2" />
 
</div>

В моем кастомном шаблоне, структура которого была построена в Artisteer, навигатор выводится специальной функцией artxPost, вызов которой в index.php выглядит так:

if ($view->containsModules('breadcrumb')
  echo artxPost($view->position('breadcrumb'));

В других шаблонах код хлебных крошек может быть другим, но общий принцип таков: найти нужное место в коде можно, поискав либо по слову "breadcrumb", либо, если в вашем шаблоне модуль стоит в позиции с менее интуитивно подходящим именем - то по этому имени. Выяснить позицию модуля легко на странице его редактирования в админке. Также может прояснить картину с модулями предпросмотр позиций в менеджере шаблонов (если включить предварительно опцию Просмотр позиций модулей | Preview Module Positions в его настройках).

Теперь определим код, позволяющий скрыть вывод модуля в зависимости от наших условий. Если просто требуется убрать его с главной страницы, критерий будет таким:

JRequest::getVar('view') != 'frontpage'

Применив его для первого примера (Beez2 или Beez5), изменим приведенную часть кода на следующую:

<div id="breadcrumbs">
 
<?php if (JRequest::getVar('view') != 'frontpage') { ?>
  <jdoc:include type="modules" name="position-2" />
<?php } ?>
 
</div>

Во втором примере (шаблон, построенный в Artisteer) измененный код будет иметь такой вид:

if ($view->containsModules('breadcrumb') &&
    JRequest::getVar('view') != 'frontpage')
  echo artxPost($view->position('breadcrumb'));

Вернемся теперь к ситуации, когда требуется убрать модуль навигатора со страниц, выводящих конкретные материалы. Рассмотрим случай мультиязычного сайта (а именно - двуязычного, каковым является мой на момент написания этих строк) и ликвидируем хлебные крошки с обеих страниц 404 - русской и английской. Начнем с того, что узнаем ID соответствующих материалов. Это легко сделать, найдя их в списке материалов в админке сайта. В моем случае идентификатор русской страницы - 80, английской же - 448. В следующих фрагментах кода, призванных, как и в предыдущем случае, заменить существующие, подставьте вместо них свои значения (подробнее об этой конструкции - в статье, описывающей методику избирательного вывода социальных кнопок).

Первый пример:

<div id="breadcrumbs">
 
<?php
  $article_id = explode(':', JRequest::getVar('id'));
  if (!(JRequest::getVar('view') == 'article' &&
        ($article_id[0] == '80' || $article_id[0] == '448'))) {
?>
  <jdoc:include type="modules" name="position-2" />
<?php } ?>
 
</div>

Второй пример:

if ($view->containsModules('breadcrumb') &&
    !(JRequest::getVar('view') == 'article' &&
      ($article_id[0] == '80' || $article_id[0] == '448'))) {
  echo artxPost($view->position('breadcrumb'));

По этой методике можно скрыть хлебные крошки и с других страниц, просто добавив их ID в условие. Можно также перевернуть логику и спрятать навигатор на всех статьях, кроме перечисленных (подробнее - там же). И наконец - она позволяет манипулировать и прочими модулями, для которых выделены отдельные позиции в основном шаблоне сайта.

Комментарии  

Николай
0 # Николай 29.03.2014 16:41
Когда вызываю страницы сайта с помощью хлебных крошек, то на страницу вылезает все, что связанно с данной категорией -все тексты данной категории, список статей, в общем, черти-что. Не связано ли это с тем, что у меня статьи не привязаны к меню, а вызываются по ссылкам в главной статье категории?
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 15.04.2014 23:17
Николай, уверен, что вы уже знаете ответ на вопрос, заданный вами больше двух недель назад. Я, к сожалению, по некоторым причинам не смог отреагировать оперативно. Если тем не менее вопрос для вас все еще актуален - дайте знать, подумаем.
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 17.04.2014 19:13
Николай, по ошибке потер ваш следующий комментарий и мой ответ на него. Восстанавливаю.
Вы писали:
Цитата:
Второй день бьюсь с этой темой. Скорее всего до конца не понимаю принцип работы крошек и их взаимосвязь с меню, деревом категорий и материалами.
Я отвечал:
Цитата:
Крошки привязаны к структуре меню. Вызов страницы через крошки такой же, как и по клику на пункт меню. А вот что там будет на странице, зависит от привязки конкретного пункта меню.
Приношу извинения.
Ответить | Ответить с цитатой | Цитировать
Денис
0 # Денис 04.06.2014 07:31
Подскажите пожалуйста, как исключить хлебные крошки на страничке для которой нет возможности создать пункт меню?
Если быть точным, то скрыть нужно на этой страничке:
index.php?option=com_virtuemart&view=opc&controller=opc&task=checkout
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 04.06.2014 16:09
Я именно сейчас делаю статью о выборочной привязке не только к материалам, но и к категориям, а также к компонентам и их отдельным страницам. А тут вы как раз своим вопросом подтвердили, что это актуально не только мне.

В вашем случае условие вывода крошек будет таким:

$jinput = JFactory::getApplication()->input;

$option = $jinput->getCmd('option');
$view = $jinput->getCmd('view');
$controller = $jinput->getCmd('controller');
$task = $jinput->getCmd('task');

if (!($option == 'com_virtuemart' && $view == 'opc' && $controller == 'opc' && $task == 'checkout')) {
  /* выводить хлебные крошки */
}

Я не использую virtuemart и не могу потестить этот код, но тестил подобный на других компонентах и на 99% уверен, что он будет работать. Если сможете - подтвердите. Удачи!
Ответить | Ответить с цитатой | Цитировать
Денис
0 # Денис 11.06.2014 06:28
Спасибо за оперативный ответ, но потестить так и не удалось. В нужном мне шаблоне shaper_megadeal позиции и настройки модулей хранятся в папочке лейаут в формате json, так что нужно изобретать новый велосипед :-)
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 11.06.2014 23:29
В этом случае можно внести код в сам модуль крошек. Мне приходилось его кастомизировать, найти место, куда всунуть фильтр, несложно. Вопрос - стоит ли игра свеч, поскольку подобные кастомизации приходится тащить через обновления. В json тоже можно влезть, есть средства. Если вам действительно важно убрать крошки с определенных страниц - можем разобрать ваш случай. Если же это не сильно принципиально - оставьте как есть.
Ответить | Ответить с цитатой | Цитировать
Олег
0 # Олег 12.09.2014 07:31
Как в breadcrumb поставить nofollow главной странице, если материал находится в 3 кликах от главной?
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 13.09.2014 20:30
Странная задача. Впрочем, легко решаемая. Немножко кастомизируется модуль breadcrumbs или пишется плагин. Тут вообще неважно, сколько крошек от материала до главной. Я сейчас немного занят, но если вы подтвердите, что вам эта задача важна, с удовольствием отвлекусь от своих занятий и выдам решение.
Ответить | Ответить с цитатой | Цитировать
Олег
0 # Олег 17.09.2014 04:52
Я через breadcrumbs часть автоматической перелинковки делаю, но в джумле немогу разобраться как ставить nofollow в нём по заданным условиям.
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 18.09.2014 15:06
Редактируете файл [корень_сайта]\modules\mod_breadcrumbs\tmpl\default.php

Находите вот этот кусок:

// Render all but last item - along with separator
if (!empty($item->link))
{
    echo '<a href="' . $item->link . '" class="pathway">' . $item->name . '</a>';
}

Если хотите сделать nofollow только для линка на главную, заменяете третью строчку на такую:

echo '<a href="' . $item->link . '" class="pathway"' . ($key == 0 ? ' rel="nofollow"' : '') . '>' . $item->name . '</a>';

Если для всех - убираете условие $key == 0. Если для некоторых по вашему выбору - задайте соответствующие условия.
Ответить | Ответить с цитатой | Цитировать
Олег
0 # Олег 23.09.2014 05:12
Спасиб за помощь, сделал условие, получилось идеално для меня
// Find last and penultimate items in breadcrumbs list
end($list);
$last_item_key = key($list);
prev($list);
$penult_item_key = key($list);
$Result = array();
foreach ($list as $key) {
$Result[] = $key;
}
if (count($Result) == 3) {
$rel = 'rel="nofollow"';
}
if (count($Result) >= 4) {
$rel2 = 'rel="nofollow"';
}
// Generate the trail
foreach ($list as $key=>$item) :
// Make a link if not the last item in the breadcrumbs
$show_last = $params->get('showLast', 1);
if ($key != $last_item_key)
{
// Render all but last item - along with separator
if (!empty($item->link))
{
echo '' . $item->name . '';
Ответить | Ответить с цитатой | Цитировать
Олег
0 # Олег 23.09.2014 05:17
a'. ($key == 0 ? $rel : '').($key == 0 ? $rel2 : '').($key == 1 ? $rel2 : '').' href="' . $item->link . '" class="pathway" >'
Ответить | Ответить с цитатой | Цитировать
Александр я
0 # Александр я 07.12.2014 05:51
Цитирую Ogri:
Редактируете файл [корень_сайта]\modules\mod_breadcrumbs\tmpl\default.php

Находите вот этот кусок:

// Render all but last item - along with separator
if (!empty($item->link))
{
    echo '<a href="' . $item->link . '" class="pathway">' . $item->name . '</a>';
}

Если хотите сделать nofollow только для линка на главную, заменяете третью строчку на такую:

echo '<a href="' . $item->link . '" class="pathway"' . ($key == 0 ? ' rel="nofollow"' : '') . '>' . $item->name . '</a>';

Если для всех - убираете условие $key == 0. Если для некоторых по вашему выбору - задайте соответствующие условия.

А у меня вот ничего не изменилось(( В общем стоит 3 жумла, В модуле есть кнопка не показывать главную, но она не работает, видать я чето наклацал, т.к. ранее работала. Помогите мне убрать "Главная" или сделать ее не ссылкой.. В меру шаблона главная у меня идет site.ru или site.ru/home, там идет модуль с заставкой на весь екран, и кнопка войти и идет перенаправление на site.tu/glavnaya, на блог категорий.. Так вот, как можно сделать ее неактивной, или вовсе убрать или перенаправить на :glavnaya:
Ответить | Ответить с цитатой | Цитировать
Олег
0 # Олег 17.09.2014 05:35
На счёт скрытия крошек с вариантом joomla 2.5.19 и Artisteer if ($view->containsModules('position-2') && JURI::current() != JURI::base())
echo artxPost($view->position('position-2'));
Ответить | Ответить с цитатой | Цитировать
Ogri
+1 # Ogri 18.09.2014 14:55
Такой вариант не универсален - не годится для мультиязычного сайта. Мой как раз такой - двуязычный. JURI::base() у меня -
http:// ogri.me/, а JURI::current() на главной для каждого языка - http:// ogri.me/ru/ и http:// ogri.me/en/, т.е. с префиксом языка. Условие JRequest::getVar('view') != 'frontpage' работает всегда.
Ответить | Ответить с цитатой | Цитировать
Олег
0 # Олег 23.09.2014 05:12
Условие JRequest::getVar('view') != 'frontpage' у меня не сработало
Ответить | Ответить с цитатой | Цитировать
Евген
0 # Евген 11.01.2016 08:14
а как добавить еще страницу в условие?
JRequest::getVar('view') != 'frontpage'

например корзину?
JRequest::getVar('view') != 'frontpage' && != 'cart'
так?
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 12.01.2016 00:05
Какую корзину? В электронном магазине? Зависит от компонента. JRequest::getVar('view') != 'frontpage' - это для com_content, в нем корзины нет. Вы почитайте вот это - ogri.me/ru/web-design-development/813-struktura-vnutrennikh-ssylok-sajta-na-joomla и до комплекта еще ogri.me/ru/web-design-development/816-joomla-filtruem-kontent-po-materialam-kategoriyam-i-komponentam. Там всё для введения условий, подобных вашему с корзиной.
Ответить | Ответить с цитатой | Цитировать
Евген
0 # Евген 12.01.2016 02:59
Да, электронного магазина.
JRequest::getVar('view') != 'frontpage' - я таким образом запрятал div с заголовком страницы в карточке товара productdetails.








Чтобы запрятать div в корзине магазина, вместо productdetails указываю cart. Всё работает, div скрывается в корзине. Но вот каким образом указать сразу и productdetails и cart - не знаю. Пробую:
JRequest::getVar('view') != 'productdetails' && != 'cart' - не работает.
Ответить | Ответить с цитатой | Цитировать
Евген
0 # Евген 12.01.2016 03:01
if(JURI::current()== JURI::base())
else{ if (JRequest::getString('view') != 'productdetails')

Заголовок
Ответить | Ответить с цитатой | Цитировать
Евген
0 # Евген 12.01.2016 08:05
разобрался) прописал != ('productdetails' || 'cart')
Ответить | Ответить с цитатой | Цитировать
Алексей
0 # Алексей 01.02.2016 19:26
Ну весь index.php обрыл вдоль и поперёк! Нет у меня ничего похожего на:
if ($view->containsModules('breadcrumb') &&
JRequest::getVar('view') != 'frontpage')
echo artxPost($view->position('breadcrumb'));

И breadcrumb в нём нигде не упоминается (шаблон Артистер)!

Однако "крошки" на странице ошибок висят и бесят! И если убрать букву у любой страницы внутри категорий, для попадания на страницу ошибки оттуда, то крошки выглядят Главная - Категория - Без категории - Ошибка 404 - Страница не найдена! Ужас просто... И решения пока не нашёл...
Ответить | Ответить с цитатой | Цитировать
Ogri
0 # Ogri 01.02.2016 20:11
Я сто лет назад делал шаблон в Артистере, да и статье три с половиной года. Бросьте ваш index.php на мыло (), гляну.
Ответить | Ответить с цитатой | Цитировать
Роман
0 # Роман 28.05.2016 04:33
Здравствуйте. Подскажите пожалуйста, куда смотреть в такой ситуации: на главную привязан отдельный материал (zoo item), нужно чтобы модуль breadcrumbs вообще не выводился на главной(конкретно этом материале). В настройках модуля joomla не получается, только видимо правкой кода. Буду очень благодарен за помощь!
Ответить | Ответить с цитатой | Цитировать

Добавить комментарий