Форум русской поддержки Joomla!® CMS
06.12.2016, 10:03:56 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
   
   Начало   Поиск Joomla 3.0 FAQ Joomla 2.5 FAQ Joomla 1.5 FAQ Правила форума Новости Joomla Реклама Войти Регистрация Помощь  
Страниц: [1]   Вниз
  Добавить закладку  |  Печать  
Автор

Циклические ссылки в меню

 (Прочитано 257 раз)
0 Пользователей и 1 Гость смотрят эту тему.
zimt42
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 9


« : 16.08.2016, 09:57:25 »

Пролог: был основательно перерыт как форум, так и за его пределами, рабочее решение так и не найдено.
Версия: 3.6.2.

Задача: есть меню, подменю, они состоят из ссылок, который там всегда есть. Но если мы находимся в одном из пунктов, то он ссылается сам на себя, чего быть не должно. Как избавиться от циклической переадресации? Причём, если мы находимся в /меню3, то он должен быть некликабельным, но если мы находимся в меню3/подменю1, то некликабельным должно быть только подменю1, а меню3 являться ссылкой.
Записан
effrit
Группа развития
*****

Репутация: +730/-7
Offline Offline

Пол: Мужской
Сообщений: 6807


effrit.com


« Ответ #1 : 16.08.2016, 10:08:24 »

написано не очень понятно, лучше бы ссылку на сайт дали.
возможно, вы не используете тип пункта меню Псевдоним, который используется, когда в любом из меню уже есть пункт, ссылающийся на нужную страницу, и ему надо создать дубликат
Записан
yandex_hb
Давно я тут
****

Репутация: +21/-1
Offline Offline

Пол: Мужской
Сообщений: 348



« Ответ #2 : 16.08.2016, 10:26:09 »

Модуль меню надо ковырять. А зачем это вообще нужно?
Записан
Shustry
Группа развития
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #3 : 16.08.2016, 13:33:40 »

Шаблон пункта меню переопределяется для этого.
Записан
Shustry
Группа развития
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #4 : 16.08.2016, 13:45:04 »

Копируете из modules\mod_menu\tmpl\ в templates\шаблон\html\mod_menu файл default_component.php. Далее оборачиваете вывод ссылки в условие (начиная с 26-й строки):

Код
/*начало вставки 1*/
$uri = JURI::current();
$ur = JURI::getInstance( $uri );
$u = $ur->getPath();
 
if ($u == $item->flink) {
echo '<span class='.$class.'>'.$linktype.'</span>';
} else {
/*конец вставки 1*/
 
switch ($item->browserNav)
{
default:
case 0:
?><a <?php echo $class; ?>href="<?php echo $item->flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
break;
case 1:
// _blank
?><a <?php echo $class; ?>href="<?php echo $item->flink; ?>" target="_blank" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
break;
case 2:
// Use JavaScript "window.open"
?><a <?php echo $class; ?>href="<?php echo $item->flink; ?>" onclick="window.open(this.href,'targetWindow','toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes');return false;" <?php echo $title; ?>><?php echo $linktype; ?></a>
<?php
break;
}
/*вставка два, только скобка*/
}
/*вставка два кончилась*/

Должно сработать. Не проверял.
Записан
zimt42
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 9


« Ответ #5 : 16.08.2016, 14:39:00 »

А зачем это вообще нужно?
Во-первых, то же SEO, страница, ссылающаяся на саму себя теряет в весе, ну и во-вторых, здравый смысл: если я уже зашёл в пункт меню, зачем ссылаться на него же? <a> должен становиться <span>.
Записан
zimt42
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 9


« Ответ #6 : 16.08.2016, 14:43:39 »

