web-dev-qa-db-fra.com

Appliquez le même code sur PHP au contenu du composant et de chaque module

J'ai du code sur PHP quelque chose comme:

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

echo $newstring;

Je dois appliquer ce code (peut-être en tant que classe ou d'une manière ou d'une autre) au contenu du composant et à chaque module existant de la page, quelque chose comme:

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

Le deuxième code est seulement quelque chose comme ce que je veux dire. C'est à dire. car les anciennes chaînes doivent être composant et chaque module et ils doivent être répercutés en tant que nouvelles chaînes sur ses positions sur la page.

Quelqu'un peut-il écrire un exemple sur la manière de créer un plugin Joomla simple à cette fin? Merci

5
stckvrw

Ok, j'ai découvert comment modifier un composant et n'importe quel module avec un plugin système:

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

Il existe plusieurs façons de modifier le contenu de Joomla avec un plugin:

  • Un composant peut appeler le mécanisme du plug-in, par exemple, com_content utilise l'événement "onContentPrepare". Vous pouvez l'utiliser pour modifier le contenu de com_content. Les plugins pour cela sont dans plugins/content, mais c'est un comportement courant, le plugin fonctionnerait dans n'importe quel dossier.

  • Un plug-in système peut prendre la sortie de n'importe quel composant et le modifier, par exemple avec des expressions régulières.

  • Un plugin système peut aussi modifier tout le code HTML

  • Un module appelle l'événement "onRenderModule" afin que vous puissiez l'utiliser pour modifier la sortie du module.

Vous devez donc créer un plug-in pour les composants et un pour les modules et vous pouvez partager votre code, par exemple en installant une bibliothèque.

Un exemple plus détaillé:

Donc, tout mettre ensemble:

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

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

}

Ceci remplacerait toutes les occurrences de foo par bar dans n’importe quel module.

3
jdog