"We are back" « oc.at

Smarty-Frage

moidaschl 24.12.2005 - 12:58 1056 13
Posts

moidaschl

Vollzeit-Hackler
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
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 :confused:

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
Avatar
Registered: Jan 2002
Location: Scotland
Posts: 13497
hm... also in meinen Smarty Anwendungen is des immer so, dass die index.php im prinzip nur folgendes inne hat:
Code: PHP
// 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
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4349
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
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
Zitat von kleinerChemiker
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 :D

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4349
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
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
Zitat von kleinerChemiker
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
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
ah ich hab jetzt noch eine frage

folgenden code hab ich um werte aus der datenbank auszulesen und im script darzustellen

Code: 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;
	
		/* 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
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4349
Code: PHP
$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
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
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
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4349
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:
Code:
{foreach from=$news item=zeile}
{$zeile.newstitle} {$zeile.date} ...
{/foreach}

php:
Code: 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
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
jap genauso hab ichs jetzt auch (irgendwie mühsam ausm inet zammgsucht :)

template:

Code:
{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:
Code: 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
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4349
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
Avatar
Registered: Aug 2002
Location: 1210, ABK-D/L
Posts: 4029
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 :D)

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:
Code:
	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:
Code: PHP
	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
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4349
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.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz