Autor: Robert Data: 28 Luty 2008
Za każdym razem, kiedy zajmuję się jakimś rozwiązaniem związanym z PHP jestem mile zaskoczony. Nie dość, że upraszcza pracę, to do tego tzw. ‘learning curve’ jest bardzo krótkie.
Poniżej wycinek kodu który pozwala połączyć dwie tablice kluczem obcym. Zakładam, że znasz już podstawowe założenia Smarty, dlatego nie opisuję operacji krok po kroku. Założenia są następujące:
W bazie mamy:

Czyli przykładowe dane w tabelach mogłyby wyglądać tak:


Ale chcemy wyświetlić je na stronie tak:

Stąd potrzeba zamiany identyfikatora liczbowego na konkretną wartość (czyli nazwę) z tabeli. Kod w skrócie wygląda następująco.
Plik cellrender.php
<?php
//konfiguracja bazy danych - uzupełnij zgodnie z własną konfiguracją
define ("BASE_SERVER","server");
define ("BASE_USER","user");
define ("BASE_PASS","password");
define ("BASE_NAME","wordpress");
require '../libs/Smarty.class.php';
$smarty = new Smarty; $sql = "SELECT * FROM wp_users";
/* ... usunięty kod połączenia do bazy danych */
$user = array();
while($tmp = mysql_fetch_assoc($result)) {
$user[] = $tmp;
}
$smarty->assign("user", $user);
$sql = "SELECT * FROM wp_posts";
/* ... usunięty kod połączenia do bazy danych */
$user = array();
while($tmp = mysql_fetch_assoc($result)) {
$post[] = $tmp;
}
$smarty->assign("post", $post);
$smarty->display('cellrender.tpl');
Plik szablonu cellrender.tlp
{config_load file=mysmarty.conf section="setup"} <table>
<tr style="font-weight:bold;background-color: #FFBD00">
<td>No.</td>
<td>ID</td>
<td>POST_TITLE</td>
<td>POST_AUTHOR</td>
<td>POST_STATUS</td>
<td>POST_NAME</td>
</tr>
{section name=c loop=$post}
{if $smarty.section.c.iteration is not odd}
<tr style="background-color: #FFD86F">
{else}
<tr style="background-color: #A9D1E7">
{/if}
<td>{$smarty.section.c.iteration}</td>
<td>{$post[c].id}</td>
<td>{$post[c].post_title}</td>
{assign var=autor value=$post[c].post_author}
<td>{$post[c].post_author} - - {$user[$autor].user_nicename}</td>
<td>{$post[c].post_status}</td>
<td>{$post[c].post_name}</td>
</tr>
{/section}
</table>
Kluczowe linie:
{assign var=autor value=$post[c].post_author}
<td>{$post[c].post_author} - - {$user[$autor].user_nicename}</td>
Jak widać udaje się odseparować szablon od kodu php zachowując swobodę w operowaniu danymi z bazy danych, a o to przecież właśnie chodzi.
27 Luty 2008 @ 14:12
Jest jeszcze jedna możliwość, która może jeszcze bardziej uprościć sprawę. Chodzi o połączenie dwóch tabel w zapytaniu SQL’owym. Myślę w kategoriach Java – czyli technologia ORM (Object Relational Mapping) i stąd nie skorzystałem tym razem z takiego oczywistego podejścia, a tymczasem nie mapuję żadnego obiektu i nie muszę się martwić, że nie zadziała rzutowanie. Ach to EJB3. Swoją drogą, wracając do PHP, muszę sprawdzić jak by to wyglądało w Zend Framework.