joomla_test/modules/mod_roknavmenu/lib/librokmenu/RokMenuNodeTree.php

168 lines
5.8 KiB
PHP
Raw Normal View History

2020-01-02 22:20:31 +07:00
<?php
/**
* @version $Id: RokMenuNodeTree.php 4585 2012-10-27 01:44:54Z btowles $
* @author RocketTheme http://www.rockettheme.com
* @copyright Copyright (C) 2007 - 2013 RocketTheme, LLC
* @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 only
*/
require_once(dirname(__FILE__) . '/RokMenuNodeBase.php');
require_once(dirname(__FILE__) . '/RokMenuNode.php');
if (!class_exists('RokMenuNodeTree')) {
/**
* Rok Nav Menu Tree Class.
*/
class RokMenuNodeTree extends RokMenuNodeBase
{
protected $rootid;
public function __construct($rootid = 0){
$this->rootid = $rootid;
}
/**
* @param int $top_node_id
* @return bool
*/
public function resetTop($top_node_id)
{
$new_top = $this->findNode($top_node_id);
if (!$new_top) return false;
$this->children = $new_top->getChildren();
return true;
}
/**
* @param RokMenuNodeBase $node
* @return bool
*/
public function addNode(RokMenuNodeBase &$node)
{
if ($node->getParent() == $this->rootid) {
$this->addChild($node);
$node->setLevel(0);
return true;
}
else {
$iterator = $this->getIterator();
$childrenIterator = new RecursiveIteratorIterator(new RokMenuIdFilter($iterator, $node->getParent()), RecursiveIteratorIterator::SELF_FIRST);
foreach ($childrenIterator as $child) {
if ($child->getId() == $node->getParent()) {
$child->addChild($node);
$node->setLevel($childrenIterator->getDepth() + 1);
return true;
}
}
}
return false;
}
/**
* @param int $id
* @return bool
*/
public function findNode($id)
{
$iterator = $this->getIterator();
$childrenIterator = new RecursiveIteratorIterator(new RokMenuIdFilter($iterator, $id), RecursiveIteratorIterator::SELF_FIRST);
foreach ($childrenIterator as $child) {
if ($child->getId() == $id) {
$childref = &$child;
return $childref;
}
}
return false;
}
/**
* @param int $nodeId
* @return bool
*/
public function removeNode($nodeId)
{
$iterator = $this->getIterator();
$childrenIterator = new RecursiveIteratorIterator(new RokMenuIdFilter($iterator, $nodeId), RecursiveIteratorIterator::SELF_FIRST);
foreach ($childrenIterator as $child) {
if ($child->getId() == $nodeId) {
$parent = $child->getParentRef();
$parent->removeChild($nodeId);
return true;
}
}
return false;
}
/**
* @param int $end
* @return void
*/
public function removeLevel($end)
{
$toRemove = array();
$iterator = $this->getIterator();
$childrenIterator = new RecursiveIteratorIterator(new RokMenuGreaterThenLevelFilter($iterator, $end), RecursiveIteratorIterator::SELF_FIRST);
foreach ($childrenIterator as $child) {
if ($child->getLevel() > $end) {
$toRemove[] = $child->getId();
}
}
foreach ($toRemove as $remove_id) {
$this->removeNode($remove_id);
}
}
/**
* @param int $end
* @return void
*/
public function removeLevelFromNonActive($active_tree, $end)
{
$toRemove = array();
$iterator = $this->getIterator();
$childrenIterator = new RecursiveIteratorIterator(new RokMenuNotOnActiveTreeFilter($iterator,$active_tree,$end), RecursiveIteratorIterator::SELF_FIRST);
foreach ($childrenIterator as $child) {
if ($child->getLevel() > $end+1) {
$toRemove[] = $child->getId();
}
}
foreach ($toRemove as $remove_id) {
$this->removeNode($remove_id);
}
}
/**
* @param array $active_tree the array of active RokNavMenu items
* @param int $last_active the id of the last active item in the tree
* @return void
*/
public function removeIfNotInTree(&$active_tree, $last_active)
{
if (!empty($active_tree)) {
$toRemove = array();
$childrenIterator = new RecursiveIteratorIterator($this, RecursiveIteratorIterator::SELF_FIRST);
foreach ($childrenIterator as $child) {
if (!in_array($child->getId(), $active_tree) && $last_active == $child->getId()) {
// i am the last node in the active tree dont show my childs but not my grandchildren
foreach ($child as $subchild) {
$toRemove = array_merge($toRemove, array_keys($subchild->getChildren()));
}
}
else if (!in_array($child->getId(), $active_tree) && $child->getParent() != $last_active) {
// I am not in the active tree and not a child of the last node in the active tree so dont show my children
$toRemove = array_merge($toRemove, array_keys($child->getChildren()));
}
}
foreach ($toRemove as $remove_id) {
$this->removeNode($remove_id);
}
}
}
}
}