Exemple #1
0
/**
 * Sets up SCORM 1.2/2004 packages using the manifest file.
 * Called whenever SCORM changes
 * @param object $scorm instance - fields are updated and changes saved into database
 * @param stored_file|string $manifest - path to manifest file or stored_file.
 * @return bool
 */
function scorm_parse_scorm(&$scorm, $manifest)
{
    global $CFG, $DB;
    // load manifest into string
    if ($manifest instanceof stored_file) {
        $xmltext = $manifest->get_content();
    } else {
        require_once "{$CFG->libdir}/filelib.php";
        $xmltext = download_file_content($manifest);
    }
    $defaultorgid = 0;
    $firstinorg = 0;
    $pattern = '/&(?!\\w{2,6};)/';
    $replacement = '&';
    $xmltext = preg_replace($pattern, $replacement, $xmltext);
    $objXML = new xml2Array();
    $manifests = $objXML->parse($xmltext);
    $scoes = new stdClass();
    $scoes->version = '';
    $scoes = scorm_get_manifest($manifests, $scoes);
    $newscoes = array();
    $sortorder = 0;
    if (count($scoes->elements) > 0) {
        $olditems = $DB->get_records('scorm_scoes', array('scorm' => $scorm->id));
        foreach ($scoes->elements as $manifest => $organizations) {
            foreach ($organizations as $organization => $items) {
                foreach ($items as $identifier => $item) {
                    $sortorder++;
                    // This new db mngt will support all SCORM future extensions
                    $newitem = new stdClass();
                    $newitem->scorm = $scorm->id;
                    $newitem->manifest = $manifest;
                    $newitem->organization = $organization;
                    $newitem->sortorder = $sortorder;
                    $standarddatas = array('parent', 'identifier', 'launch', 'scormtype', 'title');
                    foreach ($standarddatas as $standarddata) {
                        if (isset($item->{$standarddata})) {
                            $newitem->{$standarddata} = $item->{$standarddata};
                        } else {
                            $newitem->{$standarddata} = '';
                        }
                    }
                    if (!empty($defaultorgid) && !empty($scoes->defaultorg) && empty($firstinorg) && $newitem->parent == $scoes->defaultorg) {
                        $firstinorg = $sortorder;
                    }
                    if (!empty($olditems) && ($olditemid = scorm_array_search('identifier', $newitem->identifier, $olditems))) {
                        $newitem->id = $olditemid;
                        // Update the Sco sortorder but keep id so that user tracks are kept against the same ids.
                        $DB->update_record('scorm_scoes', $newitem);
                        $id = $olditemid;
                        // Remove all old data so we don't duplicate it.
                        $DB->delete_records('scorm_scoes_data', array('scoid' => $olditemid));
                        $DB->delete_records('scorm_seq_objective', array('scoid' => $olditemid));
                        $DB->delete_records('scorm_seq_mapinfo', array('scoid' => $olditemid));
                        $DB->delete_records('scorm_seq_ruleconds', array('scoid' => $olditemid));
                        $DB->delete_records('scorm_seq_rulecond', array('scoid' => $olditemid));
                        $DB->delete_records('scorm_seq_rolluprule', array('scoid' => $olditemid));
                        $DB->delete_records('scorm_seq_rolluprulecond', array('scoid' => $olditemid));
                        // Now remove this SCO from the olditems object as we have dealt with it.
                        unset($olditems[$olditemid]);
                    } else {
                        // Insert the new SCO, and retain the link between the old and new for later adjustment
                        $id = $DB->insert_record('scorm_scoes', $newitem);
                    }
                    $newscoes[$id] = $newitem;
                    // Save this sco in memory so we can use it later.
                    if ($optionaldatas = scorm_optionals_data($item, $standarddatas)) {
                        $data = new stdClass();
                        $data->scoid = $id;
                        foreach ($optionaldatas as $optionaldata) {
                            if (isset($item->{$optionaldata})) {
                                $data->name = $optionaldata;
                                $data->value = $item->{$optionaldata};
                                $dataid = $DB->insert_record('scorm_scoes_data', $data);
                            }
                        }
                    }
                    if (isset($item->sequencingrules)) {
                        foreach ($item->sequencingrules as $sequencingrule) {
                            $rule = new stdClass();
                            $rule->scoid = $id;
                            $rule->ruletype = $sequencingrule->type;
                            $rule->conditioncombination = $sequencingrule->conditioncombination;
                            $rule->action = $sequencingrule->action;
                            $ruleid = $DB->insert_record('scorm_seq_ruleconds', $rule);
                            if (isset($sequencingrule->ruleconditions)) {
                                foreach ($sequencingrule->ruleconditions as $rulecondition) {
                                    $rulecond = new stdClass();
                                    $rulecond->scoid = $id;
                                    $rulecond->ruleconditionsid = $ruleid;
                                    $rulecond->referencedobjective = $rulecondition->referencedobjective;
                                    $rulecond->measurethreshold = $rulecondition->measurethreshold;
                                    $rulecond->operator = $rulecondition->operator;
                                    $rulecond->cond = $rulecondition->cond;
                                    $rulecondid = $DB->insert_record('scorm_seq_rulecond', $rulecond);
                                }
                            }
                        }
                    }
                    if (isset($item->rolluprules)) {
                        foreach ($item->rolluprules as $rolluprule) {
                            $rollup = new stdClass();
                            $rollup->scoid = $id;
                            $rollup->childactivityset = $rolluprule->childactivityset;
                            $rollup->minimumcount = $rolluprule->minimumcount;
                            $rollup->minimumpercent = $rolluprule->minimumpercent;
                            $rollup->rollupruleaction = $rolluprule->rollupruleaction;
                            $rollup->conditioncombination = $rolluprule->conditioncombination;
                            $rollupruleid = $DB->insert_record('scorm_seq_rolluprule', $rollup);
                            if (isset($rollup->conditions)) {
                                foreach ($rollup->conditions as $condition) {
                                    $cond = new stdClass();
                                    $cond->scoid = $rollup->scoid;
                                    $cond->rollupruleid = $rollupruleid;
                                    $cond->operator = $condition->operator;
                                    $cond->cond = $condition->cond;
                                    $conditionid = $DB->insert_record('scorm_seq_rolluprulecond', $cond);
                                }
                            }
                        }
                    }
                    if (isset($item->objectives)) {
                        foreach ($item->objectives as $objective) {
                            $obj = new stdClass();
                            $obj->scoid = $id;
                            $obj->primaryobj = $objective->primaryobj;
                            $obj->satisfiedbumeasure = $objective->satisfiedbymeasure;
                            $obj->objectiveid = $objective->objectiveid;
                            $obj->minnormalizedmeasure = trim($objective->minnormalizedmeasure);
                            $objectiveid = $DB->insert_record('scorm_seq_objective', $obj);
                            if (isset($objective->mapinfos)) {
                                foreach ($objective->mapinfos as $objmapinfo) {
                                    $mapinfo = new stdClass();
                                    $mapinfo->scoid = $id;
                                    $mapinfo->objectiveid = $objectiveid;
                                    $mapinfo->targetobjectiveid = $objmapinfo->targetobjectiveid;
                                    $mapinfo->readsatisfiedstatus = $objmapinfo->readsatisfiedstatus;
                                    $mapinfo->writesatisfiedstatus = $objmapinfo->writesatisfiedstatus;
                                    $mapinfo->readnormalizedmeasure = $objmapinfo->readnormalizedmeasure;
                                    $mapinfo->writenormalizedmeasure = $objmapinfo->writenormalizedmeasure;
                                    $mapinfoid = $DB->insert_record('scorm_seq_mapinfo', $mapinfo);
                                }
                            }
                        }
                    }
                    if (empty($defaultorgid) && (empty($scoes->defaultorg) || $scoes->defaultorg == $identifier)) {
                        $defaultorgid = $id;
                    }
                }
            }
        }
        if (!empty($olditems)) {
            foreach ($olditems as $olditem) {
                $DB->delete_records('scorm_scoes', array('id' => $olditem->id));
                $DB->delete_records('scorm_scoes_data', array('scoid' => $olditem->id));
                $DB->delete_records('scorm_scoes_track', array('scoid' => $olditem->id));
                $DB->delete_records('scorm_seq_objective', array('scoid' => $olditem->id));
                $DB->delete_records('scorm_seq_mapinfo', array('scoid' => $olditem->id));
                $DB->delete_records('scorm_seq_ruleconds', array('scoid' => $olditem->id));
                $DB->delete_records('scorm_seq_rulecond', array('scoid' => $olditem->id));
                $DB->delete_records('scorm_seq_rolluprule', array('scoid' => $olditem->id));
                $DB->delete_records('scorm_seq_rolluprulecond', array('scoid' => $olditem->id));
            }
        }
        if (empty($scoes->version)) {
            $scoes->version = 'SCORM_1.2';
        }
        $DB->set_field('scorm', 'version', $scoes->version, array('id' => $scorm->id));
        $scorm->version = $scoes->version;
    }
    $scorm->launch = 0;
    // Check launch sco is valid.
    if (!empty($defaultorgid) && isset($newscoes[$defaultorgid]) && !empty($newscoes[$defaultorgid]->launch)) {
        // Launch param is valid - do nothing.
        $scorm->launch = $defaultorgid;
    } else {
        if (!empty($defaultorgid) && isset($newscoes[$defaultorgid]) && empty($newscoes[$defaultorgid]->launch)) {
            // The launch is probably the default org so we need to find the first launchable item inside this org.
            $sqlselect = 'scorm = ? AND sortorder >= ? AND ' . $DB->sql_isnotempty('scorm_scoes', 'launch', false, true);
            // We use get_records here as we need to pass a limit in the query that works cross db.
            $scoes = $DB->get_records_select('scorm_scoes', $sqlselect, array($scorm->id, $firstinorg), 'sortorder', 'id', 0, 1);
            if (!empty($scoes)) {
                $sco = reset($scoes);
                // We only care about the first record - the above query only returns one.
                $scorm->launch = $sco->id;
            }
        }
    }
    if (empty($scorm->launch)) {
        // No valid Launch is specified - find the first launchable sco instead.
        $sqlselect = 'scorm = ? AND ' . $DB->sql_isnotempty('scorm_scoes', 'launch', false, true);
        // We use get_records here as we need to pass a limit in the query that works cross db.
        $scoes = $DB->get_records_select('scorm_scoes', $sqlselect, array($scorm->id), 'sortorder', 'id', 0, 1);
        if (!empty($scoes)) {
            $sco = reset($scoes);
            // We only care about the first record - the above query only returns one.
            $scorm->launch = $sco->id;
        }
    }
    return true;
}
Exemple #2
0
function scorm_parse_scorm($pkgdir, $scormid)
{
    global $CFG;
    $launch = 0;
    $manifestfile = $pkgdir . '/imsmanifest.xml';
    if (is_file($manifestfile)) {
        $xmltext = file_get_contents($manifestfile);
        $pattern = '/&(?!\\w{2,6};)/';
        $replacement = '&';
        $xmltext = preg_replace($pattern, $replacement, $xmltext);
        $objXML = new xml2Array();
        $manifests = $objXML->parse($xmltext);
        //print_object($manifests);
        $scoes = new stdClass();
        $scoes->version = '';
        $scoes = scorm_get_manifest($manifests, $scoes);
        //print_object($scoes);
        if (count($scoes->elements) > 0) {
            $olditems = get_records('scorm_scoes', 'scorm', $scormid);
            foreach ($scoes->elements as $manifest => $organizations) {
                foreach ($organizations as $organization => $items) {
                    foreach ($items as $identifier => $item) {
                        // This new db mngt will support all SCORM future extensions
                        $newitem = new stdClass();
                        $newitem->scorm = $scormid;
                        $newitem->manifest = $manifest;
                        $newitem->organization = $organization;
                        $standarddatas = array('parent', 'identifier', 'launch', 'scormtype', 'title');
                        foreach ($standarddatas as $standarddata) {
                            if (isset($item->{$standarddata})) {
                                $newitem->{$standarddata} = addslashes_js($item->{$standarddata});
                            }
                        }
                        // Insert the new SCO, and retain the link between the old and new for later adjustment
                        $id = insert_record('scorm_scoes', $newitem);
                        if (!empty($olditems) && ($olditemid = scorm_array_search('identifier', $newitem->identifier, $olditems))) {
                            $olditems[$olditemid]->newid = $id;
                        }
                        if ($optionaldatas = scorm_optionals_data($item, $standarddatas)) {
                            $data = new stdClass();
                            $data->scoid = $id;
                            foreach ($optionaldatas as $optionaldata) {
                                if (isset($item->{$optionaldata})) {
                                    $data->name = $optionaldata;
                                    $data->value = addslashes_js($item->{$optionaldata});
                                    $dataid = insert_record('scorm_scoes_data', $data);
                                }
                            }
                        }
                        if (isset($item->sequencingrules)) {
                            foreach ($item->sequencingrules as $sequencingrule) {
                                $rule = new stdClass();
                                $rule->scoid = $id;
                                $rule->ruletype = $sequencingrule->type;
                                $rule->conditioncombination = $sequencingrule->conditioncombination;
                                $rule->action = $sequencingrule->action;
                                $ruleid = insert_record('scorm_seq_ruleconds', $rule);
                                if (isset($sequencingrule->ruleconditions)) {
                                    foreach ($sequencingrule->ruleconditions as $rulecondition) {
                                        $rulecond = new stdClass();
                                        $rulecond->scoid = $id;
                                        $rulecond->ruleconditionsid = $ruleid;
                                        $rulecond->referencedobjective = $rulecondition->referencedobjective;
                                        $rulecond->measurethreshold = $rulecondition->measurethreshold;
                                        $rulecond->cond = $rulecondition->cond;
                                        $rulecondid = insert_record('scorm_seq_rulecond', $rulecond);
                                    }
                                }
                            }
                        }
                        if (isset($item->rolluprules)) {
                            foreach ($item->rolluprules as $rolluprule) {
                                $rollup = new stdClass();
                                $rollup->scoid = $id;
                                $rollup->childactivityset = $rolluprule->childactivityset;
                                $rollup->minimumcount = $rolluprule->minimumcount;
                                $rollup->minimumpercent = $rolluprule->minimumpercent;
                                $rollup->rollupruleaction = $rolluprule->rollupruleaction;
                                $rollup->conditioncombination = $rolluprule->conditioncombination;
                                $rollupruleid = insert_record('scorm_seq_rolluprule', $rollup);
                                if (isset($rollup->conditions)) {
                                    foreach ($rollup->conditions as $condition) {
                                        $cond = new stdClass();
                                        $cond->scoid = $rollup->scoid;
                                        $cond->rollupruleid = $rollupruleid;
                                        $cond->operator = $condition->operator;
                                        $cond->cond = $condition->cond;
                                        $conditionid = insert_record('scorm_seq_rolluprulecond', $cond);
                                    }
                                }
                            }
                        }
                        if (isset($item->objectives)) {
                            foreach ($item->objectives as $objective) {
                                $obj = new stdClass();
                                $obj->scoid = $id;
                                $obj->primaryobj = $objective->primaryobj;
                                $obj->satisfiedbumeasure = $objective->satisfiedbymeasure;
                                $obj->objectiveid = $objective->objectiveid;
                                $obj->minnormalizedmeasure = $objective->minnormalizedmeasure;
                                $objectiveid = insert_record('scorm_seq_objective', $obj);
                                if (isset($objective->mapinfos)) {
                                    //print_object($objective->mapinfos);
                                    foreach ($objective->mapinfos as $objmapinfo) {
                                        $mapinfo = new stdClass();
                                        $mapinfo->scoid = $id;
                                        $mapinfo->objectiveid = $objectiveid;
                                        $mapinfo->targetobjectiveid = $objmapinfo->targetobjectiveid;
                                        $mapinfo->readsatisfiedstatus = $objmapinfo->readsatisfiedstatus;
                                        $mapinfo->writesatisfiedstatus = $objmapinfo->writesatisfiedstatus;
                                        $mapinfo->readnormalizedmeasure = $objmapinfo->readnormalizedmeasure;
                                        $mapinfo->writenormalizedmeasure = $objmapinfo->writenormalizedmeasure;
                                        $mapinfoid = insert_record('scorm_seq_mapinfo', $mapinfo);
                                    }
                                }
                            }
                        }
                        //print_object($item);
                        if ($launch == 0 && (empty($scoes->defaultorg) || $scoes->defaultorg == $identifier)) {
                            $launch = $id;
                        }
                    }
                }
            }
            if (!empty($olditems)) {
                foreach ($olditems as $olditem) {
                    delete_records('scorm_scoes', 'id', $olditem->id);
                    delete_records('scorm_scoes_data', 'scoid', $olditem->id);
                    if (isset($olditem->newid)) {
                        set_field('scorm_scoes_track', 'scoid', $olditem->newid, 'scoid', $olditem->id);
                    }
                    delete_records('scorm_scoes_track', 'scoid', $olditem->id);
                    delete_records('scorm_seq_objective', 'scoid', $olditem->id);
                    delete_records('scorm_seq_mapinfo', 'scoid', $olditem->id);
                    delete_records('scorm_seq_ruleconds', 'scoid', $olditem->id);
                    delete_records('scorm_seq_rulecond', 'scoid', $olditem->id);
                    delete_records('scorm_seq_rolluprule', 'scoid', $olditem->id);
                    delete_records('scorm_seq_rolluprulecond', 'scoid', $olditem->id);
                }
            }
            if (empty($scoes->version)) {
                $scoes->version = 'SCORM_1.2';
            }
            set_field('scorm', 'version', $scoes->version, 'id', $scormid);
            $scorm->version = $scoes->version;
        }
    }
    return $launch;
}