Może nie powinny, ale widocznie mają. Podam zasade działania i proszę przetestować. Jest to trójwarstwowa architektura z wykorzystaniem SMARTY i biblioteki PEAR.
Wartswta dostępu do danych, Warstwa reguł bisnessu, Warstwa prezentacji:
Struktura katalogów:
data_obiects/do_catalog.php
bisness_objects/bo_catalog.php
include/top.php, config.inc.php, database.php, setup_smarty.php
libs/
pear/pliki biblioteki PEAR
smarty/pliki SMARTY
smarty_plugins/function.load_dzialy_list.php
templates/
index.tpl
dzialy_list.tpl
templates_c/kompilowane pliki
index.php
Jak to wszystko funkjonuje:
index.php
- Kod: Zaznacz cały
<?php
// Załadowanie biblioteki Smarty i plików konfiguracyjnych
require_once 'include/top.php';
// załadowanie kodu warstwy bisnesowej
require_once SITE_ROOT.'/bisiness_objects/bo_catalog.php';
// Załadowanie szablonu Smarty
$page = new Page();
$page->display('index.tpl');
?>
zaladowany plik top.php w index.php z plikami konfiguracyjnymi
- Kod: Zaznacz cały
<?php
require_once 'config.inc.php';
require_once 'setup_smarty.php';
require_once 'database.php';
$gDbManager = new DbManager(MYSQL_CONNECTION_STRING);
?>
plik config.inc.php
- Kod: Zaznacz cały
// Stała SITE_ROOT zawiera pełną ścieżkę dostępu do folderu fregata
define("SITE_ROOT", dirname(dirname(__FILE__)));
// Parametry konfiguracyjne szablonów Smarty
define("SMARTY_DIR", SITE_ROOT."/libs/smarty/");
define("TEMPLATE_DIR", SITE_ROOT."/templates");
define("COMPILE_DIR", SITE_ROOT."/templates_c");
define("CONFIG_DIR", SITE_ROOT."/configs");
define("PATH_SEPARATOR", ";");
ini_set('include_path', SITE_ROOT . "/libs/pear/" . PATH_SEPARATOR . ini_get('include_path'));
define("USE_PERSISTENT_CONNECTIONS", "true");
define("DB_SERVER", "localhost");
define("DB_USERNAME", "uzytkownik");
define("DB_PASSWORD", "haslo");
define("DB_DATABASE", "nazwadb");
define("MYSQL_CONNECTION_STRING", "mysql://" . DB_USERNAME . ":" .
DB_PASSWORD . "@" . DB_SERVER . "/" . DB_DATABASE);
ustawienia smarty w pliku setup_smarty.php
- Kod: Zaznacz cały
// Odwołanie do biblioteki Smarty
require_once SMARTY_DIR.'Smarty.class.php';
// Odwołanie do własnego pliku konfiguracyjnego
require_once 'config.inc.php';
// Klasa rozszerzająca klasę Smarty, przeznaczona do przetwarzania i wyświetlania
// plików szablonu Smarty
class Page extends Smarty
{
// konstruktor
function __construct()
{
// Wywołanie konstruktora klasy Smarty
$this->Smarty();
// Zmiana domyślnych ścieżek dostępu do katalogów
$this->template_dir = TEMPLATE_DIR;
$this->compile_dir = COMPILE_DIR;
$this->config_dir = CONFIG_DIR;
$this->plugins_dir[0] = SMARTY_DIR . 'plugins';
$this->plugins_dir[1] = SITE_ROOT . "/smarty_plugins";
}
}
database.php
- Kod: Zaznacz cały
require_once 'DB.php';
class DbManager
{
public $db;
function __construct($connectionString)
{
$this->db = DB::connect($connectionString, USE_PERSISTENT_CONNECTIONS);
$this->db->setFetchMode(DB_FETCHMODE_ASSOC);
}
public function DbGetAll($queryString)
{
$result = $this->db->getAll($queryString);
return $result;
}
}
dalsze przetwarzanie pliku index.php i zaladowanie bo_catalog.php
- Kod: Zaznacz cały
require_once SITE_ROOT.'/data_objects/do_catalog.php';
// klasa warstwy logiki odpowiedzialna za pobieranie informacji o pozycjach katalogowych
class BoCatalog
{
/* prywatne składowe */
private $mDoCatalog;
// konstruktor klasy inicjujący obiekt warstwy danych
function __construct()
{
$this->mDoCatalog = new DoCatalog();
}
// pobranie informacji o wszystkich działach
public function GetDzialy()
{
$result = $this->mDoCatalog->GetDzialy();
return $result;
}
}
zaladowanie z warstwy danych do_catalog i pobranie listy dzialow oraz ich id
- Kod: Zaznacz cały
class DoCatalog
{
// konstruktor klasy
function __construct()
{
// odniesienie do obiektu klasy DbManager (powołanego w pliku app_top.php)
$this->dbManager = $GLOBALS['gDbManager'];
}
// pobranie wszystkich informacji o działach
public function GetDzialy()
{
$query_string = "SELECT dzial_id, nazwa FROM dzialy";
$result = $this->dbManager->DbGetAll($query_string);
return $result;
}
}
warstwa prezentacji: laduje plik function.load_dzialy_list.php
- Kod: Zaznacz cały
// nazwy funkcji zapisane w plikach modułów dodatków muszą mieć składnię: smarty_typ_nazwa
function smarty_function_load_dzialy_list($params, $smarty)
{
$dzialy_list = new DepartmentsList();
$dzialy_list->init();
// zdefiniowanie zmiennej assign szablonu
$smarty->assign($params['assign'], $dzialy_list);
}
// Obsługa listy działów
class DepartmentsList
{
/* publiczne składowe dostępne z poziomu szablonu dzial_list.tpl */
public $mDepartments;
public $mSelectedDepartment;
/* prywatne składowe */
private $mBoCatalog;
// konstruktor inicjuje obiekt warstwy logiki i odczytuje parametr ciągu tekstowego żadania GET
function __construct()
{
// powołanie obiektu warstwy pośredniej
$this->mBoCatalog = new BoCatalog();
// jeżli w żądaniu GET występuje parametr DepartmentID, wyświetlane są informacje o dziale sklepu
if (isset($_GET['DepartmentID']))
$this->mSelectedDepartment = (int)$_GET['DepartmentID'];
else
$this->mSelectedDepartment = -1;
}
// wywołanie metody warstwy logiki, która odczyta listę działów i utworzy odpowiednie łącza
function init()
{
// pobranie listy działów z warstwy logiki
$this->mDepartments = $this->mBoCatalog->GetDzialy();
// utworzenie ³±czy listy dzia³ów
for ($i = 0; $i < count($this->mDepartments); $i++)
$this->mDepartments[$i]['onclick'] = "index.php?DepartmentID=" . $this->mDepartments[$i]['dzial_id'];
}
} //koniec klasy
utworzenie pliku do wyswietlenia listy dzialow dzialy_list.tpl
- Kod: Zaznacz cały
{* dzialy_list.tpl *}
{load_dzialy_list assign="dzialy_list"}
{* początek listy działów *}
<table border="0" cellpadding="0" cellspacing="1" width="200">
<tr>
<td class="DepartmentListHead"> Wybierz dział </td>
</tr>
<tr>
<td class="DepartmentListContent">
{* iteracyjna analiza listy działów *}
{section name=i loop=$dzialy_list->mDepartments}
{* ustalenie czy dział jest zaznaczony i dobór odpowiedniej klasy stylu CSS *}
{if ($dzialy_list->mSelectedDepartment == $dzialy_list->mDepartments[i].dzial_id)}
{assign var=class_d value="DepartmentSelected"}
{else}
{assign var=class_d value="DepartmentUnselected"}
{/if}
{* utworzenie łącza dla każdego nowo dodanego działu listy *}
<a class="{$class_d}" href="{$dzialy_list->mDepartments[i].onclick}">
» {$dzialy_list->mDepartments[i].nazwa}
</a>
<br/>
{/section}
</td>
</tr>
</table>
{* koniec listy działów *}
dodanie dzialy_list.tpl do index.tpl
- Kod: Zaznacz cały
{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>
<head>
<meta http-equiv="Content-type" content="text/html; charset=UTF-8" />
<title>{#sitetitle#}</title>
<link href="styl.css" type="text/css" rel="stylesheet"/>
<!--stuczka dla Microsoftu -->
<!--[if lt IE 7]>
<link rel='stylesheet' type='text/css' href='styl-s.css' />
<script src='/ie7/ie7-standard-p.js' type='text/javascript'></script>
<![endif]-->
</head>
<body>
<div id='header'>
naglowek
</div>
<div id='container'>
<div id='first-column'>
{include file="dzialy_list.tpl"}
</div>
<div id='content'>
tresc
</div>
</div>
<div id='footer'>
stopka
</div>
</body>
</html>
i to wlasciwie wszystko. powinna sie wyswietlic lista dzialow pobrana z bazy mysql.Testujcie a jak sa jakies uwagi to pisac w koncu po to sa fora bysmy sobie pomagali. A tak nawiasem mowiac TO ZARZADCY SERWEROW UGU POWINNI WYKAZAC LISTE FUNKCJI JAKIE SA ZABLOKOWANE LUB NIE DOSTEPNE!!! NIE UTRUDNIAJMY SOBIE ZYCIA!
Pozdrawiam
