Module comme élément de menu

11

J'ai besoin d'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 pensée serait de dupliquer le module de menu par défaut deux fois:

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

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 modules de menu méga pour ce faire, mais je voudrais éviter les extensions tierces et utiliser du code personnalisé que je peux contrôler.

Comment puis-je ajouter un module comme élément de menu dans le menu par défaut?

web-tiki
la source
Vous pouvez utiliser deux menus différents + une recherche avec quelques astuces CSS mais si vous voulez exactement la structure ci-dessus, vous pouvez envisager des jQueryfonctions comme append()ou prepend()qui ne fonctionneront pas sur les navigateurs désactivés par javascript.
Farahmand
Je préfère ne pas utiliser jQuery pour déplacer des éléments et utiliser la technique que j'ai décrite dans la question s'il n'y a pas de meilleur moyen ...
web-tiki
1
Je suppose que vous devrez soit utiliser une extension de menu méga, soit un système de type d'extrait qui chargera un module dans la liste déroulante en le tirant avec un code d'extrait. Des extraits non numériques combinés à des modules non numériques n'importe où fonctionneraient probablement. Le système de menu de stock n'est tout simplement pas conçu pour cela. Je veux dire, je suppose qu'il est possible de simplement remplacer la sortie du menu, mais l'inconvénient est que vous avez un menu entièrement personnalisé au lieu d'utiliser simplement des plugins évolutifs disponibles.
Brian Peat
Je suis sûr que Brian a raison. Vous devez soit remplacer le menu et réécrire ses fonctions, soit utiliser un tiers. NoNumber serait votre option tierce moins gonflée.
Faye
Comment générez-vous actuellement un lien vers le module? Avez-vous un lien de travail vers le menu?
David Fritsch

Réponses:

4

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

1. Remplacez votre mod_menumodule

  • 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é une if-elsedé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 souvenez d'utiliser la même valeur dans les étapes suivantes.

2. Créez un nouveau module de recherche

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

Publiez le module dans la position personnalisée "CustomSearchBox"

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

L'élément de menu peut être de 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.

johanpw
la source
Merci pour la réponse. J'ai essayé d'utiliser votre technique avec une position de module que j'avais déjà dans mon modèle (LOGO) mais cela ne semblait pas fonctionner. Dois-je essayer de créer une position "CustomSearchBox" dans mon modèle et l'utiliser?
web-tiki
Oui, vous devez créer une position personnalisée "CustomSearchBox" et l'utiliser. Ou vous pouvez le changer dans le code ci-dessus ici: $linktype == "CustomSearchBox"et ici$position = 'CustomSearchBox';
Dmitry Rekun
Vous n'avez pas réellement besoin de créer la position (dans vos fichiers index.php ou template.xml). Écrivez simplement CustomSearchBoxdans le champ de position du module et appuyez sur Entrée.
johanpw
Ok, j'ai finalement eu le temps de passer au travers, j'ai dû peaufiner votre code pour le faire fonctionner. 1 / Pour une raison quelconque, ce n'était pas wotking parce que j'utilisais et image dans l'élément de menu. 2 / J'ai changé la ligne 30 de votre code en $document = JFactory::getDocument();. Maintenant, cela fonctionne, mais je devrai trouver un moyen d'ajouter à nouveau mon image.
web-tiki
Quelques modifications supplémentaires: j'ai basé l'instruction if sur la classe d'élément de menu CSS plutôt que sur le titre de l'élément de menu et j'ai ajouté la fonction $linktypedans l'écho. Le code est visible ici: phpad.org/1645824385 . Merci de m'avoir orienté dans la bonne direction c'est quelque chose que je voulais réaliser depuis un certain temps maintenant c'est génial! :)
web-tiki
1

Bien que vous disiez que vous ne voulez pas utiliser d'extensions tierces, j'ai une solution qui utilise RokCandy de RocketTheme . Il s'agit d'un petit composant d'extrait qui permet d'ajouter très facilement le 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.

Créez maintenant un élément de menu pour la zone de recherche (je suggère External URLcomme type, mais n'importe quel type d'élément de menu fera l'affaire), et dans le champ Titre , ajoutez [searchfield][/searchfield]:

Champ de recherche dans le menu

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

Résultat

johanpw
la source