2013-02-10 83 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