Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

David Figueiredo

Mostrar Modulo dentro de componente

Recommended Posts

Olá David,

 

Uma maneira simples de carregar um módulo dentro de um componente é utilizar o plugin que já vem com o joomla "loadmodule". O que ele faz é, antes de o joomla renderizar o componente, verificar o conteúdo do mesmo à procura de uma palavra-chave que indica à ele a necessidade de carregar um módulo ali. Se houver esta palavra chave, ele renderiza o módulo também. Senão, ele continua com o componente simplesmente.

 

No caso esta "palavra" (seria mesmo uma expressão) que você deve usar para indicar à este plugin que você quer que um módulo seja renderizado naquela posição é a seguinte:

 

{loadposition position}

Note que você não diz para o joomla qual módulo quer carregar e sim qual a posição. Ele vai renderizar todos os módulos que estiverem nesta posição para a determinada página onde está sendo exibido o componente. Note também que você deve trocar o 'position' pela posição criada no seu template. :)

 

Só para deixar claro, quando eu disse mais acima que o Joomla procura no conteúdo do componente, ele não vai olhar o código que define o comportamento do componente. Ele vai olhar é mesmo o conteúdo, ou seja, os dados com os quais o componente trabalha e os exibe, que geralmente são inseridos pelo administrador, etc. :P

 

Esta é, a meu ver, uma solução muito simples e bem rápida de ser usada. Existem outras formas mais precisas de se carregar um módulo dentro de um componente, mas você precisaria trabalhar com PHP. Se quiser, podermos aprofundar a discussão sobre estas maneiras também.

 

Depois deixa a gente saber se isto é o suficiente para o que você estava querendo ok?

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá beghelli,

 

gostei da sua solução, mais tem um porem: Como vou fazer isso diretamente no código do meu componente?

 

Eu ja tinha encontrado essa solução mais sem se fala em carregar modulo dentro de um artigo e ñ dentro do componente. então vamos a 3 pontos:

 

1º - Se essa solução realmente é válida para um componente então como exatamente usá-la?

2º - Se ñ, vamos discutir essas outras soluções para encontrarmos uma saída;

3º - Independente dessa solução servir ou não vamos discutir outras soluções, para o meu problema essa solução serve mais sempre é bom aprendermos mais.

Estou a disposição para discutirmos esses assuntos. espero tenhamos bons resultados.

 

Desde já agradeço por ter me ajudado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu ja tinha encontrado essa solução mais sem se fala em carregar modulo dentro de um artigo e ñ dentro do componente.

Justamente, o artigo é uma visualização que é gerida por um componente do joomla. :)

 

Para qualquer componente você pode usar esta solução, basta você incluir no conteúdo do seu componente a expressão que disse acima.

 

Com relação às outras alternativas, posso já te adiantar um link de uma discussão no fórum do joomla exatamente sobre isso:

 

http://forum.joomla.org/viewtopic.php?f=231&t=247191

(usa o google para tradução se precisar, já dá uma ajuda boa).

 

Eu ainda não testei qual seria a melhor solução, talvez o Edultra possa ajudar a gente aqui. :)

 

Mas de qualquer forma eu vou, hoje à noite, mexer no joomla e verificar isso. Amanhã posso te dar um parecer menos irresponsável. :P

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

David,

 

Desculpa a demora, fui adiando o estudo e só peguei mesmo no fim de semana... :)

 

Antes de te mostrar os resultados a que cheguei, quero que saiba que não são conclusivos. Ainda estou estudando o Joomla e programação inclusive, portanto o que descrevo aqui pode não ser a melhor solução.

 

Eu tentei ao máximo, antes de postar esta mensagem, seguir o padrão MVC do Joomla para a criação de componentes. Vamos então ao que consegui entender:

 

1 - Para que você consiga renderizar um módulo dentro de um componente através de código você deve antes de tudo criar o módulo e associá-lo à página que leva ao seu componente. Caso isto não seja realizado você não carregará o módulo.

 

2 - O modelo MVC padroniza a organização do código, separando o código que define a lógica da apresentação dos dados do que define a lógica de manipulação destes dados. Desta forma fica muito mais simples a atualização e manutenção do sistema. Pensando nisso, eu imagino (e aqui eu ficaria muito satisfeito se algum usuário de joomla mais experiente nos desse sua opinião também) que o código que você vai ter que inserir para "pegar" o módulo tenha que ficar dentro do Model do seu componente. Eu acredito que seria o lugar mais lógico, já que o Model é o responsável por lidar com o conteúdo do componente, acessá-lo, editá-lo e repassá-lo à View quando for solicitado.

 

