web-dev-qa-db-fra.com

Content Plugin 'charge' plusieurs fois sur la page de catégorie

J'ai un plugin où j'essaye d'instancier une nouvelle classe, mais chaque fois que le plugin était activé, la page continuait de mourir en disant que l'objet existait déjà. Après enquête, j'ai découvert que cela ne se produit que dans la page Catégorie et non dans la page Article.

J'ai donc tout supprimé du code et le code suivant:

class plgContentFoobar extends JPlugin
{
  public function onContentPrepare($context, &$row, &$params, $page = 0)
  {
    echo 1;
  }
}

Sur la page Article, il ne sort qu'une fois comme prévu, mais sur une page de catégorie; il sort 15 fois. Dois-je savoir quoi que ce soit qui cause cela sur les pages de catégorie?

2
sifu

Bien, la fonction est exécutée 15 fois et vous avez 14 articles affectés à une catégorie.

Si vous ouvrez le fichier suivant:

composants\com_content\views\article\view.html.php

vous voyez l'événement distribué sur la ligne 161:

$dispatcher->trigger('onContentPrepare', array ('com_content.article', &$item, &$item->params, $offset));

Puis dans ce fichier:

composants\com_content\views\category\view.html.php

Vous le voyez également envoyé sur la ligne 106:

$dispatcher->trigger('onContentPrepare', array ('com_content.category', &$item, &$item->params, 0));

Comme vous êtes dans la vue des catégories et que vous avez 14 articles affectés à la catégorie, le onContentPrepare est distribué 14 fois, puis ne fois à nouveau à partir de la vue des catégories.

3
Lodder

Les plugins Contnet se déclenchent sur chaque portion de contenu - chaque module, chaque article sur une page de blog, etc. Si vous souhaitez remplacer quelque chose qui ne gêne pas l'exécution d'un plugin, vous devez utiliser un plugin système et onAfterRender

    function onAfterRender() {
            $body = JResponse::getBody();
            // replace what you need in the $body
            JResponse::setBody($body);
   }
1
Gruz