0

我需要创建一个审核表。我有 2 个模型和 2 个控制器 - 产品和评论与“产品”有许多“评论”关系,评论表单将显示在当前产品页面上(产品控制器,“查看”操作),此表单将使用另一个控制器(评论)。

我还需要对此表单进行验证,并显示验证错误。

在我的 Products 控制器 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();

评论控制器 -> 添加:

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 语句:

评论控制器-> 添加:

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?

4

2 回答 2

2

您的问题之一是您仅在保存成功时才进行重定向,因此如果保存失败,您没有 Review/add.ctp ,因此它会给您一个缺少视图的错误。无论保存是否有效,您都需要进行重定向,以便您始终返回产品页面。

您不会在字段上收到错误的原因是因为您正在执行重定向,因此错误会丢失。您可以将错误作为操作的另一个参数传递给产品控制器。

评论控制器

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

产品控制器

public function view($product_id, $errors = null) {
    if (!empty($errors)) {
        $this->Review->validationErrors = $errors;
    }
}

当然我不知道你所有的代码是什么样子的,这是未经测试的,但想法是将 Review 模型的验证错误传递给产品控制器,然后在产品页面上再次将它们手动分配回 Review 模型.

于 2012-11-22T17:14:26.303 回答
0

您似乎没有add.ctp为审核创建视图。

如果您不打算做任何特别的事情,那么添加条件是没有意义的。您总是希望用户返回产品视图吗?它不介意它是否验证。

当您使用条件并且它不验证时,控制器不会将您重定向到 products 控制器的视图操作,它会默认加载 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'));
}

请注意,重定向始终存在。

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

于 2012-11-22T14:03:04.913 回答