public function export2()
 {
     try {
         $dom = new DomDocument();
         $id = $dom->createAttribute('id');
         //
         $id->appendChild($dom->createTextNode($this->lesson['id']));
         $lessonNode = $dom->createElement("lesson");
         $lessonNode->appendChild($id);
         $lessonNode = $dom->appendChild($lessonNode);
         $parentNodes[0] = $lessonNode;
         $lessonContent = new EfrontContentTree($this->lesson['id']);
         foreach ($iterator = new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($lessonContent->tree), RecursiveIteratorIterator::SELF_FIRST)) as $key => $properties) {
             $result = eF_getTableData("content", "*", "id={$key}");
             $contentNode = $dom->appendChild($dom->createElement("content"));
             //<content></content>
             $parentNodes[$iterator->getDepth() + 1] = $contentNode;
             $attribute = $contentNode->appendChild($dom->createAttribute('id'));
             //<content id = ""></content>
             $attribute->appendChild($dom->createTextNode($key));
             //<content id = "CONTENTID:32"></content>
             foreach ($result[0] as $element => $value) {
                 if ($element == 'data') {
                     $value = htmlentities($value);
                 }
                 if ($element != 'id' && $element != 'previous_content_ID' && $element != 'parent_content_ID' && $element != 'lessons_ID') {
                     $element = $contentNode->appendChild($dom->createElement($element));
                     $element->appendChild($dom->createTextNode($value));
                 }
             }
             /*
             if ($properties['ctg_type'] == 'tests') {
             $result = eF_getTableData("tests", "*", "content_ID=$key");
             foreach ($result[0] as $element => $value) {
             
             }
             }
             */
             $parentNodes[$iterator->getDepth()]->appendChild($contentNode);
             //<lesson><content></content></lesson>
         }
         header("content-type:text/xml");
         echo $dom->saveXML();
         //$content = eF_getTableData("content", "*", "lessons_ID=".$this -> lesson['id']);
     } catch (Exception $e) {
         pr($e);
     }
 }
     $navigation = $scoContent->overall_sequencing_process($navigation);
     //Set the current unit
     if ($navigation->delivery_request) {
         $_GET['view_unit'] = $navigation->delivery_request['content_ID'];
         $currentUnit = $currentContent->seekNode($navigation->delivery_request['content_ID']);
         //The content tree does not hold data, so assign this unit its data
         $unitData = new EfrontUnit($currentUnit['id']);
         $currentUnit['data'] = $unitData['data'];
     } else {
         $currentUnit = $currentContent->seekNode($_SESSION['package_ID']);
     }
 } else {
     $currentUnit = $currentContent->seekNode($_SESSION['package_ID']);
 }
 //Set completion icons
 $iterator = new EfrontNodeFilterIterator(new RecursiveIteratorIterator($scoContent->tree, RecursiveIteratorIterator::SELF_FIRST));
 foreach ($iterator as $key => $value) {
     $objInfo = $scoContent->objectives->get_objective_info(false, $value['content_ID']);
     //Completion Status
     if ($objInfo['attempt_progress_status'] == 'true' && $objInfo['attempt_completion_status'] == 'true') {
         $trackActivityInfo['completion_status'] = 'completed';
     } else {
         if ($objInfo['attempt_progress_status'] == 'true' && $objInfo['attempt_completion_status'] == 'false') {
             $trackActivityInfo['completion_status'] = 'incomplete';
         } else {
             $trackActivityInfo['completion_status'] = 'not attempted';
         }
     }
     //Success Status
     if ($objInfo['objective_progress_status'] == 'true' && $objInfo['objective_satisfied_status'] == 'true') {
         $trackActivityInfo['success_status'] = 'passed';
 public function toSelect($returnClassedHTML = false, $includeSkillGaps = false, $showQuestions = false, $iterator = false, $lessons = false, $courses = false)
 {
     if (!$iterator) {
         $iterator = new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($this->tree), RecursiveIteratorIterator::SELF_FIRST));
     }
     if ($lessons === false) {
         //If a lessons list is not specified, get all active lessons
         if ($showQuestions) {
             $result = eF_getTableData("lessons l JOIN questions q ON q.lessons_ID = l.id", "l.id, l.name, count(q.id) as questions", "q.type <> 'raw_text' AND l.archive = 0 AND l.active=1", "", "l.name");
         } else {
             $result = eF_getTableData("lessons", "*", "archive = 0 && active=1");
             //Get all lessons at once, thus avoiding looping queries
         }
         foreach ($result as $value) {
             $value['name'] = str_replace("'", "&#039;", $value['name']);
             $lessons[$value['id']] = new EfrontLesson($value);
             //Create an array of EfrontLesson objects
         }
     }
     $directionsQuestions = array();
     $directionsLessons = array();
     foreach ($lessons as $id => $lesson) {
         if (!$lesson->lesson['active']) {
             //Remove inactive lessons
             unset($lessons[$id]);
         } elseif (!$lesson->lesson['course_only']) {
             //Lessons in courses will be handled by the course's display method, so remove them from the list
             $directions_ID = $lesson->lesson['directions_ID'];
             $directionsLessons[$directions_ID][] = $id;
             //Create an intermediate array that maps lessons to directions
             if ($showQuestions) {
                 if (isset($directionsQuestions[$directions_ID])) {
                     $directionsQuestions[$directions_ID] += $lesson->lesson['questions'];
                 } else {
                     $directionsQuestions[$directions_ID] = $lesson->lesson['questions'];
                 }
             }
         }
     }
     if ($courses === false) {
         //If a courses list is not specified, get all active courses
         if ($showQuestions) {
             $resultQuestions = eF_getTableData("courses c JOIN lessons_to_courses lc ON lc.courses_ID = c.id JOIN questions q ON q.lessons_ID = lc.lessons_ID", "c.id, count(q.id) as questions", "q.type <> 'raw_text' AND c.archive = 0 AND c.active=1", "", "c.name");
             $coursesQuestions = array();
             foreach ($resultQuestions as $resultQs) {
                 $coursesQuestions[$resultQs['id']] = $resultQs['questions'];
             }
         }
         $result = eF_getTableData("courses", "*", "archive = 0 AND active=1");
         //Get all courses at once, thus avoiding looping queries
         foreach ($result as $value) {
             $value['name'] = str_replace("'", "&#039;", $value['name']);
             $value['questions'] = $coursesQuestions[$value['id']] != "" ? $coursesQuestions[$value['id']] : 0;
             // 0 + to cast empty values to 0
             $courses[$value['id']] = new EfrontCourse($value);
             //Create an array of EfrontCourse objects
         }
     }
     $directionsCourses = array();
     foreach ($courses as $id => $course) {
         if (!$course->course['active']) {
             //Remove inactive courses
             unset($courses[$id]);
         } else {
             $directions_ID = $course->course['directions_ID'];
             $directionsCourses[$directions_ID][] = $id;
             //Create an intermediate array that maps courses to directions
             if ($showQuestions) {
                 if (isset($directionsQuestions[$directions_ID])) {
                     $directionsQuestions[$directions_ID] += $course->course['questions'];
                 } else {
                     $directionsQuestions[$directions_ID] = $course->course['questions'];
                 }
             }
         }
     }
     //We need to calculate which directions will be displayed. We will keep only directions that have lessons or courses and their parents. In order to do so, we traverse the directions tree and set the 'hasNodes' attribute to the nodes that will be kept
     foreach ($iterator as $key => $value) {
         if (isset($directionsLessons[$value['id']]) || isset($directionsCourses[$value['id']])) {
             $count = $iterator->getDepth();
             $value['hasNodes'] = true;
             isset($directionsLessons[$value['id']]) ? $value['lessons'] = $directionsLessons[$value['id']] : null;
             //Assign lessons ids to the direction
             isset($directionsCourses[$value['id']]) ? $value['courses'] = $directionsCourses[$value['id']] : null;
             //Assign courses ids to the direction
             while ($count) {
                 $node = $iterator->getSubIterator($count--);
                 $node['hasNodes'] = true;
                 //Mark "keep" all the parents of the node
             }
         }
     }
     $iterator = new EfrontNodeFilterIterator($iterator, array('hasNodes' => true));
     //Filter in only tree nodes that have the 'hasNodes' attribute
     $iterator->rewind();
     $current = $iterator->current();
     // pr($current);
     $current_level_father = 0;
     $treeArray = array();
     if ($includeSkillGaps) {
         $treeArray['lesson_0'] = _SKILLGAPTESTS;
     }
     $offset = "";
     while ($iterator->valid()) {
         $children = array();
         //The $children array is used so that when collapsing a direction, all its children disappear as well
         foreach (new EfrontNodeFilterIterator(new ArrayIterator($this->getNodeChildren($current), RecursiveIteratorIterator::SELF_FIRST)) as $key => $value) {
             $children[] = $key;
         }
         if ($offset != "") {
             $treeArray['direction_' . $current['id']] = str_replace("'", "&#039;", $offset . " " . $current['name']);
         } else {
             $treeArray['direction_' . $current['id']] = str_replace("'", "&#039;", $current['name']);
         }
         if (sizeof($current['lessons']) > 0) {
             foreach ($current->offsetGet('lessons') as $lessonId) {
                 $treeArray['lesson_' . $current['id'] . '_' . $lessonId] = str_replace("'", "&#039;", $offset . "- " . $lessons[$lessonId]->lesson['name']);
             }
         }
         if (sizeof($current['courses']) > 0) {
             foreach ($current->offsetGet('courses') as $courseId) {
                 $coursesArray = $courses[$courseId]->toSelect();
                 $first = 1;
                 foreach ($coursesArray as $courseId => $courseName) {
                     // The first result is the name of the course - the rest lesson names
                     // We need this distinction to have different keys (starting with course_ or lesson_ correctly
                     if ($first) {
                         $treeArray['course_' . $current['id'] . '_' . $courseId . "_" . $courseId] = str_replace("'", "&#039;", $offset . "-" . $courseName);
                         $first = 0;
                     } else {
                         $treeArray['lesson_' . $current['id'] . '_' . $courseId . "_" . $courseId] = str_replace("'", "&#039;", $offset . "-" . $courseName);
                     }
                 }
             }
         }
         $iterator->next();
         $current = $iterator->current();
         // $current
         if ($current['parent_direction_ID'] != $current_level_father) {
             $offset .= "-";
             $current_level_father = $current['parent_direction_ID'];
         }
     }
     if ($returnClassedHTML) {
         $htmlString = '<select id= "educational_criteria_row" name ="educational_criteria_row" onchange="createQuestionsSelect(this)" mySelectedIndex = "0">';
         if ($showQuestions) {
             $result = eF_getTableData("questions", "lessons_ID, count(lessons_ID) as quests", "type <> 'raw_text'", "", "lessons_ID");
             $lessonQuestions = array();
             foreach ($result as $lesson) {
                 if ($lesson['quests'] > 0) {
                     $lessonQuestions[$lesson['lessons_ID']] = $lesson['quests'];
                 }
             }
         }
         foreach ($treeArray as $key => $value) {
             $extras = " ";
             $htmlString .= '<option';
             if (strpos($key, "direction_") === 0) {
                 $directions_ID = strrchr($key, "_");
                 $htmlString .= ' value = "direction' . $directions_ID . '" style="background-color:maroon; color:white"';
                 $course_ID = substr($directions_ID, 1);
                 if ($showQuestions) {
                     $questions = $directionsQuestions[$directions_ID];
                     if ($questions) {
                         $extras = ' (' . $questions . ')';
                     } else {
                         $extras = ' (0)';
                     }
                 }
             } else {
                 if (strpos($key, "course_") === 0) {
                     $course_ID = strrchr($key, "_");
                     $htmlString .= ' value = "course' . $course_ID . '" style="background-color:green; color:white"';
                     $course_ID = substr($course_ID, 1);
                     if ($showQuestions) {
                         $questions = $courses[$course_ID]->course['questions'];
                         if ($questions) {
                             $extras = ' (' . $questions . ')';
                         } else {
                             $extras = ' (0)';
                         }
                     }
                 } else {
                     $htmlString .= ' value = "lesson' . strrchr($key, "_") . '" ';
                     if ($showQuestions) {
                         $lessonId = substr(strrchr($key, "_"), 1);
                         if ($showQuestions) {
                             if ($lessonQuestions[$lessonId]) {
                                 $extras .= "(" . $lessonQuestions[$lessonId] . ")";
                             } else {
                                 $extras .= "(0)";
                             }
                         }
                     }
                 }
             }
             $htmlString .= ">" . $value . $extras . "</option>";
         }
         $htmlString .= "</select>";
         // If no lessons or anything is found, then an empty select or array should be returned
         return $htmlString;
     }
     return $treeArray;
 }
 /**
  * Create array to be used for HTML options
  *
  * This function is used to create a structure that can be used
  * in select lists. The array is of the form [content id] => [content name string]
  * where content name is prepended with spaces and special characters "&raquo;" that
  * denote its depth.
  * <br/>Example:
  * <code>
  * $optionsArray = $content -> toHTMLSelectOptions();
  * </code>
  * An iterator may be optionally specified, in order to display specific units (by default
  * all active units are used).
  * Note that unit names more than 50 characters long are truncated.
  *
  * @param RecursiveIteratorIterator $iterator The tree iterator to be used
  * @return array The options array
  * @since 3.5.0
  * @access public
  */
 public function toHTMLSelectOptions($iterator = false)
 {
     if (!$iterator) {
         $iterator = new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($this->tree), RecursiveIteratorIterator::SELF_FIRST), array('active' => 1));
         //Default iterator excludes non-active units
     }
     $optionsArray = array();
     foreach ($iterator as $value) {
         mb_strlen($value['name']) > 50 ? $value['name'] = mb_substr($value['name'], 0, 50) . '...' : null;
         if ($iterator->getDepth()) {
             $optionsArray[$value['id']] = implode("", array_fill(0, $iterator->getDepth(), "&nbsp;&nbsp;")) . '&raquo;&nbsp;' . $value['name'];
             //This line prints spaces and a >> in front of every unit. The spaces number depend on the depth of the unit
         } else {
             $optionsArray[$value['id']] = $value['name'];
         }
     }
     return $optionsArray;
 }
