4require_once 
'Modules/TestQuestionPool/classes/questions/class.ilAssOrderingElement.php';
 
   36        self::IDENTIFIER_TYPE_SOLUTION => array(),
 
   37        self::IDENTIFIER_TYPE_RANDOM => array()
 
   57        $this->questionId = 
null;
 
   70        foreach ($this as $key => $element) {
 
  111            "SELECT * FROM qpl_a_ordering WHERE question_fi = %s ORDER BY position ASC",
 
  119            $element->setRandomIdentifier($row[
'random_id']);
 
  120            $element->setSolutionIdentifier($row[
'solution_key']);
 
  122            $element->setPosition($row[
'position']);
 
  123            $element->setIndentation($row[
"depth"]);
 
  125            $element->setContent($row[
'answertext']);
 
  135    public function saveToDb()
 
  141            "DELETE FROM qpl_a_ordering WHERE question_fi = %s",
 
  146        foreach ($this as $orderElement) {
 
  149            $ilDB->insert(
'qpl_a_ordering', array(
 
  150                'answer_id' => array( 
'integer', 
$ilDB->nextId(
'qpl_a_ordering') ),
 
  152                'answertext' => array( 
'text', $orderElement->getContent()),
 
  153                'solution_key' => array( 
'integer', $orderElement->getSolutionIdentifier() ),
 
  154                'random_id' => array( 
'integer', $orderElement->getRandomIdentifier() ),
 
  155                'position' => array( 
'integer', $orderElement->getPosition() ),
 
  156                'depth' => array( 
'integer', $orderElement->getIndentation() ),
 
  157                'tstamp' => array( 
'integer', time() )
 
  167        foreach ($this as $orderingElement) {
 
  168            $orderingElement->setContent(
'');
 
  174        return count($this->elements);
 
  184        return $position == 0;
 
  197        $elementList = 
new self();
 
  200        foreach ($this as $element) {
 
  201            if ($element->getPosition() == $currentPosition) {
 
  202                $elementList->addElement($dodgingElement);
 
  206            if ($element->getPosition() == $targetPosition) {
 
  207                $elementList->addElement($movingElement);
 
  211            $elementList->addElement($element);
 
  214        $dodgingElement->setPosition($currentPosition);
 
  215        $movingElement->setPosition($targetPosition);
 
  222        $elementList = 
new self();
 
  225        $positionCounter = 0;
 
  227        foreach ($this as $element) {
 
  228            if ($element->isSameElement($removeElement)) {
 
  232            $element->setPosition($positionCounter++);
 
  233            $elementList->addElement($element);
 
  242        $this->elements = array();
 
  304        foreach ($this as $element) {
 
  320        $this->elements[] = $element;
 
  329        if (isset($this->elements[$position])) {
 
  330            return $this->elements[$position];
 
  351        foreach ($this as $element) {
 
  352            if ($element->getRandomIdentifier() != $randomIdentifier) {
 
  377        foreach ($this as $element) {
 
  378            if ($element->getSolutionIdentifier() != $solutionIdentifier) {
 
  418        if (!isset(self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
 
  422        return self::$identifierRegistry[$identifierType][$this->
getQuestionId()];
 
  431        $identifier = $this->
fetchIdentifier($element, self::IDENTIFIER_TYPE_SOLUTION);
 
  437        $identifier = $this->
fetchIdentifier($element, self::IDENTIFIER_TYPE_RANDOM);
 
  486        if (!isset(self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
 
  487            self::$identifierRegistry[$identifierType][$this->
getQuestionId()] = array();
 
  492        if (!in_array($identifier, self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
 
  493            self::$identifierRegistry[$identifierType][$this->
getQuestionId()][] = $identifier;
 
  505        if (!isset(self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
 
  511        if (!in_array($identifier, self::$identifierRegistry[$identifierType][$this->
getQuestionId()])) {
 
  526        switch ($identifierType) {
 
  542        switch ($identifierType) {
 
  557        switch ($identifierType) {
 
  575        switch ($identifierType) {
 
  590            "unknown identifier type given (type: $identifierType)" 
  601            "could not build random identifier (max tries: $maxTries)" 
  612            "cannot reorder element due to missing position (random identifier: $randomIdentifier)" 
  623            'cannot reorder element due to one or more unknown random identifiers ' .
 
  624            '(' . implode(
', ', $randomIdentifiers) . 
')' 
  633        $lastSolutionIdentifier = 
null;
 
  636            if ($lastSolutionIdentifier > $registeredIdentifier) {
 
  640            $lastSolutionIdentifier = $registeredIdentifier;
 
  643        return $lastSolutionIdentifier;
 
  653        if ($lastSolutionIdentifier === 
null) {
 
  659        return $nextSolutionIdentifier;
 
  668        $usedTriesCounter = 0;
 
  671            if ($usedTriesCounter >= self::RANDOM_IDENTIFIER_BUILD_MAX_TRIES) {
 
  679            $randomIdentifier = mt_rand($lowerBound, $upperBound);
 
  682            $testElement->setRandomIdentifier($randomIdentifier);
 
  685        return $randomIdentifier;
 
  690        if (!is_numeric($identifier)) {
 
  694        if ($identifier != (
int) $identifier) {
 
  698        if ($identifier < 0) {
 
  707        if (!is_numeric($identifier)) {
 
  711        if ($identifier != (
int) $identifier) {
 
  715        if ($identifier < self::RANDOM_IDENTIFIER_RANGE_LOWER_BOUND) {
 
  719        if ($identifier > self::RANDOM_IDENTIFIER_RANGE_UPPER_BOUND) {
 
  741        foreach ($this as $element) {
 
  752        $numIntersectingElements = count(array_intersect(
 
  753            $otherList->getRandomIdentifierIndex(),
 
  754            $this->getRandomIdentifierIndex()
 
  761        if ($numIntersectingElements != $otherList->countElements()) {
 
  767        $otherListRandomIdentifierIndex = $otherList->getRandomIdentifierIndex();
 
  769        foreach ($this as $orderingElement) {
 
  770            if (!in_array($orderingElement->getRandomIdentifier(), $otherListRandomIdentifierIndex)) {
 
  774            $randomIdentifierIndexMatchingsCount = count(array_keys(
 
  775                $otherListRandomIdentifierIndex,
 
  776                $orderingElement->getRandomIdentifier(),
 
  780            if ($randomIdentifierIndexMatchingsCount != 1) {
 
  785        return $this->
countElements() == $otherList->countElements();
 
  794        $parityTrueElementList = 
new self();
 
  795        $parityTrueElementList->setQuestionId($this->
getQuestionId());
 
  797        foreach ($this as $thisElement) {
 
  798            $otherElement = $otherList->getElementByRandomIdentifier(
 
  799                $thisElement->getRandomIdentifier()
 
  802            if ($otherElement->getPosition() != $thisElement->getPosition()) {
 
  806            if ($otherElement->getIndentation() != $thisElement->getIndentation()) {
 
  810            $parityTrueElementList->addElement($thisElement);
 
  813        return $parityTrueElementList;
 
  823        $positionsMap = array_flip(array_values($randomIdentifiers));
 
  825        $orderedElements = array();
 
  827        foreach ($this as $element) {
 
  828            if (!isset($positionsMap[$element->getRandomIdentifier()])) {
 
  832            $position = $positionsMap[$element->getRandomIdentifier()];
 
  833            unset($positionsMap[$element->getRandomIdentifier()]);
 
  835            $element->setPosition($position);
 
  836            $orderedElements[$position] = $element;
 
  839        if (count($positionsMap)) {
 
  843        ksort($orderedElements);
 
  845        $this->
setElements(array_values($orderedElements));
 
  853        foreach ($this as $element) {
 
  854            $element->setIndentation(0);
 
  866        $differenceElementList = 
new self();
 
  867        $differenceElementList->setQuestionId($this->
getQuestionId());
 
  869        foreach ($differenceRandomIdentifierIndex as $randomIdentifier) {
 
  871            $differenceElementList->addElement($element);
 
  874        return $differenceElementList;
 
  883        $differenceRandomIdentifierIndex = array_diff(
 
  885            $otherElementList->getRandomIdentifierIndex()
 
  888        return $differenceRandomIdentifierIndex;
 
  896        foreach ($this as $thisElement) {
 
  897            if (!$otherList->elementExistByRandomIdentifier($thisElement->getRandomIdentifier())) {
 
  901            $otherElement = $otherList->getElementByRandomIdentifier(
 
  902                $thisElement->getRandomIdentifier()
 
  905            $thisElement->setContent($otherElement->getContent());
 
  914        return current($this->elements);
 
  922        return next($this->elements);
 
  930        return key($this->elements);
 
  938        return ($this->
key() !== 
null);
 
  946        return reset($this->elements);
 
  955        $element->setRandomIdentifier(self::FALLBACK_DEFAULT_ELEMENT_RANDOM_IDENTIFIER);
 
  967        $elementList = 
new self();
 
  970        $elementList->setElements($orderingElements);
 
  979        foreach ($this as $element) {
 
  980            $items[] = implode(
':', array(
 
  981                $element->getSolutionIdentifier(),
 
  982                $element->getRandomIdentifier(),
 
  983                $element->getIndentation()
 
  987        return md5(serialize($items));
 
if(!defined('PATH_SEPARATOR')) $GLOBALS['_PEAR_default_error_mode']
An exception for terminatinating execution or to throw for unit testing.
const IDENTIFIER_TYPE_SOLUTION
isIdentifierRegistered(ilAssOrderingElement $element, $identifierType)
hasSameElementSetByRandomIdentifiers(self $otherList)
const RANDOM_IDENTIFIER_RANGE_LOWER_BOUND
completeContentsFromElementList(self $otherList)
distributeNewRandomIdentifiers()
static isValidPosition($position)
registerIdentifiers(ilAssOrderingElement $element)
getLastSolutionIdentifier()
const SOLUTION_IDENTIFIER_START_VALUE
elementExistBySolutionIdentifier($solutionIdentifier)
getDifferenceElementList(self $otherElementList)
const SOLUTION_IDENTIFIER_BUILD_MAX_TRIES
getElementBySolutionIdentifier($solutionIdentifier)
registerIdentifier(ilAssOrderingElement $element, $identifierType)
getIndexedElements($identifierType)
const JS_ADDED_ELEMENTS_RANDOM_IDENTIFIER_START_VALUE
getElementByPosition($position)
static $identifierRegistry
loadFromDb()
load elements from database
static $objectInstanceCounter
static isValidRandomIdentifier($identifier)
getRegisteredRandomIdentifiers()
getRegisteredSolutionIdentifiers()
static getFallbackDefaultElement()
__construct()
ilAssOrderingElementList constructor.
resetElements()
resets elements
isLastElementPosition($position)
getRandomIdentifierIndexedElements()
getSolutionIdentifierIndex()
getSolutionIdentifierIndexedElements()
getDifferenceRandomIdentifierIndex(self $otherElementList)
throwMissingReorderPositionException($randomIdentifier)
populateIdentifier(ilAssOrderingElement $element, $identifierType, $identifier)
getRegisteredIdentifiers($identifierType)
getElementByRandomIdentifier($randomIdentifier)
const SOLUTION_IDENTIFIER_VALUE_INTERVAL
elementExistByRandomIdentifier($randomIdentifier)
getRandomIdentifierIndex()
buildSolutionIdentifier()
removeElement(ilAssOrderingElement $removeElement)
getParityTrueElementList(self $otherList)
static buildInstance($questionId, $orderingElements=array())
clearElementContents()
clears the contents of all elements
isValidIdentifier($identifierType, $identifier)
setQuestionId($questionId)
hasValidIdentifiers(ilAssOrderingElement $element)
const RANDOM_IDENTIFIER_RANGE_UPPER_BOUND
ensureValidIdentifiers(ilAssOrderingElement $element)
const FALLBACK_DEFAULT_ELEMENT_RANDOM_IDENTIFIER
const RANDOM_IDENTIFIER_BUILD_MAX_TRIES
static isValidSolutionIdentifier($identifier)
static isValidIndentation($indentation)
fetchIdentifier(ilAssOrderingElement $element, $identifierType)
reorderByRandomIdentifiers($randomIdentifiers)
const IDENTIFIER_TYPE_RANDOM
throwCouldNotBuildRandomIdentifierException($maxTries)
moveElementByPositions($currentPosition, $targetPosition)
addElement(ilAssOrderingElement $element)
__clone()
clone list by additionally cloning the element objects
const JS_ADDED_ELEMENTS_RANDOM_IDENTIFIER_VALUE_INTERVAL
buildIdentifier($identifierType)
throwUnknownIdentifierTypeException($identifierType)
elementExistByPosition($position)
isFirstElementPosition($position)
ensureValidIdentifier(ilAssOrderingElement $element, $identifierType)
throwUnknownRandomIdentifiersException($randomIdentifiers)
resetElementsIndentations()
resets the indentation to level 0 for all elements in list
setRandomIdentifier($randomIdentifier)
setSolutionIdentifier($solutionIdentifier)