
Właśnie rozpoczynam pisanie kodu do nowego projektu katalogu internetowego. Projekt nie będzie zbyt wielki. Ma on jedynie służyć prezentacji asortymentu więc zdecydowałem się na zastosowanie Smarty i jakiejś kalsy do obsługi zapytań do MySQL-a (padło na AdoDB). W którymś momencie pisania kodu przyszła pora na obsługę błędów. Skoro mam do dyspozycji na serwerze PHP5 to postanowiłem zastosować wyjątki. I tutaj pojawił się problem. Jak zrobić klasę która będzie na podstawie danego numeru kodu błędu wyświetlać dany szablon .tpl w którym zagnieżdżona będzie odp treść wiadomości. Inaczej mówiąc klasa ta ma mieć narzucone otwieranie góra czterech szablonów (bład zapytania sql, błąd konfiguracji lub bibliotek serwisu, niewłaściwe parametry wchodzące np z GET-a i przerwa konserwacyjna) z których każdy będzie miał przekazywany jakiś tam komunikat. Ale może pokaże najpierw kod jaki do tej pory powstał a potem omówię co jeszcze.
exceptions.php
Kod
class MyException extends Exception
{
public function __construct($code = 0) {
parent::__construct('blad blad', $code);
}
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function NewErrorRedirect() {
//tutaj funckja przekierowująca na nową stronę
}
}
{
public function __construct($code = 0) {
parent::__construct('blad blad', $code);
}
public function __toString() {
return __CLASS__ . ": [{$this->code}]: {$this->message}\n";
}
public function NewErrorRedirect() {
//tutaj funckja przekierowująca na nową stronę
}
}
index.php
Kod
require_once 'page.php';
try {
$str = new PageControler();
$str->smarty -> assign("cats",$str->getCategories());
$str->smarty -> display($str->getView());
}
catch (MyException $e) {
die($e->NewErrorRedirect());
}
try {
$str = new PageControler();
$str->smarty -> assign("cats",$str->getCategories());
$str->smarty -> display($str->getView());
}
catch (MyException $e) {
die($e->NewErrorRedirect());
}
page.php
Kod
require_once 'smarty/Smarty.class.php';
require_once 'adodb/adodb.inc.php';
require_once 'exceptions.php';
class PageControler {
private $db;
public $smarty;
private $settings = array();
function getSettings() {
$config = parse_ini_file("config.ini", TRUE);
return $config;
}
function __construct() {
$this->settings = $this->getSettings();
$this->settings['view'] = $this->getView();
$this->settings['id'] = $this->getId();
$this->smarty = new Smarty();
$this->smarty->template_dir = $this->settings['smarty']['szablony'];
$this->smarty->compile_dir = $this->settings['smarty']['kompilacja'];
$this->smarty->cache_dir = $this->settings['smarty']['bufor'];
$this->db = ADONewConnection($this->settings['db']['type']);
if(!$this->db->Connect($this->settings['db']['host'],$this->settings['db']['user'],$this->settings['db']['passwd'], $this->settings['db']['database']))
throw new MyException (10003);
}
public function getView() {
$this->settings['view'] = $_GET['view'];
}
public function getId() {
$this->settings['id'] = $_GET['id'];
}
}
require_once 'adodb/adodb.inc.php';
require_once 'exceptions.php';
class PageControler {
private $db;
public $smarty;
private $settings = array();
function getSettings() {
$config = parse_ini_file("config.ini", TRUE);
return $config;
}
function __construct() {
$this->settings = $this->getSettings();
$this->settings['view'] = $this->getView();
$this->settings['id'] = $this->getId();
$this->smarty = new Smarty();
$this->smarty->template_dir = $this->settings['smarty']['szablony'];
$this->smarty->compile_dir = $this->settings['smarty']['kompilacja'];
$this->smarty->cache_dir = $this->settings['smarty']['bufor'];
$this->db = ADONewConnection($this->settings['db']['type']);
if(!$this->db->Connect($this->settings['db']['host'],$this->settings['db']['user'],$this->settings['db']['passwd'], $this->settings['db']['database']))
throw new MyException (10003);
}
public function getView() {
$this->settings['view'] = $_GET['view'];
}
public function getId() {
$this->settings['id'] = $_GET['id'];
}
}
No i na zakończenie. Problem jest taki żeby klasa PageControler przekazywała jedynie kod błędu do klasy Exception a ta będzie robiła resztę.... Chyba że takie rozwiązanie jest bezsensowne to oczywiście też chętnie posłucham uwag krytycznych :-)
Pozdr.
Nikt nie wie czy wie ale nie powie

Sorki ale czy to jest jakieś idiotyczne pytanie czy nikt poprostu nie wie
