ti-enxame.com

Aplique o mesmo código em PHP no conteúdo do componente e em cada módulo

Eu tenho algum código em PHP algo como:

$oldstring = ...;
...
$pattern = ...;
$newstring = preg_replace_callback($pattern, ... {...}, $oldstring);

echo $newstring;

Preciso aplicar esse código (talvez como classe ou de alguma forma) ao conteúdo do componente e a cada módulo existente na página, algo como:

$doc = JFactory::getDocument();

$oldcomponent = $doc->getBuffer('component', '', array('class'=> ''));
// the same code for applying
echo $newcomponent;

$oldmodule1 = $doc->getBuffer('modules', 'position-1', array('style'=> ''));
// the same code for applying
echo $newmodule1;

$oldmodule2 = $doc->getBuffer('modules', 'position-2', array('style'=> ''));
// the same code for applying
echo $newmodule2;

...

$oldmoduleN = $doc->getBuffer('modules', 'position-N', array('style'=> ''));
// the same code for applying
echo $newmoduleN;

O segundo código é apenas algo como o que quero dizer. I.e. como strings antigas devem ser componentes e cada módulo e devem ecoar como novas strings em suas posições na página.

Alguém pode escrever um exemplo de como criar um simples plugin Joomla para esse fim. obrigado

5
stckvrw

Ok, eu descobri como modificar o componente e qualquer módulo com um plugin do sistema:

class PlgSystemSomename extends JPlugin
{
    public function onAfterDispatch()
    {
        $doc = JFactory::getDocument();
        $oldComponent = $doc->getBuffer('component');
        $db = JFactory::getDBO();
        $query = $db->getQuery(true);
        $query->select($db->quoteName('position'))
            ->from($db->quoteName('#__modules'))
            ->where($db->quoteName('published')." = 1 AND ".$db->quoteName('client_id')." = 0");
        $db->setQuery($query);
        $list = $db->loadObjectList();
        ...
        $pattern = ...;
        $newComponent = preg_replace_callback($pattern, ... {...}, $oldComponent);
        if(count($list) > 0) {
            foreach($list as $module) {
                $newModule = preg_replace_callback($pattern, ... {...}, $doc->getBuffer('modules', $module->position, array('style'=> 'xhtml')));
                $doc->setBuffer($newModule, 'modules', $module->position, array('style'=> 'xhtml'));
            }
        }

        $doc->setBuffer($newComponent, 'component');
        return true;
    }
}
1
stckvrw

Existem várias maneiras de modificar o conteúdo do Joomla com um plugin:

  • Um componente pode chamar o mecanismo do plug-in, por exemplo, com_content usa o evento "onContentPrepare". Você pode usar isso para modificar o conteúdo com_content. Os plugins para isso estão em plugins/conteúdo, mas isso é apenas um comportamento comum, o plug-in funcionaria em qualquer pasta.

  • Um plugin do sistema pode pegar a saída de qualquer componente e modificá-lo, por exemplo, com expressões regulares.

  • Um plugin do sistema também pode modificar todo o HTML

  • Um módulo chama o evento "onRenderModule", para que você possa usá-lo para modificar a saída do módulo.

Portanto, você precisa criar um plug-in para componentes e um para módulos e pode compartilhar seu código, por exemplo, instalando uma biblioteca.

Um exemplo mais detalhado:

Então, juntando tudo:

public function onRenderModule($module, $attribs)
{
    $modulePosition = $attribs['name']
    $moduleStyle = $attribs['style']

    $module->content = str_replace('foo','bar',$module->content;

}

Isso substituiria todas as ocorrências de foo por bar em qualquer módulo.

3
jdog