Vlastna adresarova struktura
- Raiper34
- Člen | 65
Zdar,
pre moj projekt mi pride adresarova struktura strasne neprehladna, preto by som chcel svoju. Mala by vapadat nejak takto klasicky v App by bol proste priecinok podla presentera teda nejak takto
Presenter1
Presenter1.php
Templates
Template1.latte
Template2.latte
Models
Model1.php
Model2.php
Ako toho docielit? Viem ze Presenter aj Model si robotLoader najde vsade, len tie tempplaty neviem takto urobit aby mohli byt… :/
Editoval Raiper34 (25. 8. 2015 14:04)
- chemix
- Nette Core | 1310
Ahoj, osobně bych u struktury zůstal, ze začátku jsem měl také snahu to nějak ohýbat, ale pak jsem se poddal a jsem rád že jsem nevymýšlel kola (nebo hovadiny) a čas věnoval něčemu užitečnějšímu. Ale chápu, že můžou být komplikovanější dohledávácí postupy pro šablony.
Ale tak jako tak, v presenteru je metoda co dohledává šablony
/**
* Formats view template file names.
* @return array
*/
public function formatTemplateFiles()
{
$name = $this->getName();
$presenter = substr($name, strrpos(':' . $name, ':'));
$dir = dirname($this->getReflection()->getFileName());
$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
return array(
"$dir/templates/$presenter/$this->view.latte",
"$dir/templates/$presenter.$this->view.latte",
);
}
plus ještě formatLayoutTemplateFiles
- Šaman
- Člen | 2666
Modely nepatří pod presenter! Modely (přesněji modelové třídy – model bývá jen jeden a není to kus kódu, ale logická vrstva aplikace) si dej ideálně někam zcela mimo presentery a šablony.
Co se šablon týče, tak ty se dohledávají relativně k presenteru
pomocí metod presenteru formatTemplateFiles
a
formatLayoutTemplateFiles
pro layouty.
Používám tohle nastavení, šablony se pak hledají přímo v adresáři
presenteru, pak v podadresáři /templates a když se tam nenajdou, tak kvůli
kompatibilitě se ještě hledají podle původního algoritmu Nette. Stejnou
strukturu mám i u šablon komponent a je to krásně přehledné, dokud na
tom dělá jen programátor. Problém bude, pokud bys celý projekt dal
kodérovi – pak má šablony roztahané po celém projektu.
<?php
// BasePresenter.php
public function formatTemplateFiles()
{
$name = $this->getName();
$presenter = substr($name, strrpos(':' . $name, ':'));
$dir = dirname($this->getReflection()->getFileName());
$templateFiles = [
"$dir/$this->view.latte",
"$dir/templates/$this->view.latte",
"$dir/$presenter.$this->view.latte",
"$dir/templates/$presenter.$this->view.latte",
];
$originalTemplateFiles = parent::formatTemplateFiles();
return array_merge($templateFiles, $originalTemplateFiles);
}
public function formatLayoutTemplateFiles()
{
$layoutFiles = [];
$reflection = $this->getReflection();
while( $reflection->getName() !== 'Nette\Application\UI\Presenter' )
{
$dir = dirname($reflection->getFileName());
$layoutFiles[] = "$dir/@layout.latte";
$layoutFiles[] = "$dir/templates/@layout.latte";
$reflection = $reflection->getParentClass();
}
$originalLayoutFiles = parent::formatLayoutTemplateFiles();
return array_merge($layoutFiles, $originalLayoutFiles);
}
?>
- yrow
- Člen | 12
zdravím, vadí nečemu když jsem do této metody přidat označený řadek?
public function formatLayoutTemplateFiles()
{
$name = $this->getName();
$presenter = substr($name, strrpos(':' . $name, ':'));
$layout = $this->layout ? $this->layout : 'layout';
$dir = dirname($this->getReflection()->getFileName());
$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
$list = array(
"$dir/templates/$presenter/@$layout.latte",
"$dir/templates/$presenter.@$layout.latte"
);
do {
$list[] = "$dir/templates/@$layout.latte";
**$list[] = "$dir/presenters/templates/@$layout.latte";** // nové kdyžtak odmazat
$dir = dirname($dir);
} while ($dir && ($name = substr($name, 0, strrpos($name, ':'))));
return $list;
}
Editoval yrow (28. 8. 2015 10:06)