ti-enxame.com

Como exibir o módulo na área de componentes

Geralmente, preciso criar um item de menu que exiba um módulo na área de componentes, sem nenhum outro conteúdo.

A maneira como resolvo isso é criar um novo artigo e adicionar apenas {loadposition mymodule} no conteúdo do artigo. Em seguida, crio um item de menu Artigo único para o artigo. Isso é bom para um único módulo, mas e se eu tiver 20 módulos diferentes que quero exibir dessa maneira? Eu teria que criar 20 módulos, 20 artigos (quase vazios) e 20 itens de menu.

Existem outras maneiras de exibir um módulo (e nada mais) na área de componentes de um modelo? Truques? Hacks? Idéias?

12
johanpw

Eu fiz isso criando uma posição do módulo no mesmo local que o componente e verificando se um módulo está presente nessa posição e exibi-lo; caso contrário, vá para o componente:

Exemplo de código:

<main id="content" role="main" class="main">
 <?php 
 if ($this->countModules('myposition')) 
   { ?>
     <jdoc:include type="modules" name="myposition" style="xhtml" />
 <?php } 
  else 
  { ?>
     <jdoc:include type="component" /> 
  <?php } ?>
</main>

Então, quando quero exibir um módulo em vez de componente em uma página, crio o módulo para atribuí-lo a esse item de menu e pronto.

Uma pequena nota lateral:

Para maior comodidade e melhor clareza, sugiro nomear essa posição do módulo como "módulo de conteúdo", "módulo principal" ou "compomodule". Qualquer coisa que lembrará que qualquer módulo posicionado ali substituirá a saída do componente.

9
FFrewin

Para aprimorar as respostas dadas aqui:

Para incluir uma posição de módulo na visualização do componente e carregar os módulos, basta adicionar

echo JHtml::_('content.prepare', '{loadposition yourmodulposition}');

para o arquivo de visualização.

A segunda string com a tag abreviada da posição de carregamento pode ser substituída por uma var que contém mais html, se necessário. Você não precisa escrever essa linha para cada nova posição do módulo:

$outputModules = '<strong>Some Html</strong>'
                 .'{loadposition yourmodulposition1}'
                 .'{loadposition yourmodulposition2}';


echo JHtml::_('content.prepare', $outputModules);

(Eu sei que essa não é uma resposta direta à pergunta dos autores.)

8
Dennis Heiden

Aqui está uma solução simples e funcional. Eu tentei com o jdoc: include, mas não funcionou.

 $ document = JFactory :: getDocument (); 
 $ renderer = $ document-> loadRenderer ('modules'); 
 $ position = 'custompositionname'; 
 $ options = array ('style' => 'raw'); 
 echo $ renderer-> render ($ position, $ options, null); 
2
user2589739

Crie um artigo em branco.

Crie um item de menu selecionando o artigo que você criou.

Crie o módulo na posição não utilizada, defina a atribuição do menu apenas nas páginas selecionadas, selecione apenas o item de menu acima.

Uma vez que este estava no topo, eu daria a minha resposta, é isso que eu faço.

0
Mythic

Tente isto

jimport('joomla.application.module.helper');
    // this is where you want to load your module position
    $modules = JModuleHelper::getModules('header'); 
    foreach($modules as $module)
    {
    echo JModuleHelper::renderModule($module);
    }

ref: https://stackoverflow.com/questions/12225538/how-we-include-a-joomla-module-in-a-component-view-in-joomla

0
Sh4msi

A maneira mais limpa de fazer isso é usando: http://extensions.joomla.org/extension/m2c-module-to-component

0
Lala

Eu tive que fazer o mesmo no meu site para demonstrações de extensão e botões de download, no entanto, com toda a honestidade, acho que manter as coisas separadas é, de certa forma, melhor, pois é mais fácil de gerenciar. Não só eu tenho certeza que não há como alcançar o que você está procurando através do CMS real, apenas código rígido (não diga mais nada).

0
Lodder

Primeiro, de acordo com a sua pergunta, você já está criando 20 módulos e 20 itens de menu; portanto, a única coisa extra que você precisa fazer é criar um item de conteúdo de uma linha para cada módulo. Se isso é realmente tão oneroso, vá em frente com a idéia de @ FFrewin. É um pouco hacky, mas vai funcionar.

Pessoalmente, eu iria com os itens de conteúdo. Na verdade, eu fiz isso quando estava construindo um sistema com caixas de diálogo pop-up que também queria que o trabalho estivesse sem o js ativado. Coloquei o conteúdo da caixa de diálogo em um módulo custom_html, manipulei o módulo a ser revelado e posicionado quando um link foi clicado. E também apontei o link para um item de conteúdo, incluindo o módulo como você descreveu. Se js estiver ativado, o link não será seguido e a caixa de diálogo será revelada. Se js foi desativado, o link foi seguido e o conteúdo da caixa de diálogo foi exibido como conteúdo. E o conteúdo estava em um só lugar, então eu não estava mantendo duas cópias separadas do conteúdo.

0
Arlen