2013-02-10 3 views
0

Я новичок в cakePHP и пытаюсь разглядеть структуру, чтобы увидеть, как реализовать мои требования.Design parent-child контроллеры

Мое приложение позволяет (admin) пользователям определять Forms (parent) и FormElements (child), которые позже будут составлены «на лету» и представлены конечным пользователям.

Чтобы запустить прототипирование, я испек все части, и я могу ввести строки в обе таблицы, как ожидалось.

редактировать упрощать вопрос:

Контроллер формы уже показывает список форм и при выборе одного (вид действия), список 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-адреса, такие как: //// и я использую родительское имя и идентификатор, необходимые для создания связей между двумя контроллерами и обновлениями базы данных. – savedario

+0

Не совсем «изящный» и много напряженной работы. В любом случае ... есть ли кто-нибудь, кто хочет пролить свет? – savedario

+0

Вы злоупотребляете некоторыми терминами, и это делает ваш вопрос немного запутанным. Что вы понимаете под идентификатором дочернего контроллера? Вы имеете в виду идентификатор модели? –

ответ

1

Это происходит чаще, чем вы думаете. У меня QuestionModel hasMany AnswerModel и я хочу добавить ответы в мои ответыController. Мне нужно было показать имя 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

+0

Я знаю, что этот сценарий очень распространен. Я задал вопрос, чтобы точно понять, существует ли общее решение/подход. Я предполагаю, что у вас есть некоторая маршрутизация что делает question_id доступным для контроллера Answers. Я пытаюсь разработать некоторые базовые методы утилиты, которые возвращают, например, URL-адрес родителя и т. д. – savedario

+0

Это мой опыт, что приведенный мною пример - это общий подход Я не использую маршрутизацию для своего решения. Я строю ссылку вроде так: $ this-> Html-> link ('Добавить возможный ответ', array ('controller' => 'answers', 'action' = > 'add', $ question_id), это просто создает URL-адрес: http: // mysite/answers/add/23 по умолчанию «23» передается в действие добавления AnswersSontroller в качестве первого параметра функции. –