/** * Method triggered on publish for xml text datatype * * This method makes sure that links from all translations of an xml text * are registered in the ezurl_object_link table, and thus retained, if * previous versions of an object are removed. * * It also checks for embedded objects in other languages xml, and makes * sure the matching object relations are stored for the publish version. * * @param eZContentObjectAttribute $contentObjectAttribute * @param eZContentObject $object * @param array $publishedNodes * @return boolean */ function onPublish($contentObjectAttribute, $object, $publishedNodes) { $currentVersion = $object->currentVersion(); $langMask = $currentVersion->attribute('language_mask'); // We find all translations present in the current version. We calculate // this from the language mask already present in the fetched version, // so no further round-trip to the DB is required. $languageList = eZContentLanguage::decodeLanguageMask($langMask, true); $languageList = $languageList['language_list']; // We want to have the class attribute identifier of the attribute // containing the current ezxmltext, as we then can use the more efficient // eZContentObject->fetchAttributesByIdentifier() to get the data $identifier = $contentObjectAttribute->attribute('contentclass_attribute_identifier'); $attributeArray = $object->fetchAttributesByIdentifier(array($identifier), $currentVersion->attribute('version'), $languageList); foreach ($attributeArray as $attribute) { $xmlText = eZXMLTextType::rawXMLText($attribute); $dom = new DOMDocument('1.0', 'utf-8'); if (!$dom->loadXML($xmlText)) { continue; } // urls $urlIdArray = array(); foreach ($dom->getElementsByTagName('link') as $link) { // We are looking for external 'http://'-style links, not the internal // object or node links. if ($link->hasAttribute('url_id')) { $urlIdArray[] = $link->getAttribute('url_id'); } } if (count($urlIdArray) > 0) { eZSimplifiedXMLInput::updateUrlObjectLinks($attribute, $urlIdArray); } // linked objects $linkedObjectIdArray = $this->getRelatedObjectList($dom->getElementsByTagName('link')); // embedded objects $embeddedObjectIdArray = array_merge($this->getRelatedObjectList($dom->getElementsByTagName('embed')), $this->getRelatedObjectList($dom->getElementsByTagName('embed-inline'))); if (!empty($embeddedObjectIdArray)) { $object->appendInputRelationList($embeddedObjectIdArray, eZContentObject::RELATION_EMBED); } if (!empty($linkedObjectIdArray)) { $object->appendInputRelationList($linkedObjectIdArray, eZContentObject::RELATION_LINK); } if (!empty($linkedObjectIdArray) || !empty($embeddedObjectIdArray)) { $object->commitInputRelations($currentVersion->attribute('version')); } } }
/** * Search through valid ezxmltext occurrences, and fix missing url object links if * specified. * * @return void */ public function processData() { while ($this->processedCount < $this->xmlTextContentObjectAttributeCount()) { $limit = array('offset' => $this->offset, 'length' => $this->fetchLimit); $xmlAttributeChunk = eZContentObjectAttribute::fetchListByClassID($this->xmlClassAttributeIds(), false, $limit, true, false); foreach ($xmlAttributeChunk as $xmlAttr) { $result = true; // If the current entry has been logged, we don't increment the running number // so that the entries can be displayed together on output. $currentEntryLogged = false; $currentId = $xmlAttr->attribute('id'); $objectId = $xmlAttr->attribute('contentobject_id'); $version = $xmlAttr->attribute('version'); $languageCode = $xmlAttr->attribute('language_code'); $label = "Attribute [id:{$currentId}] - [Object-id:{$objectId}] - [Version:{$version}] - [Language:{$languageCode}]"; $xmlText = eZXMLTextType::rawXMLText($xmlAttr); if (empty($xmlText)) { if ($this->verboseLevel > 0) { $this->outputString("Empty XML-data", $label, $currentEntryLogged); $currentEntryLogged = true; } $result = false; continue; } $dom = new DOMDocument('1.0', 'utf-8'); $success = $dom->loadXML($xmlText); if (!$success) { if ($this->verboseLevel > 0) { $this->outputString("XML not loaded correctly for attribute", $label, $currentEntryLogged); $currentEntryLogged = true; } $result = false; continue; } $linkNodes = $dom->getElementsByTagName('link'); $urlIdArray = array(); foreach ($linkNodes as $link) { // We are looking for external 'http://'-style links, not the internal // object or node links. if ($link->hasAttribute('url_id')) { $urlIdArray[] = $link->getAttribute('url_id'); } } if (count($urlIdArray) > 0) { if ($this->verboseLevel > 0) { $this->outputString("Found http-link elements in xml-block", $label, $currentEntryLogged); $currentEntryLogged = true; } $urlIdArray = array_unique($urlIdArray); foreach ($urlIdArray as $url) { $linkObjectLink = eZURLObjectLink::fetch($url, $currentId, $version); if ($linkObjectLink === null) { $result = false; $this->outputString("Missing url object link: [id:{$currentId}] - [version:{$version}] - [url:{$url}]", $label, $currentEntryLogged); $currentEntryLogged = true; } $storedUrl = eZURL::url($url); if ($storedUrl === false) { $result = false; $this->outputString("Missing URL, the referenced url does not exist, [url_id:{$url}]", $label, $currentEntryLogged); $currentEntryLogged = true; } } if ($this->doFix and $linkObjectLink === null and $storedUrl !== false) { $this->outputString("Reconstructing ezurl-object-link", $label, $currentEntryLogged); $currentEntryLogged = true; eZSimplifiedXMLInput::updateUrlObjectLinks($xmlAttr, $urlIdArray); } } $this->script->iterate($this->cli, $result); $label = null; } $this->processedCount += count($xmlAttributeChunk); $this->offset += $this->fetchLimit; unset($xmlAttributeChunk); } }
private function processXmlTextData($xml, $attribute) { $parser = new eZSimplifiedXMLInputParser($this->object->attribute('id')); $parser->ParseLineBreaks = true; $xml = $parser->process($xml); $xml = eZXMLTextType::domString($xml); $urlIdArray = $parser->getUrlIDArray(); if (count($urlIdArray) > 0) { eZSimplifiedXMLInput::updateUrlObjectLinks($attribute, $urlIdArray); } return $xml; }