3 - Se a função que "pega" o módulo que você quer renderizar está no Model do seu componente, então para você renderizar você precisa fazer com que a View do seu componente chame esta função no Model e "jogue" o resultado para o Template.

 

4 - Levando em conta estes tópicos acima, eu organizei o código desta forma (leve em conta que meu componente se chame 'hello' e que o módulo que eu estou querendo carregar se chame 'welcome'):

 

site/models/hello.php

function getModule($type, $title)
    {
    	$document = &JFactory::getDocument();
	$renderer = $document->loadRenderer('module');
        $module = JModuleHelper::getModule($type, $title);
        $html = $renderer->render($module);
        return $html;
    }
Esta função (getModule()) eu criei para ser reutilizada, caso você necessite carregar mais de um módulo dentro do componente. Basicamente o que ela faz é carregar o documento atual criado pelo Joomla; depois carrega o renderizador de módulos deste documento; carrrega o módulo em questão utilizando o tipo do módulo e o seu título; renderiza o conteúdo deste módulo para uma variável e retorna esta variável.

 

site/views/hello/view.html.php

function display($tpl = null)
    {
        $model = &$this->getModel();
        $welcomeModule = $model->getModule('custom', 'welcome');
    	$this->assignRef( 'welcomeModule', $welcomeModule);    	
        
        
        parent::display($tpl);
    }
Note que o conteúdo que a minha View 'joga' para o meu template é apenas o módulo. Isto é apenas para simplificar, o importante é você criar a referência para o seu Model (1ª linha), chamar a função getModule() e 'jogar' o conteúdo carregado pelo Model para o Template (3ª linha).

 

site/views/hello/tmpl/default.php

<?php echo $this->welcomeModule; ?>
Aqui, novamente para simplificar, o template só tem uma linha: ele vai exibir o conteúdo carregado pelo Model e passado para o template através da View.

 

 

Para finalizar, algumas observações:

 

- a função JModuleHelper::getModule($type, $title) vai procurar o módulo que está ativo naquela página em questão, que é a do componente. Se o módulo não estiver ativo para aquela página, a função retorna vazio.

 

- Ainda para a função JModuleHelper::getModule($type, $title), o tipo do módulo pode ser escrito tanto com os caracteres 'mod_' ou sem eles. Apenas para o módulo custom, é que você precisa escrever apenas 'custom', sem o 'mod_'. Isso acontece pois o módulo custom não possui um arquivo mod_custom.php, como os outros módulos possuem. Se você usa o 'mod_' para especificar o tipo de módulo, o Joomla vai utilizar um procedimento para carregar o módulo que necessita deste arquivo presente para que o mesmo seja renderizado. Como não existe, o resultado retornado é vazio.

 

- Além disso, se você especificar também o título do módulo, você consegue renderizar exatemente aquele que estava querendo. Isto é legal pois você pode ter vários módulos na mesma posição e renderizar apenas um, o que não acontece com o uso do plugin loadModules, descrito mais acima.

 

- Se você desativar o módulo que está sendo renderizado no componente, ele pára de ser renderizado também. Isso é muito legal pq você ainda mantém o controle do administrator sobre o módulo em questão, e pode facilmente retirá-lo do seu componente, desativando-o.

 

- Para que o seu site não exiba duas vezes o mesmo módulo (uma vez no componente e outra em alguma posição qualquer que ele esteja definido), crie uma posição no xml do template que você não use no seu index.php. Desta forma você poderá associar o módulo à página do seu componente, tornando 'pegável' ao Joomla, sem exibí-lo duplicado. Você pode deixar esta posição (geralmente 'user + algum número') apenas para estes módulos que você já sabe que utilizará em componentes.

 

Usei várias fontes de pesquisa para escrever esta mensagem, seguem as duas mais importantes e significantes:

 

http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1

http://forum.joomla.org/viewtopic.php?f=231&t=247191

 

Espero que ajude. Se tiver alguma dúvida, posta aí.

 

Abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.