moidaschl
Vollzeit-Hackler
|
Mahlzeit! Ich hab ein kleines Verständnisproblem bei dem mir leider auch die Dokumentation nicht weiterhelfen konnte. Nehmen wir einmal dieses Typische Szenario an, dass wir per index.php?page=seitenname die richtige Seite übergeben und dann je nachdem die richtige Seite ins system einbinden. Also ensteht so ca. folgendes: index.php bindet das menü und die datei content.php ein content.php hat eine switch abfrage, welche auf die $_GET['page'] variable zugreift und je nachdem die richtige seite includet soweit so gut, kein problem. mein problem ist jetzt allerdings, dass in allen dokumentationen und beispielscripten davon ausgegangen wird, dass einfach ein script durchlaufen wird, am schluss werden mit assign die variablen zugewiesen und das template mit display ausgegeben. da ich jetzt aber dynamisch arbeite (also die einzelenen eingebundenen dateien ja immer andere formatierungen haben) müsste ich doch zuerst den html header, dann irgendwann das template der seite und dann wieder der rest der gleichbleibt. ich kann aber keine zwei templates mit display ausgeben  ich weiß, dass ich mittels code im .tpl file selber code einbinden kann, wie ich das realisiere ist mir aber noch nicht ganz klar ich hoff ihr könnt mir da denkanstöße geben  danke im voraus daschl
Bearbeitet von moidaschl am 02.01.2006, 20:20
|
Spikx
My Little Pwny
|
hm... also in meinen Smarty Anwendungen is des immer so, dass die index.php im prinzip nur folgendes inne hat: // Modul ausfuehren
$ret = ExecuteModule(MODULE,GO);
// Ergebnis zuweisen
$smarty->assign("main_title",$ret['title']);
$smarty->assign("main_content",$ret['content']);
// Anzeige
$smarty->display('main.tpl');
Im main.tpl werden halt die variablen main_title und main_content ausgegeben. ExecuteModule entspricht deinem Switch, könnte man sagen... die Variablen MODULE und GO werden aus $_GET geholt und je nachdem wird eben ein php file included. Diese php files greifen zB auf $content zu welches dann für die index.php ja wiederum in $ret['content'] steht und von eben dieser an das template übergeben wird  //außerdem kannst in den php files ja auch mit $smarty->fetch('...'); andere templates in $content schreiben und die Variablen dieses Templates natürlich auch in diesem php file assignen.
Bearbeitet von Spikx am 24.12.2005, 14:05
|
kleinerChemiker
Here to stay
|
du kannst mehrere smartyinstanzen starten und dann auch mehrere templates ausgeben.
$smarty1 = news Smarty(); $smarty1->assign(); $smarty1->display(); $smarty2 = news Smarty(); $smarty2->assign(); $smarty2->display();
|
moidaschl
Vollzeit-Hackler
|
du kannst mehrere smartyinstanzen starten und dann auch mehrere templates ausgeben.
$smarty1 = news Smarty(); $smarty1->assign(); $smarty1->display(); $smarty2 = news Smarty(); $smarty2->assign(); $smarty2->display(); oha an DAS hab ich echt noch nicht gedacht. is wahrscheinlich ned im sinne des erfinders aber solangs funktioniert
|
kleinerChemiker
Here to stay
|
warzm sollte es nicht im sinne des erfinders sein? ist nun mal so, daß man mehrere objekte haben kann. ist auch praktisch, wenn du dynamischen und fast statischen content hast, da du ja für jedes objekt die cachedauer einstellen kannst.
|
moidaschl
Vollzeit-Hackler
|
warzm sollte es nicht im sinne des erfinders sein? ist nun mal so, daß man mehrere objekte haben kann. ist auch praktisch, wenn du dynamischen und fast statischen content hast, da du ja für jedes objekt die cachedauer einstellen kannst. stimmt daran hab ich auch nicht gedacht praktisch das design (die grundstruktur) ändert sich sowieso so gut wie nie, aber andere daten ständig  muss ich sofort ausprobieren danke!
|
moidaschl
Vollzeit-Hackler
|
ah ich hab jetzt noch eine frage folgenden code hab ich um werte aus der datenbank auszulesen und im script darzustellen $mysqlQuery = "SELECT * FROM ok_news ORDER BY newsID DESC";
$mysqlResult = mysql_query($mysqlQuery);
while($actualRow = mysql_fetch_array($mysqlResult)) {
/* SmartyNews Instanz */
$smartyNews = new MySmarty;
/* variablen zuweisen */
$smartyNews->assign("newsTitle", $actualRow['newsTitle']);
$smartyNews->assign("newsDate", $actualRow['newsDate']);
$smartyNews->assign("newsContent", $actualRow['newsContent']);
$smartyNews->display("news.tpl");
}
geht das auch anders? weil da ruf ich bei jeder reihe die ich auslese ein neues objekt auf. geht doch sicher auf die performance? p.s.: das template file is einfach eine tabelle wo ich eben die werte ausgebe tia
|
kleinerChemiker
Here to stay
|
$mysqlQuery = "SELECT * FROM ok_news ORDER BY newsID DESC";
$mysqlResult = mysql_query($mysqlQuery);
while($actualRow = mysql_fetch_array($mysqlResult)) {
$a[]=$actualRow['newsTitle']
}
/* SmartyNews Instanz */
$smartyNews = new MySmarty;
$smartyNews->assign("newsTitle", $a);
|
moidaschl
Vollzeit-Hackler
|
ah das is mir gestern noch eingefallen... wenn ich das dann für mehrere mache muss ich hald im smarty template eine schleife einbauen und dann alle elemente der reihe nach ausgeben lassen.
da gibts keine einfachere methode nehm ich an!?
edit: es gibt keine while's und for's in php? hmm mit foreach is ned so gut
Bearbeitet von moidaschl am 02.01.2006, 19:09
|
kleinerChemiker
Here to stay
|
sicher gibts for und while, gibt sogar do .. while (hab ich aber noch nie benutzt) an deiner stelle würd ichs etwa so machen: template: {foreach from=$news item=zeile}
{$zeile.newstitle} {$zeile.date} ...
{/foreach}
php: $mysqlQuery = "SELECT * FROM ok_news ORDER BY newsID DESC";
$mysqlResult = mysql_query($mysqlQuery);
while($actualRow[] = mysql_fetch_array($mysqlResult))
/* SmartyNews Instanz */
$smartyNews = new MySmarty;
$smartyNews->assign("news", $actualRow);
$smartyNews->display("news.tpl");
|
moidaschl
Vollzeit-Hackler
|
jap genauso hab ichs jetzt auch (irgendwie mühsam ausm inet zammgsucht  template: {foreach item=news from=$newsArray}
<table width="100%" border="1">
<tr>
<td>{$news.newsTitle}</td>
<td>{$news.newsDate}</td>
</tr>
<tr>
<td colspan="2">{$news.newsContent}</td>
</tr>
</table>
<br />
{/foreach}
php: $mysqlQuery = "SELECT * FROM ok_news ORDER BY newsID DESC";
$mysqlResult = mysql_query($mysqlQuery);
while($currentRow = mysql_fetch_array($mysqlResult)) {
$newsArray[] = $currentRow;
}
/* SmartyNews Instanz */
$smartyNews = new MySmarty;
$smartyNews->assign("newsArray", $newsArray);
$smartyNews->display("news.tpl");
ist eindeutig besser als inline, und viel lesbarer  edit dein php code is noch besser, hab ich gleich übernommen danke nochmal!
|
kleinerChemiker
Here to stay
|
np. mit smarty arbeite ich selber des öfteren. kann dir allerdings auch das smartyforum empfehlen. zwar muß man manchmal nen tag warten, aber eigentlich sehr freundlich und sehr hilfreich. auch das deutsche unterforum.
|
moidaschl
Vollzeit-Hackler
|
gleicher code, neues - nicht entdecktes - problem ich hoff es kommt nicht so rüber als würd ich alles fragen aber ich such immer nach einer lösung aber komm nicht drauf  suchen hat auch noch ned geholfen (aber ich bin im smarty forum auf beiträge von dir gestoßen chemiker  ) wenn ich das mit der foreach ausgebe, hab ich immer einen eintrag zuviel? aus meiner programmier-intuition heraus hats sicher was damit zu tun, dass er bei 0 anfängt oder wie auch immer.. hat wer eine ahnung? edit: also er gibt zwei beträge aus, wie es in der datenbank steht und dann noch ein 3. leeres grundgerüst da er ja nichtsmehr aus der datenbank lesen kann bzw in dem array nixmehr drinsteht edit2: debug zeigt mir auch ein 3. element aber ohne einträge dürft also der hund irgendwo im php code sitzen #debug: Array (3)
0 => Array (8)
0 => 4
newsID => 4
1 => 02.01.2006
newsDate => 02.01.2006
2 => Inhalt der zweiten Nachricht
newsContent => Inhalt der zweiten Nachricht
3 => Titel der zweiten Nachricht
newsTitle => Titel der zweiten Nachricht
1 => Array (8)
0 => 3
newsID => 3
1 => 01.01.2006
newsDate => 01.01.2006
2 => Inhalt der Ersten Message
newsContent => Inhalt der Ersten Message
3 => Titel der Ersten Message
newsTitle => Titel der Ersten Message
2 =>
aah: while($row = mysql_fetch_array($mysqlResult)) {
$newsArray[] = $row;
}
funktioniert, also haut was bei deiner schreibweise ned hin
Bearbeitet von moidaschl am 02.01.2006, 21:10
|
kleinerChemiker
Here to stay
|
liegt vermutlich daran, daß in der "kurzen" while-schreibweise erst zugeordnet wird und dann festgestellt, daß es false ist. damit gibts einen überschüssigen leeren eintrag im array.
|