1
0
mirror of https://github.com/e107inc/e107.git synced 2025-08-18 12:21:45 +02:00

Navigation renderer ready for testing. Awaiting active detection, cache, benchmark.

This commit is contained in:
SecretR
2012-12-14 16:32:39 +02:00
parent 56c4d48503
commit e47f9cf5eb
3 changed files with 128 additions and 43 deletions

View File

@@ -9,11 +9,17 @@ function navigation_shortcode($parm='')
'alt' => 4 'alt' => 4
); );
$cat = varset($types[$parm], 1); $category = varset($types[$parm], 1);
$tmpl = vartrue($parm, 'main'); $tmpl = vartrue($parm, 'main');
$data = e107::getNav()->getData($cat); //$data = e107::getNav()->getData($cat);
return e107::getNav()->render($data, $tmpl); //return e107::getNav()->render($data, $tmpl);
$nav = e107::getNav();
$template = e107::getCoreTemplate('navigation', $tmpl);
$data = $nav->collection($category);
return $nav->render($data, $template);
} }

View File

@@ -59,6 +59,7 @@ $NAVIGATION_TEMPLATE['main']['submenu_start'] = '
$NAVIGATION_TEMPLATE['main']['submenu_item'] = ' $NAVIGATION_TEMPLATE['main']['submenu_item'] = '
<li role="menuitem" > <li role="menuitem" >
<a href="{LINK_URL}">{LINK_IMAGE}{LINK_NAME}</a> <a href="{LINK_URL}">{LINK_IMAGE}{LINK_NAME}</a>
{LINK_SUB}
</li> </li>
'; ';
@@ -67,6 +68,7 @@ $NAVIGATION_TEMPLATE['main']['submenu_item'] = '
$NAVIGATION_TEMPLATE['main']['submenu_item_active'] = ' $NAVIGATION_TEMPLATE['main']['submenu_item_active'] = '
<li role="menuitem" class="active"> <li role="menuitem" class="active">
<a href="{LINK_URL}">{LINK_IMAGE}{LINK_NAME}</a> <a href="{LINK_URL}">{LINK_IMAGE}{LINK_NAME}</a>
{LINK_SUB}
</li> </li>
'; ';

View File