Shustry, IDE сразу ругается на этот код, как минимум незакрытый switch, возможно что-то ещё (не силён в PHP). По аналогии вставить не вижу куда, файл default_component выглядит вот так:
Код:
<?php
/**
 * @package     Joomla.Site
 * @subpackage  mod_menu
 *
 * @copyright   Copyright (C) 2005 - 2016 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

$attributes = array();

if ($item->anchor_title)
{
$attributes['title'] = $item->anchor_title;
}

if ($item->anchor_css)
{
$attributes['class'] = $item->anchor_css;
}

if ($item->anchor_rel)
{
$attributes['rel'] = $item->anchor_rel;
}

$linktype = $item->title;

if ($item->menu_image)
{
$linktype = JHtml::_('image', $item->menu_image, $item->title);

if ($item->params->get('menu_text', 1))
{
$linktype .= '<span class="image-title">' . $item->title . '</span>';
}
}

if ($item->browserNav == 1)
{
$attributes['target'] = '_blank';
}
elseif ($item->browserNav == 2)
{
$options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes';

$attributes['onclick'] = "window.open(this.href, 'targetWindow', '" . $options . "'); return false;";
}

echo JHtml::_('link', JFilterOutput::ampReplace(htmlspecialchars($item->flink)), $linktype, $attributes);
Записан
zimt42
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 9


« Ответ #7 : 16.08.2016, 14:53:46 »

написано не очень понятно, лучше бы ссылку на сайт дали.
Могу показать на примере вашего сайта =)
Идём куда-нибудь в меню, например в http://effrit.com/work/presentations, и с этой страницы вверху в меню также есть ссылка на Презентации, т. е. на саму же себя, а так быть не должно.
И, кстати, ещё бы на главной странице логотип не был кликабельным, но это уже меньшая из проблем, но суть та же.
Записан
effrit
Группа развития
*****

Репутация: +730/-7
Offline Offline

Пол: Мужской
Сообщений: 6807


effrit.com


« Ответ #8 : 16.08.2016, 15:04:30 »

zimt42, надо было ужо картинки пиарить, раз взялись мой сайт раскручивать )).

понял, о чем речь, на одном из сайтов логотип отключал на главной так, а на текущем сайте смысла нет - он не для сео сделан )
ну тогда шаблон вывода ковырять, как Шустрый товарищ завещал ).
но там решение зависит от выбранного модуля меню.
по идее, можно js-скриптом более универсально удалять ссылки на самого себя, но это уже, наверно, для робота не сработает?
Записан
zimt42
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 9


« Ответ #9 : 16.08.2016, 15:07:48 »

effrit, ну SEO это как дополнительный малый фактор, больше смущает именно вопрос логичности и правильности интерфейса. Особенно, когда есть список из подменю, и я в одном из них, то я не должен мочь по нему кликнуть и перезагрузить страницу тем самым.
Да, понимаю, что надо ковырять тот самый файл, встречал это в других ветках, но для других версий, и у меня не сработало. Поэтому и создал тему, т. к. PHP-ковырялки не имею =)
Про js уже тоже мысли закрадываются, но пока ещё теплится надежда решить этот вопрос правильно, а потом костылить.
Записан
yandex_hb
Давно я тут
****

Репутация: +21/-1
Offline Offline

Пол: Мужской
Сообщений: 348



« Ответ #10 : 16.08.2016, 15:22:51 »

Цитировать
страница, ссылающаяся на саму себя теряет в весе
ИМХО: Вес не теряется и не утекает, нет такого вообще. А вот передаваемый вес уменьшается, да. Но учитывая сколько обычно ссылок бывает на странице — это вообще не существенно.

Цитировать
Особенно, когда есть список из подменю, и я в одном из них, то я не должен мочь по нему кликнуть и перезагрузить страницу тем самым
Ну вообще-то многие так делают, чтобы перезагрузить страницу, особенно если на странице динамический контент. Для юзабилити важно показать, что пользователь уже на этой странице, а кликабельна ссылка или нет — пофигу.
Записан
effrit
Группа развития
*****

Репутация: +730/-7
Offline Offline

Пол: Мужской
Сообщений: 6807


effrit.com


« Ответ #11 : 16.08.2016, 15:24:19 »

zimt42, просто если со стороны js, то там более понятно, чего делать, и можно универсальный код написать с минимумом подгонки под разные сайты.
смысл в том, что активному меню вешается свой уникальный класс, так что можно скриптом выбирать все ссылки с этим классом (или вложенные в этот класс) и удалять им href-атрибут.

а вообще, да - я обычно просто подсвечиваю активную ссылку и этого хватает.
Записан
Shustry
Группа развития
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #12 : 16.08.2016, 15:28:21 »

файл целиком. Свич закрывается в предпоследней строке. Невнимательно смотрели.

Код
<?php
/**
* @package     Joomla.Site
* @subpackage  mod_menu
*
* @copyright   Copyright (C) 2005 - 2015 Open Source Matters, Inc. All rights reserved.
* @license     GNU General Public License version 2 or later; see LICENSE.txt
*/

 
defined('_JEXEC') or die;
 
