Moduł jako pozycja menu

11

Muszę wstawić moduł wyszukiwania jako element menu (domyślny moduł menu).

Potrzebuję tego wyjścia:

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

Moje pierwsze myśli to dwukrotne skopiowanie domyślnego modułu menu:

  1. Jeden do wyświetlania pozycji menu przed modułem wyszukiwania bez </ul>tagu zamykającego
  2. Inny do wyświetlenia pozycji menu po module wyszukiwania bez <ul>znacznika otwierającego

I wstaw moduł wyszukiwania między nimi. Nie wydaje się to najłatwiejszym i najłatwiejszym w utrzymaniu sposobem na osiągnięcie mojego celu, ponieważ wymaga:

  • 3 pozycje modułu dla menu
  • 2 różne menu w menedżerze menu

Wiem, że mogłem do tego użyć niektórych modułów mega menu, ale chciałbym unikać rozszerzeń innych firm i używać niestandardowego kodu, którym mogę sterować.

Jak mogę dodać moduł jako pozycję menu w menu domyślnym?

web-tiki
źródło
Możesz użyć dwóch różnych menu + jedno wyszukiwanie z kilkoma sztuczkami CSS, ale jeśli chcesz dokładnie powyższą strukturę, możesz rozważyć jQueryfunkcje takie jak append()lub, prepend()które nie będą działać w przeglądarkach z wyłączoną obsługą javascript.
Farahmand
Wolałbym nie używać jQuery do przesuwania elementów i stosować technikę opisaną w pytaniu, jeśli nie ma lepszego sposobu ...
web-tiki
1
Podejrzewam, że albo będziesz musiał użyć rozszerzenia mega menu, albo systemu typu snippet, który załaduje moduł do rozwijanej listy, wciągając go za pomocą kodu snippet. Krótkie fragmenty w połączeniu z nielicznymi modułami Anywhere prawdopodobnie działałyby. System menu podstawowego po prostu nie jest do tego stworzony. To znaczy, myślę, że można po prostu zastąpić wyjście z menu, ale wadą jest to, że masz w pełni niestandardowe menu zamiast tylko niektórych gotowych do uaktualnienia wtyczek.
Brian Peat
Jestem pewien, że Brian ma rację. Musisz albo zastąpić menu i przepisać jego funkcje, albo musisz skorzystać z pomocy strony trzeciej. NoNumber byłby twoją najmniej rozdętą opcją strony trzeciej.
Faye
Jak teraz generujesz link do modułu? Czy masz działający link do menu?
David Fritsch,

Odpowiedzi:

4

Oto jedna alternatywa, aby załadować moduł wyszukiwania do swojego menu. Wymaga kilku prostych kroków:

1. Zastąp mod_menumoduł

  • Utwórz zastąpienie w folderze szablonów \templates\YOURTEMPLATE\html\mod_menu\default_url.php.
  • Skopiuj następującą zawartość do pliku:

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;
}

Dodałem if-elseinstrukcję rozpoczynającą się od wiersza # 29, która sprawdza, czy tytuł pozycji menu to „CustomSearchBox”. W takim przypadku pozycja modułu „CustomSearchBox” jest ładowana. Jeśli nie, zwracana jest normalna pozycja menu. Możesz zmienić „CustomSearchBox” na dowolne, ale jeśli pamiętasz, aby użyć tej samej wartości w poniższych krokach.

2. Utwórz nowy moduł wyszukiwania

Utwórz moduł wyszukiwania i ustaw odpowiednie parametry (sugeruję, aby ukryć tytuł modułu).

Opublikuj moduł w niestandardowej pozycji „CustomSearchBox”

3. Utwórz nowy element menu

Element menu może być dowolnego typu, sugeruję „Zewnętrzny adres URL”, a nazwa MUSI być „CustomSearchBox”.

Zapisz swój element menu, a cały element menu zostanie zastąpiony polem wyszukiwania!

Daj mi znać, jeśli coś jest niejasne.

johanpw
źródło
Dziękuję za odpowiedź. Próbowałem użyć twojej techniki z pozycją modułu, którą miałem już w swoim szablonie (LOGO), ale nie działało. Czy powinienem spróbować utworzyć pozycję „CustomSearchBox” w moim szablonie i użyć tej?
web-tiki
Tak, należy utworzyć niestandardową pozycję „CustomSearchBox” i użyć jej. Lub możesz to zmienić w powyższym kodzie tutaj: $linktype == "CustomSearchBox"a tutaj$position = 'CustomSearchBox';
Dmitry Rekun
W rzeczywistości nie musisz tworzyć pozycji (w plikach index.php lub template.xml). Po prostu napisz CustomSearchBoxw polu pozycji modułu i naciśnij enter.
johanpw
Ok, w końcu miałem czas, aby się z tym pogodzić, musiałem ulepszyć kod, aby działał. 1 / Z jakiegoś powodu nie zadziałało, ponieważ używałem i obrazu w pozycji menu. 2 / Zmieniłem wiersz 30 kodu na $document = JFactory::getDocument();. Teraz działa, ale będę musiał znaleźć sposób, aby ponownie dodać mój obraz.
web-tiki
Poprawiłem trochę więcej: Oparłem instrukcję if na klasie pozycji menu CSS, a nie na tytule pozycji menu, i dodałem $linktypefunkcję echa. Kod jest widoczny tutaj: phpad.org/1645824385 . Dzięki, że skierowałeś mnie w dobrym kierunku. To było coś, co chciałem osiągnąć przez jakiś czas, teraz jest niesamowite! :)
web-tiki
1

Chociaż mówisz, że nie chcesz używać rozszerzeń stron trzecich, mam rozwiązanie, które korzysta z RokCandy od RocketTheme . To mały komponent fragmentu, który bardzo ułatwia dodanie pola wyszukiwania w menu. Po prostu zainstaluj wtyczkę i utwórz nowe makro:

Makro

 [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">

Zapisz i zamknij.

Teraz utwórz element menu dla pola wyszukiwania (proponuję External URLjako typ, ale zrobi to dowolny typ elementu menu), aw polu Tytuł dodaj [searchfield][/searchfield]:

Pole wyszukiwania w menu

RokCandy zastąpi tytuł kodem w makrze, aw menu pojawi się pole wyszukiwania:

Wynik

johanpw
źródło