Krzysztof Z.

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ę.
Damian Ślimak

Damian Ślimak Programista symfony,
prestashop

Temat: Poziom wyśwetlanej strony

Najprościej to będzie stworzyć tablice z tabeli id => (name, parent_id) i zrobić do tego pętle while która się kończy gdy parent_id=NULL;

Polecam poczytać o module sprig_mptt który jest wykorzystany w CMSie http://kohanut.com/ ładnie się sprawuje
Krzysztof Z.

Krzysztof Z. Programista PHP/
Webdeveloper

Temat: Poziom wyśwetlanej strony

Damian Ślimak:
Najprościej to będzie stworzyć tablice z tabeli id => (name, parent_id) i zrobić do tego pętle while która się kończy gdy parent_id=NULL;

Polecam poczytać o module sprig_mptt który jest wykorzystany w CMSie http://kohanut.com/ ładnie się sprawuje

Rzeczywiście fajny ten moduł.
Jednak szukam już drugi dzień jakiegoś prostego przykładu, żebym mógł się nauczyć jak na podstawie tego modułu można wygenerować meni itp. ale nie mogę nic konkretnego znaleźć.
Możesz coś konkretnego polecić?
Damian Ślimak

Damian Ślimak Programista symfony,
prestashop

Temat: Poziom wyśwetlanej strony

Cztery przykłady wyświetlania menu są zawarte w sprig-mptt w katalogu z modułem. Wystarczy przejrzeć katalog modułu
Krzysztof Z.

Krzysztof Z. Programista PHP/
Webdeveloper

Temat: Poziom wyśwetlanej strony


<?php defined('SYSPATH') OR die('No direct access allowed.');
/**
* @package MPTT
* @author Mathew Davies
* @author Kiall Mac Innes
*/?>
<ul>
<?php
$level = $nodes->current()->lvl;
$first = TRUE;

foreach ($nodes as $node)
{
if ($node->lvl > $level)
{
?>
<ul>
<?php
}
else if ($node->lvl < $level)
{
?>
</ul>
</li>
<?php
}
else if ( ! $first)
{
?>
</li>
<?php
}
?>
<li>ID: <?php print $node->id; ?>
<?php
$level = $node->lvl;
$first = FALSE;
}
?>
</li>
</ul>

Tabela:
INSERT INTO `sprig_mptt_test` (`id`, `lvl`, `lft`, `rgt`, `scope`, `name`) VALUES
(1, 0, 1, 22, 1, 'Root Node'),
(2, 1, 2, 3, 1, 'Leaf Node'),
(3, 1, 4, 7, 1, 'Normal Node'),
(4, 2, 5, 6, 1, 'Leaf Node'),
(5, 1, 8, 9, 1, 'Leaf Node'),
(6, 1, 10, 21, 1, 'Normal Node'),
(7, 2, 11, 12, 1, 'Leaf Node'),
(8, 2, 13, 18, 1, 'Normal Node'),
(9, 3, 14, 15, 1, 'Leaf Node'),
(10, 3, 16, 17, 1, 'Leaf Node'),
(11, 2, 19, 20, 1, 'Leaf Node'),
(12, 0, 1, 22, 2, 'Root Node'),
(13, 1, 2, 3, 2, 'Leaf Node'),
(14, 1, 4, 7, 2, 'Normal Node'),
(15, 2, 5, 6, 2, 'Leaf Node'),
(16, 1, 8, 9, 2, 'Leaf Node'),
(17, 1, 10, 21, 2, 'Normal Node'),
(18, 2, 11, 12, 2, 'Leaf Node'),
(19, 2, 13, 18, 2, 'Normal Node'),
(20, 3, 14, 15, 2, 'Leaf Node'),
(21, 3, 16, 17, 2, 'Leaf Node'),
(22, 2, 19, 20, 2, 'Leaf Node'),
(23, 0, 1, 22, 3, 'Root Node'),
(24, 1, 2, 3, 3, 'Leaf Node'),
(25, 1, 4, 7, 3, 'Normal Node'),
(26, 2, 5, 6, 3, 'Leaf Node'),
(27, 1, 8, 9, 3, 'Leaf Node'),
(28, 1, 10, 21, 3, 'Normal Node'),
(29, 2, 11, 12, 3, 'Leaf Node'),
(30, 2, 13, 18, 3, 'Normal Node'),
(31, 3, 14, 15, 3, 'Leaf Node'),
(32, 3, 16, 17, 3, 'Leaf Node'),
(33, 2, 19, 20, 3, 'Leaf Node');

i błędna lista ul li:

<ul>

<li>ID: 1 <li>ID: 2 </li>
<li>ID: 3 <ul>
<li>ID: 4 </ul>
</li>
<li>ID: 5 </li>

<li>ID: 6 <ul>
<li>ID: 7 </li>
<li>ID: 8 <ul>
<li>ID: 9 </li>
<li>ID: 10 </ul>
</li>

<li>ID: 11 </ul>
</li>
<li>ID: 12 <li>ID: 13 </li>
<li>ID: 14 <ul>
<li>ID: 15 </ul>

</li>
<li>ID: 16 </li>
<li>ID: 17 <ul>
<li>ID: 18 </li>
<li>ID: 19 <ul>
<li>ID: 20 </li>

<li>ID: 21 </ul>
</li>
<li>ID: 22 </ul>
</li>
<li>ID: 23 <li>ID: 24 </li>
<li>ID: 25 <ul>

<li>ID: 26 </ul>
</li>
<li>ID: 27 </li>
<li>ID: 28 <ul>
<li>ID: 29 </li>
<li>ID: 30 <ul>

<li>ID: 31 </li>
<li>ID: 32 </ul>
</li>
<li>ID: 33 </li>
</ul> </div>



Znalazłem jakieś przykłady, to jest najprostszy. Niby wszystko działa jednak nie do końca. Wgrałem przykładową tabelę. Lista ul li jest nieprawidłowa. W kodzie niby wszystko jest poprawne... Już nie mam pomysłów co jest tu źle...



Wyślij zaproszenie do