[英]CakePHP 2.4 redirect() with POST data?
我希望通过控制器方法将用户发送到另一个页面。 另一页需要POST数据。
通常,使用postLink()访问页面。 有没有办法在控制器中使用它,也许使用redirect()?
有点旧,但仍然没有接受答案......答案是否定的,是的。
不,没有直接方法,因为您无法使用redirect()
函数传递POSTed数据。
您可以使用requestAction()
,因为您可以传递数据( 请参阅requestAction()此处的版本cakePHP> = 2.0 )。
在这种情况下,您传递一个url,然后传递一个具有关键数据和发布数据的数组,如
$this->requestAction($url, array('data' =>$this->data));
或者如果你愿意的话
$this->requestAction($url, array('data' =>$this->request->data));
requestAction()
的问题在于,结果是环境的,就好像你在当前控制器中而不是在目标中生成所请求操作的页面一样,导致效果不是非常令人满意(至少对我来说,组件表现不是很好)很好),所以,不,不。
...但是,你可以使用Session
组件做一些非常相似的事情。
这就是我通常这样做的方式。 流程将是这样的:
在控制器中查看A =>通过postLink()
到Action =>
=>控制器request->data
到会话变量=>
=>通过redirect()
=>在B控制器中执行操作
=>设置B控制器request->data
来自Session变量=>的数据
=> B控制器动作中的过程数据=>视图B.
所以,在你的A控制器中,让我们说在sentToNewPage()
动作你会有类似的东西
//Action in A controller
public function sentToNewPage()
{
$this->Session->write('previousPageInfo', $this->request->data);
$url = array('plugin' => 'your_plugin', 'controller'=>'B',
'action'=>'processFromPreviousPage');
$this->redirect($url);
}
在B控制器中:
//Action in B controller
public function beforeFilter()
{//not completelly necessary but handy. You can recover directly the data
//from session in the action
if($this->Session->check('previousPageInfo'))
{$this->data = $this->Session->read('previousPageInfo')};
parent::beforeFilter();
}
public function processFromPreviousPage()
{
//do what ever you want to do. Data will be in $this->data or
// if you like it better in $this->request->data
$this->processUserData($this->request->data);
//...
}
最好的解决方案是使用javascript重定向。
但是如果你想要更多蛋糕,我会给你一些工具CakeAPI:requestAction - 它允许用参数执行欲望的控制器方法,如果你传递'return' ,它将返回该动作的全视图输出。
//very useful in views
$result = $this->requestAction('Controller/method',
array('return','user_id'=>$userId)
);
参数将通过请求参数在控制器中访问
$this->request->params['user_id']
简而言之,用POST数据和重定向模拟HTML表单并不容易,你需要设置一堆包含数据的隐藏变量,并通过Javascript自动将表单发布到目的地。
我要做的是将处理功能从需要POST变量的函数中取出,并使其成为通用的,以便您可以从两个函数中调用它。
考虑这个粗略的例子:
public function myPostDataAction() {
$name = $_POST['name'];
$age = $_POST['age'];
// do stuff
echo $name . ', ' . $age;
}
假设这是您尝试在此方案中发布数据的操作,但您不能,因为您无法通过重定向模拟这些$ _POST变量,而不会在此处顶部提到的方案。 你可以这样做:
public function myPostDataAction() {
$name = $_POST['name'];
$age = $_POST['age'];
// call common function
echo $this->getMyResults($name, $age);
}
// accessible from inside the controller only
private function getMyResults($name, $age) {
return $name . ', ' . $age;
}
现在,您还可以通过将常规旧变量传递到其中来使用该getMyResults()
功能:
public function myProblemFunction() {
$name = 'John';
$age = 15;
echo $this->getMyResults($name, $age);
}
现在,显然你不会直接从控制器动作输出这样的东西,你将把它设置为你的视图等,但这是一个如何集中在多个位置使用的功能的例子。
对于免责声明,这种情况正是模型的用途,您应该考虑将这种功能放入模型而不是控制器中 - 这取决于您的具体应用。
使用cakephp 2.x使用此:
$this->autoRender = false;
$request = new CakeRequest(Router::url(array('controller' => 'mycontroller','action' => 'my_action')));
$request->data('dataIndex','value');
$response = new CakeResponse();
$d = new Dispatcher();
$d->dispatch(
$request,
$response
);
但它不会重定向,而是调度到不同的控制器/动作,所以如果你继续/ controller / oldaction,它将保持当前的url(没有HTTP重定向完成)。
您仍然可以使用javascript 更改网址 :请在浏览器中更改网址,而无需使用JavaScript加载新网页
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.