4 require_once
'Modules/TestQuestionPool/classes/questions/class.ilAssOrderingElement.php';
36 self::IDENTIFIER_TYPE_SOLUTION => array(),
37 self::IDENTIFIER_TYPE_RANDOM => array()
55 $this->objectInstanceId = ++self::$objectInstanceCounter;
57 $this->questionId = null;
66 $this->objectInstanceId = ++self::$objectInstanceCounter;
70 foreach ($this as
$key => $element) {
108 $ilDB = $DIC[
'ilDB'];
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) {
558 case self::IDENTIFIER_TYPE_SOLUTION:
559 return self::isValidSolutionIdentifier($identifier);
561 case self::IDENTIFIER_TYPE_RANDOM:
562 return self::isValidRandomIdentifier($identifier);
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) {
657 $nextSolutionIdentifier = $lastSolutionIdentifier + self::SOLUTION_IDENTIFIER_VALUE_INTERVAL;
659 return $nextSolutionIdentifier;
668 $usedTriesCounter = 0;
671 if ($usedTriesCounter >= self::RANDOM_IDENTIFIER_BUILD_MAX_TRIES) {
677 $lowerBound = self::RANDOM_IDENTIFIER_RANGE_LOWER_BOUND;
678 $upperBound = self::RANDOM_IDENTIFIER_RANGE_UPPER_BOUND;
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) {
728 return self::isValidSolutionIdentifier($position);
733 return self::isValidPosition($indentation);
741 foreach ($this as $element) {
752 $numIntersectingElements = count(array_intersect(
753 $otherList->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));
__clone()
clone list by additionally cloning the element objects
reorderByRandomIdentifiers($randomIdentifiers)
registerIdentifiers(ilAssOrderingElement $element)
elementExistBySolutionIdentifier($solutionIdentifier)
static isValidPosition($position)
const IDENTIFIER_TYPE_SOLUTION
const JS_ADDED_ELEMENTS_RANDOM_IDENTIFIER_START_VALUE
static $identifierRegistry
isValidIdentifier($identifierType, $identifier)
getRegisteredSolutionIdentifiers()
getLastSolutionIdentifier()
__construct()
ilAssOrderingElementList constructor.
const SOLUTION_IDENTIFIER_START_VALUE
populateIdentifier(ilAssOrderingElement $element, $identifierType, $identifier)
removeElement(ilAssOrderingElement $removeElement)
const RANDOM_IDENTIFIER_RANGE_UPPER_BOUND
setSolutionIdentifier($solutionIdentifier)
isFirstElementPosition($position)
completeContentsFromElementList(self $otherList)
elementExistByPosition($position)
moveElementByPositions($currentPosition, $targetPosition)
hasSameElementSetByRandomIdentifiers(self $otherList)
static buildInstance($questionId, $orderingElements=array())
setQuestionId($questionId)
elementExistByRandomIdentifier($randomIdentifier)
getSolutionIdentifierIndex()
getRegisteredRandomIdentifiers()
throwMissingReorderPositionException($randomIdentifier)
resetElements()
resets elements
const JS_ADDED_ELEMENTS_RANDOM_IDENTIFIER_VALUE_INTERVAL
static isValidRandomIdentifier($identifier)
const SOLUTION_IDENTIFIER_VALUE_INTERVAL
throwCouldNotBuildRandomIdentifierException($maxTries)
getRegisteredIdentifiers($identifierType)
distributeNewRandomIdentifiers()
getElementByRandomIdentifier($randomIdentifier)
buildIdentifier($identifierType)
loadFromDb()
load elements from database
throwUnknownRandomIdentifiersException($randomIdentifiers)
getElementBySolutionIdentifier($solutionIdentifier)
ensureValidIdentifier(ilAssOrderingElement $element, $identifierType)
throwUnknownIdentifierTypeException($identifierType)
addElement(ilAssOrderingElement $element)
setRandomIdentifier($randomIdentifier)
getDifferenceRandomIdentifierIndex(self $otherElementList)
getIndexedElements($identifierType)
isIdentifierRegistered(ilAssOrderingElement $element, $identifierType)
getRandomIdentifierIndexedElements()
static getFallbackDefaultElement()
getRandomIdentifierIndex()
fetchIdentifier(ilAssOrderingElement $element, $identifierType)
const FALLBACK_DEFAULT_ELEMENT_RANDOM_IDENTIFIER
static isValidSolutionIdentifier($identifier)
const RANDOM_IDENTIFIER_RANGE_LOWER_BOUND
const RANDOM_IDENTIFIER_BUILD_MAX_TRIES
resetElementsIndentations()
resets the indentation to level 0 for all elements in list
buildSolutionIdentifier()
getElementByPosition($position)
getParityTrueElementList(self $otherList)
static $objectInstanceCounter
getSolutionIdentifierIndexedElements()
static isValidIndentation($indentation)
hasValidIdentifiers(ilAssOrderingElement $element)
$GLOBALS['JPEG_Segment_Names']
Global Variable: XMP_tag_captions.
isLastElementPosition($position)
ensureValidIdentifiers(ilAssOrderingElement $element)
clearElementContents()
clears the contents of all elements
const IDENTIFIER_TYPE_RANDOM
registerIdentifier(ilAssOrderingElement $element, $identifierType)
const SOLUTION_IDENTIFIER_BUILD_MAX_TRIES
getDifferenceElementList(self $otherElementList)