[ Man-Wolf @ 12.10.2007. 23:34 ] @
Pozdrav,

juce sam prvi put uzeo da probam smarty i polako krenuo i kapiram da sam dobro skontao manje vise :-))

E sad, doso sam do sledeceg problema: prikaz menija. Naime, imam bazu podataka koja izgleda ovako:

ID------------VREDNOST-----------------PARENT
``````````````````````````````````````````
1-------------HOME---------------------NULL
2-------------O Nama-------------------NULL
3-------------Neko dugme---------------1
4-------------Opet neko dugme----------2
5-------------I tako dalje----------------1

E sad, problem mi je bio kako da ovakav meni(iscitan iz baze) prebacim u smarty, al da meni moze da ima Child-ove. Problem sam resio na sledeci nacin:

INDEX.php:

Code:

<?php
  session_register();

  // Ucitaj config file
  include('config.php');

  // Prvo se konektujemo na bazu
  mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
  // Izaberemo tabelu
  mysql_select_db(DB_NAME) or die(mysql_error());

  //Sada cemo da ucitamo dugmice iz menija :-)) 
  $query = "SELECT * FROM meni ORDER BY `parent`";
  $query = mysql_query($query) or die(mysql_error());
  while($result = mysql_fetch_array($query, MYSQL_ASSOC)) {
    if ($result['parent'] >= 1) {
      $child[] = $result;
    }
    else {
    $parent[] = $result;
    }
    
  }

  $smarty->assign('parent', $niz);
  $smarty->assign('child', $child);
  $smarty->display('index.tpl');

?>


INDEX.tpl

Code:

<html>
<head>
<title>User Info</title>
</head>
<body>
{section name=parent loop=$parent}

      {$parent[parent].ID} 
      {$parent[parent].parent} 
      {$parent[parent].vrednost}
      
      {section name=child loop=$child}
        {if $child[child].parent == $niz[parent].ID}
        <br />
          - {$child[child].vrednost}
          
        {/if}
       {/section}
       <br />

{/section}


</body>
</html>


Znaci logika rada je sledeca: U index.php fajlu, prvo pokupim sve iz baze i Parent-e smestim u jedan niz, a Child-ove u drugi. Zatim te nizove prosledim u Smarty.

E sad, kao sto vidite, u smarty-ju pravim dve petlje, prva odstampa Parent, pa onda pokrece drugu petlju koja proverava da li taj parent ima child-ove (proveri ceo $child niz ) i ukoliko ih ima, normalno odstampa.

E to sve radi ok ( za sad :P ), al mene zanima dal postoji neki jednostavniji nacin da se ovo odradi ( da ne proveravam svaki put ceo $child niz ) ??

Hvala unapred :-)

Mihailo Joksimovic






[ dakipro @ 13.10.2007. 09:14 ] @
Smarty nazalost ne ume da odradi klasicnu rekurziju.
Postoji neki plugin ovde http://www.phpinsider.com/smar...&postorder=asc&start=0
koji doduse nisam uspeo da "nabedim" da radi nakon pola sata, a nisam imao vise vremena, pa sam odradeo staru losu foru sa include.
Umesto dva niza kreiras jedan niz, gde ce svaki clan da ima child elemente, pa ako ih ima udjes u rekurziju, ako ne, nastavis dalje. Nalik listanju direktorijuma.
Nije tesko, ali je zato sporo, jer ima onoliko includea koliko ima clanova niza (a mozda i vise ).
Moze i da se napravi funckija koja ce da crta ul/li elemente, ali mi se to ne svidja, jer posle dizajner mora da ulazi u php fajlove da bi opravio meni css-om...
[ Man-Wolf @ 13.10.2007. 13:33 ] @
@dakipro - Hvala na odgovoru.

Sto se tice tog plugin-a, ne svidja mi se ideja da pravim toliko include-a - kao sto si i sam rekao :-))

Znaci, sudeci po svemu, po tebi nema nekog jednostavnijeg nacina da se ovo odradi ??

Hvala jos jednom :-))
[ dakipro @ 13.10.2007. 14:01 ] @
Ne ne, mozda sam nejasno napisao.
Plugin nisam uspeo da osposobim, pa sam koristio include.

Taj plugin je napisan bas iz tog razloga da bi se izbeglo includovanje...
[ Man-Wolf @ 14.10.2007. 14:19 ] @
Axa, sorry, nismo se razumeli )

Nego, nakon malo duzeg za*ebavanja, uspeo sam da ga odradim pomocu jednog niza i da iscitam lepo ) Evo koda:

