Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  php template engine: smarty. edit: rekursioon märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele 1, 2  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale. Teata moderaatorile
otsing:  
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 30.01.2008 19:59:41 php template engine: smarty. edit: rekursioon vasta tsitaadiga

keegi mõnda lihtsalt templete enginit php-s jooksutamiseks oskab soovitada? vaja oleks loopid, if-d ja muu elementaarne. smarty suudab seda ja ka rohkemgi, kuid see on jube keemia.
_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!


viimati muutis keevitaja 10.02.2008 23:48:04, muudetud 2 korda
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
taavi
HV veteran

liitunud: 04.02.2002



Online

sõnum 30.01.2008 20:38:49 vasta tsitaadiga

php oskab kõike, mida sa küsisid. miks on mingit eraldi kihti sinna vahele vaja?
Kommentaarid: 60 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 55
tagasi üles
vaata kasutaja infot saada privaatsõnum
lehm2
Kreisi kasutaja


liitunud: 19.09.2004




sõnum 30.01.2008 21:38:50 vasta tsitaadiga

Minuarust ka, milleks sulle mõni templiidi mootor kõike saab php-s väga efektiivselt ära teha, ei ole vaja sul midagi juurde õppida mõnd teist süntaksit

php:
  1.  
  2. <?php foreach($names as $name): ?>
  3. <span><?php echo $name; ?></span>
  4. <?php endforeach; ?>
  5.  

_________________
Piilu siia, progreja!
Vajad abi Node.JS-ga ?
Võta ühendust !
Kommentaarid: 15 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 13
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 30.01.2008 22:03:13 vasta tsitaadiga

no idee on html php koodist eraldada. nii on palju selgem
_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
Tomv
Kreisi kasutaja
Tomv

liitunud: 14.01.2007




sõnum 30.01.2008 22:41:24 vasta tsitaadiga

http://www.intranetjournal.com/articles/200412/ij_12_08_04c.html
Äkki on abiks.

_________________
jah
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 30.01.2008 23:03:42 vasta tsitaadiga

no ma võtsin selle smarty ette. pealiskaudsel(väga pealiskaudsel) tutvumisel tundus jube keemia olevat. aga vist polegi. ning see peaks vast ka võimaluste rohkeim olema!
_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
gynterk
HV kasutaja

liitunud: 17.01.2004




sõnum 31.01.2008 20:40:48 vasta tsitaadiga

bTemplate sobib väga hästi. Kergesti muudetav ja vägagi arusaadav kood. Õpetused on ka lehel olemas.
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 5
tagasi üles
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 31.01.2008 22:27:05 vasta tsitaadiga

nüüdseks olen rohkem tutvund smartyga. tegemist on väga võimsa ja ülimalt lihtsa templeidi süsteemiga. enne olin rumal...
_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
skycat
HV kasutaja
skycat

liitunud: 20.05.2003




sõnum 03.02.2008 00:33:41 vasta tsitaadiga

lehm2 kirjutas:
Minuarust ka, milleks sulle mõni templiidi mootor kõike saab php-s väga efektiivselt ära teha, ei ole vaja sul midagi juurde õppida mõnd teist süntaksit

php:
  1.  
  2. <?php foreach($names as $name): ?>
  3. <span><?php echo $name; ?></span>
  4. <?php endforeach; ?>
  5.  


kui natuke confida saab ka nii kirjutada:

php:
  1. <?= $name ?>
Kommentaarid: 17 loe/lisa Kasutajad arvavad:  :: 2 :: 0 :: 12
tagasi üles
vaata kasutaja infot saada privaatsõnum
kapa24
HV vaatleja

liitunud: 23.01.2003




sõnum 06.02.2008 21:00:19 vasta tsitaadiga

Smarty kasuks ütlen seda, et koodi teeb puhtamaks ja lihtsamini arusaadavamaks icon_smile.gif

Php:

<ul>
    <?php foreach($list as $key=>$value): ?>
        <?php if($key%2 == 0): ?>
            <li><?=$key?></li>
        <?php else: ?>
            <li><?=$value?></li>
        <?php endif; ?>
    <?php foreachend; ?>
</ul>


Smartys näeb igaljuhul asi soliidsem välja icon_smile.gif

<ul>
    {foreach from=$list key='key' item='value'}
        {if $key%2 == 0}
            <li>{$key}</li>
        {else}
            <li>{$value}</li>
        {/if}
    {/foreach}
</ul>


Ning kiirusevahe on peaaegu olematu.
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 06.02.2008 22:00:37 vasta tsitaadiga

Ei taba eriti, mis sul seal soliidsem on, lihtsalt sa kirjutad php koodi veidralt.
_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 06.02.2008 23:57:08 vasta tsitaadiga

andrusny kirjutas:
Ei taba eriti, mis sul seal soliidsem on, lihtsalt sa kirjutad php koodi veidralt.


kapa24 näide ei too just eriti hästi Smarti paremaid külgi välja.

