Модуль как пункт меню

11

Мне нужно вставить поисковый модуль как пункт меню (модуль меню по умолчанию).

Мне нужен этот вывод:

<ul>
    <li>menu item</li>
    <li>menu item</li>
    <li>SEARCH MODULE</li>
    <li>menu item</li>
    ...
</ul>

Моими первыми мыслями было бы дублировать модуль меню по умолчанию дважды:

  1. Один для отображения пунктов меню перед модулем поиска без закрывающего </ul>тега
  2. Другой для отображения пунктов меню после модуля поиска без открывающего <ul>тега

И вставьте поисковый модуль между ними. Это не самый простой и понятный способ достижения моей цели, так как требует:

  • 3 позиции модуля для меню
  • 2 разных меню в менеджере меню

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

Как добавить модуль в качестве пункта меню в меню по умолчанию?

веб-Тики
источник
Вы можете использовать два разных меню + один поиск с некоторыми хитростями CSS, но если вы хотите точно описанную выше структуру, вы можете рассмотреть jQueryфункции, подобные append()или prepend()не работающие в браузерах с отключенным JavaScript.
Фараманд
Я бы предпочел не использовать jQuery для перемещения элементов и использовать технику, описанную в вопросе, если нет лучшего способа ...
web-tiki
1
Я подозреваю, что вам придется использовать расширение мегаменю или систему типа сниппета, которая загрузит модуль в выпадающий список, вытянув его с помощью кода сниппета. Фрагменты nonumber в сочетании с модулями nonumber Anywhere, вероятно, будут работать. Система стандартного меню просто не создана для этого. Я имею в виду, я думаю, что можно просто переопределить вывод меню, но недостатком является то, что у вас есть полностью настраиваемое меню вместо того, чтобы просто использовать некоторые из готовых обновляемых плагинов.
Брайан Пит
Уверен, что Брайан прав. Вам нужно либо переопределить меню и переписать его функции, либо использовать стороннего разработчика. NoNumber будет вашим наименее раздутым сторонним вариантом.
Фэй
Как вы генерируете ссылку на модуль прямо сейчас? У вас есть рабочая ссылка на меню?
Дэвид Фрич

Ответы:

4

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

1. Переопределите ваш mod_menuмодуль

  • Создайте переопределение в вашей папке шаблонов \templates\YOURTEMPLATE\html\mod_menu\default_url.php.
  • Скопируйте следующее содержимое в файл:

default_url.php

 <?php
 /**
 * @package     Joomla.Site
 * @subpackage  mod_menu
 *
 * @copyright   Copyright (C) 2005 - 2014 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;
 }

 $flink = $item->flink;
$flink = JFilterOutput::ampReplace(htmlspecialchars($flink));
if ($linktype == "CustomSearchBox"){
    $document   = &JFactory::getDocument();
    $renderer   = $document->loadRenderer('modules');
    $options    = array('style' => 'xhtml');
    $position   = 'CustomSearchBox';
    echo $renderer->render($position, $options, null);
}
else {

switch ($item->browserNav) :
    default:
    case 0:
?><a <?php echo $class; ?>href="<?php echo $flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
        break;
    case 1:
        // _blank
?><a <?php echo $class; ?>href="<?php echo $flink; ?>" target="_blank" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
        break;
    case 2:
        // window.open
        $options = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,'.$params->get('window_open');
            ?><a <?php echo $class; ?>href="<?php echo $flink; ?>" onclick="window.open(this.href,'targetWindow','<?php echo $options;?>');return false;" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
        break;
endswitch;
}

Я добавил if-elseоператор, начинающийся со строки № 29, который проверяет, является ли заголовок пункта меню «CustomSearchBox». Если это так, позиция модуля "CustomSearchBox" загружается. Если нет, то возвращается обычный пункт меню. Вы можете изменить «CustomSearchBox» на что угодно, но если вы не забыли использовать то же значение в следующих шагах.

2. Создайте новый поисковый модуль

Создайте модуль поиска и установите необходимые параметры (я предлагаю скрыть название модуля).

Опубликуйте модуль в пользовательскую позицию «CustomSearchBox»

3. Создайте новый пункт меню

Пункт меню может быть любого типа, я предлагаю «Внешний URL», и имя ДОЛЖНО быть «CustomSearchBox».

Сохраните ваш пункт меню, и весь пункт меню будет заменен на окно поиска!

Дайте мне знать, если что-то неясно.

johanpw
источник
Спасибо за ответ. Я пытался использовать вашу технику с положением модуля, которое у меня уже было в моем шаблоне (ЛОГОТИП), но, похоже, это не сработало. Должен ли я попытаться создать позицию CustomSearchBox в моем шаблоне и использовать ее?
веб-тики
Да, вы должны создать пользовательскую позицию «CustomSearchBox» и использовать ее. Или вы можете изменить его в приведенном выше коде здесь: $linktype == "CustomSearchBox"и здесь$position = 'CustomSearchBox';
Дмитрий Рекун
На самом деле вам не нужно создавать позицию (в ваших файлах index.php или template.xml). Просто напишите CustomSearchBoxв поле позиции модуля и нажмите ввод.
Johanpw
Хорошо, у меня, наконец, было время, чтобы пройти через это, мне пришлось настроить ваш код, чтобы он заработал. 1 / Почему-то это не было wotking, потому что я использовал и изображение в пункте меню. 2 / Я изменил строку 30 вашего кода на $document = JFactory::getDocument();. Теперь это работает, но мне нужно будет найти способ добавить мое изображение снова.
web-tiki
Еще немного подправил: я основал оператор if на классе пункта меню CSS, а не на заголовке пункта меню, и добавил $linktypeфункцию echo. Код виден здесь: phpad.org/1645824385 . Спасибо, что указали мне правильное направление, это то, чего я хотел достичь в течение некоторого времени, это потрясающе! :)
web-tiki
1

Хотя вы говорите, что не хотите использовать сторонние расширения, у меня есть решение, которое использует RokCandy от RocketTheme . Это небольшой фрагмент кода, который позволяет очень просто добавить поле поиска в меню. Просто установите плагин и создайте новый макрос следующим образом:

макрос

 [searchfield][/searchfield]

HTML

<form action="index.php" method="post" class="form-inline" _lpchecked="1">
 <input name="searchword" id="mod-search-searchword" maxlength="20" class="inputbox search-query" type="text" size="20" value="Search..." onblur="if (this.value=='') this.value='Search...';" onfocus="if (this.value=='Search...') this.value='';">       
 <input type="hidden" name="task" value="search">
 <input type="hidden" name="option" value="com_search">
 <input type="hidden" name="Itemid" value="101">

Сохрани и закрой.

Теперь создайте пункт меню для поля поиска (я предлагаю External URLкак тип, но подойдет любой тип пункта меню), и в поле Название добавьте [searchfield][/searchfield]:

Поле поиска в меню

RokCandy заменит заголовок на код в макросе, и вы получите поле поиска в меню:

Результат

johanpw
источник