Beispiel #1
0
 public static function importXML(&$import, $options = array())
 {
     if (!isset(self::$questionnaireTable)) {
         self::$questionnaireTable = QFrame_Db_Table::getTable('questionnaire');
     }
     libxml_use_internal_errors(true);
     if (is_a($import, 'ZipArchiveModel')) {
         $zip =& $import;
         $xml = $import->getQuestionnaireDefinitionXMLDocument();
         if ($xml === NULL) {
             $xml = $import->getInstanceFullResponsesXMLDocument();
         }
         if ($xml === NULL) {
             throw new Exception('Questionnaire definition not found in zip archive');
         }
         $dom = new DOMDocument();
         $dom->loadXML($xml);
     } elseif (is_a($import, 'DOMDocument')) {
         $dom =& $import;
         $xml = $dom->saveXML();
     } else {
         $xml =& $import;
         $dom = new DOMDocument();
         $dom->loadXML($xml);
     }
     $errors = libxml_get_errors();
     try {
         $logger = Zend_Registry::get('logger');
     } catch (Zend_Exception $e) {
     }
     foreach ($errors as $error) {
         $message = rtrim("XML error on line {$error->line} of {$error->file}: {$error->message}");
         if (isset($logger) && $logger) {
             $logger->log($message, Zend_Log::ERR);
         }
         error_log($message);
     }
     if (count($errors) > 0) {
         throw new Exception('XML Exception');
     }
     self::validateQuestionnaireDefinitionXML($dom);
     $questionnaire = $dom->getElementsByTagName('questionnaire')->item(0);
     $questionnaireName = $questionnaire->getAttribute('questionnaireName');
     $questionnaireVersion = $questionnaire->getAttribute('questionnaireVersion');
     $revision = $questionnaire->getAttribute('revision');
     $transactionNumber = self::startSerializableTransaction();
     if (isset($options['SkipQuestionnaireExistCheck'])) {
         $signature = 'nosignature';
     } else {
         $questionnaireID = self::$questionnaireTable->getQuestionnaireID($questionnaireName, $questionnaireVersion, $revision);
         $signature = self::generateSignature($dom);
         if (isset($questionnaireID)) {
             $prevQuestionnaire = new QuestionnaireModel(array('questionnaireID' => $questionnaireID, 'depth' => 'questionnaire'));
             if ($signature === $prevQuestionnaire->signature) {
                 $message = "Skipping questionnaire import since {$questionnaireName} {$questionnaireVersion} {$revision} already exists and has the same signature";
                 if (isset($logger) && $logger) {
                     $logger->log($message, Zend_Log::ERR);
                 }
                 self::dbCommit($transactionNumber);
                 return $questionnaireID;
             } else {
                 throw new Exception('A questionnaire with the same name, version, and revision already exists with different content');
             }
         }
     }
     $questionnaireID = self::$questionnaireTable->insert(array('questionnaireName' => $questionnaireName, 'questionnaireVersion' => $questionnaireVersion, 'revision' => $revision, 'signature' => $signature));
     $questionnaire = new QuestionnaireModel(array('questionnaireID' => $questionnaireID, 'depth' => 'questionnaire'));
     $questionnaire->validateQuestionnaireDefinitionXML($dom);
     // store files
     if (!isset($options['SkipFileAttachments'])) {
         $questionnaire->questionnaireDefinition2responseSchema($dom);
         $questionnaire->questionnaireDefinition2completedResponseSchema($dom);
         $files = new FileModel($questionnaire);
         $files->store($xml, array('filename' => 'questionnaire-definition.xml'));
     }
     self::dbCommit($transactionNumber);
     if (!isset($options['SkipQuestionnaireExistCheck']) && !$questionnaire->getDefaultInstance()) {
         InstanceModel::importXML($xml, '_default_', array('hidden' => 1));
     }
     return $questionnaireID;
 }