Ben doğru anlamak sonra modeller şöyle kurulur:
Program hasMany Module hasMany QuizContent hasMany QuizQuestion
veya daha basitçe:
Program hasMany Module hasMany Quiz hasMany Question
Orada bu uygulamalarda düşünmek için oldukça çok olacak, bu yüzden biz daha soruların cevabını bilmeden bu nasıl yapılandırabileceğinize söylemek zor olabilir:
- Kullanıcıların bir kereden fazla sınav yapabilir miyim?
- Kullanıcıların sorulara dönebilirsiniz zaten cevap var?
- Cevaplar ayrı ayrı kaydedilir?
- Sonuç kadar kaydedilir ve daha sonra sonunda saklanır mı?
- Sonuçları veritabanında saklanır mı?
- Sonuçlar sadece bir yerde kapalı gönderilir?
, Kesinlikle gördüğüm soruyu kontrol etmek istediğiniz varsayarak kullanıcıların tarayıcı kontrollerini kullanarak geri dönmek için izin değil, yerine veritabanı oturumlarında devleti (tamamlanmamış sınavlar) tutarak, bu gibi bir yaklaşım olabilir:
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'));
}
}
Not: Yukarıdaki örnekte ben readabilty geliştirmek Sınav Soru ve modelleri yeniden adlandırıldı.