Módulo como item de menu

11

Preciso inserir o módulo de pesquisa como um item de menu (módulo de menu padrão).

Eu preciso desta saída:

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

Meu primeiro pensamento seria duplicar o módulo de menu padrão duas vezes:

  1. Um para exibir itens de menu antes do módulo de pesquisa sem a </ul>marca de fechamento
  2. Outro para exibir itens de menu após o módulo de pesquisa sem a <ul>tag de abertura

E insira o módulo de pesquisa entre eles. Esta não parece ser a maneira mais fácil e sustentável de alcançar meu objetivo, pois exige:

  • 3 posições de módulo para o menu
  • 2 menus diferentes no gerenciador de menus

Sei que poderia usar alguns dos módulos do mega menu para fazer isso, mas gostaria de evitar extensões de terceiros e usar um código personalizado que eu possa controlar.

Como posso adicionar um módulo como um item de menu no menu padrão?

web-tiki
fonte
Você pode usar dois menus diferentes + uma pesquisa com alguns truques de CSS, mas se quiser exatamente a estrutura acima, considere jQueryfunções como append()ou prepend()que não funcionarão em navegadores desabilitados para javascript.
Farahmand
Eu preferiria não usar jQuery para mover os elementos e usar a técnica que eu descrito na pergunta se não há maneira melhor ...
web-tiki
1
Eu suspeito que você precisará usar uma extensão de mega menu ou um sistema do tipo snippet que carregará um módulo no menu suspenso, puxando-o com um código de snippet. Snippets não numerados combinados com módulos não numerados em qualquer lugar provavelmente funcionariam. O sistema de menu de ações simplesmente não foi criado para isso. Quero dizer, acho que é possível simplesmente substituir a saída do menu, mas a desvantagem é que você tem um menu totalmente personalizado em vez de apenas usar alguns plugins atualizáveis ​​disponíveis no mercado.
Brian turfa
Certamente Brian está certo. Você precisa substituir o menu e reescrever suas funções, ou precisa utilizar um terceiro. NoNumber seria sua opção de terceiros menos inchada.
Faye
Como você está gerando um link para o módulo agora? Você tem um link de trabalho para o menu?
David Fritsch

Respostas:

4

Aqui está uma alternativa para carregar o módulo de pesquisa no seu menu. Requer algumas etapas simples:

1. Substitua seu mod_menumódulo

  • Crie uma substituição na sua pasta de modelos \templates\YOURTEMPLATE\html\mod_menu\default_url.php.
  • Copie o seguinte conteúdo para o arquivo:

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

Eu adicionei uma if-elsedeclaração começando na linha 29, que verifica se o título do item de menu é "CustomSearchBox". Se for esse o caso, a posição do módulo "CustomSearchBox" é carregada. Caso contrário, o item de menu normal será retornado. Você pode alterar "CustomSearchBox" para o que quiser, mas se lembrar de usar o mesmo valor nas etapas a seguir.

2. Crie um novo módulo de pesquisa

Crie o módulo de pesquisa e defina os parâmetros conforme necessário (sugiro ocultar o título do módulo).

Publique o módulo na posição personalizada "CustomSearchBox"

3. Crie um novo item de menu

O item do menu pode ser de qualquer tipo, sugiro "URL externo" e o nome DEVE ser "CustomSearchBox".

Salve o item do menu e o item inteiro será substituído pela caixa de pesquisa!

Deixe-me saber se algo não está claro.

johanpw
fonte
Thx pela resposta. Tentei usar sua técnica com uma posição de módulo que eu já tinha no meu modelo (LOGO), mas não parecia funcionar. Devo tentar criar uma posição "CustomSearchBox" no meu modelo e usá-lo?
web-tiki
Sim, você deve criar a posição personalizada "CustomSearchBox" e usá-la. Ou você pode alterá-lo no código acima aqui: $linktype == "CustomSearchBox"e aqui$position = 'CustomSearchBox';
Dmitry Rekun
Na verdade, você não precisa criar a posição (nos arquivos index.php ou template.xml). Simplesmente escreva CustomSearchBoxno campo de posição do módulo e pressione enter.
Johanpw 23/09
Ok, finalmente tive tempo de resolver isso, tive que ajustar seu código para fazê-lo funcionar. 1 / Por alguma razão, não estava funcionando porque eu estava usando uma imagem no item de menu. 2 / Alterei a linha 30 do seu código para $document = JFactory::getDocument();. Agora funciona, mas terei que encontrar uma maneira de adicionar minha imagem novamente.
Web-tiki
Ajustou um pouco mais: Baseei a instrução if na classe de item de menu CSS em vez de no título do item de menu e adicionei o $linktypena função de eco. O código é visível aqui: phpad.org/1645824385 . Obrigado por me indicar a direção certa. Isso é algo que eu queria alcançar há algum tempo, agora é incrível! :)
web-tiki
1

Embora você diga que não deseja usar extensões de terceiros, eu tenho uma solução que usa o RokCandy do RocketTheme . É um pequeno componente de trecho que facilita a adição do campo de pesquisa no menu. Basta instalar o plug-in e criar uma nova 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">

Salvar e fechar.

Agora crie um item de menu para a caixa de pesquisa (sugiro External URLcomo tipo, mas qualquer tipo de item de menu serve) e, no campo Título , adicione [searchfield][/searchfield]:

Campo de pesquisa no menu

O RokCandy substituirá o título pelo código na macro e você obterá um campo de pesquisa no menu:

Resultado

johanpw
fonte