ACL Adresářová struktura+správné odkazování

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Edward
Člen | 4
+
0
-

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:

  1. David v příspěvku Adresářová struktura a moduly popisuje novou adresářovou strukturu.
  2. Panda a jeho skvělá koncepce Dynamického načítání jednotlivých modulů
  3. 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 ?

  1. 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.
  2. 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í v config.ini a samozřejmě pak začlenit do příslušných templates.
  3. 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
+
0
-

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)

despiq
Člen | 320
+
0
-

komar → velbloud

ACL != Acces Control List ?

Editoval despiq (2. 9. 2010 21:16)

Edward
Člen | 4
+
0
-

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 | 555
+
0
-

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
+
0
-

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)