CakePHP'de bir sınav uygulaması için daha iyi bir akış öner

3 Cevap php

İşte benim yarışması app akım bulunuyor:

  1. kullanıcılar / do_program
  2. quiz_contents / görünüm
  3. quiz_questions / do_quiz

Kullanıcı mevcut olanları ben çünkü yinelenen kod geliştirilebilir düşünüyorum quiz_contents ve quiz_questions denetleyicisi olan bitirdikten sonra başka bir modül yapmak için varsa kontrol. Peki siz ne önerirsiniz?

Bazı bilgiler:

  • A module belongs to a program and a program has many modules.
  • A module must have a quiz_content and it may or may not have a quiz_question
  • Ben bir kullanıcı bir kullanıcı quiz_questions bir quiz_question bitirirse günlükleri quiz_contents ve kod bir quiz_content bitirirse günlükleri bu kodu var

P.S. Also would you guys advise that I put the content/quiz to be rendered (the id in particular) in the session?

3 Cevap

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ı.

Eğer buraya ne dayanarak ben sınav içeriği ve quiz_questions yinelenen kod var mı demek varsayalım. Bu ise doğru sınav içeriği olmak more modülleri mantık için tek yerdir. Bilgi yarışması soru garanti edilmez Özellikle beri.

Kek yeniden edilecek herhangi bir kodu kullanarak aşağıdaki klasörlerde gider.

Kontrolörleri => Bileşenler

Modeller => Davranışlar

İzlenme => Elementler

Ben çerçevesiyle tanımak için http://book.cakephp.org daha uzun bir göz atın öneririz.