Click to See Complete Forum and Search --> : Dynamic Elimination of Parent from Tree View


hossaindoula
12-12-2007, 08:03 AM
I'm now working on a project. Everything is done except one thing. I've included tree view as a downline members. But the problem is I cannot remove the parent nodes of currently logged in member. The requirement is the member can see only himself and his children. Here is my tree view code for downlines. Can anyone help me to get rid off the parent nodes in terms of the member.

downlines.php
<?php require_once('Connections/kenz.php'); ?>
<?php require_once('includes/treemenus/MX_TreeMenu.inc.php'); ?>


<?php

mysql_select_db($database_kenz, $kenz);


//$mem_id=$_SESSION[mem_id];
$query_Recordset1 = "SELECT * FROM tree_view";
$Recordset1 = mysql_query($query_Recordset1, $kenz) or die(mysql_error());
$row_Recordset1 = mysql_fetch_assoc($Recordset1);
$totalRows_Recordset1 = mysql_num_rows($Recordset1);

//TreeMenu1 Start kenz tree_view None None
$TreeMenu1 = new MX_TreeMenu('TreeMenu1');
$TreeMenu1->setQuery($Recordset1);
$TreeMenu1->setPK("id_dir");
$TreeMenu1->setFK("iddir_dir");
$TreeMenu1->setNameField("name_dir");
$TreeMenu1->setTitleField("desc_dir");
//URL Type: Static
$TreeMenu1->setLink("view_downlines.php?id=");
$TreeMenu1->setURLParameter("id_dir");
$TreeMenu1->setTarget("_self");

//TreeMenu1 Layout
$TreeMenu1->highlightCurrent(true);
$TreeMenu1->setLevel(-1);
//TreeMenu1 End

echo $TreeMenu1->render();
mysql_free_result($Recordset1);
?>







MX_TreeMenu.inc.php
<?php

