 |
Forum PHP Romania - Discutii despre PHP, MySQL, Javascript, AJAX, etc Comunitatea PHP Romania
|
| 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}
{/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&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 & 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 & 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 |
|
| |
|