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
00032
00033
00034
00035
00036
00037
00038
00039 require_once( 'kernel/classes/ezcontentlanguage.php' );
00040 include_once( 'kernel/classes/ezcontentclassnamelist.php' );
00041
00042 class eZContentStructureTreeOperator
00043 {
00044 function eZContentStructureTreeOperator( $name = 'content_structure_tree' )
00045 {
00046 $this->Operators = array( $name );
00047 }
00048
00049
00050
00051
00052 function &operatorList()
00053 {
00054 return $this->Operators;
00055 }
00056
00057
00058
00059
00060 function namedParameterList()
00061 {
00062 return array( 'root_node_id' => array( 'type' => 'int',
00063 'required' => true,
00064 'default' => 0 ),
00065 'class_filter' => array( 'type' => 'array',
00066 'required' => false,
00067 'default' => false ),
00068 'max_depth' => array( 'type' => 'int',
00069 'required' => false,
00070 'default' => 0 ),
00071 'max_nodes' => array( 'type' => 'int',
00072 'required' => false,
00073 'default' => 0 ),
00074 'sort_by' => array( 'type' => 'array',
00075 'required' => false,
00076 'default' => 'false' ),
00077 'fetch_hidden' => array( 'type' => 'bool',
00078 'required' => false,
00079 'default' => 'false' ),
00080 'unfold_node_id' => array( 'type' => 'int',
00081 'required' => false,
00082 'default' => 0 ) );
00083 }
00084
00085
00086
00087
00088 function modify( &$tpl, &$operatorName, &$operatorParameters, &$rootNamespace, &$currentNamespace, &$operatorValue, &$namedParameters )
00089 {
00090 $sortArray = false;
00091 $fetchHidden = false;
00092 if ( $namedParameters[ 'sort_by' ] != 'false' )
00093 {
00094 if( is_array($namedParameters[ 'sort_by' ]))
00095 {
00096 $sortArray = array();
00097 foreach( $namedParameters[ 'sort_by' ] as $parameter )
00098 {
00099 $sortingMethod = explode("/", $parameter );
00100 $sortingMethod[1] = ($sortingMethod[1] == 'ascending') ? '1' : '0';
00101 $sortArray[] = $sortingMethod;
00102 }
00103 }
00104 else
00105 {
00106 $sortingMethod = explode("/", $namedParameters[ 'sort_by' ]);
00107 $sortingMethod[1] = ($sortingMethod[1] == 'ascending') ? '1' : '0';
00108 $sortArray = array();
00109 $sortArray[] =& $sortingMethod;
00110 }
00111 }
00112
00113 if ( $namedParameters[ 'fetch_hidden' ] != 'false' )
00114 {
00115 $fetchHidden = true;
00116 }
00117 $operatorValue = eZContentStructureTreeOperator::contentStructureTree( $namedParameters['root_node_id'],
00118 $namedParameters['class_filter'],
00119 $namedParameters['max_depth'],
00120 $namedParameters['max_nodes'],
00121 $sortArray,
00122 $fetchHidden,
00123 $namedParameters['unfold_node_id'] );
00124 }
00125
00126
00127
00128
00129
00130
00131 function &subTree( $params, $nodeID, $countChildren = false )
00132 {
00133 $nodeListArray = array();
00134
00135
00136 $sortingInfo = eZContentObjectTreeNode::createSortingSQLStrings( $params['SortBy'] );
00137
00138
00139 $notEqParentString = '';
00140 $pathStringCond = '';
00141 $noNode = null;
00142 eZContentObjectTreeNode::createPathConditionAndNotEqParentSQLStrings( $pathStringCond, $notEqParentString, $noNode, $nodeID, 1, false );
00143
00144
00145 $classCondition = eZContentObjectTreeNode::createClassFilteringSQLString( $params['ClassFilterType'], $params['ClassFilterArray'] );
00146 if ( $classCondition === false )
00147 {
00148 return $nodeListArray;
00149 }
00150
00151
00152 $limitationParams = false;
00153 $limitationList = eZContentObjectTreeNode::getLimitationList( $limitationParams );
00154
00155 if ( $limitationList === false )
00156 {
00157 return $nodeListArray;
00158 }
00159
00160 $permissionChecking = eZContentObjectTreeNode::createPermissionCheckingSQL( $limitationList );
00161
00162
00163 $useVersionName = true;
00164 $versionNameTables = eZContentObjectTreeNode::createVersionNameTablesSQLString( $useVersionName );
00165 $versionNameTargets = eZContentObjectTreeNode::createVersionNameTargetsSQLString( $useVersionName );
00166 $versionNameJoins = eZContentObjectTreeNode::createVersionNameJoinsSQLString( $useVersionName );
00167
00168
00169 $showInvisibleNodesCond = eZContentObjectTreeNode::createShowInvisibleSQLString( false, $params['FetchHidden'] );
00170
00171 $query = '';
00172 if ( $countChildren )
00173 {
00174 $query = "SELECT count(*) as count
00175 FROM
00176 ezcontentobject_tree,
00177 ezcontentobject,ezcontentclass
00178 $versionNameTables
00179 $permissionChecking[from]
00180 WHERE $pathStringCond
00181 $classCondition
00182 ezcontentclass.version=0 AND
00183 $notEqParentString
00184 ezcontentobject_tree.contentobject_id = ezcontentobject.id AND
00185 ezcontentclass.id = ezcontentobject.contentclass_id
00186 $versionNameJoins
00187 $permissionChecking[where] ";
00188 }
00189 else
00190 {
00191 $query = "SELECT ezcontentobject.*,
00192 ezcontentobject_tree.*,
00193 ezcontentclass.serialized_name_list as class_serialized_name_list,
00194 ezcontentclass.identifier as class_identifier,
00195 ezcontentclass.is_container as is_container
00196 $versionNameTargets
00197 FROM
00198 ezcontentobject_tree,
00199 ezcontentobject,ezcontentclass
00200 $versionNameTables
00201 $sortingInfo[attributeFromSQL]
00202 $permissionChecking[from]
00203 WHERE
00204 $pathStringCond
00205 $sortingInfo[attributeWhereSQL]
00206 ezcontentclass.version=0 AND
00207 $notEqParentString
00208 ezcontentobject_tree.contentobject_id = ezcontentobject.id AND
00209 ezcontentclass.id = ezcontentobject.contentclass_id AND
00210 $classCondition
00211 ezcontentobject_tree.contentobject_is_published = 1
00212 $versionNameJoins
00213 $showInvisibleNodesCond
00214 $permissionChecking[where]
00215 ORDER BY $sortingInfo[sortingFields]";
00216
00217 }
00218
00219 $db =& eZDB::instance();
00220 $nodeListArray = $db->arrayQuery( $query );
00221
00222
00223 $db->dropTempTableList( $permissionChecking['temp_tables'] );
00224
00225 if ( $countChildren )
00226 {
00227 return $nodeListArray[0]['count'];
00228 }
00229 else
00230 {
00231 return $nodeListArray;
00232 }
00233 }
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 function &contentStructureTree( $rootNodeID, &$classFilter, $maxDepth, $maxNodes, &$sortArray, $fetchHidden, $unfoldNodeID )
00245 {
00246 $contentTree =& eZContentStructureTreeOperator::initContentStructureTree( $rootNodeID, $fetchHidden, $classFilter );
00247
00248
00249
00250
00251
00252 if ( $contentTree === false)
00253 return $contentTree;
00254
00255 $nodesLeft = $maxNodes - 1;
00256 $depthLeft = $maxDepth - 1;
00257
00258 eZContentStructureTreeOperator::children( $contentTree, $classFilter, $depthLeft, $nodesLeft, $sortArray, $fetchHidden, $unfoldNodeID );
00259
00260 return $contentTree;
00261 }
00262
00263
00264
00265
00266
00267
00268
00269 function oneLevelChildren( &$contentTree, &$classFilter, &$sortBy, &$nodesLeft, $fetchHidden )
00270 {
00271 $parentNode =& $contentTree['parent_node'];
00272
00273 if ( !is_array( $parentNode ) || count( $parentNode['node'] ) == 0 )
00274 {
00275 return false;
00276 }
00277
00278 if ( !$parentNode['object']['is_container'] || $parentNode['node']['children_count'] == 0 )
00279 {
00280 return true;
00281 }
00282
00283
00284 if ( $nodesLeft != 0)
00285 {
00286
00287 $sortArray = ( $sortBy == false ) ? $parentNode['node']['sort_array'] : $sortBy;
00288
00289 $children =& eZContentStructureTreeOperator::subTree( array( 'SortBy' => $sortArray,
00290 'ClassFilterType' => 'include',
00291 'ClassFilterArray'=> $classFilter,
00292 'NodePath' => $parentNode['node']['path_string'],
00293 'NodeDepth' => $parentNode['node']['depth'],
00294 'FetchHidden' => $fetchHidden ),
00295 $parentNode['node']['node_id'] );
00296 if ( $children && count( $children ) > 0 )
00297 {
00298 $childrenNodes =& $contentTree['children'];
00299
00300 foreach ( $children as $child )
00301 {
00302 $childrenCount = 0;
00303
00304 if ( $child['is_container'] == '1' )
00305 {
00306 $childrenCount = eZContentStructureTreeOperator::subTree( array( 'SortBy' => false,
00307 'ClassFilterType' => 'include',
00308 'ClassFilterArray'=> $classFilter,
00309 'NodePath' => $child['path_string'],
00310 'NodeDepth' => $child['depth'],
00311 'FetchHidden' => $fetchHidden ),
00312 $child['node_id'],
00313 true );
00314 }
00315
00316 $childNode = eZContentStructureTreeOperator::createContentStructureNode( $child, $childrenCount );
00317
00318 $childrenNodes[] = array( 'parent_node' => $childNode,
00319 'children' => array() );
00320
00321 --$nodesLeft;
00322 if ( $nodesLeft == 0 )
00323 {
00324 return false;
00325 }
00326 }
00327 }
00328 return true;
00329 }
00330
00331 return false;
00332 }
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344
00345 function children( &$contentTree, &$classFilter, &$depthLeft, &$nodesLeft, &$sortBy, $fetchHidden, $unfoldNodeID )
00346 {
00347 if ( $depthLeft == 0 )
00348 return false;
00349
00350 if ( eZContentStructureTreeOperator::oneLevelChildren( $contentTree, $classFilter, $sortBy, $nodesLeft, $fetchHidden ) )
00351 {
00352 --$depthLeft;
00353 if ( $depthLeft != 0 )
00354 {
00355 $children =& $contentTree['children'];
00356 $children_keys = array_keys( $children );
00357
00358 foreach( $children_keys as $key )
00359 {
00360 $child =& $children[$key];
00361 $currentDepth = $depthLeft;
00362
00363 if ( $unfoldNodeID != 0 and $unfoldNodeID != $child['parent_node']['node']['node_id'] )
00364 continue;
00365
00366 if ( !eZContentStructureTreeOperator::children( $child, $classFilter, $currentDepth, $nodesLeft, $sortBy, $fetchHidden, 0 ) )
00367 {
00368 return false;
00369 }
00370 }
00371 }
00372 return true;
00373 }
00374 return false;
00375 }
00376
00377
00378
00379
00380
00381
00382
00383
00384 function createContentStructureNode( &$treeNode, $childrenCount )
00385 {
00386 $node = array( 'node' => array( 'node_id' => $treeNode['node_id'],
00387 'path_identification_string' => $treeNode['path_identification_string'],
00388 'children_count' => $childrenCount,
00389 'sort_array' => eZContentObjectTreeNode::sortArrayBySortFieldAndSortOrder( $treeNode['sort_field'], $treeNode['sort_order'] ),
00390 'path_string' => $treeNode['path_string'],
00391 'depth' => $treeNode['depth'],
00392 'is_hidden' => $treeNode['is_hidden'],
00393 'is_invisible' => $treeNode['is_invisible'] ),
00394 'classes_js_array' => eZContentObjectTreeNode::availableClassListJsArray( array( 'path_string' => $treeNode['path_string'], 'is_container' => $treeNode['is_container'], 'node_id' => $treeNode['node_id'] ) ),
00395 'object' => array( 'id' => $treeNode['id'],
00396 'name' => $treeNode['name'],
00397 'class_identifier' => $treeNode['class_identifier'],
00398 'class_name' => eZContentClass::nameFromSerializedString( $treeNode['class_serialized_name_list'] ),
00399 'published' => $treeNode['published'],
00400 'is_container' => ( $treeNode['is_container'] == '1' ),
00401 'language_js_array' => eZContentLanguage::jsArrayByMask( $treeNode['language_mask'] ) ) );
00402 return $node;
00403 }
00404
00405
00406
00407
00408
00409
00410
00411 function &initContentStructureTree( $rootNodeID, $fetchHidden, $classFilter = false )
00412 {
00413
00414 $nodes = false;
00415 $rootTreeNode = eZContentObjectTreeNode::fetch( $rootNodeID );
00416 if ( $rootTreeNode && $rootTreeNode->canRead() )
00417 {
00418 if ( !$fetchHidden && ( $rootTreeNode->attribute( 'is_hidden' ) || $rootTreeNode->attribute( 'is_invisible' ) ) )
00419 {
00420 $nodes = false;
00421 }
00422 else
00423 {
00424 $contentObject =& $rootTreeNode->attribute( 'object' );
00425
00426 $viewNodeAllowed = true;
00427 if ( is_array( $classFilter ) && count( $classFilter ) > 0 )
00428 {
00429 $contentClassIdentifier =& $contentObject->attribute( 'class_identifier' );
00430
00431 if ( !in_array( $contentClassIdentifier, $classFilter ) )
00432 $viewNodeAllowed = false;
00433 }
00434
00435 if ( $viewNodeAllowed )
00436 {
00437 $rootNode = array( 'node' => array( 'node_id' => $rootTreeNode->attribute( 'node_id' ),
00438 'path_identification_string' => $rootTreeNode->attribute( 'path_identification_string' ),
00439 'children_count' => $rootTreeNode->attribute( 'children_count' ),
00440 'sort_array' => $rootTreeNode->attribute( 'sort_array' ),
00441 'path_string' => $rootTreeNode->attribute( 'path_string' ),
00442 'depth' => $rootTreeNode->attribute( 'depth' ),
00443 'is_hidden' => $rootTreeNode->attribute( 'is_hidden' ),
00444 'is_invisible' => $rootTreeNode->attribute( 'is_invisible' ) ),
00445 'classes_js_array' => eZContentObjectTreeNode::availableClassListJsArray( array( 'node' => &$rootTreeNode ) ),
00446 'object' => array( 'id' => $contentObject->attribute( 'id' ),
00447 'name' => $contentObject->attribute( 'name' ),
00448 'class_identifier' => $contentObject->attribute( 'class_identifier' ),
00449 'class_name' => $contentObject->attribute('class_name'),
00450 'published' => $contentObject->attribute( 'published' ),
00451 'is_container' => true,
00452 'language_js_array' => eZContentLanguage::jsArrayByMask( $contentObject->attribute( 'language_mask' ) ) ) );
00453
00454 $nodes = array( 'parent_node' => &$rootNode,
00455 'children' => array() );
00456 }
00457 }
00458 }
00459
00460 return $nodes;
00461 }
00462
00463
00464 var $Operators;
00465 }
00466 ?>