0

在查看了这篇文章后,我知道 Joomla 使用task=X.Y调用控制器来处理请求。

但是,如果我单击 com_categories 组件上的 NEW 按钮,它将访问/administrator/index.php?option=com_categories&view=items包含 POST 数据的 URL,如下所示:
在此处输入图像描述

然后 URL 被重定向到/administrator/index.php?option=com_categories&view=item&layout=edit.

我的问题是为什么 URL/administrator/index.php?option=com_categories&view=items没有task=X.Y并且它可以重定向到/administrator/index.php?option=com_categories&view=item&layout=edit

我知道它包含带有 的 POST 数据task=item.add,但是哪个控制器将此 POST 数据转换为目标 URL 并重定向到那个?

谢谢。

4

1 回答 1

2

实际上(在 2.5.14 上),当您单击 Category Manger 视图中的“新建”按钮时,第一个请求会生成一个 POST:

POST /administrator/index.php?option=com_categories&view=categories HTTP/1.1

POST请求通常在HTTP消息正文中发送查询字符串,而不仅仅是在 URL 中,在这种情况下,POST请求在正文中具有以下表单数据:

filter_search   
filter_level    
filter_published    
filter_access   
filter_language 
limit   5
limitstart  0
order[] 1
order[] 1
order[] 1
order[] 1
order[] 2
batch[assetgroup_id]    
batch[language_id]  
batch[category_id]  
batch[move_copy]    m
extension   com_content
task    category.add
boxchecked  0
filter_order    a.lft
filter_order_Dir    asc
original_order_values   1,1,1,1,2
796194955f38a0d8db484c92d92ca5ce    1

您会注意到这有一个task具有值的参数category.add不是 item.add ),当在入口点文件中调用JController时,类会考虑到这一点:getInstance($prefix, $config)com_categories

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

该类JController转换category.add为 a $typeofcategory和 a $taskof add。该$type值用于与组件基本路径(在本例中/pathto/site/administrator/components/com_categories)一起组装到控制器的路径。

因此,当实例化类在入口点文件中JController收到->execute($task)消息时:com_categories/categories.php

$controller->execute(JRequest::getVar('task'));

它实际上已经是一个类型的控制器,CategoriesControllerCategory这是您期望处理New按钮请求的类型。

于 2013-09-01T02:55:03.280 回答