Code:

 function meni() {      
      // Prvo se konektujemo na bazu
       $this->link = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die(mysql_error());
        // Izaberemo tabelu
        mysql_select_db(DB_NAME) or die(mysql_error());
      mysql_query("SET NAMES utf8");
      mysql_query("SET CHARACTER SET utf8");
      mysql_query("SET COLLATION_CONNECTION='utf8_general_ci'");
      // Uzimamo rezultate iz baze i redjamo ih po "parentu"
      $this->query = "SELECT * FROM meni ORDER BY `parent`";
      
      $this->query = mysql_query($this->query) or die(mysql_error());
      $broj_redova = mysql_num_rows($this->query);
      ///DA GA TESTIRAMO !!!!!!!!!!!
      $kveri = mysql_query("SELECT * FROM meni");
      for ($i=1; $i<$broj_redova; $i++) {
           // Za svakog parent-a trazimo njegove Child-ove
       $children = mysql_query("SELECT * FROM meni WHERE parent = '$i'");
       $result = mysql_fetch_array($kveri, MYSQL_ASSOC);
       $this->upit[$i] = $result;
       if(!empty($children)) {
         while ($child = mysql_fetch_array($children, MYSQL_ASSOC)) {
           array_push($this->upit[$i], $child);
         }
       }
      }
  }


Index.tpl

Code:

<table width="100%" border="0" cellspacing="0" cellpadding="0">
              <p>{section name=broj loop=$upit start=1}
                {if $upit[broj].parent < 1}
                <tr><td valign="top" class="meni" align="center">
                <a href="{$upit[broj].link}" class="meni">{$upit[broj].vrednost}</a>
                </td></tr>
                {/if}
            
                {section name=child loop=$upit start=0}
                {if $upit[broj].parent < 1 AND count($upit[broj][child].vrednost) > 0}
                <tr><td valign="top" class="meni" align="left">
                <a href="{$upit[broj][child].link}" class="submeni">{$upit[broj][child].vrednost}</a>
                </td></tr>
               
                {/if}
                {/section}
             
                {/section}          </p>
              
                
                 
                
            </table>


Inace, niza koji se kreira izgleda ovako:

Citat:

Array (
[1] => Array (

[ID] => 1
[vrednost] => HOME
[link] => index.php
[parent] =>


[0] => Array (
[ID] => 4
[vrednost] => Pod link 2
[link] => blayaya
[parent] => 1 )
[1] => Array (
[ID] => 5
[vrednost] => dfdf
[link] => dfdfdfd
[parent] => 1 )
[2] => Array (
[ID] => 6
[vrednost] => sfdsfds
[link] => dfdgdf
[parent] => 1 ) )


[2] => Array (
[ID] => 2
[vrednost] => O Nama
[link] => onama.php
[parent] =>


[0] => Array (
[ID] => 3
[vrednost] => Pod link 1
[link] => bla bla [parent] => 2 ) )



Plavo - Parent
Crveno - Child

Manje vise, sad kad gledam kod, ni meni nije bas jasno sta sam sve radio, al znam da je osnova bila da se u niz u koji se smestaju parent-i, pomocu array_push() f-je, ubaci niz u kome se nalaze child-ovi za taj parent. Cini mi se da je ovo jednostavnije resenje jer ipak imam samo jedan niz )

Btw, @dakipro - Kolko sam skapirao i taj plugin radi na ovu foru ??
[ dakipro @ 14.10.2007. 15:12 ] @
Cisto sumnjam jer plugin sluzi za rekurziju, ali ako neces da imas vise od 1 dubine, tj. imas samo menije i podmenije, onda mozes da ga resis kako god, isto ti dodje i sa jednim nizom, i sa dva. Mada mislim da je univerzalinije resenje, pogotovo za menije (a i za sve kategorije i podkategorije) uraditi niz nekako ovako:
Code:

    $maps[] = array(
        "title" => "cat1",
        "url" => "www.www.com",
        "image" => "image.gif",
        "childs" => array(array(
                "title" => "cat1_1",
                "url" => "www.www.com",
                "image" => "image.gif",
                "childs" => array(
                        "title" => "cat1_1_1",
                        "url" => "www.www.com",
                        "image" => "image.gif",
                        "childs" => array()
                        )
                ),
                array(
                "title" => "cat1_2",
                "url" => "www.www.com",
                "image" => "image.gif",
                "childsozna" => array(
                        "title" => "cat1_2_1",
                        "url" => "www.www.com",
                        "image" => "image.gif",
                        "childs" => array()
                        )
                )
                
            )
        
        );


i onda rekurzivno praviti ul/li listu, pa sutra kad teba dodati jos jednu dubinu (pod meni/kategoriju), tvoj kod to vec podrzava, a ti lupis klijenta po usi za $