【问题标题】:How does Joomla route to the controller method on submitting the form?Joomla 如何在提交表单时路由到控制器方法?
【发布时间】:2014-02-20 02:26:14
【问题描述】:

如果表单操作设置为:

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

表单包含并隐藏输入:

<input type="hidden" name="task" value="testctrl.save" />

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

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

【问题讨论】:

    标签: php forms joomla form-submit


    【解决方案1】:

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

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

    在此处查看示例: 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)
    { ... }
    

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

    【讨论】:

    • 感谢乍得! Jobin Jose 刚刚打败了你 :)
    • 你知道Jobin Jose 的代码只适用于Joomla 1.5。他引用的文件在 Joomal 3.x 中不存在:github.com/joomla/joomla-cms/tree/staging/libraries/joomla/…
    • @ChadWindnagle 它不仅适用于 1.5,而且适用于高达 2.x
    • 好点 Chad,我的组件实际上是为 Joomla 3.x 开发的,但 Jobin Jose 的回答足以为我指明正确的方向。我认为为了未来读者的利益,我会接受您的回答,因为它目前更相关。
    • 好点乔宾何塞!老实说,我想说任何一个都足够接近。
    【解决方案2】:

    当您使用隐藏字段显式设置 controller 名称时

    <input type="hidden" name="task" value="testctrl.save" />
    

    <input type="hidden" name="controller" value="testctrl" />
    <input type="hidden" name="task" value="save" />
    

    甚至不使用 task 指定控制器,只是将其与视图名称一起使用。

    您的组件文件(如com_test)的所有情况下都有一个带有test.php 的文件

    它包括 Joomla 库文件。

    jimport('joomla.application.component.controller');
    

    当您检查库文件时,它有两个函数用于获取相关的控制器和模型。

    createFileName()getInstance()libraries/joomla/application/component/controller.php

    这两个函数完成任务。

    以上文件仅适用于 Joomla 1.5 到 Joomla 2.x

    编辑

    对于 Joomla3.x

    在 Joomla 3.x 中,文件结构略有改变。

    代替jimport('joomla.application.component.controller'); Joomla 3.x 使用

    $controller = JControllerLegacy::getInstance('Content');
    

    这将调用libraries\legacy\controller\legacy.php 中的JControllerLegacy

    你可以在上面的路径中找到相同的函数createFileName() ,getInstance()

    希望对你有所帮助..

    【讨论】:

    • 非常感谢!我试图追踪它,但找不到它!这真的让我很烦:)
    • 仅供查看此答案的其他人使用:此答案代码适用于 Joomla 1.5。 Joomla 3.x 根本没有那个文件。
    • 我已经接受了 Chads 的答案,因为它是未来读者的利益,因为它是一个更相关的答案。
    • @doovers 也按照 J3.x 版本更新。
    猜你喜欢
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多