<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Komentarze do: Menu w postaci drzewa</title>
	<atom:link href="http://www.cojack.pl/menu-w-postaci-drzewa/feed" rel="self" type="application/rss+xml" />
	<link>http://www.cojack.pl/menu-w-postaci-drzewa</link>
	<description>Programowanie oraz Open Source powodem do życia</description>
	<lastBuildDate>Sun, 27 Nov 2011 08:56:20 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>Autor: porady</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-342</link>
		<dc:creator>porady</dc:creator>
		<pubDate>Sun, 27 Mar 2011 15:46:56 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-342</guid>
		<description>no to czekamy na jakiś wydajniejszy ;)</description>
		<content:encoded><![CDATA[<p>no to czekamy na jakiś wydajniejszy <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: cojack</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-271</link>
		<dc:creator>cojack</dc:creator>
		<pubDate>Sun, 29 Aug 2010 08:01:13 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-271</guid>
		<description>Ja chciałbym dodać tylko że to rozwiązanie moje, której jest w tym wpisie, jest bardzo pamięciożerne i nie optymalne, także zgadzam się z Jx że to jest do dupy. W wpisach o Ltree możecie znaleźć najlepsze rozwiązanie z strukturą drzewiastą w sql.</description>
		<content:encoded><![CDATA[<p>Ja chciałbym dodać tylko że to rozwiązanie moje, której jest w tym wpisie, jest bardzo pamięciożerne i nie optymalne, także zgadzam się z Jx że to jest do dupy. W wpisach o Ltree możecie znaleźć najlepsze rozwiązanie z strukturą drzewiastą w sql.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: Jx</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-270</link>
		<dc:creator>Jx</dc:creator>
		<pubDate>Sat, 28 Aug 2010 17:26:52 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-270</guid>
		<description>O jaaa. Ale technologia - ja właśnie kilka dni temu napisałem sobie takie drzewko z twoimi założeniami. Prbowałem to podłączyć do jakichś templatów i natknąłem się w necie na hasło MPTT i tą stronę - nawet nie wiedziałem że można znaleźć gotowe przykłady - ale ten to chyba przesada. Zastrzegam że nie znam Doctrine i innych frameworkow bo dopiero zaczynam. Do drzewa wystarczy jedna tabela w mySql i 2 klasy. tabela trzyma elementy menu: id, parentId, priorytet, level, sort (i inne nazwy, opisy, id obrazków dla upiększenia). Klasa MenuElement trzyma dane z bazy i metody usuwania, zmiany zmiennych. Klasa Menu ładuje strukturę do tablicy z MenuElementami. Aby stworzyć drzewo z tablicy trzeba sobie zdefiniowac nowego usort-a (u mnie wg priorytet, parentId, nazwa) a potem poprzenosic kilkoma ifami do nowej tablicy wyszukując elementy podrzędne. W trakcie tego procesu nadajemy elementom level (poziom zagnieżdżenia) i sort (nowa kolejność elementow) i wrzucamy te 2 wartosci do tablicy w SQLu. Jeśli potem metodami zmieniasz drzewo to nie machasz rekordami w SQLu tylko zmieniasz liczby w level i sort. Od kiedy to tabela w SQL musi odzwierciedlać strukture. Od tego macie SELECTa (u mnie ORDER BY sort ASC)</description>
		<content:encoded><![CDATA[<p>O jaaa. Ale technologia &#8211; ja właśnie kilka dni temu napisałem sobie takie drzewko z twoimi założeniami. Prbowałem to podłączyć do jakichś templatów i natknąłem się w necie na hasło MPTT i tą stronę &#8211; nawet nie wiedziałem że można znaleźć gotowe przykłady &#8211; ale ten to chyba przesada. Zastrzegam że nie znam Doctrine i innych frameworkow bo dopiero zaczynam. Do drzewa wystarczy jedna tabela w mySql i 2 klasy. tabela trzyma elementy menu: id, parentId, priorytet, level, sort (i inne nazwy, opisy, id obrazków dla upiększenia). Klasa MenuElement trzyma dane z bazy i metody usuwania, zmiany zmiennych. Klasa Menu ładuje strukturę do tablicy z MenuElementami. Aby stworzyć drzewo z tablicy trzeba sobie zdefiniowac nowego usort-a (u mnie wg priorytet, parentId, nazwa) a potem poprzenosic kilkoma ifami do nowej tablicy wyszukując elementy podrzędne. W trakcie tego procesu nadajemy elementom level (poziom zagnieżdżenia) i sort (nowa kolejność elementow) i wrzucamy te 2 wartosci do tablicy w SQLu. Jeśli potem metodami zmieniasz drzewo to nie machasz rekordami w SQLu tylko zmieniasz liczby w level i sort. Od kiedy to tabela w SQL musi odzwierciedlać strukture. Od tego macie SELECTa (u mnie ORDER BY sort ASC)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: cojack</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-108</link>
		<dc:creator>cojack</dc:creator>
		<pubDate>Wed, 09 Dec 2009 12:32:17 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-108</guid>
		<description>No mercy ;)</description>
		<content:encoded><![CDATA[<p>No mercy <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: maur</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-107</link>
		<dc:creator>maur</dc:creator>
		<pubDate>Wed, 09 Dec 2009 05:54:36 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-107</guid>
		<description>&quot;bo na piśmie to ja też potrafię sporo&quot; ehh, cojack, cojack. Odrobinkę pokory. ;-)</description>
		<content:encoded><![CDATA[<p>&#8222;bo na piśmie to ja też potrafię sporo&#8221; ehh, cojack, cojack. Odrobinkę pokory. <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: Paweł Kruczyński</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-46</link>
		<dc:creator>Paweł Kruczyński</dc:creator>
		<pubDate>Mon, 21 Sep 2009 21:00:12 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-46</guid>
		<description>OK! :) Chcesz powiedzieć że istnieje wydajniejszy sposób podejścia do tego problemu? Hmm, zajrzę tu za jakiś czas ;)</description>
		<content:encoded><![CDATA[<p>OK! <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Chcesz powiedzieć że istnieje wydajniejszy sposób podejścia do tego problemu? Hmm, zajrzę tu za jakiś czas <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: cojack</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-45</link>
		<dc:creator>cojack</dc:creator>
		<pubDate>Mon, 21 Sep 2009 14:21:34 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-45</guid>
		<description>Boziu, to byly moje pierwsze kroki ;) z drzewkiem, teraz kminie drzewko w doctrine, jak tylko najdzie mnie wena to napisze o tym.</description>
		<content:encoded><![CDATA[<p>Boziu, to byly moje pierwsze kroki <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  z drzewkiem, teraz kminie drzewko w doctrine, jak tylko najdzie mnie wena to napisze o tym.</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: Paweł Kruczyński</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-44</link>
		<dc:creator>Paweł Kruczyński</dc:creator>
		<pubDate>Sun, 20 Sep 2009 21:30:40 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-44</guid>
		<description>W w/w kodzie poucinało znaki większości/mniejszości i znak &quot;różne od&quot; (pewnie zidentyfikowane, jako części tagów) .. ale, jakby coś - to podeślę zainteresowanym mailem: kruk AT op DOT pl</description>
		<content:encoded><![CDATA[<p>W w/w kodzie poucinało znaki większości/mniejszości i znak &#8222;różne od&#8221; (pewnie zidentyfikowane, jako części tagów) .. ale, jakby coś &#8211; to podeślę zainteresowanym mailem: kruk AT op DOT pl</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: Paweł Kruczyński</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-43</link>
		<dc:creator>Paweł Kruczyński</dc:creator>
		<pubDate>Sun, 20 Sep 2009 19:22:26 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-43</guid>
		<description>O boże! :) Polecam poszukać tematu MPTT (Modified Preorder Tree Traversal). Taką strukturę można trzymać w jednej tabeli, np. z kolumnami ID, Name, PID, L, R. Dodając elementy podajemy tylko wartości dla Name, i PID (parent ID) - ID jest zazwyczaj auto_increment. Po każdym dodaniu, przesunięciu lub usunięciu elementu musimy uruchomić zew. procedurkę w PHP lub SQL wyliczjącą wartości kolumn L i R. A co to są kolumny L iR ? - To właśnie cały power tej metodologii! Dodam, że nie ma szybszej metody obsługi / przeszukiwania dużych / nieogranicznonych struruktur drzewiastych. Procedura przebudowująca drzewo w Perlu może wyglądać jak poniżej (W mojej tabeli kategorii, założyłem nadrzędną kategorię o ID = 0 i PID = 0 - może mało logicznie ale mam założony foregin constraint na kolumnie PID):

sub rebuild_tree(;$$$$)
{
  my $table = shift &#124;&#124; &quot;t_categories&quot;;
  my $PID   = shift &#124;&#124; 0;
  my $L     = shift &#124;&#124; 0;

  if (shift &#124;&#124; 1)
  {
    $dbh-&gt;do(&quot;
      update $table
         set PID = 0,
             L = null,
             R = null
       where ID = PID
         and ID  0
    &quot;);
  }

  my $R = $L + 1;

  my $sth = $dbh-&gt;prepare(&quot;
    select ID
      from $table
     where PID = $PID
       and ID  PID
     order by Name asc
  &quot;);

  $sth-&gt;execute();

  while (my $row = $sth-&gt;fetchrow_hashref())
  {
    $R = rebuild_tree($table, $row-&gt;{&#039;ID&#039;}, $R, undef);
  }

  $sth-&gt;finish();

  $dbh-&gt;do(&quot;
    update $table
       set L = $L,
           R = $R
     where ID = $PID
  &quot;);

  return $R + 1;
}

Po usunięciu elementu (DELETE), przeniesieniu (UPDATE) lub dodaniu (INSERT) - wystarczy wywołać w/w procedurę a select&#039;y wywoływać w oparciu nie o pole PID a o wartości L i R (zgodnnie z metodologią MPTT)</description>
		<content:encoded><![CDATA[<p>O boże! <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Polecam poszukać tematu MPTT (Modified Preorder Tree Traversal). Taką strukturę można trzymać w jednej tabeli, np. z kolumnami ID, Name, PID, L, R. Dodając elementy podajemy tylko wartości dla Name, i PID (parent ID) &#8211; ID jest zazwyczaj auto_increment. Po każdym dodaniu, przesunięciu lub usunięciu elementu musimy uruchomić zew. procedurkę w PHP lub SQL wyliczjącą wartości kolumn L i R. A co to są kolumny L iR ? &#8211; To właśnie cały power tej metodologii! Dodam, że nie ma szybszej metody obsługi / przeszukiwania dużych / nieogranicznonych struruktur drzewiastych. Procedura przebudowująca drzewo w Perlu może wyglądać jak poniżej (W mojej tabeli kategorii, założyłem nadrzędną kategorię o ID = 0 i PID = 0 &#8211; może mało logicznie ale mam założony foregin constraint na kolumnie PID):</p>
<p>sub rebuild_tree(;$$$$)<br />
{<br />
  my $table = shift || &#8222;t_categories&#8221;;<br />
  my $PID   = shift || 0;<br />
  my $L     = shift || 0;</p>
<p>  if (shift || 1)<br />
  {<br />
    $dbh-&gt;do(&#8221;<br />
      update $table<br />
         set PID = 0,<br />
             L = null,<br />
             R = null<br />
       where ID = PID<br />
         and ID  0<br />
    &#8222;);<br />
  }</p>
<p>  my $R = $L + 1;</p>
<p>  my $sth = $dbh-&gt;prepare(&#8221;<br />
    select ID<br />
      from $table<br />
     where PID = $PID<br />
       and ID  PID<br />
     order by Name asc<br />
  &#8222;);</p>
<p>  $sth-&gt;execute();</p>
<p>  while (my $row = $sth-&gt;fetchrow_hashref())<br />
  {<br />
    $R = rebuild_tree($table, $row-&gt;{&#8216;ID&#8217;}, $R, undef);<br />
  }</p>
<p>  $sth-&gt;finish();</p>
<p>  $dbh-&gt;do(&#8221;<br />
    update $table<br />
       set L = $L,<br />
           R = $R<br />
     where ID = $PID<br />
  &#8222;);</p>
<p>  return $R + 1;<br />
}</p>
<p>Po usunięciu elementu (DELETE), przeniesieniu (UPDATE) lub dodaniu (INSERT) &#8211; wystarczy wywołać w/w procedurę a select&#8217;y wywoływać w oparciu nie o pole PID a o wartości L i R (zgodnnie z metodologią MPTT)</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: cojack</title>
		<link>http://www.cojack.pl/menu-w-postaci-drzewa/comment-page-1#comment-25</link>
		<dc:creator>cojack</dc:creator>
		<pubDate>Fri, 21 Aug 2009 11:40:06 +0000</pubDate>
		<guid isPermaLink="false">http://cojack.os-cms.pl/?p=137#comment-25</guid>
		<description>Dobra, no tak mi wjechaliście na ambicje, że napisze lepsze! W dodatku Doctrine chyba mam wbudowane coś takiego, to przedstawię jak użyć :P</description>
		<content:encoded><![CDATA[<p>Dobra, no tak mi wjechaliście na ambicje, że napisze lepsze! W dodatku Doctrine chyba mam wbudowane coś takiego, to przedstawię jak użyć <img src='http://www.cojack.pl/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
</channel>
</rss>

