Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
30.01.2008 19:59:41
php template engine: smarty. edit: rekursioon |
|
|
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 |
|
|
taavi
HV veteran
liitunud: 04.02.2002
|
30.01.2008 20:38:49
|
|
|
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 |
|
|
lehm2
Kreisi kasutaja
liitunud: 19.09.2004
|
30.01.2008 21:38:50
|
|
|
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:
|
<?php foreach($names as $name): ?> <span><?php echo $name; ?></span> <?php endforeach; ?>
|
_________________ Piilu siia, progreja!
Vajad abi Node.JS-ga ?
Võta ühendust ! |
|
Kommentaarid: 15 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
13 |
|
tagasi üles |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
30.01.2008 22:03:13
|
|
|
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 |
|
|
Tomv
Kreisi kasutaja
liitunud: 14.01.2007
|
|
Kommentaarid: 20 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
19 |
|
tagasi üles |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
30.01.2008 23:03:42
|
|
|
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 |
|
|
gynterk
HV kasutaja
liitunud: 17.01.2004
|
31.01.2008 20:40:48
|
|
|
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 |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
31.01.2008 22:27:05
|
|
|
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 |
|
|
skycat
HV kasutaja
liitunud: 20.05.2003
|
03.02.2008 00:33:41
|
|
|
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:
|
<?php foreach($names as $name): ?> <span><?php echo $name; ?></span> <?php endforeach; ?>
|
|
kui natuke confida saab ka nii kirjutada:
|
|
Kommentaarid: 17 loe/lisa |
Kasutajad arvavad: |
|
:: |
2 :: |
0 :: |
12 |
|
tagasi üles |
|
|
kapa24
HV vaatleja
liitunud: 23.01.2003
|
06.02.2008 21:00:19
|
|
|
Smarty kasuks ütlen seda, et koodi teeb puhtamaks ja lihtsamini arusaadavamaks
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
<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 |
|
|
andrusny
Kreisi kasutaja
liitunud: 20.03.2006
|
06.02.2008 22:00:37
|
|
|
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 |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
06.02.2008 23:57:08
|
|
|
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 |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
07.02.2008 23:23:51
|
|
|
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 |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
10.02.2008 17:51:07
|
|
|
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 |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
10.02.2008 18:22:06
|
|
|
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 |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
10.02.2008 18:48:50
|
|
|
Selle esimese osa jaoks saad sa kasutada rekursiooni:
php:
|
<?php function load_meny($parent_id = 0, $level = 0) { $sql = ???; $query = $sql->sql_query( "SELECT page_id, parent_id, active FROM ".PAGES." WHERE parent_id='$parent_id' ORDER BY order_id" ); while($row = $sql->sql_row($query)) { 'page_id' => $row['page_id'], 'active' => $row['active'], 'level' => $level ); $meny = array_merge($meny, load_menu ($row['parent_id'], $level + 1)); } return $meny; } $meny = load_meny(); $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 |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
10.02.2008 19:48:09
|
|
|
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 |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
10.02.2008 20:23:14
|
|
|
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 |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
10.02.2008 22:07:30
|
|
|
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 |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
11.02.2008 10:16:30
|
|
|
$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 |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
11.02.2008 22:35:53
|
|
|
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 |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
12.02.2008 11:42:17
|
|
|
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 |
|
|
nene
Kreisi kasutaja
liitunud: 20.03.2004
|
13.02.2008 02:22:25
|
|
|
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 |
|
|
kapa24
HV vaatleja
liitunud: 23.01.2003
|
13.02.2008 16:59:26
|
|
|
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 |
|
|
lehm2
Kreisi kasutaja
liitunud: 19.09.2004
|
13.02.2008 18:46:50
|
|
|
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 |
|
|
|