ACL Adresářová struktura+správné odkazování
- Edward
- Člen | 4
Snažím se dát dohromady to co zde nikde není popsáno.. a to je opravdu modulární adresářová struktura.. použitelná nejen pro CMS, ale také pro jednorázové aplikace..
Zdroje informací z fóra:
- David v příspěvku Adresářová struktura a moduly popisuje novou adresářovou strukturu.
- Panda a jeho skvělá koncepce Dynamického načítání jednotlivých modulů
- Podobná idea na modulární adresářovou strukturu, jen nedotažená do konce (resp. nebylo ukázáno jak toho dosáhnout).
Cíl
Dosáhnout následující adresářové struktury:
app/log/
temp/
presenters/BasePresenter.php
models/BaseModel.php
templates/@layout.phtml
modules/
PagesModule/
FrontPagesModule/
templates/
presenters/
AdminPagesModule/
templates/
presenters/
models/
NewsModule/
FrontNewsModule/
templates/
presenters/
AdminNewsModule/
templates/
presenters/
models/ ....
libs/
document_root/
tedy všechny moduly sjednotit do adresářů a současně mít u každého modulu dvě sekce..
Adresářová struktura modulu
- frontend modulu ve složce (FrontXXXModule)
- administraci modulu ve složce (AdminXXXModule)
- modely jsou společné pro admin i front
Proč taková struktura ?
- Vývoj a verzování (SVN) – Myslím že se to pak bude krásně verzovat.. vše co se týká jednotlivých modulů je na jednom místě a programátor přesně ví kam šáhnout.
- Snadná instalace dalších modulů – Když někdo
vyvine nějaký další modul, mělo by stačit jej jen nakopírovat do složky
modules
, nastavit načítání vconfig.ini
a samozřejmě pak začlenit do příslušných templates. - Snadná konfigurace aplikací – Prostě si nakopírujete jen ty moduly, které opravdu aplikace potřebuje ke své funkčnosti.
Dotazy......
S prezentery problém není, RobotLoader všechny načítá nezávisle na
adresářové struktuře. Potíž je v načítání modelů a
templates. Nejsem schopen a nebo nevím jak nette donutit, aby mi
načítalo uvedenou strukturu.
Vím že se musí zřejmě nějak upravit metody
formatLayoutTemplateFiles
a
formatTemplateFiles
ale bohužel nevím jak. Mohl by mě
někdo vysvětlit jak to funguje ? Výsledný kód celé aplikace zde pak
uveřejním pro ostatní. Díky za reakce..
Editoval Edward (2. 9. 2010 8:10)
- natrim
- Člen | 73
Modely přeci RobotLoader načte taky ne?
Já jen používám jednoduchou service na přístup k nim.
<?php
class Model extends Object {
/** @var array */
private $models;
public function &__get($name) {
if (isset($this->models[$name])) {
return $this->models[$name];
}
if (class_exists(ucwords($name).'Model')) {
$class = ucwords($name).'Model';
$this->models[$name] = new $class;
return $this->models[$name];
}
return parent::__get($name);
}
}
?>
Jinak na templates ve složce modulů používám toto. Je to jednoduchá změna, která hledá šablonu a layout nejdříve v <Presenter>Module/templates.
<?php
public function formatTemplateFiles($presenter, $view) {
$appDir = Environment::getVariable('appDir');
if ($presenter == 'Error') {
$path = '/' . str_replace(':', 'Module/', $presenter);
} else {
$path = '/modules/' . str_replace(':', 'Module/', $presenter);
}
$pathP = substr_replace($path, '/templates', strrpos($path, '/'), 0);
$path = substr_replace($path, '/templates', strrpos($path, '/'));
return array(
"$appDir$pathP/$view.phtml",
"$appDir$pathP.$view.phtml",
"$appDir$path/@global.$view.phtml",
);
}
public function formatLayoutTemplateFiles($presenter, $layout) {
$appDir = Environment::getVariable('appDir');
if ($presenter == 'Error') {
$path = '/' . str_replace(':', 'Module/', $presenter);
} else {
$path = '/modules/' . str_replace(':', 'Module/', $presenter);
}
$pathP = substr_replace($path, '/templates', strrpos($path, '/'), 0);
$list = array(
"$appDir$pathP/@$layout.phtml",
"$appDir$pathP.@$layout.phtml",
);
while (($path = substr($path, 0, strrpos($path, '/'))) !== FALSE) {
$list[] = "$appDir$path/templates/@$layout.phtml";
}
return $list;
}
?>
Editoval natrim (2. 9. 2010 8:20)
- Edward
- Člen | 4
natrim napsal(a):
Modely přeci RobotLoader načte taky ne?
Já jen používám jednoduchou service na přístup k nim.<?php class Model extends Object { /** @var array */ private $models; public function &__get($name) { if (isset($this->models[$name])) { return $this->models[$name]; } if (class_exists(ucwords($name).'Model')) { $class = ucwords($name).'Model'; $this->models[$name] = new $class; return $this->models[$name]; } return parent::__get($name); } } ?>
Můžu se zeptat, jak máš tuto service zavedenou v config.ini
a jak ji pak používáš ve skriptech ? Snažím se teď pochopit services a
hodně by mi to pomohlo.
- srigi
- Nette Blogger | 558
Edward napsal(a):
Můžu se zeptat, jak máš tuto service zavedenou v
config.ini
a jak ji pak používáš ve skriptech ? Snažím se teď pochopit services a hodně by mi to pomohlo.
V principe pre PHP5.3 (namespace):
app/bootstrap.php
...
Environment::setServiceAlias('Project\\Database\\ModelService', 'Model');
...
config.ini
service.Project-Database-ModelService = Project\Database\ModelService
anywhere
$modelService = Environment::getModel(); // umoznuje to ten alias
Editoval srigi (13. 9. 2010 14:32)
- Edward
- Člen | 4
srigi napsal(a):
anywhere$modelService = Environment::getModel(); // umoznuje to ten alias
Díky díky… Inicializaci chápu, takže v libovolném prezenteru pokud chci získat model, může to vypadat například takto ???
class ShopPresenter extends BasePresenter {
public function renderDefault() {
$shopModel = Environment::getShopModel();
$this->template->articles = $shopModel -> getArticles();
}
}
s tím že někde v models mám následující kód, přičemž je jedno kde, protože RobotLoader modely najde stejně jako Presentery že ?
class ShopModel extends DibiRow {
public function getArticles() {
//...
}
}
je to správný předpoklad ?
Editoval Edward (14. 9. 2010 7:23)