ZF - Problemi i diskusija
29.03.2009. u 17:06 · pre 213 meseci
#1
Pre neki dan sam konačno naterao sebe da počnem da proučavam taj Zend Framework. Najpre nisam znao kako da krenem da ga radim, pa rek'o aj da probam ovaj moj lični sajt da odradim preko ZF-a, čisto vežbe radi. I taj tkz. public deo sajta sam odradio bez problema, ali naišao sam na problem kada sam krenuo da radim admin modul, tačnije, nisam mogao ni da krenem da ga radim.
Problem mi pravi to što nikako nisam mogao da "nateram" ZF, odnosno njegov FrontController, da vidi oba modula (default i admin).
Ovako mi izgleda organizacija foldera:
Primetićete da u modulima nema onog foldera "views". To je zato što sam se odlučio da u kombinaciji sa Zend-om, umesto onog njegovom ugrađenom template sistema, koristim Smarty. Znam da time automatski gubim mogućnost korišćenja onih silnih helper-a, ali navikao sam na Smarty i nije mi nikakav problem da časkom napišem neki plug-in za njega koji će da zameni odgovarajući helper.
U tom cilju, dodao sam klasu koja se izvodi iz Zend_View_Abstract i njen kod izgleda ovako:
Posle u bootstrap-u samo kažem Zend_Controller-u da koristi ovu klasu umesto one default Zend_View klase:
Da li je to pravi način kad nameravam da imam više modula?
E sad, to sve lepo radi za ovaj default modul, ali za admin nikako... Ja sam samo hteo da umesto da dodajem nove kontrolere, modele i templejte za admin u okviru default modula, dodam ceo modul admin, koji će takođe imati svoje kontrolere, modele i templejte, a koji bi se takođe pozivao iz public foldera, tačnije, preko index.php.
U tom cilju, u onom delu bootstrap-a za definisanje direktorijuma kontrolera sam napisao ovako:
Da li je to ok? Opet kažem, default modul radi super, ali kad pokušam da se "zakačim" na admin (npr. 127.0.0.1/zf_test/admin/index), baci se onaj izuzetak, tipa: Invalid controller specifed (error), ili tako nešto...
Ako vam išta znači, ovako mi izgleda ostatak bootstrap fajla, odnonso, onaj početni deo, pre ova dva koja sam vam ispisao:
Da li bi možda bolji pristup bio da napravim jedan novi folder admin, koji bi, kao i public, opet imao svoj index.php (bootstrap), htaccess, itd., pa da onda on radi samo sa tim admin modulom? To bi verovatno i radilo, ali ja bih samo voleo da rešim taj problem korišćenja više modula, na jednom bootstrap-u (index.php).
Unapred hvala.
mister rap: naslov teme
[Ovu poruku je menjao Mister_rap dana 18.06.2009. u 22:16 GMT+1]
Ovako mi izgleda organizacija foldera:
Code:
- app
- default
- controllers
- models
- templates
- scripts
- themes
- admin
- controllers
- models
- templates
- scripts
- themes
- data
- logs
- tmp
- templates_c
- uploaded_files
- libs
- Smarty
- Zend
SmartyTemplater.php
- public
- css
- img
- js
index.php
htaccess
- app
- default
- controllers
- models
- templates
- scripts
- themes
- admin
- controllers
- models
- templates
- scripts
- themes
- data
- logs
- tmp
- templates_c
- uploaded_files
- libs
- Smarty
- Zend
SmartyTemplater.php
- public
- css
- img
- js
index.php
htaccess
Primetićete da u modulima nema onog foldera "views". To je zato što sam se odlučio da u kombinaciji sa Zend-om, umesto onog njegovom ugrađenom template sistema, koristim Smarty. Znam da time automatski gubim mogućnost korišćenja onih silnih helper-a, ali navikao sam na Smarty i nije mi nikakav problem da časkom napišem neki plug-in za njega koji će da zameni odgovarajući helper.
U tom cilju, dodao sam klasu koja se izvodi iz Zend_View_Abstract i njen kod izgleda ovako:
Code:
include_once('Smarty/Smarty.class.php');
class SmartyTemplater extends Zend_View_Abstract
{
protected $_path;
protected $_engine;
public function __construct($template_dir, $compile_dir)
{
$this->_engine = new Smarty();
$this->_engine->template_dir = $template_dir;
$this->_engine->compile_dir = $compile_dir;
}
public function getEngine()
{
return $this->_engine;
}
public function setCompileDir($compile_dir)
{
$this->_engine->compile_dir = $compile_dir;
}
public function getCompileDir()
{
return $this->_engine->compile_dir;
}
public function __set($key, $val)
{
$this->_engine->assign($key, $val);
}
public function __get($key)
{
return $this->_engine->get_template_vars($key);
}
public function __isset($key)
{
return $this->_engine->get_template_vars($key) !== null;
}
public function __unset($key)
{
$this->_engine->clear_assign($key);
}
public function assign($spec, $value = null)
{
if (is_array($spec)) {
$this->_engine->assign($spec);
return;
}
$this->_engine->assign($spec, $value);
}
public function clearVars()
{
$this->_engine->clear_all_assign();
}
public function render($name)
{
return $this->_engine->fetch(strtolower($name));
}
public function _run()
{
}
}
include_once('Smarty/Smarty.class.php');
class SmartyTemplater extends Zend_View_Abstract
{
protected $_path;
protected $_engine;
public function __construct($template_dir, $compile_dir)
{
$this->_engine = new Smarty();
$this->_engine->template_dir = $template_dir;
$this->_engine->compile_dir = $compile_dir;
}
public function getEngine()
{
return $this->_engine;
}
public function setCompileDir($compile_dir)
{
$this->_engine->compile_dir = $compile_dir;
}
public function getCompileDir()
{
return $this->_engine->compile_dir;
}
public function __set($key, $val)
{
$this->_engine->assign($key, $val);
}
public function __get($key)
{
return $this->_engine->get_template_vars($key);
}
public function __isset($key)
{
return $this->_engine->get_template_vars($key) !== null;
}
public function __unset($key)
{
$this->_engine->clear_assign($key);
}
public function assign($spec, $value = null)
{
if (is_array($spec)) {
$this->_engine->assign($spec);
return;
}
$this->_engine->assign($spec, $value);
}
public function clearVars()
{
$this->_engine->clear_all_assign();
}
public function render($name)
{
return $this->_engine->fetch(strtolower($name));
}
public function _run()
{
}
}
Posle u bootstrap-u samo kažem Zend_Controller-u da koristi ovu klasu umesto one default Zend_View klase:
Code:
$vr = new Zend_Controller_Action_Helper_ViewRenderer();
$vr->setViewScriptPathSpec(BASE_PATH . 'app/:module/templates/scripts/:controller/:action.:suffix');
$vr->setView(new SmartyTemplater(BASE_PATH . 'app/', BASE_PATH . 'data/tmp/templates_c'));
$vr->setViewSuffix('tpl');
Zend_Controller_Action_HelperBroker::addHelper($vr);
$vr = new Zend_Controller_Action_Helper_ViewRenderer();
$vr->setViewScriptPathSpec(BASE_PATH . 'app/:module/templates/scripts/:controller/:action.:suffix');
$vr->setView(new SmartyTemplater(BASE_PATH . 'app/', BASE_PATH . 'data/tmp/templates_c'));
$vr->setViewSuffix('tpl');
Zend_Controller_Action_HelperBroker::addHelper($vr);
Da li je to pravi način kad nameravam da imam više modula?
E sad, to sve lepo radi za ovaj default modul, ali za admin nikako... Ja sam samo hteo da umesto da dodajem nove kontrolere, modele i templejte za admin u okviru default modula, dodam ceo modul admin, koji će takođe imati svoje kontrolere, modele i templejte, a koji bi se takođe pozivao iz public foldera, tačnije, preko index.php.
U tom cilju, u onom delu bootstrap-a za definisanje direktorijuma kontrolera sam napisao ovako:
Code:
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory(array('default' => BASE_PATH . 'app/default/controllers', 'admin' => BASE_PATH . 'app/admin/controllers'));
$front = Zend_Controller_Front::getInstance();
$front->setControllerDirectory(array('default' => BASE_PATH . 'app/default/controllers', 'admin' => BASE_PATH . 'app/admin/controllers'));
Da li je to ok? Opet kažem, default modul radi super, ali kad pokušam da se "zakačim" na admin (npr. 127.0.0.1/zf_test/admin/index), baci se onaj izuzetak, tipa: Invalid controller specifed (error), ili tako nešto...
Ako vam išta znači, ovako mi izgleda ostatak bootstrap fajla, odnonso, onaj početni deo, pre ova dva koja sam vam ispisao:
Code:
date_default_timezone_set("Europe/Belgrade");
define('BASE_PATH', dirname(__FILE__) . '/');
set_include_path('.' . PATH_SEPARATOR . BASE_PATH . 'libs/'
. PATH_SEPARATOR . BASE_PATH . 'app/default/models/'
. PATH_SEPARATOR . BASE_PATH . 'app/admin/models/'
. PATH_SEPARATOR . get_include_path());
include_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
$config = new Zend_Config_Ini(BASE_PATH . 'config.ini');
Zend_Registry::set('config', $config);
$logger = new Zend_Log(new Zend_Log_Writer_Stream(BASE_PATH . 'data/logs/debug.txt'));
Zend_Registry::set('logger', $logger);
$db = Zend_Db::factory($config->database);
$db->query('SET NAMES UTF8');
Zend_Registry::set('db_handler', $db);
Zend_Db_Table::setDefaultAdapter($db);
date_default_timezone_set("Europe/Belgrade");
define('BASE_PATH', dirname(__FILE__) . '/');
set_include_path('.' . PATH_SEPARATOR . BASE_PATH . 'libs/'
. PATH_SEPARATOR . BASE_PATH . 'app/default/models/'
. PATH_SEPARATOR . BASE_PATH . 'app/admin/models/'
. PATH_SEPARATOR . get_include_path());
include_once('Zend/Loader.php');
Zend_Loader::registerAutoload();
$config = new Zend_Config_Ini(BASE_PATH . 'config.ini');
Zend_Registry::set('config', $config);
$logger = new Zend_Log(new Zend_Log_Writer_Stream(BASE_PATH . 'data/logs/debug.txt'));
Zend_Registry::set('logger', $logger);
$db = Zend_Db::factory($config->database);
$db->query('SET NAMES UTF8');
Zend_Registry::set('db_handler', $db);
Zend_Db_Table::setDefaultAdapter($db);
Da li bi možda bolji pristup bio da napravim jedan novi folder admin, koji bi, kao i public, opet imao svoj index.php (bootstrap), htaccess, itd., pa da onda on radi samo sa tim admin modulom? To bi verovatno i radilo, ali ja bih samo voleo da rešim taj problem korišćenja više modula, na jednom bootstrap-u (index.php).
Unapred hvala.
mister rap: naslov teme
[Ovu poruku je menjao Mister_rap dana 18.06.2009. u 22:16 GMT+1]