/** * Returns an SQL part which makes sure that fetched nodes are (not) part of the given node path * and not the parent node * * @param string $outPathConditionStr * @param string $outNotEqParentStr * @param int $nodeID * @param bool $depth * @param string $depthOperator * @return bool */ static function createPathConditionAndNotEqParentSQLStrings(&$outPathConditionStr, &$outNotEqParentStr, $nodeID, $depth = false, $depthOperator = 'le') { if (!$depthOperator) { $depthOperator = 'le'; } // check if we are only fetching children // - depth (lower than or) eqaul to 1 // - depth lower than 2 = depth equal to 1 $onlyChildren = $depth === 1 && ($depthOperator === 'le' || $depthOperator === 'eq') || $depth === 2 && $depthOperator === 'lt'; if (is_array($nodeID) && count($nodeID) == 1) { $nodeID = $nodeID[0]; } if (is_array($nodeID)) { $outNotEqParentStr = ''; // a parent_node_id condition suffits when only fetching children if ($onlyChildren) { $db = eZDB::instance(); $outPathConditionStr = $db->generateSQLINStatement($nodeID, 'ezcontentobject_tree.parent_node_id', false, true, 'int') . ' and'; } else { $nodeIDList = $nodeID; $sqlPartForOneNodeList = array(); foreach ($nodeIDList as $nodeID) { $node = eZContentObjectTreeNodeNoLanguage::fetch($nodeID, false, false); if (!is_array($node)) { return false; } $nodePath = $node['path_string']; $nodeDepth = $node['depth']; $depthCond = ''; if ($depth) { $sqlDepthOperator = '<='; if ($depthOperator) { if ($depthOperator == 'lt') { $sqlDepthOperator = '<'; } else { if ($depthOperator == 'gt') { $sqlDepthOperator = '>'; } else { if ($depthOperator == 'le') { $sqlDepthOperator = '<='; } else { if ($depthOperator == 'ge') { $sqlDepthOperator = '>='; } else { if ($depthOperator == 'eq') { $sqlDepthOperator = '='; } } } } } } $nodeDepth += $depth; $depthCond = ' and ezcontentobject_tree.depth ' . $sqlDepthOperator . ' ' . $nodeDepth . ' '; } $requireNotEqParentStr = !$depth || $depthOperator == 'le' || $depthOperator == 'lt'; $notEqParentStr = $requireNotEqParentStr ? " and ezcontentobject_tree.node_id != {$nodeID} " : ''; $sqlPartForOneNodeList[] = " ( ezcontentobject_tree.path_string like '{$nodePath}%' {$depthCond} {$notEqParentStr} ) "; } $outPathConditionStr = implode(' or ', $sqlPartForOneNodeList); $outPathConditionStr = ' (' . $outPathConditionStr . ') and'; } } else { if ($nodeID == 0) { return false; } // a parent_node_id condition suffits when only fetching children if ($onlyChildren) { $outNotEqParentStr = ''; $outPathConditionStr = 'ezcontentobject_tree.parent_node_id = ' . (int) $nodeID . ' and'; } else { $node = eZContentObjectTreeNodeNoLanguage::fetch($nodeID, false, false); if (!is_array($node)) { return false; } $nodePath = $node['path_string']; $nodeDepth = $node['depth']; $outNotEqParentStr = eZContentObjectTreeNodeNoLanguage::createNotEqParentSQLString($nodeID, $depth, $depthOperator); $outPathConditionStr = eZContentObjectTreeNodeNoLanguage::createPathConditionSQLString($nodePath, $nodeDepth, $depth, $depthOperator); } } return true; }