Modulo come voce di menu


11

Devo inserire il modulo di ricerca come voce di menu (modulo di menu predefinito).

Ho bisogno di questo risultato:

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

Il mio primo pensiero sarebbe quello di duplicare due volte il modulo menu predefinito:

  1. Uno per visualizzare le voci di menu prima del modulo di ricerca senza il </ul>tag di chiusura
  2. Un altro per visualizzare le voci di menu dopo il modulo di ricerca senza il <ul>tag di apertura

E inserisci il modulo di ricerca tra di loro. Questo non sembra essere il modo più semplice e più sostenibile per raggiungere il mio obiettivo in quanto richiede:

  • 3 posizioni del modulo per il menu
  • 2 diversi menu nel menu manager

So che potrei usare alcuni dei moduli del menu mega per fare questo, ma vorrei evitare estensioni di terze parti e utilizzare il codice personalizzato che posso controllare.

Come posso aggiungere un modulo come voce di menu nel menu predefinito?


Puoi usare due menu diversi + una ricerca con alcuni trucchi CSS ma se vuoi esattamente la struttura sopra, puoi considerare jQueryfunzioni simili append()o prepend()che non funzioneranno su browser disabilitati a JavaScript.
Farahmand,

Preferirei non usare jQuery per spostare gli elementi e usare la tecnica che ho descritto nella domanda se non esiste un modo migliore ...
web-tiki,

1
Ho il sospetto che dovrai usare una mega estensione di menu o un sistema di tipo snippet che caricherà un modulo nel menu a discesa estraendolo con un codice snippet. I frammenti non numerici combinati con i moduli non numerici Ovunque probabilmente funzionerebbero. Il sistema di menu stock non è stato creato proprio per questo. Voglio dire, immagino che sia possibile sovrascrivere l'output del menu, ma lo svantaggio è che hai un menu completamente personalizzato invece di utilizzare solo alcuni plug-in aggiornabili.
Brian Peat,

Abbastanza sicuro che Brian abbia ragione. O devi sovrascrivere il menu e riscriverne le funzioni, oppure devi utilizzare una terza parte. NoNumber sarebbe l'opzione di terze parti meno gonfia.
Faye,

Come stai generando un collegamento al modulo in questo momento? Hai un link funzionante al menu?
David Fritsch,

Risposte:


4

Ecco un'alternativa per caricare il modulo di ricerca nel tuo menu. Richiede un paio di semplici passaggi:

1. Sostituisci il tuo mod_menumodulo

  • Crea una sostituzione nella cartella dei modelli \templates\YOURTEMPLATE\html\mod_menu\default_url.php.
  • Copia i seguenti contenuti nel file:

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

Ho aggiunto una if-elsedichiarazione a partire dalla riga 29, che verifica se il titolo della voce di menu è "CustomSearchBox". In tal caso, viene caricata la posizione del modulo "CustomSearchBox". In caso contrario, viene restituita la normale voce di menu. Puoi modificare "CustomSearchBox" in qualsiasi cosa ti piaccia, ma se ricordi di utilizzare lo stesso valore nei seguenti passaggi.

2. Creare un nuovo modulo di ricerca

Crea il modulo di ricerca e imposta i parametri secondo necessità (suggerisco di nascondere il titolo del modulo).

Pubblica il modulo nella posizione personalizzata "CustomSearchBox"

3. Creare una nuova voce di menu

La voce di menu può essere di qualsiasi tipo, suggerisco "URL esterno" e il nome DEVE essere "CustomSearchBox".

Salva la tua voce di menu e l'intera voce di menu verrà sostituita con la casella di ricerca!

Fammi sapere se qualcosa non è chiaro.


Grazie per la risposta. Ho provato a usare la tua tecnica con una posizione del modulo che avevo già nel mio template (LOGO) ma non sembrava funzionare. Dovrei provare a creare una posizione "CustomSearchBox" nel mio modello e utilizzarla?
web-tiki,

Sì, è necessario creare la posizione personalizzata "CustomSearchBox" e utilizzarla. Oppure puoi cambiarlo nel codice sopra qui: $linktype == "CustomSearchBox"e qui$position = 'CustomSearchBox';
Dmitry Rekun il

Non è necessario creare la posizione (nei file index.php o template.xml). Scrivi semplicemente CustomSearchBoxnel campo della posizione del modulo e premi invio.
johanpw,

Ok, finalmente ho avuto il tempo di superare questo, ho dovuto modificare il tuo codice per farlo funzionare. 1 / Per qualche ragione non è stato wotking perché stavo usando e l'immagine nella voce di menu. 2 / Ho cambiato la riga 30 del tuo codice in $document = JFactory::getDocument();. Ora funziona ma dovrò trovare un modo per aggiungere nuovamente la mia immagine.
web-tiki,

Modificato un po 'di più: ho basato l'istruzione if sulla classe della voce di menu CSS anziché sul titolo della voce di menu e ho aggiunto la $linktypefunzione echo. Il codice è visibile qui: phpad.org/1645824385 . Grazie per avermi indicato nella giusta direzione, questo è qualcosa che volevo raggiungere da tempo, ora è fantastico! :)
web-tiki,

1

Anche se dici di non voler utilizzare estensioni di terze parti, ho una soluzione che utilizza RokCandy di RocketTheme . È un piccolo componente snippet che semplifica l'aggiunta del campo di ricerca nel menu. Installa semplicemente il plugin e crea una nuova macro come questa:

macro

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

Salva e chiudi.

Ora crea una voce di menu per la casella di ricerca (suggerisco External URLcome tipo, ma qualsiasi tipo di voce di menu lo farà) e, nel campo Titolo , aggiungi [searchfield][/searchfield]:

Campo di ricerca nel menu

RokCandy sostituirà il titolo con il codice nella macro e otterrai un campo di ricerca nel menu:

Risultato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.