
Ovako mi izgleda organizacija foldera:
- 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:
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:
$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:
$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:
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]