Smarty: Daten aus der Datenbank auslesen und mit foreach zusammensetzen

supercat1510

Erfahrenes Mitglied
Ich versuch momentan Smarty zu lernen und kann's auch zum Teil schon umsetzen.
Mein Testscript ist ein Gästebuch-Backend.

Erst hab ich es recht einfach programmiert und das funktioniert auch schon tadellos - jetzt will ich sämtlichen HTML-Code aus den PHP-Dateien entfernen, bei einem einzelnen Eintrag klappt das auch - nur funktioniert das noch nicht ganz bei der Eintragsliste die ich aus der Datenbank auslese.

So hatte ich das bisher:
PHP:
        $DbCon->DoSql("SELECT gbook_id,name,email,url,text,timestamp FROM ".$tblgbook." ORDER BY gbook_id DESC ");

        $gbook_content .= "<table border=\"0\" cellspacing=\"0\" cellpadding=\"5\" width=\"100%\" class=\"zebra\">";
          while ($row = $DbCon->GetRes()) {
                $gbook_content .= '<tr title="'.htmlspecialchars($row['text']).'">
                        <td>'.$row['gbook_id'].'</td>
                        <td>'.$row['name'].'</td>
                        <td>'.$row['email'].'</td>
                        <td>'.$row['url'].'</td>
                        <td>';
                $gbook_content .= date_return($row['timestamp']);
                $gbook_content .= '</td>
                        <td>[<a href="index.php?link=au_gbook&amp;job=edit&amp;id='.$row['gbook_id'].'">Edit</a>]</td>
                        <td>[<a href="index.php?link=au_gbook&amp;job=del&amp;id='.$row['gbook_id'].'">Delete</a>]</td>
                </tr>';
     }
        $gbook_content .= "</table>";

Und so versuche ich es jetzt:

gbook_list.tpl
PHP:
<table border="0" cellspacing="0" cellpadding="5" width="100%">
{foreach name=aussen item=guestbok from=$guestbook}
  {foreach key=gid item=gbook from=$guestbok}
<tr title="{$gbook.text}">
        <td>{$gid}</td>
        <td>{$gbook.name}</td>
        <td>{$gbook.email}</td>
        <td>{$gbook.url}</td>
        <td>{$gbook.timestamp}</td>
        <td>[<a href="{$gbook.edit}">Edit</a>]</td>
        <td>[<a href="{$gbook.delete}">Delete</a>]</td>
</tr>
  {/foreach}
{/foreach}
</table>

au_gbook.php
PHP:
        $DbCon->DoSql("SELECT gbook_id,name,email,url,text,timestamp FROM ".$tblgbook." ORDER BY gbook_id DESC ");
        $smarty->assign("guestbook", $DbCon->GetRes());
        $smarty->fetch('gbook_list.tpl');

Das Problem das ich hierbei habe ist:
1. das ich ein Feld {$guestbook} in meinem Main-Template brauche - ich würd das gerne aber wieder über die {$content} einbinden. Zum anderen scheint er auch das template so nicht zu finden das er hier halt einbinden soll.
2. wenn ich $smarty->display('gbook_list.tpl'); statt fetch nehme zeigt er mir mein Template zwar an, aber über dem Design und mit komischen werten die sich in jeder zeile wiederholen

Ich hab wahrscheinlich nur einen Denkfehler in meinem Script, aber komm momentan grad nicht selber drauf.
 
Tja - nach etlichen Versuchen doch noch geschafft:

gbook_list.tpl:
PHP:
{config_load file=test.conf section="setup"}
<table border="0" cellspacing="0" cellpadding="5" width="100%" class="zebra">

