Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc
Comunitatea PHP Romania
 

Smarty Recursion
Vezi mesajul original

 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> PHP Avansat
Subiectul anterior :: Subiectul următor  
Autor Mesaj
copot



Data înscrierii: 06/Apr/2005
Mesaje: 233
Locație: Undeva departe

Trimis: Joi Aug 04, 2005 9:47 am    Titlul subiectului: Smarty Recursion  

Problema cu recursivitate - SMARTY

Am urmatoarea structura"
CatID = int
CatName = varchar
CatParent = int

Evidenta CatParent spune cine e parintele inregistrarii curente.

Are cineva vreo idee cum pot sa structurez un array pe care ulterior sa - l trimit template-ului si cum se foloseste chestia asta in SMARTY ?
Sus  
ExcalIbvr



Data înscrierii: 02/Mai/2004
Mesaje: 1107
Locație: Oradea

Trimis: Joi Aug 04, 2005 1:03 pm    Titlul subiectului:  

E foarte neclara cererea ta, dar cred ca te referi la modul de transmitere a unui vector prin smarty in template.
PHPan style="color: #000000"><?php $vector=array(); $vector[]='pozitia 1'; $vector[]='pozitia 2'; $smarty->assign(vector,$vector); 
TPL Cod: {section name=lista loop=vector}
   <div>{$vector[lista]}</div>
{/section}
Sus  
johnny



Data înscrierii: 31/Iul/2004
Mesaje: 904
Locație: Bucuresti

Trimis: Joi Aug 04, 2005 1:55 pm    Titlul subiectului:  

Cred ca se refera la generarea unui tree de categorii, folosind o functie recursiva:
adica se va obtine un vector de forma

an style="color: #000000"><?php $categorii = array( 0 => array(         0 => 'child1'         1 => array(...)              ) .... 1 => ... ) 

O solutie, dar am indoieli in privinta performantei:

an style="color: #000000"><?php $categorii = array( 0 => array(         0 => 'child1'         1 => array(...)              ) .... 1 => ... ) $smart->assign("tree",$categorii); //template //categorii.tpl <ul> {foreach from=$tree.element item=element}    <li>{$element.name}</li>    {if $element.element}    <ul>{include file="rec.tpl" element=$element.element}</ul>    {/if} {/foreach} </ul> //rec.tpl {foreach from=$element item=element}    <li>{$element.name}</li>    {if $element.element}    <ul>{include file="rec.tpl" element=$element.element}</ul>    {/if} {/foreach} 

S-ar putea sa existe si alte solutii mai eficiente.
Opinie persoanala: nu imi place smarty, deorece isi depaseste atributiile de engine de templating... Dar, am fost nevoit sa-l utilizez in unele situatii, asa ca...
Sus  
copot



Data înscrierii: 06/Apr/2005
Mesaje: 233
Locație: Undeva departe

Trimis: Lun Ian 09, 2006 12:04 pm    Titlul subiectului: o alta solutie  

Raspuns: :lol:

an style="color: #000000"><?php function return_tree($table,$id,$parent,$level,$sortorder)  {     $sql="SELECT $table.*,users.* FROM $table INNER JOIN users ON $table.Created_By = users.ID where Parent=$parent order by $sortorder";         $q = mysql_query($sql) or die('unable to contact database.');     $a = array();      while ($row = mysql_fetch_assoc($q))     {         $row['level'] = $level;         $a[] = $row;         $b = return_tree($table,$id,$row[$id],$level+1,$sortorder);         for ($j=0;$j<count($b);$j++)         {$a[]=$b[$j];}     }     return $a; } 


smarty template:
Presupunem ca cms_categories e vectorul

<table>
{section name=i loop=$cms_categories}
<tr>
<td>
{section name=j loop=$cms_categories[i].level}
&nbsp;&nbsp;&nbsp;
{/section}
<a href="{$host}/info/index.php?article_id={$cms_categories[i].ArticleID}"></a>
</td>
</tr>
{/section}
</table>[/b][/php]
Sus  
coditza



Data înscrierii: 23/Ian/2004
Mesaje: 298
Locație: cluj-napoca

Trimis: Joi Ian 12, 2006 2:33 am    Titlul subiectului:  

O alta solutie, pe care am aplicat-o ieri, este sa-ti faci singurel un plugin pentru smarty. Uita-te la unul din fisierele din directorul smarty_path/plugins pentru un exemplu (hint: html_table e chiar simplu)
Sus  
copot



Data înscrierii: 06/Apr/2005
Mesaje: 233
Locație: Undeva departe

Trimis: Joi Ian 12, 2006 7:52 am    Titlul subiectului: Multam  

I will trouble myself no longer with this.
Gave up on Smarty.

Am construit ceva mai simplu.
Sus  
Mascka



Data înscrierii: 01/Oct/2005
Mesaje: 1282
Locație: Braila

Trimis: Vin Ian 13, 2006 11:37 am    Titlul subiectului:  

PHP:an style="color: #000000"><?php $TMPL['content'] = $this->do_skin('meniu_categorii_open');             $result = $DB->query("SELECT * FROM cats ", __FILE__, __LINE__);             while ($row  = $DB->fetch_array($result)) {             $TMPL  = array_merge($TMPL, $row);               $TMPL['content'] .= $this->do_skin('meniu_categorii_row');         }          $TMPL['content'] .= $this->do_skin('meniu_categorii_close'); 

TPL HTML PHP HTM si care mai sunt :
Cod:
{$content}

daca nu se foloseste cu content se sterge randurile de creare skin si in pagina template se trece:
Cod:
{$categorie} {$id}

categorie si id fiind rows in bd :)
poate ajuta la altceva daca nu la topicul propus
Sus  
eyecon



Data înscrierii: 05/Noi/2002
Mesaje: 180

