/** * * @param string $trackingField The field that stores the tracking value * @param string $trackedField The field whose changing is tracked * @param string $oldValueField Optional, the field to store a copy of the original value in */ public function apply($trackingField, $trackedField, $oldValueField = null) { if (null === $oldValueField) { // Defautl name $oldValueField = self::OLD_FIELD_PREFIX . $trackedField; // Check if a fields already existed if (method_exists($this->_model, 'getKeyCopyName')) { $copyName = $this->_model->getKeyCopyName($trackedField); if ($this->_model->has($copyName)) { $oldValueField = $copyName; } } } if (!$this->_model->has($oldValueField)) { $this->_model->set($oldValueField, 'elementClass', 'Hidden', __CLASS__, $trackedField); $this->_model->setOnLoad($oldValueField, array($this, 'loadOldValue')); } if (!$this->_model->has($trackingField)) { // Only load the original value and ste the original result when it was not already in the model $this->_model->setAutoSave($trackingField); // $this->_model->setOnLoad($trackingField, $this->_unchangedValue); } $this->_model->set($trackingField, __CLASS__, array($trackedField, $oldValueField)); $this->_model->setOnSave($trackingField, array($this, 'saveValue')); // Store the extra hidden fields needed $hiddenFields = $this->_model->getMeta(self::HIDDEN_FIELDS, array()); $hiddenFields[] = $oldValueField; $this->_model->setMeta(self::HIDDEN_FIELDS, $hiddenFields); // Make sure the fields are in the result set $this->_model->get($trackedField); $this->_model->get($trackingField); $this->_model->get($oldValueField); }