Если я вас правильно понимаю, то ваши модели настроены так:
Program hasMany Module hasMany QuizContent hasMany QuizQuestion
или более просто:
Program hasMany Module hasMany Quiz hasMany Question
В этих приложениях может быть достаточно много размышлений, поэтому трудно сказать вам, как мы могли бы это структурировать, не зная ответа на дополнительные вопросы:
- Могут ли пользователи пройти тест более одного раза?
- Могут ли пользователи вернуться к вопросам, на которые они уже ответили?
- Сохраняются ли ответы индивидуально?
- Сохраняются ли результаты, а затем сохраняются в конце?
- Сохраняются ли результаты в базе данных?
- Результаты просто отправляются по электронной почте куда-нибудь?
Предполагая, что вы хотите строго контролировать увиденный вопрос, не позволяя пользователям возвращаться назад, используя элементы управления своего браузера, сохраняя состояние (незавершенные тесты) в сеансах вместо базы данных, вы можете подойти к нему так:
class QuizController extends AppController {
# allow user to do a quiz
function do($id) {
# do something with each answer submitted
if ($this->data) {
// validate, save to database, or store in session until the end
$questionNumber = $this->Session->read('Quiz.question');
$this->Session->write('Quiz.question', $questionNumber + 1);
$this->redirect(array('action' => 'do', $id));
}
# get the quiz (and questions)
$quiz = $this->Quiz->find('first', array(
'conditions' => array('Quiz.id' => $id),
'contain' => array('Question'), // if using Containable
));
# quiz doesn't exist
if (!$quiz) {
$this->cakeError('error404');
}
# get the question number
$questionNumber = $this->Session->read('Quiz.question');
# quiz hasn't been started
if (!$questionNumber) {
$questionNumber = 1;
$this->Session->write('Quiz.question', $questionNumber);
}
# get the question
$question = Set::extract("/Question[$questionNumber]", $quiz);
# there are no more questions
if (!$question) {
// finalize quiz, save to database, redirect to obvious place
$this->Session->setFlash('Quiz complete');
$this->redirect(array('action' => 'index', $quiz['Quiz']['id']));
}
# set variables to the view
$this->set(compact('quiz', 'question'));
}
}
Примечание: в приведенном выше примере я переименовал модели в Quiz и Question для улучшения читабельности.