我需要创建一个评论表单。我有2个型号和2个控制器 - 产品和评论与'产品'有很多'评论'关系,评论表格将显示在当前产品页面上(产品控制器,'查看'动作),此表格将使用另一个控制器(评价)。
此外,我需要验证此表单,并显示验证错误。
在我的产品控制器view.ctp中,我有:
// product page stuff...
echo $this->Form->create($model = 'Review', array('url' => '/reviews/add'));
echo $this->Form->input('name', array('label' => 'Your name:'));
echo $this->Form->input('email', array('label' => 'Your e-mail:'));
echo $this->Form->input('message', array('rows' => '6', 'label' => 'Your message:'));
echo $this->Form->hidden('product_id', array('default' => $product['Product']['id']));
echo $this->Form->end('Send');
echo $this->Session->flash();
ReviewsController - >添加:
public function add() {
if ($this->request->is('post')) {
$this->Review->save($this->request->data);
$this->redirect(array('controller' => 'products', 'action' => 'view', $this->request->data['Review']['product_id'], '#' => 'reviews'));
}
}
不知何故,这个可怕的代码在某种程度上起作用。 查看保存,但未显示验证错误。
如果我将If语句添加到此操作:
ReviewsController - >添加:
public function add() {
if ($this->request->is('post')) {
if ( $this->Review->save($this->request->data) ){
$this->redirect(array('controller' => 'products', 'action' => 'view', $this->request->data['Review']['product_id'], '#' => 'reviews'));
}}
}
如果表单有错误但没有验证我收到MissingView错误: 缺少视图
Error: The view for ReviewsController::add() was not found.
我的问题是如何正确处理这种情况以实现我需要的功能? 我应该使用带有请求操作的元素,还是应该移动操作以将评论添加到ProductsController?
答案 0 :(得分:2)
您的一个问题是,如果保存成功,您只进行重定向,因此如果失败则没有Review / add.ctp,因此它会给您一个缺少的视图错误。无论保存是否工作,您都需要进行重定向,以便始终返回产品页面。
你不会在字段上得到错误的原因是因为你正在进行重定向,所以错误会丢失。您可以将错误传递给产品控制器作为操作的另一个参数。
<强> ReviewsController 强>
public function add() {
if (!empty($this->request->data)) {
$errors = null;
if (!$this->Review->save($this->request->data)) {
$errors = $this->Review->validationErrors;
}
// Always redirect
$this->redirect(array('controller' => 'products', 'action' => 'view', $this->request->data['Review']['product_id'], 'errors' => $errors, '#' => 'reviews'));
}
}
<强>的ProductsController 强>
public function view($product_id, $errors = null) {
if (!empty($errors)) {
$this->Review->validationErrors = $errors;
}
}
当然我不知道您的所有代码是什么样的,这是未经测试的,但我们的想法是将Review模型的验证错误传递给产品控制器,然后再将它们手动分配回Review模型。产品页面。
答案 1 :(得分:0)
您似乎没有为评论创建add.ctp
视图。
如果您不打算做任何特别的事情,添加条件是没有意义的。您总是希望用户返回产品视图吗?它不介意它是否验证。
当您使用条件并且它未验证时,控制器不会将您重定向到产品控制器的视图操作,它将默认加载add.ctp视图。
继续使用重定向返回表单。
使用您的第一个添加操作。它是正确的。如果需要,可以添加错误消息:
public function add() {
if ($this->request->is('post')) {
if(!$this->Review->save($this->request->data)({
$this->Session->setFlash(__('There was a problem adding the product. Please try again.'));
}
$this->redirect(array('controller' => 'products', 'action' => 'view', $this->request->data['Review']['product_id'], '#' => 'reviews'));
}
请注意重定向始终存在。
它可能不会在每个输入上显示红色错误框,因为您使用的是“重定向”而不是操作的默认视图。不管怎样,还不太确定。