web-dev-qa-db-fra.com

Module comme élément de menu

Je dois insérer le module de recherche comme élément de menu (module de menu par défaut).

J'ai besoin de cette sortie:

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

Ma première idée serait de dupliquer deux fois le module de menu par défaut:

  1. Une pour afficher les éléments de menu avant le module de recherche sans la fermeture </ul> tag
  2. Une autre pour afficher les éléments de menu après le module de recherche sans l'ouverture <ul> tag

Et insérez le module de recherche entre eux. Cela ne semble pas être le moyen le plus simple et le plus facile à atteindre pour atteindre mon objectif car il nécessite:

  • 3 positions de module pour le menu
  • 2 menus différents dans le gestionnaire de menus

Je sais que je pourrais utiliser certains des méga-menus pour cela, mais j'aimerais éviter les extensions tierces et utiliser un code personnalisé que je peux contrôler.

Comment puis-je ajouter un module en tant qu'élément de menu dans le menu par défaut?

11
web-tiki

Voici une alternative pour charger le module de recherche dans votre menu. Cela nécessite quelques étapes simples:

1. Remplacez votre mod_menu module

  • Créez un remplacement dans votre dossier de modèles \templates\YOURTEMPLATE\html\mod_menu\default_url.php.
  • Copiez le contenu suivant dans le fichier:

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

J'ai ajouté un if-else déclaration à partir de la ligne 29, qui vérifie si le titre de l'élément de menu est "CustomSearchBox". Si tel est le cas, la position du module "CustomSearchBox" est chargée. Sinon, l'élément de menu normal est renvoyé. Vous pouvez remplacer "CustomSearchBox" par tout ce que vous voulez, mais si vous vous en souvenez, utilisez la même valeur dans les étapes suivantes.

2. Créer un nouveau module de recherche

Créez le module de recherche et définissez les paramètres nécessaires (je suggère de masquer le titre du module).

Publier le module à la position personnalisée "CustomSearchBox"

3. Créer un nouvel élément de menu

L'élément de menu peut être n'importe quel type, je suggère "URL externe" et le nom DOIT être "CustomSearchBox".

Enregistrez votre élément de menu, et l'élément de menu entier sera remplacé par le champ de recherche!

Faites-moi savoir si quelque chose n'est pas clair.

4
johanpw

Bien que vous disiez que vous ne souhaitiez pas utiliser d'extensions tierces, j'ai une solution qui utilise RokCandy de RocketTheme . C'est un petit composant d'extrait qui facilite l'ajout du champ de recherche dans le menu. Installez simplement le plugin et créez une nouvelle macro comme celle-ci:

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

Sauver et fermer.

Maintenant, créez un élément de menu pour le champ de recherche (je suggère External URL en tant que type, mais tout type d’élément de menu convient), et dans le champ Titre , ajoutez [searchfield][/searchfield]:

Searchfield in menu

RokCandy remplacera le titre par le code dans la macro et vous obtiendrez un champ de recherche dans le menu:

Result

1
johanpw