Módulo como elemento de menú

11

Necesito insertar el módulo de búsqueda como elemento de menú (módulo de menú predeterminado).

Necesito esta salida:

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

Mis primeros pensamientos serían duplicar el módulo de menú predeterminado dos veces:

  1. Uno para mostrar los elementos del menú antes del módulo de búsqueda sin la </ul>etiqueta de cierre
  2. Otro para mostrar los elementos del menú después del módulo de búsqueda sin la <ul>etiqueta de apertura

E inserte el módulo de búsqueda entre ellos. Esta no parece ser la forma más fácil y fácil de lograr mi objetivo, ya que requiere:

  • 3 posiciones de módulo para el menú
  • 2 menús diferentes en el administrador de menús

Sé que podría usar algunos de los módulos de megamenú para hacer esto, pero me gustaría evitar extensiones de terceros y usar código personalizado que pueda controlar.

¿Cómo puedo agregar un módulo como elemento de menú en el menú predeterminado?

web-tiki
fuente
Puede usar dos menús diferentes + una búsqueda con algunos trucos CSS, pero si desea exactamente la estructura anterior, puede considerar jQueryfunciones como append()o prepend()que no funcionarán en los navegadores con JavaScript deshabilitado.
Farahmand
Preferiría no usar jQuery para mover elementos y usar la técnica que describí en la pregunta si no hay una mejor manera ...
web-tiki
1
Sospecho que tendrá que usar una extensión de megamenú o un sistema de tipo fragmento que cargará un módulo en el menú desplegable introduciéndolo con un código fragmento. Fragmentos sin número combinados con módulos sin número en cualquier lugar probablemente funcionarían. El sistema de menú de acciones simplemente no está diseñado para esto. Quiero decir, supongo que es posible anular la salida del menú, pero el inconveniente es que tienes un menú totalmente personalizado en lugar de solo usar algunos complementos actualizables.
Brian Peat
Estoy bastante seguro de que Brian tiene razón. Debe anular el menú y reescribir sus funciones, o debe utilizar un tercero. NoNumber sería su opción de tercero menos hinchada.
Faye
¿Cómo está generando un enlace al módulo en este momento? ¿Tiene un enlace de trabajo al menú?
David Fritsch

Respuestas:

4

Aquí hay una alternativa para cargar el módulo de búsqueda en su menú. Requiere un par de pasos simples:

1. Anula tu mod_menumódulo

  • Cree una anulación en su carpeta de plantillas \templates\YOURTEMPLATE\html\mod_menu\default_url.php.
  • Copie los siguientes contenidos al archivo:

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

He agregado una if-elsedeclaración que comienza en la línea 29, que verifica si el título del elemento del menú es "CustomSearchBox". Si ese es el caso, se carga la posición del módulo "CustomSearchBox". Si no, se devuelve el elemento de menú normal. Puede cambiar "CustomSearchBox" a lo que quiera, pero si recuerda usar el mismo valor en los siguientes pasos.

2. Crear un nuevo módulo de búsqueda

Cree el módulo de búsqueda y configure los parámetros según sea necesario (sugiero ocultar el título del módulo).

Publique el módulo en la posición personalizada "CustomSearchBox"

3. Crear un nuevo elemento de menú

El elemento del menú puede ser de cualquier tipo, sugiero "URL externa" y el nombre DEBE ser "CustomSearchBox".

¡Guarde su elemento de menú, y todo el elemento de menú será reemplazado por el cuadro de búsqueda!

Avísame si algo no está claro.

johanpw
fuente
Gracias por la respuesta. Intenté usar su técnica con una posición de módulo que ya tenía en mi plantilla (LOGO) pero no pareció funcionar. ¿Debo intentar crear una posición "CustomSearchBox" en mi plantilla y usar esa?
web-tiki
Sí, debe crear una posición personalizada "CustomSearchBox" y usarla. O puede cambiarlo en el código anterior aquí: $linktype == "CustomSearchBox"y aquí$position = 'CustomSearchBox';
Dmitry Rekun
En realidad, no tiene que crear la posición (en sus archivos index.php o template.xml). Simplemente escriba CustomSearchBoxen el campo de posición del módulo y presione Intro.
johanpw
Ok, finalmente tuve tiempo de superar esto, tuve que modificar tu código para que funcione. 1 / Por alguna razón no funcionaba porque estaba usando una imagen en el elemento del menú. 2 / Cambié la línea 30 de su código a $document = JFactory::getDocument();. Ahora funciona, pero tendré que encontrar la manera de volver a agregar mi imagen.
web-tiki
Ajusté un poco más: basé la declaración if en la clase de elemento del menú CSS en lugar del título del elemento del menú y agregué la $linktypefunción echo. El código está visible aquí: phpad.org/1645824385 . Gracias por señalarme en la dirección correcta. Esto es algo que quería lograr desde hace algún tiempo. ¡Es increíble! :)
web-tiki
1

Aunque diga que no desea usar extensiones de terceros, tengo una solución que usa RokCandy de RocketTheme . Es un componente de fragmento pequeño que hace que sea muy fácil agregar el campo de búsqueda en el menú. Simplemente instale el complemento y cree una nueva macro como esta:

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

Guardar y cerrar.

Ahora cree un elemento de menú para el cuadro de búsqueda (sugiero External URLcomo tipo, pero cualquier tipo de elemento de menú servirá), y en el campo Título , agregue [searchfield][/searchfield]:

Campo de búsqueda en el menú

RokCandy reemplazará el título con el código en la macro, y obtendrá un campo de búsqueda en el menú:

Resultado

johanpw
fuente