Joomla - 如何覆盖组件控制器?
Joomla - How to override component controller?
我想覆盖组件内的控制器
即;
文件路径:components/com_test/controllers/test.php
如何覆盖 test.php?
我们不能覆盖 joomla 中的控制器和模型,我们只会覆盖组件的视图。
正如 Pritesh 所说,你不能*。
我可以看到几种实现结果的方法:
您可以创建一个新的控制器来扩展您的 test.php 控制器,然后调用它;为了实现这一点,控制器绝不能使用 JPATH_COMPONENT 并且您还必须重写视图以指向正确的组件。
在你的视图中添加一个特殊任务,并在OnAfterRoute()
中用系统插件拦截它。您不会接触原始控制器,但您的插件会在原始控制器之前触发,因此它可以采取行动、操纵输入和输出,并最终完全避免调用原始控制器。
--
如果编辑原始控制器似乎是一个选项,请忽略它:原始组件会不时更新,您将进入维护噩梦。
很多时候我必须达到这个结果。 90% 的时间我都是在系统插件中实现的。如果有改进,我会将代码贡献回原始开发人员,他们通常会在下一个版本中集成这些功能。不要忘记让原始开发人员知道,您将帮助改进他们的产品并节省您自己的时间。
- 实际上,您可以通过在 Joomla 之前加载 class 来覆盖核心的很大一部分;这仅限于非核心 classes 但它是可行的。这就是我在 n.2
中所指的
我想覆盖组件内的控制器
即;
文件路径:components/com_test/controllers/test.php
如何覆盖 test.php?
我们不能覆盖 joomla 中的控制器和模型,我们只会覆盖组件的视图。
正如 Pritesh 所说,你不能*。
我可以看到几种实现结果的方法:
您可以创建一个新的控制器来扩展您的 test.php 控制器,然后调用它;为了实现这一点,控制器绝不能使用 JPATH_COMPONENT 并且您还必须重写视图以指向正确的组件。
在你的视图中添加一个特殊任务,并在
OnAfterRoute()
中用系统插件拦截它。您不会接触原始控制器,但您的插件会在原始控制器之前触发,因此它可以采取行动、操纵输入和输出,并最终完全避免调用原始控制器。
--
如果编辑原始控制器似乎是一个选项,请忽略它:原始组件会不时更新,您将进入维护噩梦。
很多时候我必须达到这个结果。 90% 的时间我都是在系统插件中实现的。如果有改进,我会将代码贡献回原始开发人员,他们通常会在下一个版本中集成这些功能。不要忘记让原始开发人员知道,您将帮助改进他们的产品并节省您自己的时间。
- 实际上,您可以通过在 Joomla 之前加载 class 来覆盖核心的很大一部分;这仅限于非核心 classes 但它是可行的。这就是我在 n.2 中所指的