/** * Overwrited setter mechanism to handle link retrieval properly. * * @see Opus_Model_Abstract::_setFieldValue() */ protected function _setFieldValue(Opus_Model_Field $field, $values) { $fieldname = $field->getName(); $linkmodelclass = $field->getLinkModelClass(); if (!is_null($values) and !is_null($linkmodelclass)) { // Workaround for link_-tables with ternary relations. It's not // beautyful, but it works for now. There won't be an easier // solution without major changes on the framework/schema, since // we cannot know the type of ternary relations at this point. $ternaryRelationName = null; if (isset($this->_externalFields[$fieldname]['addprimarykey'][0])) { $ternaryRelationName = $this->_externalFields[$fieldname]['addprimarykey'][0]; } $values_as_array = is_array($values); $values = is_array($values) ? $values : array($values); foreach ($values as $i => $value) { $linkmodel = null; if ($value instanceof Opus_Model_Dependent_Link_Abstract === true) { $linkmodel = $value; } else { if (is_null($this->getId()) or is_null($value->getId())) { // If any of the linked models hasn't been stored yet. $linkmodel = new $linkmodelclass(); $linkmodel->setModel($value); } else { $linkId = array($this->getId(), $value->getId()); if (isset($ternaryRelationName)) { $linkId[] = $ternaryRelationName; } try { $linkmodel = new $linkmodelclass($linkId); } catch (Opus_Model_NotFoundException $e) { $linkmodel = new $linkmodelclass(); } $linkmodel->setModel($value); } } $values[$i] = $linkmodel; } if (!$values_as_array) { $values = $values[0]; } } return parent::_setFieldValue($field, $values); }