00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 include_once( "kernel/classes/ezcontentobjecttreenode.php" );
00032
00033 class eZTreeMenuOperator
00034 {
00035
00036
00037 function eZTreeMenuOperator( $name = 'treemenu' )
00038 {
00039 $this->Operators = array( $name );
00040 }
00041
00042
00043
00044
00045 function &operatorList()
00046 {
00047 return $this->Operators;
00048 }
00049
00050
00051
00052
00053 function namedParameterList()
00054 {
00055 return array( 'path' => array( 'type' => 'array',
00056 'required' => true,
00057 'default' => false ),
00058 'node_id' => array( 'type' => 'int',
00059 'required' => false,
00060 'default' => false ),
00061 'class_filter' => array( 'type' => 'array',
00062 'required' => false,
00063 'default' => false ),
00064 'depth_skip' => array( 'type' => 'int',
00065 'required' => false,
00066 'default' => false ),
00067 'max_level' => array( 'type' => 'int',
00068 'required' => false,
00069 'default' => false ),
00070 'is_selected_method' => array( 'type' => 'string',
00071 'required' => false,
00072 'default' => 'tree' ),
00073 'indentation_level' => array( 'type' => 'int',
00074 'required' => false,
00075 'default' => 15 ),
00076 'language' => array( 'type' => 'string|array',
00077 'required' => false,
00078 'default' => false ) );
00079 }
00080
00081
00082
00083
00084 function modify( &$tpl, &$operatorName, &$operatorParameters, &$rootNamespace, &$currentNamespace, &$operatorValue, &$namedParameters )
00085 {
00086 $level = 0;
00087 $done = false;
00088 $i = 0;
00089 $pathArray = array();
00090 $tmpModulePath = $namedParameters['path'];
00091 $classFilter = $namedParameters['class_filter'];
00092 $language = $namedParameters['language'];
00093
00094 if ( !empty( $namedParameters['node_id'] ) )
00095 eZDebug::writeNotice( 'Deprecated parameter "node_id" in treemenu template operator' );
00096
00097 if ( $classFilter === false )
00098 {
00099 $classFilter = array();
00100 }
00101 else if ( count( $classFilter ) == 0 )
00102 {
00103 $classFilter = array( 1 );
00104 }
00105 $classFilter = ( count( $classFilter ) == 1 and !isset( $classFilter[0] ) ) ? array( 1 ) : $classFilter;
00106 if ( !$tmpModulePath[count($tmpModulePath)-1]['url'] and isset( $tmpModulePath[count($tmpModulePath)-1]['node_id'] ) )
00107 $tmpModulePath[count($tmpModulePath)-1]['url'] = "/content/view/full/" . $tmpModulePath[count($tmpModulePath)-1]['node_id'];
00108
00109 $depthSkip = $namedParameters['depth_skip'];
00110 $indentationLevel = $namedParameters['indentation_level'];
00111
00112 $maxLevel = $namedParameters['max_level'];
00113 $isSelectedMethod = $namedParameters['is_selected_method'];
00114 if ( $maxLevel === false )
00115 $maxLevel = 2;
00116
00117 while ( !$done && isset( $tmpModulePath[$i+$depthSkip] ) )
00118 {
00119
00120 $elements = explode( "/", $tmpModulePath[$i+$depthSkip]['url'] );
00121 $nodeID = false;
00122 if ( isset( $elements[4] ) )
00123 $nodeID = $elements[4];
00124
00125 $excludeNode = false;
00126
00127 if ( isset( $elements[1] ) &&
00128 isset( $elements[2] ) &&
00129 $elements[1] == 'content' &&
00130 $elements[2] == 'view' &&
00131 is_numeric( $nodeID ) &&
00132 $excludeNode == false &&
00133 $level < $maxLevel )
00134 {
00135 $node = eZContentObjectTreeNode::fetch( $nodeID );
00136 if ( !isset( $node ) ) { $operatorValue = $pathArray; return; }
00137 if ( isset( $tmpModulePath[$i+$depthSkip+1] ) )
00138 {
00139 $nextElements = explode( "/", $tmpModulePath[$i+$depthSkip+1]['url'] );
00140 if ( isset( $nextElements[4] ) )
00141 {
00142 $nextNodeID = $nextElements[4];
00143 }
00144 else
00145 {
00146 $nextNodeID = false;
00147 }
00148 }
00149 else
00150 $nextNodeID = false;
00151
00152 $menuChildren = eZContentObjectTreeNode::subTree( array( 'Depth' => 1,
00153 'Offset' => 0,
00154 'SortBy' => $node->sortArray(),
00155 'Language' => $language,
00156 'ClassFilterType' => 'include',
00157 'ClassFilterArray' => $classFilter ),
00158 $nodeID );
00159
00160
00161 eZContentObject::fillNodeListAttributes( $menuChildren );
00162
00163 $tmpPathArray = array();
00164 foreach ( $menuChildren as $child )
00165 {
00166 $name = $child->attribute( 'name' );
00167 $tmpNodeID = $child->attribute( 'node_id' );
00168
00169 $url = "/content/view/full/$tmpNodeID/";
00170 $urlAlias = "/" . $child->attribute( 'url_alias' );
00171
00172 $mainNode = $child->attribute( 'main_node_id' );
00173 $dataMap = $child->attribute( 'data_map' );
00174 $childrenCount = $child->attribute( 'children_count' );
00175 $contentObject = $child->attribute( 'object' );
00176 $isMain = false;
00177 if ( $mainNode == $tmpNodeID )
00178 $isMain = true;
00179
00180 $hasChildren = false;
00181 if ( $childrenCount > 0 )
00182 $hasChildren = true;
00183
00184 $indent = ($i - 1) * $indentationLevel;
00185
00186 $isSelected = false;
00187 $nextNextElements = ( $isSelectedMethod == 'node' and isset( $tmpModulePath[$i+$depthSkip+2]['url'] ) ) ? explode( "/", $tmpModulePath[$i+$depthSkip+2]['url'] ) : null;
00188 if ( $nextNodeID === $tmpNodeID and !isset( $nextNextElements[4] ) )
00189 {
00190 $isSelected = true;
00191 }
00192
00193 $tmpPathArray[] = array( 'id' => $tmpNodeID,
00194 'level' => $i,
00195 'data_map' => $dataMap,
00196 'class_name' => $contentObject->classname(),
00197 'is_main_node' => $isMain,
00198 'has_children' => $hasChildren,
00199 'indent' => $indent,
00200 'url_alias' => $urlAlias,
00201 'url' => $url,
00202 'text' => $name,
00203 'is_selected' => $isSelected,
00204 'node' => $child );
00205 }
00206
00207
00208 $j = 0;
00209 $insertPos = 0;
00210 foreach ( $pathArray as $path )
00211 {
00212 if ( $path['id'] == $nodeID )
00213 $insertPos = $j;
00214 $j++;
00215 }
00216 $restArray = array_splice( $pathArray, $insertPos + 1 );
00217
00218 $pathArray = array_merge( $pathArray, $tmpPathArray );
00219 $pathArray = array_merge( $pathArray, $restArray );
00220 }
00221 else
00222 {
00223 if ( $level == 0 )
00224 {
00225 $node = eZContentObjectTreeNode::fetch( 2 );
00226 if ( !isset( $node ) ) { $operatorValue = $pathArray; return; }
00227 $menuChildren = eZContentObjectTreeNode::subTree( array( 'Depth' => 1,
00228 'Offset' => 0,
00229 'SortBy' => $node->sortArray(),
00230 'Language' => $language,
00231 'ClassFilterType' => 'include',
00232 'ClassFilterArray' => $classFilter ),
00233 2 );
00234
00235
00236 eZContentObject::fillNodeListAttributes( $menuChildren );
00237
00238 $pathArray = array();
00239 foreach ( $menuChildren as $child )
00240 {
00241 $name = $child->attribute( 'name' );
00242 $tmpNodeID = $child->attribute( 'node_id' );
00243
00244 $url = "/content/view/full/$tmpNodeID/";
00245 $urlAlias = "/" . $child->attribute( 'url_alias' );
00246
00247 $pathArray[] = array( 'id' => $tmpNodeID,
00248 'level' => $i,
00249 'url_alias' => $urlAlias,
00250 'url' => $url,
00251 'text' => $name,
00252 'is_selected' => false,
00253 'node' => $child );
00254 }
00255 }
00256 $done = true;
00257 }
00258 ++$level;
00259 ++$i;
00260 }
00261
00262 $operatorValue = $pathArray;
00263 }
00264
00265
00266 var $Operators;
00267 };
00268
00269 ?>