我希望通过控制器方法将用户发送到另一个页面。另一页需要POST数据。
通常,使用postLink()访问页面。有没有办法在控制器中使用它,也许使用redirect()?
答案 0 :(得分:4)
有点旧,但仍然没有接受答案......
答案是否定的,是的。
不,没有直接方法,因为您无法使用redirect()
函数传递POSTed数据。
您可以使用requestAction()
,因为您可以按已发布的数据传递数据(see requestAction() here for version cakePHP>=2.0)
在这种情况下,您传递一个网址,然后传递一个数据,其中包含关键数据和发布的数据,如
$this->requestAction($url, array('data' =>$this->data));
或如果您愿意的话{
{1}}
$this->requestAction($url, array('data' =>$this->request->data));
的问题在于,结果是环境性的,就像您在当前控制器中而不是在目标中生成所请求操作的页面一样,导致效果不是非常令人满意(至少通常不会对我有组件)表现得不是很好),所以仍然不行。
...但是,您可以使用requestAction()
组件执行非常类似的操作
这就是我通常这样做的方式。流程将是这样的:
查看A =>到Session
到A控制器中的操作=>
=>控制器postLink()
到会话变量=>
=> B控制器中的操作通过request->data
=>
=>设置B控制器redirect()
来自会话变量=>
=>处理B控制器动作中的数据=>查看B
所以,在你的A控制器中,让我们在request->data
行动中说出你会有的话
sentToNewPage()
并在B控制器中:
//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);
}
答案 1 :(得分:2)
最佳解决方案是使用javascript重定向。
但如果你想要更多蛋糕,我会给你一些工具 CakeAPI: requestAction - 它允许用参数执行欲望的控制器方法,如果你传递'return',它将返回该动作的完整视图输出。
//very useful in views
$result = $this->requestAction('Controller/method',
array('return','user_id'=>$userId)
);
参数可通过请求参数
在控制器中访问$this->request->params['user_id']
答案 2 :(得分:0)
长期和短期是,使用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);
}
现在,显然你不会直接从控制器动作输出这样的东西,你将它设置为你的视图等,但这是一个如何集中在多个位置使用的功能的例子。 / p>
对于免责声明,这种事情正是模型所针对的,你应该考虑将这种功能放入模型而不是控制器 - 这取决于你的具体应用。
答案 3 :(得分:0)
使用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更改网址 见:Change the URL in the browser without loading the new page using JavaScript