Krzysztof
Z.
Programista PHP/
Webdeveloper
Temat: Poziom wyśwetlanej strony
Witam, napisałem sobie taką klasę do generowania nieskończonej ilości zagłębień menu w postaci list ul li:
<?php
defined('SYSPATH') OR die('No direct access allowed.');
/**
* Generowania menu w postaci listy ul li oraz linków do poziomu strony
*
*/
class Kohana_Menu {
/**
* Tablica przechowująca dane z menu górnego.
*/
private $Tab_Top = array();
/**
*
* Zmienna przechowujaca treść menu górnego.
*/
private $Menu_Top_Content = '';
/**
*
* Zmienna przechowująca nazwę tabeli menu
*/
private $Table_Name = 'pages';
/**
*
* Zmienna przechowujaca nazwę kolumny w której
* zapisany jest typ menu np.: type
*/
private $Type_Name = 'type';
/**
*
* Tablica przechowująca typy menu
* np.: array('top' => 1, 'left' => 2)
*/
private $Type = array('top' => NULL);
/**
*
* Tablica ustalająca sortowanie menu
* np.: array('name' => 'position', 'order_by' => 'asc')
*/
private $Order_By = array('name' => 'position', 'order_by' => 'asc');
/**
*
* Tablica przechowujaca style menu górnego
*/
private $Style_Top = array();
/**
* Metoda zapisuje dane z menu górnego do tablicy.
*/
private function getTopMenuToTable ()
{
$pages = ORM::factory($this->Table_Name)->where($this->Type_Name, '=', $this->Type['top']);
$pages = $pages->order_by($this->Order_By['name'], $this->Order_By['order_by']);
$pages = $pages->find_all();
foreach ($pages as $row)
{
// Dodajemy do tablicy wszystkie dane, które będą nam potrzebne
$this->Tab_Top[] = array
(
"id" => $row->id,
"parent_id" => $row->parent_id,
"title" => $row->title,
"module" => $row->module,
"seo_title" => $row->seo_title,
);
}
}
/**
* Funkcja generujaca górne menu
*/
private function Generate_Top_Menu ($id = NULL)
{
$r = array();
$indentation = 0;
$space = 0;
static $count = 0;
foreach($this->Tab_Top as $values)
{
$r[]=$values['parent_id'];
}
if(in_array($id, $r))
{
$indentation++;
$result = array();
foreach($this->Tab_Top as $values)
{
if ($values['parent_id']==$id)
{
$result[] = $values;
}
}
if ($count == 0)
{
$this->Menu_Top_Content .= "\n ".str_repeat(" ", $indentation-1)."<ul";
foreach ($this->Style_Top as $key => $val)
{
$this->Menu_Top_Content .=" ".$key."="."\"".$val."\"";
}
$this->Menu_Top_Content .= ">";
}
else
$this->Menu_Top_Content .= "\n ".str_repeat(" ", $indentation-1)."<ul>";
$count++;
foreach($result as $values)
{
$space = str_repeat(" ", $indentation-1);
$lang = (Cookie::get('lang') == FALSE
? Kohana::config('config')->default_lang : Cookie::get('lang'));
$this->Menu_Top_Content .= "\n".$space." <li><a href=\"".URL::base().$lang.
"/".URL::title($values['seo_title'] != NULL ? $values['seo_title'] : $values['title'],
"-", true).",".$values['id'].".html\">".
$values['title']."</a>";
$this->Generate_Top_Menu($values['id']);
$this->Menu_Top_Content .= ' '.$space.'</li>';
}
$this->Menu_Top_Content .= "\n$space</ul>\n";
$indentation--;
}
}
/**
* Metoda wyświetlajaca menu górne
*/
public function Top_Menu($style = null)
{
$this->Style_Top = $style;
$this->getTopMenuToTable();
$this->Generate_Top_Menu();
return $this->Menu_Top_Content;
}
}
Klasa działa jak najbardziej poprawnie i optymalnie bo na jednym zapytaniu sql ;)
Każda strona ma pole id i parent_id gdzie jest zapisane id "rodzica" danej strony.
Moje pytanie brzmi:
W jaki sposób wyświetlić ścieżkę "dojścia" do danej strony np:
Strona 3:
Strona1->Strona2->Strona3
Do dyspozycji mam tylko id strony i id rodzica.
Proszę o radę.
Z góry dziękuję.