Exemple #5
0
 public function getPreviousSiblingNode($queryNode)
 {
     $iterator = new EfrontNodeFilterIterator(new RecursiveIteratorIterator(new RecursiveArrayIterator($this->tree), RecursiveIteratorIterator::SELF_FIRST));
     //Create iterators for the tree
     $iterator->rewind();
     //Initialize iterator
     while ($iterator->valid() && $iterator->key() != $queryNode['parent_content_ID']) {
         //Advance iterator until we reach the designated node
         $iterator->next();
     }
     if ($iterator->valid()) {
         $iterator = new EfrontNodeFilterIterator(new IteratorIterator(new ArrayIterator($iterator->current())));
         $iterator->rewind();
         //Initialize iterator
         while ($iterator->valid() && $iterator->key() != $queryNode['id']) {
             //Advance iterator until we reach the designated node
             $previousNode = $iterator->current();
             $iterator->next();
         }
         if ($iterator->valid()) {
             if (!isset($previousNode)) {
                 //The designated node was apparently the first one, so return false
                 return false;
             } else {
                 if (!$queryNode) {
                     $this->currentNodeId = $previousNode['id'];
                     //If a $queryNode was not specified, we must set the internal pointer to the previous node we just found
                 }
                 //$previousNode = $this -> filterOutChildren(new RecursiveArrayIterator($previousNode));     //Cut off node's children
                 return $previousNode;
             }
         }
     } else {
         throw new EfrontTreeException(_NODEDOESNOTEXIST . ': ' . $queryNode['id'], EfrontTreeException::NODE_NOT_EXISTS);
     }
 }