CakePHP - 2个控制器,1个表格

时间:2012-11-21 22:56:16

标签: cakephp formhelper

我需要创建一个评论表单。我有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?

2 个答案:

答案 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'));
}

请注意重定向始终存在。

它可能不会在每个输入上显示红色错误框,因为您使用的是“重定向”而不是操作的默认视图。不管怎样,还不太确定。