@@ -1219,7 +1219,41 @@ class e_navigation
{ {
return 'nomd5_sitelinks_'; return 'nomd5_sitelinks_';
} }
protected function retrieveAddon($id, $function, $orderStart = 0)
{
list($path, $method) = explode('::', $function);
$path = preg_replace('[^\w]', '', $path);
if(include_once(e_PLUGIN.$path."/e_sitelink.php"))
{
$class = $path."_sitelinks";
$sublinkArray = e107::callMethod($class, $method);
if(!is_array($sublinkArray) || empty($sublinkArray))
{
return;
}
$i = $orderStart;
foreach ($sublinkArray as $addonLink)
{
$i++;
/*if(!isset($addonLinks['link_parent']))*/ $addonLink['link_parent'] = $id;
/*if(!isset($addonLinks['link_id']))*/ $addonLink['link_id'] = $id.'-'.$i;
/*if(!isset($addonLinks['link_id']))*/ $addonLink['link_order'] = $i;
$this->data[$category][$addonLink['link_parent']][$addonLink['link_id']] = $link;
$this->indeces['flat'][$addonLink['link_id']] = $addonLink['link_parent'];
$this->indeces['ordered'][$addonLink['link_id']] = $addonLink['link_order'];
if(isset($addonLink['link_function']) && !empty($addonLink['link_function']))
{
$this->indeces['dynamic'][$addonLink['link_id']] = $addonLink['link_function'];
$this->retrieveAddon($addonLink['link_id'], $addonLink['link_function'], $addonLink['link_order']);
}
}
}
}
// FIXME syscache
protected function initData($category) protected function initData($category)
{ {
$sql = e107::getDb('sqlSiteLinks'); $sql = e107::getDb('sqlSiteLinks');
@@ -1255,44 +1289,10 @@ class e_navigation
// cache it // cache it
} }
protected function retrieveAddon($id, $function, $orderStart = 0)
{
list($path, $method) = explode('::', $function);
$path = preg_replace('[^\w]', '', $path);
if(include_once(e_PLUGIN.$path."/e_sitelink.php"))
{
$class = $path."_sitelinks";
$sublinkArray = e107::callMethod($class, $method);
if(!is_array($sublinkArray) || empty($sublinkArray))
{
return;
}
$i = $orderStart;
foreach ($sublinkArray as $addonLink)
{
$i++;
/*if(!isset($addonLinks['link_parent']))*/ $addonLink['link_parent'] = $id;
/*if(!isset($addonLinks['link_id']))*/ $addonLink['link_id'] = $id.'-'.$i;
/*if(!isset($addonLinks['link_id']))*/ $addonLink['link_order'] = $i;
$this->data[$category][$addonLink['link_parent']][$addonLink['link_id']] = $link;
$this->indeces['flat'][$addonLink['link_id']] = $addonLink['link_parent'];
$this->indeces['ordered'][$addonLink['link_id']] = $addonLink['link_order'];
if(isset($addonLink['link_function']) && !empty($addonLink['link_function']))
{
$this->indeces['dynamic'][$addonLink['link_id']] = $addonLink['link_function'];
$this->retrieveAddon($addonLink['link_id'], $addonLink['link_function'], $addonLink['link_order']);
}
}
}
return array();
}
/** /**
* Retrive link data * Retrive link data
* We retrieve ALWAYS the whole data if there is missing cached data * We retrieve ALWAYS the whole data if there is missing cached data
* FIXME syscache
*/ */
public function retrieve($category = 1, $parent = 0) public function retrieve($category = 1, $parent = 0)
{ {
@@ -1322,14 +1322,86 @@ class e_navigation
return $this->data[$category][$parent]; return $this->data[$category][$parent];
} }
/**
* Prepare site links data for the renderer
* @todo maybe some kind of dead loop protection
*
* Returned array structure: index key is item ID, containing array same as #links table,
* additonal 'link_sub' array, containing current row children (same structure, recursive,
* no sub-level restrictions)
*
* @param int $category render type
* @param int $parent starting from parent node
* @param bool $flat if true, sub-levels wont be processed
* @return array milti-level or flat navigation data
*/
public function collection($category = 1, $parent = 0, $flat = false) public function collection($category = 1, $parent = 0, $flat = false)
{ {
$this->initData($category);
if(!vartrue($this->data[$category]) || !vartrue($this->data[$category][$parent])) return array();
$ret = array();
// re-order, required only when there is dynamic (3rd party) data available
if(!empty($this->indeces['dynamic']))
{
$ids = array_keys($this->data[$category][$parent]);
$index = array();
foreach ($ids as $id)
{
$index[$id] = $this->indeces['ordered'][$id];
}
asort($index, SORT_NUMERIC);
$ids = array_keys($index);
foreach ($ids as $id)
{
$ret[$id] = $this->data[$category][$parent][$id];
}
}
else
{
$ret = $this->data[$category][$parent];
}
//only current node needed
if($flat) return $ret;
// process subs - recursion
foreach ($ret as $id => $_data)
{
$ret[$id]['link_sub'] = $this->collection($category, $_data['link_id'], false);
}
return $ret;
} }
function render($data, $template, $useCache = true)
{
if(empty($data) || empty($template) || !is_array($template)) return '';
$sc = e107::getScBatch('navigation');
$sc->template = $template;
$ret = $template['start'];
foreach ($data as $_data)
{
$sc->setVars($_data);
$itemTmpl = count($_data['link_sub']) > 0 ? $template['item_submenu'] : $template['item'];
$ret .= e107::getParser()->parseTemplate($itemTmpl, TRUE);
}
$ret .= $template['end'];
// FIXME $useCache
return $ret;
}
/** /**
* Return a standardized clean array structure for all links. * Return a standardized clean array structure for all links.
*/ */
/*
function getData($cat=1) function getData($cat=1)
{ {
$sql = e107::getDb('sqlSiteLinks'); $sql = e107::getDb('sqlSiteLinks');
@@ -1378,8 +1450,10 @@ class e_navigation
return $ret; return $ret;
} }*/
/*
function compile($ret, $sub) function compile($ret, $sub)
{ {
$new = array(); $new = array();
@@ -1395,7 +1469,8 @@ class e_navigation
} }
return $new; return $new;
} }*/
/** /**
@@ -1404,6 +1479,7 @@ class e_navigation
* @param template to use. * @param template to use.
* TODO Support for side-menu templates and others. * TODO Support for side-menu templates and others.
*/ */
/*
function render($data, $type = 'main') function render($data, $type = 'main')
{ {
$sc = e107::getScBatch('navigation'); $sc = e107::getScBatch('navigation');
@@ -1422,7 +1498,8 @@ class e_navigation
$text .= $template['end']; $text .= $template['end'];
return $text; return $text;
} }*/
@@ -1471,7 +1548,7 @@ class navigation_shortcodes extends e_shortcode
foreach($this->var['link_sub'] as $val) foreach($this->var['link_sub'] as $val)
{ {
$this->setVars($val); $this->setVars($val);
$text .= e107::getParser()->parseTemplate($this->template['submenu_item'],TRUE); $text .= e107::getParser()->parseTemplate($this->template['submenu_item'], TRUE);
} }
$text .= $this->template['submenu_end']; $text .= $this->template['submenu_end'];