FROMsoft.pl

Smarty – łączenie zawartości tabel w jednej tablicy.

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:

wp_tables

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

smarty1

smarty2

Ale chcemy wyświetlić je na stronie tak:

smarty3

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.

Tagi: ,

1 odpowiedź to "Smarty – łączenie zawartości tabel w jednej tablicy."

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.

Dodaj komentarz

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Zmień )

Twitter picture

You are commenting using your Twitter account. Log Out / Zmień )

Facebook photo

You are commenting using your Facebook account. Log Out / Zmień )

Connecting to %s


  • Astroni: Dzięki - po długich poszukiwaniach w Internecie wreszcie zwięźle i na temat. Pozdrawiam
  • NaszeWP » Przyjazne linki w Wordpress-ie: [...] serwerze (Ustawienia administracji) że się nie da ustawić tak jak chcemy. Jak informuje nas blog ROBSOFT jest inny sposób aby te linki były
  • Mariusz: To jest moje rozwiązanie. Polskie znaki mogą być wszędzie. W temacie, treści a nawet w nazwisku nadawcy! pozdrawiam $Name = "$_SESSION[z

Kategorie

Follow

Otrzymuj każdy nowy wpis na swoją skrzynkę e-mail.