public function onBeforeWrite() { $changedFields = $this->owner->getChangedFields(false, 1); if (array_key_exists("DocumentTags", $changedFields)) { $currentTags = explode(',', $this->owner->getField('DocumentTags')); $oldTags = DMSTag::get()->innerJoin("DMSDocument_Tags", "\"DMSDocument_Tags\".\"DMSTagID\" = \"DMSTag\".\"ID\" AND \"DMSDocument_Tags\".\"DMSDocumentID\" = " . $this->owner->ID)->column(); // delete the tags foreach (array_diff($oldTags, $currentTags) as $idTag) { $tag = DMSTag::get()->byID($idTag); if ($tag) { $this->owner->removeTag($tag->Category, $tag->Value ? $tag->Value : null); } } // add the tags foreach (array_diff($currentTags, $oldTags) as $idTag) { $tag = DMSTag::get()->byID($idTag); if ($tag) { $tag->Documents()->add($this->owner); } } } }
/** * Adds a metadata tag to the Document. The tag has a category and a value. * Each category can have multiple values by default. So: addTag("fruit","banana") addTag("fruit", "apple") will add two items. * However, if the third parameter $multiValue is set to 'false', then all updates to a category only ever update a single value. So: * addTag("fruit","banana") addTag("fruit", "apple") would result in a single metadata tag: fruit->apple. * Can could be implemented as a key/value store table (although it is more like category/value, because the * same category can occur multiple times) * @param $category String of a metadata category to add (required) * @param $value String of a metadata value to add (required) * @param bool $multiValue Boolean that determines if the category is multi-value or single-value (optional) * @return null */ function addTag($category, $value, $multiValue = true) { if ($multiValue) { //check for a duplicate tag, don't add the duplicate $currentTag = $this->Tags()->filter(array('Category' => $category, 'Value' => $value)); if ($currentTag->Count() == 0) { //multi value tag $tag = new DMSTag(); $tag->Category = $category; $tag->Value = $value; $tag->MultiValue = true; $tag->write(); $tag->Documents()->add($this); } else { //add the relation between the tag and document foreach ($currentTag as $tagObj) { $tagObj->Documents()->add($this); } } } else { //single value tag $currentTag = $this->Tags()->filter(array('Category' => $category)); $tag = null; if ($currentTag->Count() == 0) { //create the single-value tag $tag = new DMSTag(); $tag->Category = $category; $tag->Value = $value; $tag->MultiValue = false; $tag->write(); } else { //update the single value tag $tag = $currentTag->first(); $tag->Value = $value; $tag->MultiValue = false; $tag->write(); } //regardless of whether we created a new tag or are just updating an existing one, add the relation $tag->Documents()->add($this); } }