// Note. It is important to remove spaces between elements.
$class = $item->anchor_css ? 'class="' . $item->anchor_css . '" ' : '';
$title = $item->anchor_title ? 'title="' . $item->anchor_title . '" ' : '';
 
if ($item->menu_image)
{
$item->params->get('menu_text', 1)?
$linktype = '<img src="' . $item->menu_image . '" alt="' . $item->title . '" /><span class="image-title">' . $item->title . '</span> ' :
$linktype = '<img src="' . $item->menu_image . '" alt="' . $item->title . '" />';
}
else
{
$linktype = $item->title;
}
/*начало вставки 1*/
$uri = JURI::current();
$ur = JURI::getInstance( $uri );
$u = $ur->getPath();
 
if ($u == $item->flink) {
echo '<span class='.$class.'>'.$linktype.'</span>';
} else {
/*конец вставки 1*/
 
switch ($item->browserNav)
{
default:
case 0:
?><a <?php echo $class; ?>href="<?php echo $item->flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
break;
case 1:
// _blank
?><a <?php echo $class; ?>href="<?php echo $item->flink; ?>" target="_blank" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
break;
case 2:
// Use JavaScript "window.open"
?><a <?php echo $class; ?>href="<?php echo $item->flink; ?>" onclick="window.open(this.href,'targetWindow','toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes');return false;" <?php echo $title; ?>><?php echo $linktype; ?></a>
<?php
break;
} //вот тут свич закрывается
/*вставка два, только скобка*/
}
/*вставка два кончилась*/
Записан
zimt42
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 9


« Ответ #13 : 16.08.2016, 15:44:07 »

ИМХО: Вес не теряется и не утекает, нет такого вообще.
Мне кажется, что мы о разном весе говорим. Я про тот, который поисковыми машинами учитывается при выдаче, где сотни факторов влияют. И вот ссылательство на саму себя — это минус юзабилити и странице.

effrit, а, я вспомнил, почему отложил мысль с js и выборкой по активному классу (поизголяться может и можно, но..): есть у нас пункт-меню-1, мы в нём, оно с классом активности, запрещаем клик. А потом мы идем в подменю! И надо чтобы родитель в данном случае был также с классом active, но кликабельным, ведь сейчас мы не в нём, а в его потомке, вот в чём заковырка
Записан
zimt42
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 9


« Ответ #14 : 16.08.2016, 15:48:35 »

файл целиком.
Прошу прощения, я ожидал (не знаю почему) endswitch, в любом случае сначала IDE ругался, а на этот файл целиком — нет.
Но самое главное-то! Заработало! Всё поразъехалось, но это вопрос в подправке стилей, фигня.
Просто огромное спасибо, вот уж не ожидал, что не смогу чего-то нагуглить, пойду на форум и получу ответ-решение! Осталось только вопрос с логотипом-ссылкой на главной решить =)
*Убежал на радостях в закат*
Записан
Shustry
Группа развития
*****

Репутация: +727/-3
Offline Offline

Пол: Мужской
Сообщений: 6667


Рисую дизайны


« Ответ #15 : 16.08.2016, 15:58:09 »

Незачто. Файлы разные возможно потому, что мой из модуля непосредственно, а не из шаблона.
Записан
zimt42
Новичок
*

Репутация: +0/-0
Offline Offline

Сообщений: 9


« Ответ #16 : 16.08.2016, 18:41:19 »

Скинутый мною файл, кстати, тоже был из модуля, а не из шаблона. Видать в недавнем обновлении поменялось у них что-то.
Записан
Страниц: [1]   Вверх
  Добавить закладку  |  Печать  
 
Перейти в:  

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines

Joomlaforum.ru is not affiliated with or endorsed by the Joomla! Project or Open Source Matters.
The Joomla! name and logo is used under a limited license granted by Open Source Matters
the trademark holder in the United States and other countries.

LiveInternet