/** * Override the default preDispatch to prevent loading of an instance which is * not necessary in the compare context */ public function preDispatch() { $id = $this->_getParam('id'); if ($id) { $this->model = new ModelModel(array('modelID' => $id)); $questionnaire = new QuestionnaireModel(array('questionnaireID' => $this->model->questionnaireID, 'depth' => 'page')); $this->_instance = $questionnaire->getDefaultInstance(); if ($this->_hasParam('page')) { $this->view->currentPageID = $this->_getParam('page'); } else { $this->view->currentPageID = $this->_instance->getFirstPage()->pageID; } $this->view->menuItems = $this->buildMenu("/compare/edit/{$id}?page="); } }
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; }
public function testDeletingRemovesHiddenInstances() { $this->auth(); $xml = file_get_contents(PROJECT_PATH . "/test/data/xml/test1-questionnaire-definition.xml"); QuestionnaireModel::importXML($xml); $questionnaire = new QuestionnaireModel(array('questionnaireName' => 'Test1 Questionnaire', 'questionnaireVersion' => '3.00', 'revision' => 1, 'depth' => 'instance')); $instanceID = $questionnaire->getDefaultInstance()->instanceID; $questionnaire->delete(); QFrame_Db_Table::resetAll(); try { new InstanceModel(array('instanceID' => $instanceID)); } catch (Exception $e) { $this->assertTrue(preg_match('/^Instance not found/', $e->getMessage()) > 0); return; } $this->fail('Fetching hidden instance after questionnaire deletion should throw an exception'); }