2

I have a plugin where I am trying to instantiate a new class but every time the plugin was enabled, the page kept dying saying the object already exists. Upon investigating, I found out that it only happens in Category Page and not Article page.

So I removed everything in the code and had the following code:

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

On the Article page, it just outputs once as expected but on a category page; it outputs 15 times. Is there anything I need to be aware which is causing this on the category pages?

  • How many articles are displayed on the category page? – Lodder Jun 23 '16 at 13:10
  • @Lodder 14 articles on that page. – sifu Jun 23 '16 at 13:25
3

Right, so the function executes 15 times and you have 14 articles assigned to a category.

If you open the following file:

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

you see the event dispatched on line 161:

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

Then in this file:

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

You also see it dispatched on line 106:

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

As you are on the category view and have 14 articles assigned to the category, the onContentPrepare is dispatched 14 times and then once again from the category view.

  • That explains it. Marking it as an answer but is it possible to dispatch the onContentPrepare just once? What I am trying to do requires the code to run just once otherwise it fails which explains why it worked on Article Page and not Category page. – sifu Jun 23 '16 at 13:54
  • It would be best to create a new question, showing the full code your using – Lodder Jun 23 '16 at 14:05
1

Contnet plugins fire on each content portion - each module, each article on a blog page and so on. If you want to replace something unsing one run of a plugin you should use a system plugin and onAfterRender

    function onAfterRender() {
            $body = JResponse::getBody();
            // replace what you need in the $body
            JResponse::setBody($body);
   }
  • This is the appropriate answer for what I wanted to do but for the question I asked, I will keep the 'Marked Answer' as the one above. – sifu Jun 28 '16 at 14:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.