2012-11-21 103 views
0

我需要創建一個評論表單。我有2個模型和2個控制器 - 產品和評論與'產品'有許多'評論'的關係,評論表格將顯示在當前產品頁面上(產品控制器,'視圖'行動),這個表格將使用另一個控制器(點評)。CakePHP - 2個控制器,1個表格

此外我需要驗證此表單與顯示驗證錯誤。

對我的產品控制器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')); 
    } 
} 

不知怎的,這個可怕的代碼工作..部分。 查看保存,但不顯示驗證錯誤。

如果我添加如果語句這個動作:

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

爲什麼你不能添加這個? if($ this-> Review-> save($ this-> request-> data)){ // ... } 這是它顯示的錯誤嗎? – Alvaro

+0

如果表單驗證 - 無錯誤,所有事情都可以正確保存。但如果有一些驗證問題 - 缺少查看錯誤。 – user1327

+0

你可以使用顯示錯誤的代碼更新你的文章嗎?你還可以發佈完整的錯誤信息嗎? – Alvaro

回答

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

當然,我不知道所有的代碼看起來像,這是未經測試,但這個想法是通過審覈模型對產品控制器的驗證錯誤,然後在產品頁面上再次手動將其分配回審閱模型。

+0

謝謝。我使用會話傳遞錯誤來解決此問題,但您的解決方案看起來更好。 – user1327

+0

@ user1327是的,會話是我最初的想法,但我認爲通過路由器傳遞錯誤是一個更加穩固的解決方案,不會受到干擾。 – BadHorsie

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

注意重定向總是存在。

它可能不會顯示每個輸入上的紅色錯誤框,因爲您正在使用「重定向」而不是操作的默認視圖。無論如何不太確定。

+0

謝謝你的回答,但我需要那些「紅色的錯誤框」。 – user1327

相關問題