/** * This function is called in addBrowseTableColumns() to filter the names displayed * by AnswerModelSnippetGeneric. * * @see \Gems_Tracker_Snippets_AnswerModelSnippetGeneric * * @param \MUtil_Model_Bridge_TableBridge $bridge * @param \MUtil_Model_ModelAbstract $model * @param array $currentNames The current names in use (allows chaining) * @return array Of the names of labels that should be shown */ public function filterAnswers(\MUtil_Model_Bridge_TableBridge $bridge, \MUtil_Model_ModelAbstract $model, array $currentNames) { $repeater = $model->loadRepeatable(); $table = $bridge->getTable(); $table->setRepeater($repeater); // Filter unless option 'fullanswers' is true, can be set as get or post var. $requestFullAnswers = \Zend_Controller_Front::getInstance()->getRequest()->getParam('fullanswers', false); if (!$repeater->__start()) { return $currentNames; } $keys = array(); if ($requestFullAnswers !== false) { // No filtering return $model->getItemsOrdered(); } else { foreach ($model->getItemNames() as $name) { $start = substr(strtolower($name), 0, $this->IncludeLength); if (in_array($start, $this->IncludeStarts)) { $keys[$name] = $name; } } } $answers = $this->token->getRawAnswers(); // Prevent errors when no answers present if (!empty($answers)) { $results = array_intersect($currentNames, array_keys($keys), array_keys($answers)); } else { $results = array_intersect($currentNames, array_keys($keys)); } $results = $this->restoreHeaderPositions($model, $results); if ($results) { return $results; } return $this->getHeaders($model, $currentNames); }
/** * Function to allow overruling of transform for certain models * * @param \MUtil_Model_ModelAbstract $model Parent model * @param \MUtil_Model_ModelAbstract $sub Sub model * @param array $data The nested data rows * @param array $join The join array * @param string $name Name of sub model * @param boolean $new True when loading a new item * @param boolean $isPostData With post data, unselected multiOptions values are not set so should be added */ protected function transformLoadSubModel(\MUtil_Model_ModelAbstract $model, \MUtil_Model_ModelAbstract $sub, array &$data, array $join, $name, $new, $isPostData) { if (1 === count($join)) { // Suimple implementation $mkey = key($join); $skey = reset($join); $mfor = \MUtil_Ra::column($mkey, $data); // \MUtil_Echo::track($mfor); if ($new) { $sdata = $sub->loadNew(1); } else { $sdata = $sub->load(array($skey => $mfor)); } // \MUtil_Echo::track($sdata); if ($sdata) { $skeys = array_flip(\MUtil_Ra::column($skey, $sdata)); $empty = array_fill_keys(array_keys(reset($sdata)), null); foreach ($data as &$mrow) { $mfind = $mrow[$mkey]; if (isset($skeys[$mfind])) { $mrow += $sdata[$skeys[$mfind]]; } else { $mrow += $empty; } } } else { $empty = array_fill_keys($sub->getItemNames(), null); foreach ($data as &$mrow) { $mrow += $empty; } } // \MUtil_Echo::track($mrow); } else { // Multi column implementation $empty = array_fill_keys($sub->getItemNames(), null); foreach ($data as &$mrow) { $filter = $sub->getFilter(); foreach ($join as $from => $to) { if (isset($mrow[$from])) { $filter[$to] = $mrow[$from]; } } if ($new) { $sdata = $sub->loadNew(); } else { $sdata = $sub->loadFirst($filter); } if ($sdata) { $mrow += $sdata; } else { $mrow += $empty; } // \MUtil_Echo::track($sdata, $mrow); } } }
/** * The transform function performs the actual transformation of the data and is called after * the loading of the data in the source model. * * @param \MUtil_Model_ModelAbstract $model The parent model * @param array $data Nested array * @param boolean $new True when loading a new item * @param boolean $isPostData With post data, unselected multiOptions values are not set so should be added * @return array Nested array containing (optionally) transformed data */ public function transformLoad(\MUtil_Model_ModelAbstract $model, array $data, $new = false, $isPostData = false) { // get tokens $tokens = \MUtil_Ra::column('gto_id_token', $data); $answerRows = $this->source->getRawTokenAnswerRows(array('token' => $tokens), $this->survey->getSurveyId()); $resultRows = array(); $emptyRow = array_fill_keys($model->getItemNames(), null); foreach ($data as $row) { $tokenId = $row['gto_id_token']; if (isset($answerRows[$tokenId])) { $resultRows[$tokenId] = $row + $answerRows[$tokenId] + $emptyRow; } else { $resultRows[$tokenId] = $row + $emptyRow; } } //\MUtil_Echo::track($tokens); //\MUtil_Echo::track($resultRows); // No changes return $resultRows; }
/** * Returns the required rows set or calculates the rows using the $model and the required rows info * * @param \MUtil_Model_ModelAbstract $model Optional model for calculation * @return array * @throws \MUtil_Model_ModelException */ public function getDefaultRow(\MUtil_Model_ModelAbstract $model = null) { if (!$this->_defaultRow) { $requireds = $this->getRequiredRows(); $required = \MUtil_Ra::to(reset($requireds)); if (!$this->_keyItemCount) { $this->setKeyItemCount(count($required)); } if ($required && $model instanceof \MUtil_Model_ModelAbstract) { $defaults = array(); foreach ($model->getItemNames() as $name) { if (!array_key_exists($name, $required)) { $defaults[$name] = null; } } $this->_defaultRow = $defaults; } else { throw new \MUtil_Model_ModelException('Cannot create default row without model and required rows.'); } } elseif (!is_array($this->_defaultRow)) { $this->_defaultRow = \MUtil_Ra::to($this->_defaultRow); } return $this->_defaultRow; }