/** * 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); } } }
/** * Switch to single row mode and set that row. * * @param array $row Or load from model * @return \MUtil_Model_Format_DisplayFormatter (continuation pattern) * @throws \MUtil_Model_ModelException */ public function setRow(array $row = null) { $this->setMode(self::MODE_SINGLE_ROW); if (null === $row) { // Stop tracking usage, in row mode it is unlikely // all fields have been set. $this->model->trackUsage(false); $row = $this->model->loadFirst(); if (!$row) { $row = array(); } } $this->_data = $row; if ($this->_chainedBridge) { $this->_chainedBridge->_data = $this->_data; } $this->setRepeater(array($this->_data)); return $this; }