Предложить лучший поток для приложения викторины в CakePHP - PullRequest
0 голосов
/ 21 декабря 2009

Вот текущий поток моего приложения викторины:

  1. Пользователи / do_program
  2. quiz_contents / вид
  3. quiz_questions / do_quiz

Проверка того, должен ли пользователь выполнять другой модуль после завершения текущих, осуществляется в контроллере quiz_contents и quiz_questions, который, я думаю, может быть улучшен из-за дублированного кода. Так что бы вы предложили, ребята?

Некоторая информация:

  • Модуль принадлежит программе и Программа имеет много модулей.
  • модуль должен иметь quiz_content, и это может или может не иметь quiz_question
  • Я получил код, который регистрирует, если пользователь заканчивает quiz_content в quiz_contents, и код, который регистрирует, если пользователь заканчивает quiz_question в quiz_questions

P.S. Также вы, ребята, посоветуете, чтобы я поместил контент / тест для визуализации (в частности, идентификатор) в сеанс?

Ответы [ 3 ]

0 голосов
/ 21 декабря 2009

С помощью Cake любой код, который должен быть использован повторно, помещается в следующие папки.

Контроллеры => Компоненты

Модели => Поведение

Views => Elements

Я предлагаю вам взглянуть на http://book.cakephp.org, чтобы ознакомиться с фреймворком.

0 голосов
/ 24 декабря 2009

Если я вас правильно понимаю, то ваши модели настроены так:

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 для улучшения читабельности.

0 голосов
/ 21 декабря 2009

Исходя из того, что у вас есть, я предполагаю, что вы имеете в виду дублирующий код в содержимом викторины и quiz_questions. Если это правильное содержание викторины, это единственное место, где должна быть логика большего количества модулей. Тем более, что вопрос викторины не гарантирован.

...