/** * Loads Model Pages */ private function _loadModelPages() { $auth = Zend_Auth::getInstance(); if ($auth->hasIdentity()) { $user = DbUserModel::findByUsername($auth->getIdentity()); } else { throw new Exception("Hey, no loading pages without being logged in"); } $rows = self::$pageTable->fetchRows('instanceID', $this->instance->instanceID, 'seqNumber', $this->instance->instanceID); $this->modelPages = array(); foreach ($rows as $row) { $page = new PageModel(array('pageID' => $row->pageID, 'depth' => 'page')); $modelPage = new ModelPageModel(array('modelID' => $this->modelRow->modelID, 'pageID' => $row->pageID, 'depth' => $this->depth, 'instance' => $this->compareInstance)); if ($user->hasAnyAccess($page)) { $this->modelPages[] = $modelPage; } } }
/** * Returns comparison information based on criteria arguments. Virtual questions always return an empty array. * * @param array See argument array below * @return array Following this structure: * array($criteria_term => array(array('question' => QuestionModel, * 'messages' => array(string) * ) * ) * ) */ public function compare($args = array()) { // Comparison criteria $args = array_merge(array('model_fail' => true, 'model_pass' => false, 'additional_information' => false), $args); if ($this->question->virtualQuestion) { return array(); } if ($this->compareInstance->depth !== 'response') { throw new Exception('Comparison not possible since compare instance depth not set to response'); } if ($this->depth !== 'response') { throw new Exception('Comparison not possible since depth not set to response'); } $modelPageRows = self::$pageTable->fetchRows('pageID', $this->question->pageID, null, $this->question->instanceID); $modelPageRow = $modelPageRows[0]; $pageGUID = $modelPageRow->pageGUID; $comparePageRows = self::$pageTable->fetchRows('pageGUID', $pageGUID, null, $this->compareInstance->instanceID); $comparePageRow = $comparePageRows[0]; $compareQuestionRows = self::$questionTable->fetchRows('questionGUID', $this->question->questionGUID, null, $comparePageRow->pageID); $compareQuestionRow = $compareQuestionRows[0]; $compareQuestion = new QuestionModel(array('questionID' => $compareQuestionRow->questionID, 'depth' => 'response')); $response = $compareQuestion->getResponse(); $result = array(); foreach ($args as $key => $value) { $result[$key] = array(); } if ($args['model_fail'] || $args['model_pass']) { $messages = array(); $remediationInfo = ''; $pass = null; while ($modelResponse = $this->nextModelResponse()) { switch ($modelResponse->type) { case "no preference": break; case "match": if ($modelResponse->target == $response->responseText) { $messages['pass'][] = "Matches " . $modelResponse->target; $pass = true; } else { $messages['fail'][] = "Does not match " . $modelResponse->target; $pass = false; break; } break; case "selected": if ($modelResponse->promptText() == $response->promptText()) { $messages['pass'][] = "Prompt selected: " . $modelResponse->promptText(); $pass = true; } else { $messages['fail'][] = "Prompt not selected: " . $modelResponse->promptText(); $pass = false; break; } break; case "not selected": if ($modelResponse->promptText() == $response->promptText()) { $messages['fail'][] = "Prompt selected: " . $modelResponse->promptText(); $pass = false; break; } else { $messages['pass'][] = "Prompt not selected: " . $modelResponse->promptText(); $pass = true; } break; case "or selected": if ($modelResponse->promptText() == $response->promptText()) { $messages['pass'][] = "Or prompt selected: " . $modelResponse->promptText(); $pass = true; } else { if ($pass !== TRUE) { $messages['fail'][] = "And prompt not selected: " . $modelResponse->promptText(); $pass = false; } } break; case "remediation info": $remediationInfo = $modelResponse->info; break; case "require attachment": $file = new FileModel($compareQuestion); if ($file->hasAttachment()) { $pass = true; $messages['pass'][] = 'Has attachment'; } else { $pass = false; $messages['fail'][] = 'No attachment'; } break; default: throw new Exception('Unknown model response type'); } } if ($pass === TRUE && $args['model_pass']) { $result['model_pass'][] = array('question' => $compareQuestion, 'messages' => $messages['pass'], 'remediation_info' => $remediationInfo); } if ($pass === FALSE && $args['model_fail']) { $result['model_fail'][] = array('question' => $compareQuestion, 'messages' => $messages['fail'], 'remediation_info' => $remediationInfo); } } if ($args['additional_information'] && (!$args['model_fail'] || count($result['model_fail']) === 0) && strlen($response->additionalInfo) > 0) { if ($args['model_pass'] === TRUE) { $result['model_pass'] = array(); } $result['additional_information'][] = array('question' => $compareQuestion); } return $result; }