/** * Called after the check that all required registry values * have been set correctly has run. * * @return void * / public function afterRegistry() { parent::afterRegistry(); } /** * Creates the model * * @return \MUtil_Model_ModelAbstract */ protected function createModel() { if (!$this->importModel instanceof \MUtil_Model_ModelAbstract) { $surveyId = $this->request->getParam(\MUtil_Model::REQUEST_ID); if ($surveyId) { $this->formData['survey'] = $surveyId; $this->_survey = $this->loader->getTracker()->getSurvey($surveyId); $surveys[$surveyId] = $this->_survey->getName(); $elementClass = 'Exhibitor'; $tracks = $this->util->getTranslated()->getEmptyDropdownArray() + $this->util->getTrackData()->getTracksBySurvey($surveyId); } else { $empty = $this->util->getTranslated()->getEmptyDropdownArray(); $trackData = $this->util->getTrackData(); $surveys = $empty + $trackData->getActiveSurveys(); $tracks = $empty + $trackData->getAllTracks(); $elementClass = 'Select'; } parent::createModel(); $order = $this->importModel->getOrder('trans') - 5; $this->importModel->set('survey', 'label', $this->_('Survey'), 'elementClass', $elementClass, 'multiOptions', $surveys, 'onchange', 'this.form.submit();', 'order', $order, 'required', true); $this->importModel->set('track', 'label', $this->_('Track'), 'description', $this->_('Optionally assign answers only within a single track'), 'multiOptions', $tracks); $this->importModel->set('skipUnknownPatients', 'label', $this->_('Skip unknowns'), 'default', 0, 'description', $this->_('What to do when the respondent does not exist'), 'elementClass', 'Checkbox', 'multiOptions', $this->util->getTranslated()->getYesNo()); $tokenCompleted = array(\Gems_Model_Translator_AnswerTranslatorAbstract::TOKEN_OVERWRITE => $this->_('Delete old token and create new'), \Gems_Model_Translator_AnswerTranslatorAbstract::TOKEN_DOUBLE => $this->_('Create new extra set of answers'), \Gems_Model_Translator_AnswerTranslatorAbstract::TOKEN_ERROR => $this->_('Abort the import'), \Gems_Model_Translator_AnswerTranslatorAbstract::TOKEN_SKIP => $this->_('Skip the token')); $this->importModel->set('tokenCompleted', 'label', $this->_('When token completed'), 'default', \Gems_Model_Translator_AnswerTranslatorAbstract::TOKEN_ERROR, 'description', $this->_('What to do when an imported token has already been completed'), 'elementClass', 'Radio', 'multiOptions', $tokenCompleted); $tokenTreatments = array(\Gems_Model_Translator_AnswerTranslatorAbstract::TOKEN_ERROR => $this->_('Abort the import'), \Gems_Model_Translator_AnswerTranslatorAbstract::TOKEN_SKIP => $this->_('Skip the token')); $this->importModel->set('noToken', 'label', $this->_('Token does not exist'), 'default', \Gems_Model_Translator_AnswerTranslatorAbstract::TOKEN_ERROR, 'description', $this->_('What to do when no token exist to import to'), 'elementClass', 'Radio', 'multiOptions', $tokenTreatments); if (\MUtil_Bootstrap::enabled()) { $this->importModel->set('tokenCompleted', 'separator', ''); } else { $this->importModel->set('trans', 'separator', '<br/>'); } } return $this->importModel; }
/** * Should handle execution of the task, taking as much (optional) parameters as needed * * The parameters should be optional and failing to provide them should be handled by * the task */ public function execute($lineNr = null, $surveyData = null) { $batch = $this->getBatch(); $import = $batch->getVariable('import'); $trackData = $this->util->getTrackData(); if (isset($surveyData['gsu_export_code']) && $surveyData['gsu_export_code']) { $name = 'survey__' . $surveyData['gsu_export_code']; $required = $this->checkRequired($surveyData['gsu_export_code'], $import['rounds']); if (isset($surveyData['gsu_survey_name']) && $surveyData['gsu_survey_name']) { $import['modelSettings'][$name]['label'] = $surveyData['gsu_survey_name']; } else { $import['modelSettings'][$name]['label'] = $surveyData['gsu_export_code']; } $import['modelSettings'][$name]['description'] = sprintf($this->_('[%s]'), $surveyData['gsu_export_code']); $import['modelSettings'][$name]['isSurvey'] = true; $import['modelSettings'][$name]['required'] = $required; $surveyId = $this->db->fetchOne("SELECT gsu_id_survey FROM gems__surveys WHERE gsu_export_code = ?", $surveyData['gsu_export_code']); // The first search determines whether the user can select a survey // or the survey is displayed as fixed if ($surveyId) { $import['modelSettings'][$name]['elementClass'] = 'Exhibitor'; $import['modelSettings'][$name]['multiOptions'] = $trackData->getAllSurveys(); $import['surveyCodes'][$surveyData['gsu_export_code']] = $surveyId; } else { $import['modelSettings'][$name]['elementClass'] = 'Select'; // Store the exportCode for rows that should be saved $import['modelSettings'][$name]['exportCode'] = $surveyData['gsu_export_code']; if ($required) { $empty = $this->_('(survey required)'); } else { $empty = $this->_('(skip rounds)'); } $import['modelSettings'][$name]['multiOptions'] = array('' => $empty) + $trackData->getSurveysWithoutExportCode(); $import['surveyCodes'][$surveyData['gsu_export_code']] = false; } // Then try match on gsu_surveyor_id if (!$surveyId && isset($surveyData['gsu_surveyor_id']) && $surveyData['gsu_surveyor_id']) { $surveyId = $this->db->fetchOne("SELECT gsu_id_survey FROM gems__surveys WHERE gsu_surveyor_id = ?", $surveyData['gsu_surveyor_id']); } // Last try ny name if (!$surveyId && isset($surveyData['gsu_survey_name']) && $surveyData['gsu_survey_name']) { $surveyId = $this->db->fetchOne("SELECT gsu_id_survey FROM gems__surveys WHERE gsu_survey_name = ?", $surveyData['gsu_survey_name']); } // When we have a survey id that is in the options, add it as default if ($surveyId) { if (isset($import['modelSettings'][$name]['multiOptions'][$surveyId])) { $import['formDefaults'][$name] = $surveyId; } } } else { $batch->addToCounter('import_errors'); $batch->addMessage(sprintf($this->_('No gsu_export_code specified for survey at line %d.'), $lineNr)); } }
/** * Returns a model that can be used to retrieve or save the data. * * @param boolean $detailed Create a model for the display of detailed item data or just a browse table * @param string $action The current action * @return \MUtil_Model_ModelAbstract */ public function getRoundModel($detailed, $action) { $model = $this->createRoundModel(); $translated = $this->util->getTranslated(); // Set the keys to the parameters in use. $model->setKeys(array(\MUtil_Model::REQUEST_ID => 'gro_id_track', \Gems_Model::ROUND_ID => 'gro_id_round')); if ($detailed) { $model->set('gro_id_track', 'label', $this->_('Track'), 'elementClass', 'exhibitor', 'multiOptions', $this->util->getTrackData()->getAllTracks); } $model->set('gro_id_survey', 'label', $this->_('Survey'), 'multiOptions', $this->util->getTrackData()->getAllSurveysAndDescriptions()); $model->set('gro_icon_file', 'label', $this->_('Icon')); $model->set('gro_id_order', 'label', $this->_('Order'), 'default', 10, 'validators[uni]', $model->createUniqueValidator(array('gro_id_order', 'gro_id_track'))); $model->set('gro_round_description', 'label', $this->_('Description'), 'size', '30'); //, 'minlength', 4, 'required', true); $list = $this->events->listRoundChangedEvents(); if (count($list) > 1) { $model->set('gro_changed_event', 'label', $this->_('After change'), 'multiOptions', $list); } $list = $this->events->listSurveyDisplayEvents(); if (count($list) > 1) { $model->set('gro_display_event', 'label', $this->_('Answer display'), 'multiOptions', $list); } $model->set('gro_active', 'label', $this->_('Active'), 'elementClass', 'checkbox', 'multiOptions', $translated->getYesNo()); $model->setIfExists('gro_code', 'label', $this->_('Round code'), 'description', $this->_('Optional code name to link the field to program code.'), 'size', 10); $model->addColumn("CASE WHEN gro_active = 1 THEN '' ELSE 'deleted' END", 'row_class'); $model->addColumn("CASE WHEN gro_organizations IS NULL THEN 0 ELSE 1 END", 'org_specific_round'); $model->addColumn('gro_organizations', 'organizations'); $model->set('organizations', 'label', $this->_('Organizations'), 'elementClass', 'MultiCheckbox', 'multiOptions', $this->util->getDbLookup()->getOrganizations(), 'data-source', 'org_specific_round'); $tp = new \MUtil_Model_Type_ConcatenatedRow('|', $this->_(', ')); $tp->apply($model, 'organizations'); switch ($action) { case 'create': $this->_ensureRounds(); if ($this->_rounds && ($round = end($this->_rounds))) { $model->set('gro_id_order', 'default', $round['gro_id_order'] + 10); } // Intentional fall through // break; // Intentional fall through // break; case 'edit': case 'show': $model->set('gro_icon_file', 'multiOptions', $translated->getEmptyDropdownArray() + $this->_getAvailableIcons()); $model->set('org_specific_round', 'label', $this->_('Organization specific round'), 'default', 0, 'multiOptions', $translated->getYesNo(), 'elementClass', 'radio'); break; default: $model->set('gro_icon_file', 'formatFunction', array('MUtil_Html_ImgElement', 'imgFile')); break; } return $model; }
/** * Hook that loads the form data from $_POST or the model * * Or from whatever other source you specify here. */ protected function loadFormData() { parent::loadFormData(); if ($this->createData && !$this->request->isPost()) { $this->formData = $this->trackEngine->getRoundDefaults() + $this->formData; } // Check the survey name $surveys = $this->util->getTrackData()->getAllSurveys(); if (isset($surveys[$this->formData['gro_id_survey']])) { $this->formData['gro_survey_name'] = $surveys[$this->formData['gro_id_survey']]; } else { // Currently required $this->formData['gro_survey_name'] = ''; } }
/** * Creates the model * * @return \MUtil_Model_ModelAbstract */ protected function createModel() { if (!$this->importModel instanceof \MUtil_Model_ModelAbstract) { $model = new \MUtil_Model_SessionModel('import_for_' . $this->request->getControllerName()); $model->set('trackFile', 'label', $this->_('A .track.txt file'), 'count', 1, 'elementClass', 'File', 'extension', 'txt', 'description', $this->_('Import an exported track using a file with the extension ".track.txt".'), 'required', true); $model->set('importId'); $options = array('' => $this->_('<<create a new track>>')) + $this->util->getTrackData()->getAllTracks(); $model->set('gtr_id_track', 'label', $this->_('Merge with'), 'description', $this->_('Create a new track or choose a track to merge the import into.'), 'default', '', 'multiOptions', $options, 'size', min(12, count($options) + 1)); $trackModel = $this->loader->getTracker()->getTrackModel(); $trackModel->applyFormatting(true, true); $model->set('gtr_track_name', $trackModel->get('gtr_track_name') + array('respondentData' => true)); $model->set('gtr_organizations', $trackModel->get('gtr_organizations') + array('respondentData' => true)); $this->importModel = $model; } return $this->importModel; }
/** * Set those settings needed for the detailed display * * @return \Gems\Tracker\Model\FieldMaintenanceModel (continuation pattern) */ public function applyDetailSettings() { $this->applyBrowseSettings(true); $this->_addLoadDependency = true; $this->set('gtf_id_track', 'label', $this->_('Track'), 'multiOptions', $this->util->getTrackData()->getAllTracks()); $this->set('gtf_field_description', 'label', $this->_('Description'), 'description', $this->_('Optional extra description to show the user.')); $this->set('gtf_track_info_label', 'label', $this->_('Add name to description')); $this->set('htmlUse', 'label', ' '); // But do always transform gtf_calculate_using on load and save // as otherwise we might not be sure what to do $contact = new \MUtil_Model_Type_ConcatenatedRow(self::FIELD_SEP, '; ', false); $contact->apply($this, 'gtf_calculate_using'); // Clean up data always show in browse view, but not always in detail views $this->set('gtf_create_track', 'label', null); $switches = array(0 => array('gtf_track_info_label' => array('elementClass' => 'Hidden', 'label' => null))); $this->addDependency(array('ValueSwitchDependency', $switches), 'gtf_to_track_info'); }
/** * Creates the model * * @return \MUtil_Model_ModelAbstract */ protected function createModel() { $model = $this->tracker->getTokenModel(); if ($model instanceof \Gems_Tracker_Model_StandardTokenModel) { $model->addEditTracking(); if ($this->createData) { $model->applyInsertionFormatting(); } } // Valid from can not be calculated for inserted rounds, and should always be manual $model->set('gto_valid_from_manual', 'elementClass', 'Hidden', 'default', '1'); $trackData = $this->util->getTrackData(); $this->surveyList = $trackData->getInsertableSurveys(); $model->set('gto_id_survey', 'label', $this->_('Suvey to insert'), 'multiOptions', $this->surveyList, 'onchange', 'this.form.submit();'); $model->set('gto_id_track', 'label', $this->_('Existing track'), 'elementClass', 'Select', 'onchange', 'this.form.submit();'); $model->set('gto_round_order', 'label', $this->_('In round'), 'elementClass', 'Select', 'required', true); $model->set('gto_valid_from', 'required', true); return $model; }
/** * Get form elements for the specific Export * @param \Gems_Form $form existing form type * @param array data existing options set in the form * @return array of form elements */ public function getFormElements(\Gems_Form $form, &$data) { $form->activateJQuery(); $dbLookup = $this->util->getDbLookup(); $translated = $this->util->getTranslated(); $noRound = array(self::NoRound => $this->_('No round description')); $empty = $translated->getEmptyDropdownArray(); $dateOptions = array(); \MUtil_Model_Bridge_FormBridge::applyFixedOptions('date', $dateOptions); $organizations = $this->currentUser->getRespondentOrganizations(); $tracks = $empty + $this->util->getTrackData()->getAllTracks(); $rounds = $empty + $noRound + $dbLookup->getRoundsForExport(isset($data['tid']) ? $data['tid'] : null); $surveys = $dbLookup->getSurveysForExport(isset($data['tid']) ? $data['tid'] : null, isset($data['rounds']) ? $data['rounds'] : null); $yesNo = $translated->getYesNo(); $elements = array(); $element = $form->createElement('textarea', 'ids'); $element->setLabel($this->_('Respondent id\'s'))->setAttrib('cols', 60)->setAttrib('rows', 4)->setDescription($this->_('Not respondent nr, but respondent id as exported here.')); $elements[] = $element; $element = $form->createElement('select', 'tid'); $element->setLabel($this->_('Tracks'))->setMultiOptions($tracks); $elements[] = $element; if (isset($data['tid']) && $data['tid']) { $element = $form->createElement('radio', 'tid_fields'); $element->setLabel($this->_('Export fields'))->setMultiOptions($yesNo); $elements[] = $element; if (!array_key_exists('tid_fields', $data)) { $data['tid_fields'] = 1; } } $element = $form->createElement('select', 'rounds'); $element->setLabel($this->_('Round description'))->setMultiOptions($rounds); $elements[] = $element; $element = $form->createElement('multiselect', 'sid'); $element->setLabel($this->_('Survey'))->setMultiOptions($surveys)->setDescription($this->_('Use CTRL or Shift to select more')); $elements[] = $element; $element = $form->createElement('multiCheckbox', 'oid'); $element->setLabel($this->_('Organization'))->setMultiOptions($organizations); $elements[] = $element; if (\MUtil_Bootstrap::enabled()) { $element = new \MUtil_Bootstrap_Form_Element_ToggleCheckboxes('toggleOrg', array('selector' => 'input[name^=oid]')); } else { $element = new \Gems_JQuery_Form_Element_ToggleCheckboxes('toggleOrg', array('selector' => 'input[name^=oid]')); } $element->setLabel($this->_('Toggle')); $elements[] = $element; $element = $form->createElement('datePicker', 'valid_from', $dateOptions); $element->setLabel($this->_('Valid from')); $elements[] = $element; $element = $form->createElement('datePicker', 'valid_until', $dateOptions); $element->setLabel($this->_('Valid until')); $elements[] = $element; if (\MUtil_Bootstrap::enabled()) { $element = new \MUtil_Bootstrap_Form_Element_ToggleCheckboxes('toggleOrg', array('selector' => 'input[name^=oid]')); } else { $element = new \Gems_JQuery_Form_Element_ToggleCheckboxes('toggleOrg', array('selector' => 'input[name^=oid]')); } $element = $form->createElement('checkbox', 'column_identifiers'); $element->setLabel($this->_('Column Identifiers')); $element->setDescription($this->_('Prefix the column labels with an identifier. (A) Answers, (TF) Trackfields, (D) Description')); $elements[] = $element; //unset($data['records']); if (!empty($data['sid'])) { $filters = $this->getFilters($data); foreach ($filters as $key => $filter) { unset($data['records_' . $key]); $model = $this->getModel($filter, $data); $survey = $this->loader->getTracker()->getSurvey(intval($filter['gto_id_survey'])); $recordCount = $model->loadPaginator($filter)->getTotalItemCount(); $element = $form->createElement('exhibitor', 'records_' . $key); $element->setValue($survey->getName() . ': ' . sprintf($this->_('%s records found.'), $recordCount)); //$element->setValue($survey->getName()); $elements[] = $element; } } if ($this->project->hasResponseDatabase()) { $this->addResponseDatabaseForm($form, $data, $elements); } return $elements; }
/** * * @param string $orgWhere * @param array $data The $form field values (can be usefull, but no need to set them) * @return mixed SQL string or array */ protected function getAllTrackTypes($orgWhere, array $data) { return $this->util->getTrackData()->getActiveTracks($orgWhere); }