{foreach key=gid item=gbook from=$content}
<tr title="{$gbook.text|htmlentities}">
	<td>{$gid.id}</td>
	<td>{$gbook.name|htmlentities}</td>
	<td>{$gbook.email}</td>
	<td>{$gbook.url}</td>
	<td>{$gbook.timestamp}</td>
	<td>[<a href="index.php?link=au_gbook&amp;job=edit&amp;id={$gid}">Edit</a>]</td>
	<td>[<a href="index.php?link=au_gbook&amp;job=del&amp;id={$gid}">Delete</a>]</td>
</tr>
{/foreach}

</table>

au_gbook.php
PHP:
	$DbCon->DoSql("SELECT gbook_id,name,email,url,text,timestamp FROM ".$tblgbook." ORDER BY gbook_id DESC ");

	while ($row = $DbCon->GetRes()) {
		$liste[] = $row;
	}
	$gbook_content .= $smarty->assign("content", $liste);
	$gbook_content .= $smarty->fetch('gbook_list.tpl');

Vielleicht brauchts ja jemand.
 
ich hab nen ähnlöiches problem:
room.php

Code:
else if($action == "searchroom" && $login) {
    $tmpl_name = "frameset.tpl";
    $Smarty->append("css","fenster.css");
    
    $Smarty->assign("titlevar", Url("index.php?action=menu_login"));
    $Smarty->assign("menubar", Url("room.php?action=littlemenu"));
    $Smarty->assign("content", Url("room.php?action=searchroommain"));
    $Smarty->assign("Raumverwaltung - Raumsuche", $tmpl_titel);    
    
  }
  else if($action = "searchroommain" && $login) 
  {
    $Smarty->append("css","fenster.css");
    $Smarty->append("css","formular.css");
    $tmpl_name = "fenster.tpl";
    $Smarty->assign("popheadleft","<p>Raum suchen</p>");
    $Smarty->assign("popheadright","img/search.png");
	$formular = '<div class = "formular"><form action = "room.php?action=dosearchroom" method = "POST">';
    $formular .= '</br><div class = "formularleft">Raumsuche: </div>';
    $formular .= '<div class = "formularright"><input type = "text" name = "Raumsuche"></div>';
    $formular .= '<input type = "submit" class="ok" value = "Suchen">';
    $formular .= '</form>';
    $formular .= formular("room.php?action=start","abbrechen",NULL,"ok");
    $formular .=  '</div>';
    $data = $Controller->Raum->Search($_POST["Raumsuche"]);
	while ($row = $data) 
	{
        $liste[] = $row;
    }
    $data_content .= $smarty->assign('popmainup', $liste);
    $data_content .= $smarty->fetch('searchroom.tpl');    				
	var_dump($data);
	//$Smarty->assign('popmainup',$data_content);
  }

searchroom.tpl

Code:
<div id = "popheadright"><img src="img/key.png" title="Symbol" alt="Symbol" /></div>
		</div>
		<div id="popmain">
			<div id="popmainup"><br />
				<form>
					{config_load file=test.conf section="setup"}
					<table border="0" cellspacing="0" cellpadding="5" width="100%" class="zebra">
					{foreach key=data item=gbook from=$data}
					<tr>
						<td>{$data.id}</td>
					</tr>
					{/foreach}

					</table>  
				</form>
			</div>
			<div id="popmaindown"></div>
		</div>
	</div>
</div>


kann mir vielleicht jemand sagen, wie ich die tabelle, die in einer db gespeichert hab auslesen kann****?
$data liest die db aus..
 
Deine Foreach-Abfrage müsste so aussehen:

PHP:
 {foreach key=data item=gbook from=$popmainup}
                    <tr>
                        <td>{$gbook.id}</td>
                    </tr>
                    {/foreach}

Kurz zum Verständnis:

Du speicherst deine Daten für das Foreach in $liste und liest dann diese mit popupmain ins smarty.

PHP:
    $data = $Controller->Raum->Search($_POST["Raumsuche"]);
    while ($row = $data) 
    {
        $liste[] = $row;
    }
    $data_content .= $smarty->assign('popmainup', $liste);
 
Zurück