Hi guys, I'm not sure if this is the right place to post these kind of questions. I didn't see a "developer Joomla 4" section on Joomla forum.. if there's somewhere else I should be posting this, please let me know.
I'm migrating my custom extensions to Joomla 4. One issue I am facing is that plugins don't seem to be loaded.
I'm using the JPluginHelper::importPlugin('myplugingroup');
syntax to load the plugins, as in Joomla 3, and then JFactory::getApplication->triggerEvent('eventname')
to trigger an event (this is the new J4 syntax)
However, importPlugin
does not seem to be importing anything.
Is there something I'm missing? is there an easy way to see if the plugins are being loaded into the app? (JDispatcher class does not seem to exist anymore...)
Joomla 4 Alpha 3
Labels |
Added:
?
|
Title |
|
Category | ⇒ | Plugins |
Labels |
Added:
J4 Issue
|
Status | New | ⇒ | Information Required |
Did you test EventDispatcher instead ? (JDispatcher was already deprecated in Joomla 3 i think)
use Joomla\Event\Dispatcher as EventDispatcher;
OR PluginHelper::importPlugin('myplugingroup'); instead of JPluginHelper::importPlugin('myplugingroup');
Doesn't seem to make a difference...
How would you use EventDispatcher, exaclty? I'm trying this:
$dispatcher = new EventDispatcher();
$results = $dispatcher->triggerEvent(.....
but no results...
use Joomla\CMS\Factory;
use Joomla\CMS\Plugin\PluginHelper;
PluginHelper::importPlugin('myplugingroup');
Factory::getApplication()->triggerEvent();
Instantiating a new dispatcher is going to give you just that, a new (empty) dispatcher. If you want the one loaded with all the plugins, use the dispatcher loaded into the application (and the best part is that snippet is B/C to 3.x).
If importPlugin()
isn't doing anything that is a bug unrelated to the event dispatching.
thanks, this code that you share is practically the same I was already using..
I mean, I guess there's no difference between using
use Joomla\CMS\Factory;
Factory::getApplication()->triggerEvent();
and
JFactory::getApplication()->triggerEvent();
is there?
Other than the global class names being deprecated and nothing more than aliases these days, nope.
Then... the plugins actions are not being called.
now I'm thinking.. is it possible that in J4 you are required to "register" the events before using them?
in J3, I just created a plugin with functions in them (for example, "onContentSave"), and then I just used the triggerEvent('onContentSave')
and it would work.
Is there any kind of registerEvent('onContentSave')
action required when loading a plugin in order to "register" whose events into the system?
There is no registration requirement unless you are very explicitly making changes to not autoregister (the 3.x and earlier behavior which is basically deprecated in 4.0 to be removed in 5.0).
And if importing plugins isn't working, we'd probably notice because that would mean the core plugins wouldn't work either
I know... that's why I'm so lost. I'm using the same syntax that J4 uses (I'm taking the com_content triggers as an example, and within component com_content, plugin events are called like triggerEvent('onContentAfterSave')
I do the same with my component / plugins and it does not work...
and what's more, I have a plugin that contains both functions of "core joomla", like onContentAfterSave
and those are called just fine. But my own "propietary" events, in the same file, like "onMyOwnAction" are not being called.
Without seeing the exact code it's hard to say where your issue lies, but I can say with certainty that the event dispatcher works and that importing plugins works so either there's something goofy/incorrect in your code or you've hit some extremely edge case that without seeing the code nobody's going to track down.
yes, I guess...
I'll try to dig deeper...
but again, the same plugin in J3 works fine, and when using it in J4 (using triggerEvent), it doesn't. It only calls the core funcitons, to my own.
sorry, last thought... maybe in J4, plugin can only be imported "before" some point in app execution cycle?
There is no restriction on when plugins can be imported in 4.0. There is no underlying change in 4.0 regarding the import of plugins or registration of events as long as your plugin class is extending Joomla\CMS\Plugin\CMSPlugin
in some form (either directly or in the case of Smart Search its plugin subclass).
The app's triggerEvent method in 3.x and 4.0 both refer to a global event dispatcher service (in 3.x the return of JEventDispatcher::getInstance()
and in 4.0 the one stored in the DI container). Unless you pass a dispatcher into the plugin helper, in both versions it resolves that global event dispatcher service and registers the events to that dispatcher.
At this point without seeing your exact code there is nothing I can say or do to help your issue. The API works, otherwise core would be broken.
is there a way I can share the code with you (if you want and can take a look, of course)?
ok, here's an interesting update...
my event name was "getItemName". it didn't get called.
if I change the name for a string starting with "on", it WORKS"
onItemName
gets called, getItemName
does not...!
that seems like a new requirement in J4, because this was not like this in J3... event names should start with 'on'.. is that possible? doesn't make much sense to me to force that...
The convention has always been that event names start with "on". The dispatcher in 3.x and earlier would take every public method in a plugin class and register those as listeners, so it would allow you to use any name (and it basically worked because the convention was "event name maps to method name"). So the fact it worked before I personally would call a case of "it works by accident but it's not the supported API use".
Personally, I'd take that as a documented B/C break with the instruction of prefixing event names as is convention.
Status | Information Required | ⇒ | Closed |
Closed_Date | 0000-00-00 00:00:00 | ⇒ | 2018-07-09 17:40:04 |
Closed_By | ⇒ | brianteeman |
Closed as not a bug
@dgrammatiko any Hint?