closedquestion-8.x-3.x-dev/src/Question/CqUserAnswerClient.php

src/Question/CqUserAnswerClient.php
<?php

namespace Drupal\closedquestion\Question;

/**
 * Class CqUserAnswerClient.
 *
 * CqUserAnswerClient is a CqUserAnswerInterface implementation that multiplexes
 * it's data into a parent CqUserAnswerInterface implementation. This way a node
 * can store the data of more than one question.
 *
 * Used by sequence questions, that are questions consisting of several
 * sub-questions.
 *
 * The data of the parent is assumed to be an associative array. Each client
 * puts it's data in that array with it's assigned key.
 *
 * @package Drupal\closedquestion\Question
 */
class CqUserAnswerClient implements CqUserAnswerInterface {

  /**
   * The CqUserAnswerInterface that we use to store our answer.
   *
   * @var \Drupal\closedquestion\Question\CqUserAnswerInterface
   */
  private $parentUserAnswer;

  /**
   * The key to use when adding data to the parent CqUserAnswerInterface.
   *
   * @var string
   */
  private $key;

  /**
   * The answer-data as it is stored in the parent.
   *
   * @var array
   *   Associative array
   *   - sa: The serialised answer.
   *   - tries: The number of tries.
   *   - onceCorrect: The onceCorrect property.
   */
  private $parentAnswer;

  /**
   * The user's answer.
   *
   * @var mixed
   */
  private $answer;

  /**
   * Additional data, as key/value pairs.
   *
   * @var array
   */
  private $data;

  /**
   * The correct value of the current answer.
   *
   * 1: correct
   * 0: incorrect
   * -1: (default) correctness not determined yet.
   *
   * @var int
   */
  private $isCorrect = -1;

  /**
   * The previous value of the number of tries.
   *
   * @var int
   */
  private $origTries;

  /**
   * Creates a new CqUserAnswerClient.
   *
   * @param \Drupal\closedquestion\Question\CqUserAnswerInterface $parentUserAnswer
   *   The parent CqUserAnswerInterface used to store data.
   * @param string $key
   *   The key used to store data in the parent UserAnswer.
   */
  public function __construct(CqUserAnswerInterface $parentUserAnswer, $key) {
    $this->parentUserAnswer = $parentUserAnswer;
    $this->key = $key;

    $parentAnswer = $this->parentUserAnswer->getAnswer();
    if (isset($parentAnswer[$this->key])) {
      $this->parentAnswer = $parentAnswer[$this->key];
      $this->answer = unserialize($this->parentAnswer['sa']);
      $this->data = $this->parentUserAnswer->getData($this->key);
    }
    else {
      $this->parentAnswer['tries'] = 0;
      $this->parentAnswer['onceCorrect'] = 0;
    }
    $this->origTries = $this->parentAnswer['tries'];
  }

  /**
   * Implements CqUserAnswer::store()
   */
  public function store() {
    $seranswer = serialize($this->answer);
    if ($seranswer != $this->parentAnswer['sa'] || $this->origTries != $this->parentAnswer['tries']) {
      $this->parentAnswer['sa'] = $seranswer;
      $parentAnswer = $this->parentUserAnswer->getAnswer();
      $parentAnswer[$this->key] = $this->parentAnswer;
      $this->parentUserAnswer->setAnswer($parentAnswer);
    }
    $this->parentUserAnswer->setData($this->key, $this->data);
    $this->parentUserAnswer->store();
  }

  /**
   * Implements CqUserAnswer::getAnswer()
   */
  public function getAnswer() {
    return $this->answer;
  }

  /**
   * Implements CqUserAnswer::setAnswer()
   */
  public function setAnswer($newAnswer) {
    $this->answer = $newAnswer;
  }

  /**
   * Implements CqUserAnswer::reset()
   */
  public function reset() {
    $this->parentAnswer = array();
    $this->parentAnswer['tries'] = 0;
    $this->isCorrect = -1;
    $this->parentAnswer['onceCorrect'] = 0;
    $this->answer = '';
    $this->parentAnswer['sa'] = serialize($this->answer);
    $this->store();
  }

  /**
   * Implements CqUserAnswer::answerHasChanged()
   */
  public function answerHasChanged() {
    $seranswer = serialize($this->answer);
    return ($seranswer != $this->parentAnswer['sa']);
  }

  /**
   * Implements CqUserAnswer::getTries()
   */
  public function getTries() {
    return $this->parentAnswer['tries'];
  }

  /**
   * Implements CqUserAnswer::setTries()
   */
  public function setTries($tries) {
    $this->parentAnswer['tries'] = $tries;
  }

  /**
   * Implements CqUserAnswer::increaseTries()
   */
  public function increaseTries() {
    $this->parentAnswer['tries']++;
  }

  /**
   * Implements CqUserAnswer::isEmpty()
   */
  public function isEmpty() {
    return empty($this->answer);
  }

  /**
   * Implements CqUserAnswer::isCorrect()
   */
  public function isCorrect() {
    return $this->isCorrect;
  }

  /**
   * Implements CqUserAnswer::onceCorrect()
   */
  public function onceCorrect() {
    return $this->parentAnswer['onceCorrect'];
  }

  /**
   * Implements CqUserAnswer::setCorrect()
   */
  public function setCorrect($correct) {
    $this->isCorrect = (int) $correct;
    if ($correct && !$this->parentAnswer['onceCorrect']) {
      $this->parentAnswer['onceCorrect'] = $this->parentAnswer['tries'] + 1;
    }
  }

  /**
   * Implements CqUserAnswer::getCorrect()
   */
  public function getCorrect() {
    return $this->isCorrect;
  }

  /**
   * Implements CqUserAnswer::getData()
   */
  public function getData($key) {
    return $this->data[$key];
  }

  /**
   * Implements CqUserAnswer::setData()
   */
  public function setData($key, $value) {
    $this->data[$key] = $value;
  }

  /**
   * Implements CqUserAnswer::getUserId()
   */
  public function getUserId() {
    return $this->parentUserAnswer->getUserId();
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc