问题
After checking this post, I know that Joomla use task=X.Y
to call the controller to handle the request.
But if I click NEW button on com_categories component, it will access the URL of /administrator/index.php?option=com_categories&view=items
and containing the POST data as below:
Then the URL get redirected to /administrator/index.php?option=com_categories&view=item&layout=edit
.
My question is why the URL /administrator/index.php?option=com_categories&view=items
don't have the task=X.Y
and it can redirect to /administrator/index.php?option=com_categories&view=item&layout=edit
?
I know that it contains the POST data with task=item.add
, but which controller convert this POST data to the destination URL and get redirected to that?
Thanks.
回答1:
Actually (on 2.5.14), when you click on the "New" button in the Category Manger view, the first request generates a POST:
POST /administrator/index.php?option=com_categories&view=categories HTTP/1.1
POST
requests usually send query strings in the HTTP
message body not just in the URL, in this case the POST
request has the following form data in the body:
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
You will notice this has a task
parameter that has the value category.add
(not item.add), this is taken into account by the JController
class when getInstance($prefix, $config)
is called in the com_categories
entry point file:
$controller = JControllerLegacy::getInstance('Categories');
The JController
class converts category.add
into a $type
of category
and a $task
of add
. The $type
value is used to assemble the path to the controller in conjunction with the components base path ( in this case /pathto/site/administrator/components/com_categories
).
So, when the instantiated JController
class receives the ->execute($task)
message in com_categories/categories.php
entry point file:
$controller->execute(JRequest::getVar('task'));
it's actually already a controller of type CategoriesControllerCategory
which is the what you would expect to handle the New
button request.
来源:https://stackoverflow.com/questions/18554295/which-components-controller-handle-the-form-request-of-new-item