检查完post后,我知道Joomla使用task=X.Y
来调用控制器来处理请求。
但如果我点击com_categories组件上的NEW按钮,它将访问/administrator/index.php?option=com_categories&view=items
的URL并包含POST数据,如下所示:
然后,网址会重定向到/administrator/index.php?option=com_categories&view=item&layout=edit
。
我的问题是,为什么网址/administrator/index.php?option=com_categories&view=items
没有task=X.Y
,而且可以重定向到/administrator/index.php?option=com_categories&view=item&layout=edit
?
我知道它包含task=item.add
的POST数据,但哪个控制器将此POST数据转换为目标网址并重定向到该数据?
感谢。
答案 0 :(得分:2)
实际上(在2.5.14上),当你点击Category Manger视图中的“New”按钮时,第一个请求会生成一个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
转换为$type
category
和$task
add
。 $type
值用于组合控制器的路径以及组件基本路径(在本例中为/pathto/site/administrator/components/com_categories
)。
因此,当实例化的JController
类在->execute($task)
入口点文件中收到com_categories/categories.php
消息时:
$controller->execute(JRequest::getVar('task'));
它实际上已经是CategoriesControllerCategory
类型的控制器,这是你期望处理New
按钮请求的那个。