/** * 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); } }
function &inputTagXML( &$tag, $currentSectionLevel, $tdSectionLevel = null ) { $output = ''; $tagName = $tag instanceof DOMNode ? $tag->nodeName : ''; $childTagText = ''; // render children tags if ( $tag->hasChildNodes() ) { $tagChildren = $tag->childNodes; foreach ( $tagChildren as $childTag ) { $childTagText .= $this->inputTagXML( $childTag, $currentSectionLevel, $tdSectionLevel ); } } switch ( $tagName ) { case '#text' : { $tagContent = $tag->textContent; if ( !strlen( $tagContent ) ) { break; } $tagContent = htmlspecialchars( $tagContent ); $tagContent = str_replace ( '&nbsp;', ' ', $tagContent ); if ( $this->allowMultipleSpaces ) { $tagContent = str_replace( ' ', ' ', $tagContent ); } else { $tagContent = preg_replace( "/ {2,}/", ' ', $tagContent ); } if ( $tagContent[0] === ' ' && !$tag->previousSibling )//- Fixed "first space in paragraph" issue (ezdhtml rev.12246) { $tagContent[0] = ';'; $tagContent = ' ' . $tagContent; } if ( $this->allowNumericEntities ) $tagContent = preg_replace( '/&#([0-9]+);/', '&#\1;', $tagContent ); $output .= $tagContent; }break; case 'embed' : case 'embed-inline' : { $view = $tag->getAttribute( 'view' ); $size = $tag->getAttribute( 'size' ); $alignment = $tag->getAttribute( 'align' ); $objectID = $tag->getAttribute( 'object_id' ); $nodeID = $tag->getAttribute( 'node_id' ); $showPath = $tag->getAttribute( 'show_path' ); $htmlID = $tag->getAttributeNS( 'http://ez.no/namespaces/ezpublish3/xhtml/', 'id' ); $className = $tag->getAttribute( 'class' ); $idString = ''; $tplSuffix = ''; if ( !$size ) { $contentIni = eZINI::instance( 'content.ini' ); $size = $contentIni->variable( 'ImageSettings', 'DefaultEmbedAlias' ); } if ( !$view ) { $view = $tagName; } $objectAttr = ''; $objectAttr .= ' alt="' . $size . '"'; $objectAttr .= ' view="' . $view . '"'; if ( $htmlID != '' ) { $objectAttr .= ' html_id="' . $htmlID . '"'; } if ( $showPath === 'true' ) { $objectAttr .= ' show_path="true"'; } if ( $tagName === 'embed-inline' ) $objectAttr .= ' inline="true"'; else $objectAttr .= ' inline="false"'; $customAttributePart = self::getCustomAttrPart( $tag, $styleString ); $object = false; if ( is_numeric( $objectID ) ) { $object = eZContentObject::fetch( $objectID ); $idString = 'eZObject_' . $objectID; } elseif ( is_numeric( $nodeID ) ) { $node = eZContentObjectTreeNode::fetch( $nodeID ); $object = $node instanceof eZContentObjectTreeNode ? $node->object() : false; $idString = 'eZNode_' . $nodeID; $tplSuffix = '_node'; } if ( $object instanceof eZContentObject ) { $objectName = $object->attribute( 'name' ); $classIdentifier = $object->attribute( 'class_identifier' ); if ( !$object->attribute( 'can_read' ) || !$object->attribute( 'can_view_embed' ) ) { $tplSuffix = '_denied'; } else if ( $object->attribute( 'status' ) == eZContentObject::STATUS_ARCHIVED ) { $className .= ' ezoeItemObjectInTrash'; if ( self::$showEmbedValidationErrors ) { $oeini = eZINI::instance( 'ezoe.ini' ); if ( $oeini->variable('EditorSettings', 'ValidateEmbedObjects' ) === 'enabled' ) $className .= ' ezoeItemValidationError'; } } } else { $objectName = 'Unknown'; $classIdentifier = false; $tplSuffix = '_denied'; $className .= ' ezoeItemObjectDeleted'; if ( self::$showEmbedValidationErrors ) { $className .= ' ezoeItemValidationError'; } } $embedContentType = self::embedTagContentType( $classIdentifier ); if ( $embedContentType === 'images' ) { $ini = eZINI::instance(); $URL = self::getServerURL(); $objectAttributes = $object->contentObjectAttributes(); $imageDatatypeArray = $ini->variable('ImageDataTypeSettings', 'AvailableImageDataTypes'); $imageWidth = 32; $imageHeight = 32; foreach ( $objectAttributes as $objectAttribute ) { $classAttribute = $objectAttribute->contentClassAttribute(); $dataTypeString = $classAttribute->attribute( 'data_type_string' ); if ( in_array ( $dataTypeString, $imageDatatypeArray ) && $objectAttribute->hasContent() ) { $content = $objectAttribute->content(); if ( $content == null ) continue; if ( $content->hasAttribute( $size ) ) { $imageAlias = $content->imageAlias( $size ); $srcString = $URL . '/' . $imageAlias['url']; $imageWidth = $imageAlias['width']; $imageHeight = $imageAlias['height']; break; } else { eZDebug::writeError( "Image alias does not exist: $size, missing from image.ini?", __METHOD__ ); } } } if ( !isset( $srcString ) ) { $srcString = self::getDesignFile('images/tango/mail-attachment32.png'); } if ( $alignment === 'center' ) { $objectAttr .= ' align="middle"'; $className .= ' ezoeAlignmiddle'; // align="middle" is not taken into account by browsers on img } else if ( $alignment ) $objectAttr .= ' align="' . $alignment . '"'; if ( $className != '' ) $objectAttr .= ' class="' . $className . '"'; $output .= '<img id="' . $idString . '" title="' . $objectName . '" src="' . $srcString . '" width="' . $imageWidth . '" height="' . $imageHeight . '" ' . $objectAttr . $customAttributePart . $styleString . ' />'; } else if ( self::embedTagIsCompatibilityMode() ) { $srcString = self::getDesignFile('images/tango/mail-attachment32.png'); if ( $alignment === 'center' ) $objectAttr .= ' align="middle"'; else if ( $alignment ) $objectAttr .= ' align="' . $alignment . '"'; if ( $className != '' ) $objectAttr .= ' class="' . $className . '"'; $output .= '<img id="' . $idString . '" title="' . $objectName . '" src="' . $srcString . '" width="32" height="32" ' . $objectAttr . $customAttributePart . $styleString . ' />'; } else { if ( $alignment ) $objectAttr .= ' align="' . $alignment . '"'; if ( $className ) $objectAttr .= ' class="ezoeItemNonEditable ' . $className . ' ezoeItemContentType' . ucfirst( $embedContentType ) . '"'; else $objectAttr .= ' class="ezoeItemNonEditable ezoeItemContentType' . ucfirst( $embedContentType ) . '"'; if ( $tagName === 'embed-inline' ) $htmlTagName = 'span'; else $htmlTagName = 'div'; $objectParam = array( 'size' => $size, 'align' => $alignment, 'show_path' => $showPath ); if ( $htmlID ) $objectParam['id'] = $htmlID; $res = eZTemplateDesignResource::instance(); $res->setKeys( array( array('classification', $className) ) ); if ( isset( $node ) ) { $templateOutput = self::fetchTemplate( 'design:content/datatype/view/ezxmltags/' . $tagName . $tplSuffix . '.tpl', array( 'view' => $view, 'object' => $object, 'link_parameters' => array(), 'classification' => $className, 'object_parameters' => $objectParam, 'node' => $node, )); } else { $templateOutput = self::fetchTemplate( 'design:content/datatype/view/ezxmltags/' . $tagName . $tplSuffix . '.tpl', array( 'view' => $view, 'object' => $object, 'link_parameters' => array(), 'classification' => $className, 'object_parameters' => $objectParam, )); } $output .= '<' . $htmlTagName . ' id="' . $idString . '" title="' . $objectName . '"' . $objectAttr . $customAttributePart . $styleString . '>' . $templateOutput . '</' . $htmlTagName . '>'; } }break; case 'custom' : { $name = $tag->getAttribute( 'name' ); $align = $tag->getAttribute( 'align' ); $customAttributePart = self::getCustomAttrPart( $tag, $styleString ); $inline = self::customTagIsInline( $name ); if ( $align ) { $customAttributePart .= ' align="' . $align . '"'; } if ( isset( self::$nativeCustomTags[ $name ] )) { if ( !$childTagText ) $childTagText = ' '; $output .= '<' . self::$nativeCustomTags[ $name ] . $customAttributePart . $styleString . '>' . $childTagText . '</' . self::$nativeCustomTags[ $name ] . '>'; } else if ( $inline === true ) { if ( !$childTagText ) $childTagText = ' '; $output .= '<span class="ezoeItemCustomTag ' . $name . '" type="custom"' . $customAttributePart . $styleString . '>' . $childTagText . '</span>'; } else if ( $inline ) { $imageUrl = self::getCustomAttribute( $tag, 'image_url' ); if ( $imageUrl === null || !$imageUrl ) { $imageUrl = self::getDesignFile( $inline ); $customAttributePart .= ' width="22" height="22"'; } $output .= '<img src="' . $imageUrl . '" class="ezoeItemCustomTag ' . $name . '" type="custom"' . $customAttributePart . $styleString . ' />'; } else if ( $tag->textContent === '' && !$tag->hasChildNodes() ) { // for empty custom tag, just put a paragraph with the name // of the custom tag in to handle it in the rich text editor $output .= '<div class="ezoeItemCustomTag ' . $name . '" type="custom"' . $customAttributePart . $styleString . '><p>' . $name . '</p></div>'; } else { $customTagContent = $this->inputSectionXML( $tag, $currentSectionLevel, $tdSectionLevel ); /*foreach ( $tag->childNodes as $tagChild ) { $customTagContent .= $this->inputTdXML( $tagChild, $currentSectionLevel, $tdSectionLevel ); }*/ $output .= '<div class="ezoeItemCustomTag ' . $name . '" type="custom"' . $customAttributePart . $styleString . '>' . $customTagContent . '</div>'; } }break; case 'literal' : { $literalText = ''; foreach ( $tagChildren as $childTag ) { $literalText .= $childTag->textContent; } $className = $tag->getAttribute( 'class' ); $customAttributePart = self::getCustomAttrPart( $tag, $styleString ); $literalText = htmlspecialchars( $literalText ); $literalText = str_replace( "\n", '<br />', $literalText ); if ( $className != '' ) $customAttributePart .= ' class="' . $className . '"'; $output .= '<pre' . $customAttributePart . $styleString . '>' . $literalText . '</pre>'; }break; case 'ul' : case 'ol' : { $listContent = ''; $customAttributePart = self::getCustomAttrPart( $tag, $styleString ); // find all list elements foreach ( $tag->childNodes as $listItemNode ) { if ( !$listItemNode instanceof DOMElement ) { continue;// ignore whitespace } $LIcustomAttributePart = self::getCustomAttrPart( $listItemNode, $listItemStyleString ); $noParagraphs = self::childTagCount( $listItemNode ) <= 1; $listItemContent = ''; foreach ( $listItemNode->childNodes as $itemChildNode ) { $listSectionLevel = $currentSectionLevel; if ( $itemChildNode instanceof DOMNode && ( $itemChildNode->nodeName === 'section' || $itemChildNode->nodeName === 'paragraph' ) ) { $listItemContent .= $this->inputListXML( $itemChildNode, $currentSectionLevel, $listSectionLevel, $noParagraphs ); } else { $listItemContent .= $this->inputTagXML( $itemChildNode, $currentSectionLevel, $tdSectionLevel ); } } $LIclassName = $listItemNode->getAttribute( 'class' ); if ( $LIclassName ) $LIcustomAttributePart .= ' class="' . $LIclassName . '"'; $listContent .= '<li' . $LIcustomAttributePart . $listItemStyleString . '>' . $listItemContent . '</li>'; } $className = $tag->getAttribute( 'class' ); if ( $className != '' ) $customAttributePart .= ' class="' . $className . '"'; $output .= '<' . $tagName . $customAttributePart . $styleString . '>' . $listContent . '</' . $tagName . '>'; }break; case 'table' : { $tableRows = ''; $border = $tag->getAttribute( 'border' ); $width = $tag->getAttribute( 'width' ); $align = $tag->getAttribute( 'align' ); $tableClassName = $tag->getAttribute( 'class' ); $customAttributePart = self::getCustomAttrPart( $tag, $styleString ); // find all table rows foreach ( $tag->childNodes as $tableRow ) { if ( !$tableRow instanceof DOMElement ) { continue; // ignore whitespace } $TRcustomAttributePart = self::getCustomAttrPart( $tableRow, $tableRowStyleString ); $TRclassName = $tableRow->getAttribute( 'class' ); $tableData = ''; foreach ( $tableRow->childNodes as $tableCell ) { if ( !$tableCell instanceof DOMElement ) { continue; // ignore whitespace } $TDcustomAttributePart = self::getCustomAttrPart( $tableCell, $tableCellStyleString ); $className = $tableCell->getAttribute( 'class' ); $cellAlign = $tableCell->getAttribute( 'align' ); $colspan = $tableCell->getAttributeNS( 'http://ez.no/namespaces/ezpublish3/xhtml/', 'colspan' ); $rowspan = $tableCell->getAttributeNS( 'http://ez.no/namespaces/ezpublish3/xhtml/', 'rowspan' ); $cellWidth = $tableCell->getAttributeNS( 'http://ez.no/namespaces/ezpublish3/xhtml/', 'width' ); if ( $className != '' ) { $TDcustomAttributePart .= ' class="' . $className . '"'; } if ( $cellWidth != '' ) { $TDcustomAttributePart .= ' width="' . $cellWidth . '"'; } if ( $colspan && $colspan !== '1' ) { $TDcustomAttributePart .= ' colspan="' . $colspan . '"'; } if ( $rowspan && $rowspan !== '1' ) { $TDcustomAttributePart .= ' rowspan="' . $rowspan . '"'; } if ( $cellAlign ) { $TDcustomAttributePart .= ' align="' . $cellAlign . '"'; } $cellContent = ''; $tdSectionLevel = $currentSectionLevel; foreach ( $tableCell->childNodes as $tableCellChildNode ) { $cellContent .= $this->inputTdXML( $tableCellChildNode, $currentSectionLevel, $tdSectionLevel - $currentSectionLevel ); } if ( $cellContent === '' ) { // tinymce has some issues with empty content in some browsers if ( self::browserSupportsDHTMLType() != 'Trident' ) $cellContent = '<p><br data-mce-bogus="1"/></p>'; } if ( $tableCell->nodeName === 'th' ) { $tableData .= '<th' . $TDcustomAttributePart . $tableCellStyleString . '>' . $cellContent . '</th>'; } else { $tableData .= '<td' . $TDcustomAttributePart . $tableCellStyleString . '>' . $cellContent . '</td>'; } } if ( $TRclassName ) $TRcustomAttributePart .= ' class="' . $TRclassName . '"'; $tableRows .= '<tr' . $TRcustomAttributePart . $tableRowStyleString . '>' . $tableData . '</tr>'; } //if ( self::browserSupportsDHTMLType() === 'Trident' ) //{ $customAttributePart .= ' width="' . $width . '"'; /*} else { // if this is reenabled merge it with $styleString $customAttributePart .= ' style="width:' . $width . ';"'; }*/ if ( $border !== '' && is_string( $border ) ) { if ( $border === '0%' ) $border = '0';// Strip % if 0 to make sure TinyMCE shows a dotted border $customAttributePart .= ' border="' . $border . '"'; } if ( $align ) { $customAttributePart .= ' align="' . $align . '"'; } if ( $tableClassName ) { $customAttributePart .= ' class="' . $tableClassName . '"'; } $output .= '<table' . $customAttributePart . $styleString . '><tbody>' . $tableRows . '</tbody></table>'; }break; // normal content tags case 'emphasize' : { $customAttributePart = self::getCustomAttrPart( $tag, $styleString ); $className = $tag->getAttribute( 'class' ); if ( $className ) { $customAttributePart .= ' class="' . $className . '"'; } $output .= '<em' . $customAttributePart . $styleString . '>' . $childTagText . '</em>'; }break; case 'strong' : { $customAttributePart = self::getCustomAttrPart( $tag, $styleString ); $className = $tag->getAttribute( 'class' ); if ( $className ) { $customAttributePart .= ' class="' . $className . '"'; } $output .= '<strong' . $customAttributePart . $styleString . '>' . $childTagText . '</strong>'; }break; case 'line' : { $output .= $childTagText . '<br />'; }break; case 'anchor' : { $name = $tag->getAttribute( 'name' ); $customAttributePart = self::getCustomAttrPart( $tag, $styleString ); $output .= '<a name="' . $name . '" class="mceItemAnchor"' . $customAttributePart . $styleString . '></a>'; }break; case 'link' : { $customAttributePart = self::getCustomAttrPart( $tag, $styleString ); $linkID = $tag->getAttribute( 'url_id' ); $target = $tag->getAttribute( 'target' ); $className = $tag->getAttribute( 'class' ); $viewName = $tag->getAttribute( 'view' ); $objectID = $tag->getAttribute( 'object_id' ); $nodeID = $tag->getAttribute( 'node_id' ); $anchorName = $tag->getAttribute( 'anchor_name' ); $showPath = $tag->getAttribute( 'show_path' ); $htmlID = $tag->getAttributeNS( 'http://ez.no/namespaces/ezpublish3/xhtml/', 'id' ); $htmlTitle = $tag->getAttributeNS( 'http://ez.no/namespaces/ezpublish3/xhtml/', 'title' ); $attributes = array(); if ( $objectID != null ) { $href = 'ezobject://' .$objectID; } elseif ( $nodeID != null ) { if ( $showPath === 'true' ) { $node = eZContentObjectTreeNode::fetch( $nodeID ); $href = $node ? 'eznode://' . $node->attribute('path_identification_string') : 'eznode://' . $nodeID; } else { $href = 'eznode://' . $nodeID; } } elseif ( $linkID != null ) { $href = eZURL::url( $linkID ); } else { $href = $tag->getAttribute( 'href' ); } if ( $anchorName != null ) { $href .= '#' . $anchorName; } if ( $className != '' ) { $attributes[] = 'class="' . $className . '"'; } if ( $viewName != '' ) { $attributes[] = 'view="' . $viewName . '"'; } $attributes[] = 'href="' . $href . '"'; // Also set mce_href for use by OE to make sure href attribute is not messed up by IE 6 / 7 $attributes[] = 'data-mce-href="' . $href . '"'; if ( $target != '' ) { $attributes[] = 'target="' . $target . '"'; } if ( $htmlTitle != '' ) { $attributes[] = 'title="' . $htmlTitle . '"'; } if ( $htmlID != '' ) { $attributes[] = 'id="' . $htmlID . '"'; } $attributeText = ''; if ( !empty( $attributes ) ) { $attributeText = ' ' .implode( ' ', $attributes ); } $output .= '<a' . $attributeText . $customAttributePart . $styleString . '>' . $childTagText . '</a>'; }break; case 'tr' : case 'td' : case 'th' : case 'li' : case 'paragraph' : { }break; default : { }break; } return $output; }
function outputObject( $element, &$attributes, &$sectionLevel ) { $ret = null; if ( isset( $attributes['image:ezurl_id'] ) ) { $linkID = $attributes['image:ezurl_id']; if ( $linkID != null ) { $href = eZURL::url( $linkID ); $attributes['href'] = $href; } } return $ret; }
function toString($contentObjectAttribute) { if (!$contentObjectAttribute->attribute('data_int')) { $attrValue = false; return $attrValue; } $url = eZURL::url($contentObjectAttribute->attribute('data_int')); $text = $contentObjectAttribute->attribute('data_text'); if ($text != '') { $exportData = $url . '|' . $text; } else { $exportData = $url; } return $exportData; }
<?php /** * Vue gérant les redirections de liens référencés dans eZ Publish * Utile pour les liens sponsorisés, notamment pour éviter les problèmes de validation HTML * ou pour cacher les régies publicitaires * @copyright Copyright (C) 2011 - Metal France. All rights reserved * @author Jerome Vieilledent * @version 3.0 * @package metalfrance * @subpackage mf */ $Module = $Params['Module']; $Result = array(); $http = eZHTTPTool::instance(); $mfINI = eZINI::instance('metalfrance.ini'); $url = eZURL::url((int) $Params['LinkID']); eZHTTPTool::redirect($url, array(), '302');