class MX_TreeMenu {

var $menuName;
var $menuItems;
var $menuOutput;

var $query;
var $menuPK;
var $menuFK;
var $menuNameField;
var $menuTitleField;
var $menuLink;
var $menuURLParameter;
var $menuTarget;
var $menuLinkField;
var $menuTargetField;
var $menuLevel;
var $menuHighlight;

var $isStatic;
var $isStaticURL;
var $previousItemLevel;

function MX_TreeMenu ($menuName, $menuDepthSeparator = ' ') {
$this->menuName = $menuName;
$this->menuDepthSeparator = $menuDepthSeparator;
$this->menuItems = array();
$this->previousItemLevel = -1;
$this->menuLevel = -1; // -1 means menuLevel is not taken into account
$this->menuHighlight = false;

$this->menuOutput = '';
}




/*
* Static Mx Menu
*/

function addItem ($itemName, $itemURL, $itemTitle = '', $itemTarget='') {
// sets static menu renderer
$this->isStatic = true;
$level = 0;
while (strpos($itemName, $this->menuDepthSeparator) === 0) {
$level++;
$itemName = substr($itemName, 1);
}
$useThisEntry = true;
if (($level > $this->previousItemLevel) && (($level - $this->previousItemLevel) > 1)) {
$useThisEntry = false; // ignore this entry because more than 2 spaces from the previous level have been detected
$level = $this->previousItemLevel + 1;
}
if ($useThisEntry) {
$myItem = array();
$myItem['itemName'] = htmlentities(stripslashes(trim($itemName)));
$myItem['itemURL'] = trim($itemURL);
$myItem['itemLevel'] = $level;
$myItem['itemTitle'] = htmlentities(stripslashes(trim($itemTitle)));
$myItem['itemTarget'] = $itemTarget;
array_push($this->menuItems, $myItem);
$this->previousItemLevel = $level;
}
}

/*
* Dynamic Mx Menu
*/

function setQuery (&$query) {
$this->query = $query;
$this->isStatic = false;
$this->isStaticURL = false;
}

function setPK ($menuPK) {
$this->menuPK = trim($menuPK);
}

function setFK ($menuFK) {
$this->menuFK = trim($menuFK);
}

function setNameField ($menuNameField) {
$this->menuNameField = trim($menuNameField);
}

function setTitleField ($menuTitleField) {
$this->menuTitleField = trim($menuTitleField);
}

function setLink ($menuLink) {
$this->menuLink = trim($menuLink);
}

function setURLParameter ($menuURLParameter) {
$this->menuURLParameter = trim($menuURLParameter);
}

function setTarget($menuTarget) {
$this->menuTarget = trim($menuTarget);
}

function setLinkField ($menuLinkField) {
$this->isStaticURL = false;
$this->menuLinkField = trim($menuLinkField);
}

function setTargetField ($menuTargetField) {
$this->menuTargetField = trim($menuTargetField);
}

function setLevel ($menuLevel = 3) {
// if $menuLevel < 1 => reset menuLevel
$this->menuLevel = $menuLevel;
}

function highlightCurrent ($highlight = false) {
if ($highlight === true) {
$this->menuHighlight = true;
} else {
$this->menuHighlight = false;
}
}


function render () {
if (strlen($this->menuOutput) == 0) {
if ($this->isStatic) {
$this->menuOutput = $this->_renderStatic();
} else {
$this->menuOutput = $this->_renderDynamic();
}
}
return $this->menuOutput;
}


function _renderStatic () {
$request_uri = $_SERVER['SCRIPT_NAME'];
$query_string = $_SERVER['QUERY_STRING'];

if (strlen($query_string) > 0) {
$request_uri .= '?' . $query_string;
}

$return = '<div class="ktcsstree">';

$return .= "<ul>\r\n";
$nextItemLevel = 0;
for ($i=0; $i < count($this->menuItems); $i++) {
$myItem = $this->menuItems[$i];
if ($i < (count($this->menuItems) - 1) ) {
$nextItemLevel = $this->menuItems[$i + 1]['itemLevel'];
} else {
$nextItemLevel = 0;
}
$url = $myItem['itemURL'];
$itemLi = '<li>';
if ($this->menuHighlight &&
strpos(strtolower($url), strtolower($request_uri)) !== false &&
strlen(substr(strtolower($url), strpos(strtolower($url), strtolower($request_uri)) + strlen($request_uri))) ==0 ) {
$itemLi = '<li class="selected">';
$this->menuHighlight = false;
}
$return .= $itemLi;
$return .= '<a href="' . $url . '"';
if (strlen($myItem['itemTarget']) > 0) {
$return .= ' target="' . $myItem['itemTarget'] . '"';
}
if (strlen($myItem['itemTitle']) > 0) {
$return .= ' title="' . $myItem['itemTitle'] . '"';
}
$return .= '>';
$return .= $myItem['itemName'];
$return .= '</a>';
if ($nextItemLevel <= $myItem['itemLevel']) {
$return .= "</li>\r\n";
}
if ($nextItemLevel < $myItem['itemLevel']) {
$repeat = $myItem['itemLevel'] - $nextItemLevel;
$return .= str_repeat("</ul></li>\r\n", $repeat);
}
if ($nextItemLevel > $myItem['itemLevel']) {
$repeat = $nextItemLevel - $myItem['itemLevel'];
$return .= str_repeat("<ul>\r\n", $repeat);
}
}
$return .= "</ul>\r\n";
$return .= "</div>\r\n";
if (count($this->menuItems) == 0) {
$return = 'No data to render.';
}
return $return;
}

function _renderDynamic () {
$arr = $this->_getUnformatedData();
$formated_arr = array();
if (count($arr) > 0) {
$this->_formatData($formated_arr, $arr, 0, 0, $this->menuLevel);
}
$this->menuItems = $formated_arr;
return $this->_renderStatic();
}

function _getUnformatedData () {
$arr = array();

if (is_resource($this->query)) {
include_once('MX_TreeMenu_recordset.class.php');
$rs = new MX_TreeMenu_recordset($this->query);
} else {
$rs = &$this->query;
$rs->MoveFirst();
}

while (!$rs->EOF) {
$myItem = array();
$myItem['itemName'] = htmlentities(stripslashes(trim($rs->Fields($this->menuNameField))));
$target = '';
if ($this->isStaticURL) {
$url = $this->menuLink . $rs->Fields($this->menuURLParameter);
$target = $this->menuTarget;
} else {
$url = $rs->Fields($this->menuLinkField);
if (isset($this->menuTargetField) && strlen($this->menuTargetField) > 0) {
$target = $rs->Fields($this->menuTargetField);
}
}
$myItem['itemURL'] = $url;
$myItem['itemTarget'] = $target;
$myItem['itemLevel'] = 0;
$title = '';
if (isset($this->menuTitleField) && strlen($this->menuTitleField) > 0) {
$title = htmlentities(stripslashes(trim($rs->Fields($this->menuTitleField))));
}
$myItem['itemTitle'] = $title;
$pk = $rs->Fields($this->menuPK);
$fk = (int)$rs->Fields($this->menuFK);
$myArr = array();
$myArr['fk'] = $fk;
$myArr['pk'] = $pk;
$myArr['data'] = $myItem;
array_push($arr, $myArr);
$rs->MoveNext();
}
if (!is_resource($this->query)) {
$rs->MoveFirst();
}
return $arr;
}

function _formatData (&$formated_arr, $arr, $key, $level, $maxLevel) {

foreach ($arr as $value) {
$pk = $value['pk'];
$fk = $value['fk'];
if ($key == $fk) {
$value['data']['itemLevel'] = $level;
array_push($formated_arr, $value['data']);
if ($maxLevel < 0 || $level + 1 < $maxLevel) { // use $maxLevel only if positive
$this->_formatData($formated_arr, $arr, $pk, $level + 1, $maxLevel);
}
}
}
}

}


?>


MX_TreeMenu_recordset.class.php

<?php

class MX_TreeMenu_recordset {


var $resource = null;


var $fields = array();


var $EOF = true;


function MX_TreeMenu_recordset(&$resource) {
$this->resource = &$resource;
if (mysql_num_rows($this->resource) > 0) {
mysql_data_seek($this->resource, 0);
}
$this->fields = mysql_fetch_assoc($this->resource);
$this->EOF = ($this->fields)?false:true;
}


function RecordCount() {
return mysql_num_rows($this->resource);
}


function Fields($colName) {
if (isset($this->fields[$colName])) {
return $this->fields[$colName];
} else {
return '';
}
}


function MoveNext() {
$this->fields = mysql_fetch_assoc($this->resource);
$this->EOF = ($this->fields)?false:true;
return !$this->EOF;
}
}
?>

hossaindoula
12-12-2007, 10:53 AM
One thing I forgot to mention that the siblings (same level) nodes should be eliminated as well.

TJ111
12-12-2007, 11:21 AM
One thing you can do is check the user's level, (either from DB or session data) and just use some switches in the creation.

$query_Recordset1 = "SELECT * FROM tree_view WHERE depth<{$_SESSION['user_level']";
//or something like:
$TreeMenu1->userLevel = $_SESSION['user_level'];
//and just use the userLevel in some checks on your loops to see whether or not they can see the parent items


Sorry thats the best ideas I can get without going through all your logic and stuff.