Joomla如何在提交表单时路由到控制器方法?

doo*_*ers 3 php forms joomla form-submit

在表单操作设置为类似的情况下:

action="<?php echo JRoute::_('index.php?option=com_test&layout=edit&id='.(int) $this->item->id); ?>"
Run Code Online (Sandbox Code Playgroud)

并且表单包含和隐藏输入:

<input type="hidden" name="task" value="testctrl.save" />
Run Code Online (Sandbox Code Playgroud)

joomla如何路由到控制器方法?

我会理解它是否在表单操作中有任务,但我无法看到它如何从隐藏的输入中获取任务以便路由到testctrl控制器方法中的相应方法

小智 6

这并不复杂.在您的com_mycom目录中有一个名为的文件mycom.php.在其中你有一些看起来像这样的行:

$controller = JControllerLegacy::getInstance('Contact');
$controller->execute(JFactory::getApplication()->input->get('task'));
$controller->redirect();
Run Code Online (Sandbox Code Playgroud)

请参阅此处的示例:https: //github.com/joomla/joomla-cms/blob/staging/components/com_contact/contact.php#L15

这就是接受任务并实例化该控制器对象的实例的功能,并从您指出的隐藏表单输入值中提取任务.它从那里将任务传递给控制器​​.

控制器在此处接收请求:

https://github.com/joomla/joomla-cms/blob/staging/components/com_contact/controller.php#L19

您可能会问"为什么我看不到它接收组件文件发送它的任务?".那是因为这个组件的控制器是JControllerLegacy类的子类:

https://github.com/joomla/joomla-cms/blob/staging/libraries/legacy/controller/legacy.php#L701

public function execute($task)
{ ... }
Run Code Online (Sandbox Code Playgroud)

该函数是执行函数,它从组件接收任务.这是控制器任务的父类.希望这一切都有意义!