Делаю проект на Zend Fremework 2 + Doctrine ORM. Есть задача написать конструктор опросов. В опросе может быть неограниченное количество вопросов. Ответ на вопрос может иметь один из 5 типов: Text, Textarea, Radio, MultiCheckbox ,Select. Вариантов при множественном выборе может быть неограниченное количество. Задачу, вроде как, решил, но с костылем. Уверен, что есть нативное решение на основе коллекций, но никак не могу к нему прийти.
Итак, сейчас структура следующая (Название моделей выдуманы, чтобы проще понять):
- Модель Interview (id, название опроса)
- AnswerType (Типы ответов)
- InterviewQuestion(Вопросы с привязкой к Interview и AnswerType)
- InterviewQuestionAnswer (Варианты ответов с привязкой к InterviewQuestion)
- InterviewUserAnswer (Ответы пользователя с привязкой к InterviewQuestion, InterviewQuestionAnswe, Userr)
При генерации формы для ответов генерируются филдсеты. Пример:
if (!empty($this->questions)) {
foreach ($this->questions as $question) {
switch ($question->getQuestionType()->getTypeName()) {
case 'Text':
$this->add(array(
'name' => $question->getId(),
'type' => $question->getQuestionType()->getTypeName(),
'options' => array(
'label' => $question->getQuestionText(),
),
'attributes' => array(
'class' => 'form-control'
),
));
break;
case 'MultiCheckbox':
$this->add(array(
'name' => $question->getId(),
'type' => 'DoctrineModule\Form\Element\ObjectMultiCheckbox',
'options' => array(
'label' => $question->getQuestionText(),
'object_manager' => $objectManager,
'target_class' => 'Category\Entity\RegAppAnswers',
'property' => 'answer',
'is_method' => true,
'find_method' => array(
'name' => 'findBy',
'params' => array(
'criteria' => array('question' => $question->getId()),
),
),
),
'attributes' => array(
'class' => 'checkbox-inline'
),
));
break;
}
}
}
Все хорошо идет до сохранения формы. При сохранение успешно проходит валидация, но записи в базу вставляю через foreach.
Может у кого-то возникала подобная задача, либо есть более совершенный алгоритм? Готового модуля не нашел.
Заранее благодарен.