Skip to content

Commit

Permalink
Fix query string support.
Browse files Browse the repository at this point in the history
* The documented query option was not implemented.
* Skip routing when the params have been passed through requestAction().
  • Loading branch information
markstory committed Jul 9, 2012
1 parent 8c2a447 commit ac87e5c
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 10 deletions.
29 changes: 21 additions & 8 deletions lib/Cake/Core/Object.php
Expand Up @@ -77,9 +77,18 @@ public function requestAction($url, $extra = array()) {
$extra['autoRender'] = 1;
unset($extra[$index]);
}
$extra = array_merge(array('autoRender' => 0, 'return' => 1, 'bare' => 1, 'requested' => 1), $extra);
$data = isset($extra['post']) ? $extra['post'] : null;
unset($extra['post']);
$extra = array_merge(
['autoRender' => 0, 'return' => 1, 'bare' => 1, 'requested' => 1],
$extra
);
$post = $query = [];
if (isset($extra['post'])) {
$post = $extra['post'];
}
if (isset($extra['query'])) {
$query = $extra['query'];
}
unset($extra['post'], $extra['query']);

if (is_string($url) && strpos($url, FULL_BASE_URL) === 0) {
$url = Router::normalize(str_replace(FULL_BASE_URL, '', $url));
Expand All @@ -89,13 +98,17 @@ public function requestAction($url, $extra = array()) {
'url' => $url
);
} elseif (is_array($url)) {
$url += array('pass' => array(), 'base' => false);
$params = array(
$params = array_merge($url, [
'pass' => [],
'base' => false,
'url' => Router::reverse($url)
);
]);
}
if (!empty($post)) {
$params['post'] = $post;
}
if (isset($data)) {
$params['post'] = $data;
if (!empty($query)) {
$params['query'] = $query;
}
$request = new Request($params);
$dispatcher = new Dispatcher();
Expand Down
6 changes: 4 additions & 2 deletions lib/Cake/Routing/Dispatcher.php
Expand Up @@ -218,8 +218,10 @@ public function parseParams($event) {
$this->_loadRoutes();
}

$params = Router::parse($request->url);
$request->addParams($params);
if (empty($request->params['controller'])) {
$params = Router::parse($request->url);
$request->addParams($params);
}

if (!empty($event->data['additionalParams'])) {
$request->addParams($event->data['additionalParams']);
Expand Down
9 changes: 9 additions & 0 deletions lib/Cake/Test/TestApp/Controller/RequestActionController.php
Expand Up @@ -91,6 +91,15 @@ public function post_pass() {
return $this->request->data;
}

/**
* query pass, testing query passing
*
* @return array
*/
public function query_pass() {
return $this->request->query;
}

/**
* test param passing and parsing.
*
Expand Down
23 changes: 23 additions & 0 deletions lib/Cake/Test/TestCase/Core/ObjectTest.php
Expand Up @@ -527,6 +527,29 @@ public function testRequestActionNoPostPassing() {
$this->assertEquals($expected, $result);
}

/**
* test that requestAction() can get query data from the query string and
* query option.
*
* @return void
*/
public function testRequestActionWithQueryString() {
Router::reload();
require CAKE . 'Config' . DS . 'routes.php';
$query = ['page' => 1, 'sort' => 'title'];
$result = $this->object->requestAction(
['controller' => 'request_action', 'action' => 'query_pass'],
['query' => $query]
);
$this->assertEquals($query, $result);

$result = $this->object->requestAction(
'/request_action/query_pass?page=3&sort=body'
);
$expected = ['page' => 3, 'sort' => 'body'];
$this->assertEquals($expected, $result);
}

/**
* Test requestAction with post data.
*
Expand Down

0 comments on commit ac87e5c

Please sign in to comment.