|
Smarty
WARNING: All discussion is moving to https://reddit.com/r/smarty, please go there! This forum will be closing soon. |
|
View previous topic :: View next topic |
Author |
Message |
Fellow Smarty Rookie
Joined: 26 Mar 2007 Posts: 7
|
Posted: Mon Mar 26, 2007 8:37 am Post subject: PHP5 i MySQL Zastosowania e-commerce -wyswietlanie produktow |
|
|
Od jakiegos czasu bawie sie PHP MySQL-em i smarty. Kupilem sobie ksiazke PHP5 i MySQL Zastosowania e-commerce z heliona. Przyklady tej ksiazki dzialaja bez zarzutu, ale zastanawia mnie czy system ktory zostal zastosowany moze wyswetlac produkty w rozny sposob. To znaczy ze np chcialbym wyswietlac produkty z dzialu 'Natura' i categorii 'Zwierzeta' w innej formie niz produkty dzialu 'Natura' categorii 'Kwiaty'. Jesli jest ktos w temacie to prosze o jakas pomoc bo juz troche lamalem sobie glowe nad tym i nic. Ciagle prezentowaly mi sie produkty wg jednego szablonu. hmm. pozdr |
|
Back to top |
|
SzubertX Smarty Rookie
Joined: 27 Sep 2005 Posts: 8 Location: Poland
|
Posted: Thu Mar 29, 2007 10:19 pm Post subject: |
|
|
Witam!
Te? zaczyna?em od tej ksi??ki zabaw? ze Smarty - by?a chyba pierwsza po polsku która porusza?a temat Smarty Nawet jaki? sklepik na podstawie jej kiedy? zrobi?em z ró?nymi modyfikacjami...
Je?li chodzi Ci o ró?ne szablony list produktów lub opisów produktów - to mo?na na kilka prostych sposobów to zrobi?... Odpowiedzialne za to by?y szablony products_list.tpl i product.tpl. Po prostu zrób sobie kilka ich wersji które Ci s? potrzebne - a pó?niej wg jakiego? wyznacznika (po nazwach kategorii z GETów, czy dodatkowej kolumny w kategoriach w bazie) b?dziesz odpowiednio w index.php ?adowa? odpowiednie szablony Smarty (np. products_list1.tpl, products_list2.tpl, itd)...
To tak tyle mi przysz?o na szybko do g?owy |
|
Back to top |
|
Fellow Smarty Rookie
Joined: 26 Mar 2007 Posts: 7
|
Posted: Fri Mar 30, 2007 8:01 am Post subject: |
|
|
Ciesze sie ze ktos odpisal na mojego posta. Dzieki Subert.
A moglbys przykladem pokazac jak w index.php po GET-cie wybierac odpowiednie szablony w zaleznosci od przegladanego dzialu i categorii? Bede ogromnie wdzieczny. |
|
Back to top |
|
SzubertX Smarty Rookie
Joined: 27 Sep 2005 Posts: 8 Location: Poland
|
Posted: Fri Mar 30, 2007 11:39 pm Post subject: |
|
|
Po GETach b?dzie tak troch? nieelegancko, bo b?dzie to wpisane w kod strony i ka?da modyfikacja b?dzie si? wi?za?a z modyfikacj? kodu - lepiej by by?o przez baz?, ale...
Wi?c ?eby nie szuka? daleko, podobnie jak by?o w ksi??ce... Strona by?a podzielona na bloki, które w zale?no?ci od akcji zmienia?y si?, np:
Code: |
$pageContentsCell = "first_page_contents.tpl";
$categoriesCell = "categories_list.tpl";
if (isset($_GET['OrderDone']))
$pageContentsCell="checkout_done.tpl";
if (isset($_GET['Search']))
$pageContentsCell="search_results.tpl";
if (isset($_GET['ProductID']))
$pageContentsCell = "product.tpl";
|
Czyli na domy?lnie zadeklarowane by?o, ?e w g?ównej cz??ci strony mia?e? "first_page_contents.tpl" który to szablon z kolei ?adowa? list? produktów z danej kategorii... Wi?c wystarczy, ?eby zrobi? sobie kilka takich z ró?nymi uk?adami tych list i teraz zale?y jak sobie chcesz zorganizowa? t? stron? - je?li chodzi o GETy... Np. je?li b?dzie GET['category1'] to za?adujesz product_list1.tpl itd... To ju? Twoja kwestia... To by?by taki najszybszy sposób chyba Czyli reasumuj?c:
Code: |
$pageContentsCell = "first_page_contents.tpl";
if(isset($_GET['cat1'])) $pageContentsCell = "first_page_contents1.tpl";
if(isset($_GET['cat2'])) $pageContentsCell = "first_page_contents2.tpl";
...
|
No i oczywi?cie dalej do Smarty przekazujesz $pageContentsCell która otwiera odpowiedni szablon...
A bardziej elegancko by?oby zrobi? dodatkow? kolumn? w bazie, w tabeli z kategoriami, z nazw? (lub jakim? id) szablonu w którym maj? si? otwiera?... |
|
Back to top |
|
Fellow Smarty Rookie
Joined: 26 Mar 2007 Posts: 7
|
Posted: Tue Apr 10, 2007 8:21 am Post subject: |
|
|
Myslalem ze sobie poradze ale niestety.... nie wiem jak to dalej rozwiazac. Moze jak podam troche kodu to bedzie latwiej zobrazowac.
mam warstwie danych tak plik do_portal.php Code: | <?php
//klasa warstwy danych
class DoPortal
{
//konstruktor klasy
function __construct()
{
//odniesienie do pbniektu DbMenadzer powolanego w pliku app_top.php
$this->dbManager = $GLOBALS['gDbManager'];
}
//pobranie wlasciwach informacji o dzialach
public function GetDzialy()
{
$query_string = "SELECT department_id, name FROM department";
$result = $this->dbManager->DbGetAll($query_string);
return $result;
}
// pobranie szczegółowych informacji na temat danego działu
public function GetDzialDetale($departmentId)
{
$query_string = "SELECT name, description
FROM department
WHERE department_id = $departmentId";
$result = $this->dbManager->DbGetRow($query_string);
return $result;
}
// pobranie informacji o kategoriach należących do danego działu
public function GetKategoriaWDziale($departmentId)
{
$query_string = "SELECT category_id, name
FROM category
WHERE department_id = $departmentId";
$result = $this->dbManager->DbGetAll($query_string);
return $result;
}
// pobranie szczegółowych informacji na temat danej kategorii
public function GetKategoriaDetale($categoryId)
{
$query_string =
"SELECT name AS category_name, description AS category_description
FROM category
WHERE category_id = $categoryId";
$result = $this->dbManager->DbGetRow($query_string);
return $result;
}
// pobranie listy produktów przypisanych do kategorii Aktualnosci
public function GetAktualnosci($categoryId)
{
$query_string =
"SELECT aktualnosci.product_id, aktualnosci.titel, aktualnosci.description, aktualnosci.data
FROM aktualnosci
INNER JOIN miasto_category
ON aktualnosci.product_id = miasto_category.product_id
WHERE miasto_category.category_id = $categoryId";
$result = $this->dbManager->DbGetAll($query_string);
return $result;
}
}
//koniec klasy DoPortal
?> |
dalej w warstwie biznesowej mam plik bo_portal.php
Code: | <?php
//zaladowanie warstwy danych
require_once SITE_ROOT.'/warstwa_danych/do_portal.php';
//utorzenie klasy warstwy biznesowej odpowiedzialnej za pobranie informacji o pozycjach katalogowych
class BoPortal
{
/*prywatna skladowa*/
private $mDoPortal;
// konstruktor klasy inicjujacy obiekt warstwy danych
function __construct()
{
$this->mDoPortal = new DoPortal();
}
// teraz pobierzemy dane o wszystkich dzialach
public function GetDzialy()
{
$result = $this->mDoPortal->GetDzialy();
return $result;
}
// pobranie szczegółowych informacji na temat danego działu
public function GetDzialDetale($departmentId)
{
$result = $this->mDoPortal->GetDzialDetale($departmentId);
return $result;
}
// pobranie listy kategorii przypisanych do danego działu
public function GetKategoriaWDziale($departmentId)
{
$result = $this->mDoPortal->GetKategoriaWDziale($departmentId);
return $result;
}
// pobranie szczegółowych informacji na temat danej kategorii
public function GetKategoriaDetale($categoryId)
{
$result = $this->mDoPortal->GetKategoriaDetale($categoryId);
return $result;
}
// pobranie listy produktów przypisanych do danej kategorii
public function GetAktualnosci($categoryId)
{
// wywołanie metody warstwy danych, która udostępnia listę produktów
$result = $this->mDoPortal->GetAktualnosci($categoryId);
// zwrócenie wyniku
return $result;
}
}
//koniec klasy BoPortal
?> |
a teraz warstwa prezentacji plik funtion.load_lista_aktualnosci.php
Code: |
<?php
// nazwy funkcji zapisane w plikach modułów dodatków muszą mieć składnię: smarty_typ_nazwa
function smarty_function_load_lista_aktualnosci($params, $smarty)
{
$products_list = new ListaAktualnosci();
$products_list->init();
// zdefiniowanie zmiennej assign szablonu
$smarty->assign($params['assign'], $products_list);
}
class ListaAktualnosci
{
/* publiczne składowe dostępne z poziomu szablonu Smarty */
public $mAktualnosci;
/* prywatne składowe */
private $mBoPortal;
private $mDepartmentId;
private $mCategoryId;
/* konstruktor */
function __construct()
{
// powołanie obiektu warstwy logiki
$this->mBoPortal = new BoPortal();
// pobranie parametru DepartmentID z żadania GET i rzutowanie wartości na liczbę całkowitą
if (isset($_GET['DepartmentID']))
$this->mDepartmentId = (int)$_GET['DepartmentID'];
// pobranie parametru CategoryID z żadania GET i rzutowanie wartości na liczbę całkowitą
if (isset($_GET['CategoryID']))
$this->mCategoryId = (int)$_GET['CategoryID'];
}
/* init */
function init()
{
// jeśli jest przeglądana kategoria, lista produktów zostanie pobrana dzięki wywołaniu
// metody GetProductsInCategory (warstwa logiki)
if (isset($this->mCategoryId))
$this->mAktualnosci = $this->mBoPortal->GetAktualnosci($this->mCategoryId);
}
} //koniec klasy
?> |
plik lista_aktualnosci.tpl
Code: | {* lista_aktualnosci.tpl *}
{load_lista_aktualnosci assign="lista_aktualnosci"}
<table cellspacing="0" border="0">
<tr>
{section name=k loop=$lista_aktualnosci->mAktualnosci}
{if $smarty.section.k.index !=0 && $smarty.section.k.index % 2 == 0}
</tr>
<tr>
{/if}
<td>
<table cellPadding="0" align="left">
<tr>
<td valign="top" width="200">
<span class="ProductName">
{$lista_aktualnosci->mAktualnosci[k].titel}
</span>
<br /><br />
<span class="ProductDescription">
{$lista_aktualnosci->mAktualnosci[k].description}
<br /><br />
Data dodania:
</span>
<span class="ProductPrice">
{$lista_aktualnosci->mAktualnosci[k].data}
</span>
</td>
</tr>
</table>
</td>
{/section}
</tr>
</table> |
plik index.tpl
Code: | {* smarty *}
{config_load file="site.conf"}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3c.org/1999/xhtml" xml:lang="pl" lang="pl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-2" />
<title>{#sitetitle#}</title>
<link rel="stylesheet" type="text/css" href="styl.css" />
</head>
<body>
<div id="nagl">
{include file="header.tpl"}
</div>
<div id="calosc">
<div id="pierwszakolumna">
{include file="lista_dzialow.tpl"}
{include file="$categoriesCell"}
</div>
<div id="tresc">
{include file="$pageContentsCell"}
{include file="$list"}
</div>
<div id="trzeciakolumna">
Zawartość trzeciej kolumny
</div>
</div>
<div id="stopka">
<h6>Stopka</h6>
</div>
</body>
</html> |
i sam index.php
Code: | <?php
// Za?adowanie biblioteki Smarty i plik?w konfiguracyjnych
require_once 'include/app_top.php';
//zaladowanie kodu warstwy biznesowej
require_once SITE_ROOT.'/warstwa_biznesowa/bo_portal.php';
// Za?adowanie pliku szablonu Smarty
$page = new Page();
$pageContentsCell = "blank.tpl";
$categoriesCell = "blank.tpl";
$list = "blank.tpl";
//jesli jest przegladany dzial, trzeba pobrac szczegolowe dane na jego temat
if (isset($_GET['DepartmentID']))
{
$pageContentsCell = "dzial.tpl";
$categoriesCell = "lista_kategorii.tpl";
if (isset($_GET['CategoryID']))
$list ="lista_aktualnosci.tpl";
}
$page->assign("pageContentsCell", $pageContentsCell);
$page->assign("categoriesCell", $categoriesCell);
$page->assign("list", $list);
$page->display('index.tpl');
// Za?adowanie kodu app_bottom odpowiedzialnego za zako?czenie po??czenia z baz? danych
require_once 'include/app_bottom.php';
?> |
Jak rozdzielic, ze jesli przegladam Categorie Aktualnosci wykona sie szablon lista_aktualnosci.tpl ( ktory posiada naglowki titel, description, data dodania) a jesli przegladam Categorie Turystyka wykona sie szablon turystyka.tpl (oczywiscie szablon ten jest jeszcze nie utworzony , ale bedzie posiadal np naglowki - titel, zdjecie, opis itp. czyli inne dane). Zaznaczam ze te categorie sa w jednym dziale pt" Miasto".
Szubert licze na twoja pomoc bo tylko Ty chyba jestes w temacie jesli chodzi o ta ksiazke i masz napewno pojecie w pisaniu takiego systemu. Pozdrawiam Fellow. |
|
Back to top |
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|