2011-08-22 104 views
0

這個問題的短版本是:獲取相關數據

我怎麼能走,只有在數組中存在的數據(即:不保存在模型還),它涉及到一個值從模型中的$this->find('list')數組?

這個問題的長版本是:

我使用CakePHP和Wizard Component的3步申請表。

3層形式的步驟是接觸,當然和細節。

這些步驟之後,有一個「檢討」步驟,我想從以前的3步的形式顯示所有提交的爲用戶按下提交之前檢查最後一次。大多數情況下,這很有效。我只需要做在控制器中的以下內容:

function _prepareReview() { 
    $contact = $this->Wizard->read('contact'); 
    $course = $this->Wizard->read('course'); 
    $details = $this->Wizard->read('details'); 
    $this->set(compact('contact','course','details')); 
} 

然後,在review.ctp我可以引用像$contact['Contact']['firstname'];事情讓這個人的姓名等

然而,問題是從獲取數據「相關「模型。例如,有一個「國籍」字段,它只是一個ID。在「詳細信息」一步,我用find('list')來從國籍模型作爲正常顯示一個下拉菜單各族列表,然後蛋糕保存爲它應該做相應的ID。

但是,當我來到在嚮導組件的「審覈」的步驟,我只得到了嚮導組件的陣列的實際ID。我真的不希望得到任何其他東西。

我看不到任何明顯的方式從嚮導組件的上下文中訪問$details[Detail][Nationality][name](或類似的東西),因爲設置遞歸不起作用,因爲在這個階段數據實際上不在模型中,它是隻是一組表單數據。

因此,換句話說,我已經在陣列中的數據(而不是從一個模型來,但是從一種形式subsmission)如下:

Array 
(
    [Details] => Array 
     (
     [firstname] => Test 
     [nationality_id] => 3 
    ) 
) 

然後我有以下從$this->Detail->Nationality->find('list')看起來未來像這樣:

Array 
(
    [0] => American 
    [1] => Australian 
    [2] => British 
    [3] => Canadian 
) 

那麼如何才能得到$details['Details']['nationality_id'];從嚮導組件顯示例如「加」而不是「3」?當只有一個數組來自模型時,如何建立關係?我只需要這個即刻確認所有的數據給用戶。該ID「3」,當然,被寫入型號,一旦用戶按下提交,而這已經是工作,因爲它應該做的。

或者這是一個做事的徹底瘋狂的方式,我應該看一個完全不同的方法,如先保存的數據?但是,直到用戶點擊最終提交時,我才真正想保存它。

回答

2

我可以看到你在這裏得到了什麼 - CakePHP不會自動爲你查詢這些相關模型(因爲你不是從數據庫中提取),但你不禁想到你錯過了一些框架的免費功能。

如果你仍在使用FormHelper::input()它會自動選擇正確的選項(給你執行Model::find('list')並通過選項列表視圖第一),但我假設你希望檢查畫面是免費的形式輸入(disabled或不)。

最直接的方法是簡單地手工執行相同Model::find('list')呼叫您在嚮導中的每一步做,從各組數據視圖,並打印出相應的值:

// controller 
$nationalities = $this->Review->Details->Nationality->find('list'); 
$this->set(compact(/*..., */ 'nationalities')); 

// view 
<?php echo $nationalities['Nationality'][$details['Detail']['nationality_id']]; ?> 
outputs 'Canadian' (the value for $nationalities['Nationality'][3]) 

通過調用DboSource::queryAssociation()恰到好處 - 如果你面臨挑戰 - 但對於這個特殊問題可能是矯枉過正的,CakePHP可能會幫你做到這一點。

// model 
$db =& ConnectionManager::getDataSource($this->useDbConfig); 
$data = $db->queryAssociation($model, $linkModel, $type, $association, $assocData, $queryData, $external, $resultSet, $recursive, $stack) { 
+0

謝謝,deizel,你明白我問完全和你的解決方案的作品。我將使用你給出的第一個例子,因爲它只花了幾秒鐘來實現第二個解決方案,看起來對於網站的一部分來說工作會有點太多,甚至不會得到太多的使用。再次感謝! – Joseph