2013-02-10 94 views
0

我是cakePHP的新手,並試圖讓我的頭部圍繞框架看看如何實現我的要求。設計親子控制器

我的應用程序允許(管理員)用戶定義表單(父)和表單元素(子表單),以後將會立即編寫並呈現給最終用戶。

要開始原型製作,我烘烤了所有的部分,並且可以按預期在兩個表中輸入行。

編輯簡化問題:

的形式已經控制器顯示形式的列表,並且當選擇一個(視圖動作)時,FormElements對於形成的列表。 但是...當我添加一個新的FormElement時,我必須再次選擇一個元素將關聯的表單。

相反,我希望FormElements控制器/模型知道最初選擇哪個窗體並自動填充form_id。

有關如何處理此問題的「最佳實踐」方法?

以防萬一它需要:

CREATE TABLE IF NOT EXISTS `forms` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `description` varchar(60) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
CREATE TABLE IF NOT EXISTS `form_elements` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `form_id` int(11) NOT NULL, 
    `name` varchar(40) NOT NULL, 
    `type` int(11) NOT NULL, 
    `widget` int(11) NOT NULL, 
    `mandatory` tinyint(4) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 
+0

我通過環顧樣本項目如何做到這一點已經取得了一些進展。我目前使用的URL如下: //// 我根據需要使用父名和id來建立2個控制器和數據庫更新之間的鏈接。 – savedario 2013-03-03 12:45:25

+0

不完全「優雅」,很多繁瑣的工作。 無論如何......有沒有人願意放棄一些光明? – savedario 2013-03-03 12:53:29

+0

你濫用了一些術語,這會讓你的問題有點混亂。你的孩子控制器ID是什麼意思?你是指模型ID? – 2013-03-25 07:29:22

回答

1

這種情況往往比你想象的。我有QuestionModel hasMany AnswerModel,並希望在我的AnswersController中添加Answers。我需要顯示「父」對象的QuestionModel名稱和其他屬性。這就是我的AnswersController在我的附加動作的樣子:

public function add($question_id = null) { 
    $this->Answer->Question->id = $question_id; 
    if (!$this->Answer->Question->exists()) { 
     throw new NotFoundException(__('Invalid question')); 
    } 

    if ($this->request->is('post')) { 
     $this->request->data['Answer']['question_id'] = $question_id; 
     $this->request->data['Answer']['user_id'] = $this->Auth->user('id'); 

     if ($this->Answer->save($this->request->data)) { 
      $this->Session->setFlashSuccess(__('Your answer has been saved')); 
     } else { 
      $this->Session->setFlashError(__('Your answer could not be saved. Please, try again.')); 
     } 
     $this->redirect(array('controller'=>'questions','action' => 'view', $question_id)); 
    } 

    $question = $this->Answer->Question->read(); 
    $this->set('question', $question); 
} 

你會發現,我經過Question.id到AnswersController補充作用。這讓我可以從數據庫中提取問題,並允許我能夠在用戶點擊「添加此問題的答案」之前將用戶重定向到他們所在的具體問題。

+0

非常感謝您的回答。這似乎證實我的方法是,如果不是「一般化的,至少是直覺的」。 – savedario 2013-04-01 10:05:54

+0

我知道這種情況是非常普遍的,我問這個問題的確是爲了瞭解是否有一個通用的解決方案/方法 我假設你有一些路由這使得question_id可用於Answers控制器。 我正在嘗試開發一些基本的實用方法,例如返回父級的URL等...... – savedario 2013-04-01 10:11:39

+0

IT是我的經驗,我提供的示例是常用方法。我不使用路由爲我的解決方案。我建立一個這樣的鏈接:$ this-> Html-> link('添加一個可能的答案',數組('控制'=>'答案','行動'= >'add',$ question_id);這只是創建一個url,如下所示:默認情況下,http:// mysite/answers/add/23將「23」作爲函數的第一個參數傳遞給AnswersController的add操作。 – 2013-04-03 05:33:04