Igasuguse templeidimootori puhul on siiski oluline see, kuidas ta aitab eraldada programmiloogikat ja presentatsioonikihti. Tsüklid ja valiklaused on enam-vähem üks-ühele PHP-ga, nende osas Smartyga suurt ei võida. Kuid üheks kasulikumaks vahendiks on muutujatele lisatavad modifikaatorid:

<table>
{foreach from=$forum item=topic}
    <tr class="{cycle values='odd,even'}">

        {* kirjutame teema nime ette numbri *}
        {* varjestame HTML-i erisümbolid, a'la htmlspecialchars() *}
        <td>{counter}. {$topic.title|escape}</td>

        {* Vormindame kuupäeva stiilis: 6. veebruar 2008 *}
        <td>{$topic.date|date_format:"%e. %B %Y"}</td>

        {* näitame maksimaalselt 50 tähte, kuid ei lõika sõna poole pealt *}
        {* ja lisame lõppu kolm punkti. Lisaks varjestame HTML-i. *}
        <td>{$topic.text|truncate:50|escape}</td>

    </tr>
{/foreach}
</table>
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 07.02.2008 23:23:51 vasta tsitaadiga

mul oleks abi natukene vaja sectioniga. ma ei oska menüüd kuvada. sqli baas selline: page_id, parent_id, order_id
seal siis esimise astme parent_id on 0 ja järgnevatel juba see page_id mille alla nad kuuluvad. valjavõttes peaks olema midagi sarnast:


page_1
  subpage_1
  subpage_2
page_2
page_3
  subpage_1
     subsubpage_1
     subsubpage_2

jne... oskab keegi õpetada?

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 10.02.2008 17:51:07 vasta tsitaadiga

Ma arvan, et see pole otseselt seotud Smarti {section}'iga.

Sinu probleem paistab olevat selles, kuidas andmebaasist hierarhilisi andmeid välja võtta.

Abiks on rekursioon.
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 10.02.2008 18:22:06 vasta tsitaadiga

ma midagi kribasin kokku, kuid see vist pole kõige toredam lahend:

//v6tame v2lja lehed
$sql_query['0'] = $sql->sql_query("select page_id, parent_id, active from ".PAGES."
      where parent_id='0' order by order_id");
while($sql_row['0'] = $sql->sql_row($sql_query['0']))
{
   //level 0
   $meny[] = array(
      'page_id' => $sql_row['0']['page_id'],
      'active' => $sql_row['0']['active'],
      'level' => '0'
      );
   
   $sql_query['1'] = $sql->sql_query("select page_id, parent_id, active from ".PAGES."
      where parent_id='".$sql_row['0']['page_id']."' order by order_id");
   while($sql_row['1'] = $sql->sql_row($sql_query['1']))
   {
      //level 1
      $meny[] = array(
         'page_id' => $sql_row['1']['page_id'],
         'active' => $sql_row['1']['active'],
         'level' => '1'
         );
      
      $sql_query['2'] = $sql->sql_query("select page_id, parent_id, active from ".PAGES."
         where parent_id='".$sql_row['1']['page_id']."' order by order_id");
      while($sql_row['2'] = $sql->sql_row($sql_query['2']))
      {
         //level 2
         $meny[] = array(
            'page_id' => $sql_row['2']['page_id'],
            'active' => $sql_row['2']['active'],
            'level' => '2'
            );
      }
   }
}

   
$smarty->assign('meny',$meny);    


{section name=tree loop=$meny}
<span style="margin-left: {math equation="x * y" x=10 y=$meny[tree].level}px}">lehe id: {$meny[tree].page_id}</span><br>
{/section}


et siis võtame kõik sqlist õiges järjekorras välja ning anname leveli kaasa. vastavalt sellele siis smarty kuvab

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 10.02.2008 18:48:50 vasta tsitaadiga

Selle esimese osa jaoks saad sa kasutada rekursiooni:

php:
  1. <?php
  2.  
  3. function load_meny($parent_id = 0, $level = 0) {
  4.     $sql = ???;
  5.     $query = $sql->sql_query(
  6.         "SELECT page_id, parent_id, active
  7.         FROM ".PAGES."
  8.         WHERE parent_id='$parent_id'
  9.         ORDER BY order_id"
  10.     );
  11.    
  12.     $meny = array();
  13.     while($row = $sql->sql_row($query))
  14.     {
  15.         $meny[] = array(
  16.             'page_id' => $row['page_id'],
  17.             'active' => $row['active'],
  18.             'level' => $level
  19.         );
  20.    
  21.         $meny = array_merge($meny, load_menu($row['parent_id'], $level + 1));
  22.     }
  23.    
  24.     return $meny;
  25. }
  26.  
  27. $meny = load_meny();
  28.  
  29. $smarty->assign('meny',$meny);


Aga mis probleem sul selle smartyga siis on? Ma näen, et sul on seal üks loogeline sulg üleliia ning sama asja saaks kirjutada märksa lihtsamini:

{foreach from=$meny item=item}
  <div style="margin-left: {$item.level * 10}px">lehe id: {$item.page_id}</div>
{/foreach}
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 10.02.2008 19:48:09 vasta tsitaadiga

ega see andmete kätte saamine oligi. kas see sinu sql versioon laeb n+1 arvu neid leveleid sisse?
_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 10.02.2008 20:23:14 vasta tsitaadiga

keevitaja kirjutas:
kas see sinu sql versioon laeb n+1 arvu neid leveleid sisse?


Mu kood peaks tegema täpselt seda sama, mida ka sinu kood tegi. Välja arvatud see, et sinu kood ei jõudnud sügavuselt 2 edasi.
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 10.02.2008 22:07:30 vasta tsitaadiga

mul ei hakka see asi töötama. tegin $sql globaalseks ja load_menu asendasin load_meny-ga

function load_meny($parent_id = 0, $level = 0) {
    global $sql;
   
    $query = $sql->sql_query(
        "SELECT page_id, parent_id, active
        FROM ".PAGES."
        WHERE parent_id='$parent_id'
        ORDER BY order_id"
    );
   
    $meny = array();
    while($row = $sql->sql_row($query))
    {
        $meny[] = array(
            'page_id' => $row['page_id'],
            'active' => $row['active'],
            'level' => $level
        );
   
        $meny = array_merge($meny, load_meny($row['parent_id'], $level + 1));
    }
   
    return $meny;
}


ja kui ma seda vaatan, siis kuidas peaks parent_id muutuma ning $level läheb iga kord ühe võrra suuremaks!

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 11.02.2008 10:16:30 vasta tsitaadiga

$meny = array_merge($meny, load_meny($row['parent_id'], $level + 1));

sellega hakkab asi tööle. tänud!

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 11.02.2008 22:35:53 vasta tsitaadiga

Huvitav, ma oma mäletamist mööda tegin siia vahele postituse, kus ütlesin, et peaks olema hoopis:

$meny = array_merge($meny, load_meny($row['page_id'], $level + 1));
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 12.02.2008 11:42:17 vasta tsitaadiga

aga kuidas sellele funtsioonile öelda, et ärgu mingist levelist edasi mingu? idee poolest oleks vast võimalik lihtsalt if-ga array lisamine ära keelata, kuid kas see on kõige parem mõte?
_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
nene
Kreisi kasutaja
nene

liitunud: 20.03.2004




sõnum 13.02.2008 02:22:25 vasta tsitaadiga

Kõige õigem oleks vast sellisel juhul funktsioonile kaasa anda parameeter, mis määraks maksimaalse leveli.

Näiteks ($max_level = 0 annab üksnes esimese menüütasandi, $max_level = 1 annab kaks jne, ning $max_level = -1 annab kõik):

function load_meny($parent_id = 0, $max_level = -1, $level = 0) {

    ...

    while($row = $sql->sql_row($query))
    {
        ...
       
        if ($level < $max_level || $max_level == -1) {
            $meny = $meny + load_meny($row['page_id'], $max_level, $level + 1);
        }
    }
   
    return $meny;
}
Kommentaarid: 24 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 23
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
kapa24
HV vaatleja

liitunud: 23.01.2003




sõnum 13.02.2008 16:59:26 vasta tsitaadiga

andrusny kirjutas:
Ei taba eriti, mis sul seal soliidsem on, lihtsalt sa kirjutad php koodi veidralt.


Mis seal veidrat on?

nene kirjutas:

kapa24 näide ei too just eriti hästi Smarti paremaid külgi välja.

Igasuguse templeidimootori puhul on siiski oluline see, kuidas ta aitab eraldada programmiloogikat ja presentatsioonikihti. Tsüklid ja valiklaused on enam-vähem üks-ühele PHP-ga, nende osas Smartyga suurt ei võida. Kuid üheks kasulikumaks vahendiks on muutujatele lisatavad modifikaatorid:


See ei olnudki smarty paremate külgede väljatoomiseks, pigem vastuseks kasutajatele lehm2, taavi ...

Programmiloogika ja presentatsioonikihi lahushoidmine smarty põhiülesandeks.
tagasi üles
vaata kasutaja infot saada privaatsõnum
lehm2
Kreisi kasutaja


liitunud: 19.09.2004




sõnum 13.02.2008 18:46:50 vasta tsitaadiga

Nagu olen arusaanud. et kõik muutujad mida presentatsioonikihis tahad väljastada peab olema lisatud meetodi assign abil aga kuidas siis suurema andmemahuga see ülekanne on näiteks tuhat kirjet?
_________________
Piilu siia, progreja!
Vajad abi Node.JS-ga ?
Võta ühendust !
Kommentaarid: 15 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 13
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  php template engine: smarty. edit: rekursioon mine lehele 1, 2  järgmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.