Trimis: Mie Feb 15, 2006 9:42 am    Titlul subiectului:  

Ok, m-am lovit si eu de o problema asemanatoare. Am o solutie pentru cei ce folosesc 'predefined tree traversal' pentru a stoca categoriile in baza de date. Eu folosesc PEAR::DB_Nestedset . Daca nu folositi Nestedset, dar folositi aceasta tehnica inseamna ca puteti extrage datele in format:

Cod: Array
(
    [10] => Array
        (
            [id] => 10
            [rootid] => 1
            [l] => 2
            [r] => 17
            [norder] => 1
            [level] => 2
            [name] => Financieel
            [image] =>
            [as_product] => 0
            [textname] => Financieel
            [url] => /eshop/category/Financieel
        )

    [19] => Array
        (
            [id] => 19
            [rootid] => 1
            [l] => 3
            [r] => 6
            [norder] => 1
            [level] => 3
            [name] => fsubcatb
            [image] =>
            [as_product] => 0
            [textname] => Financieel subcat 2
            [url] => /eshop/category/fsubcatb
        )

    [18] => Array
        (
            [id] => 18
            [rootid] => 1
            [l] => 4
            [r] => 5
            [norder] => 1
            [level] => 4
            [name] => fsubcata
            [image] =>
            [as_product] => 0
            [textname] => Financieel subcat 1
            [url] => /eshop/category/fsubcata
        )

... etc.



Pentru o structura de genul asta am folosit ca sablon in Smarty

Cod: {assign var="level" value="2"}
<ul>
{foreach from=$data item=category}
{if $level > $category.level}
{""|indent:$level-$category.level:"</ul></li>"}
{assign var="level" value=$category.level}
{/if}
{if $level < $category.level}

<ul>
{assign var="level" value=$category.level}
{/if}
<li><a href="{$category.url}">{$category.textname|escape:"html"}</a>{if $category.l == $category.r - 1}</li>{/if}
{/foreach}
{""|indent:$level-2:"</ul></li>"}
</ul>

Ce a generat codul html:

Cod: <ul>
   <li><a href="/eshop/category/Financieel">Financieel|2</a>
      <ul>
         <li><a href="/eshop/category/fsubcatb">Financieel subcat 2|3</a>
            <ul>
               <li><a href="/eshop/category/fsubcata">Financieel subcat 1|4</a></li>
            </ul>
         </li>
         <li><a href="/eshop/category/fsubcatc">Financieel subcat 3|3</a></li>
         <li><a href="/eshop/category/fsubcatd">Financieel subcat 4|3</a></li>
         <li><a href="/eshop/category/fsubcatf">Financieel subcat 6|3</a></li>
         <li><a href="/eshop/category/fsubcatg">Documentatie categorie|3</a></li>
         <li><a href="/eshop/category/fsubcate">Financieel subcat 5|3</a></li>
      </ul>
   </li>
   <li><a href="/eshop/category/Campingvrijetijd">Camping&amp;Vrijetijd|2</a>
      <ul>
         <li><a href="/eshop/category/Traveling">Reizen|3</a>
            <ul>
               <li><a href="/eshop/category/BagsSuitcases">Koffers en tassen|4</a></li>
            </ul>
         </li>
      </ul>
   </li>
   <li><a href="/eshop/category/Meubels">Meubels|2</a>
      <ul>
         <li><a href="/eshop/category/living">Woonkamer|3</a>
            <ul>
               <li><a href="/eshop/category/sofas">Sofas|4</a></li>
            </ul>
         </li>
      </ul>
   </li>
   <li><a href="/eshop/category/Huishoudelijk">Huishoudelijk|2</a></li>
   <li><a href="/eshop/category/juwelenhorloges">Sieraden &amp; Horloges|2</a>
      <ul>
         <li><a href="/eshop/category/EmporioArmani">Emporio Armani|3</a></li>
         <li><a href="/eshop/category/PatrickArnaud">Patrick Arnaud|3</a></li>
         <li><a href="/eshop/category/Vendoux">Vendoux|3</a>
            <ul>
               <li><a href="/eshop/category/Heren">Heren|4</a></li>
            </ul>
         </li>
         <li><a href="/eshop/category/rosenbergparis">Rosenberg Paris|3</a></li>
      </ul>
   </li>
   <li><a href="/eshop/category/sport">Sport &amp; Fitness|2</a></li>
   <li><a href="/eshop/category/Tuinartikelen">Tuinartikelen|2</a></li>
   <li><a href="/eshop/category/Uiterlijkeverzorging">Uiterlijke verzorging|2</a></li>
   <li><a href="/eshop/category/Speelgoed">Speelgoed|2</a>
      <ul>
         <li><a href="/eshop/category/Decoration">Decoratie|3</a>
            <ul>
               <li><a href="/eshop/category/Pillows">Kussens|4</a></li>
            </ul>
         </li>
      </ul>
   </li>
</ul>

Beneficiul acestei solutie este ca nu foloseste recursivitate. Alt beneficiu se obtine prin folosirea PTT pentru a structura datele in baza de date ceea ce implica o usurinta in administrare (mutare ramuri intregi dintr-un parinte in altul, adaugarea de noduri noi la inceput, sfarsit sau inainte de un anumit nod).

Sper sa va ajute.
Sus  
PHPRomania Bot
Bot Member


Data înscrierii: 27/Dec/2007
Mesaje: 1
Locaţie: Server Google
Trimis: Mie Dec 26, 2007 7:01 pm   Titlul subiectului: Ad  

Sus  
 
       Pagina de start a forumului Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc -> PHP Avansat
Pagina 1 din 1


Powered by phpBB 2.0.22 © 2001, 2002 phpBB Group
Varianta în limba română: Romanian phpBB online community