nette/application 3.2: presentery ve vlastních adresářích
- David Grudl
- Nette Core | 8227
Přidal jsem do Nette Application 3.2 nativní podporu pro umístění presenterů ve vlastních samostaných adresářích (Zatím v 3.2.x-dev větvi).
Myslím tím tuto strukturu, kdy XyzPresenter
a jeho šablony se
nachází ve složce Xyz
.
├── <b>@layout.latte</b> ├── <b>Home/</b> │ ├── <b>HomePresenter.php</b> | └── <b>default.latte</b> ├── <b>Article/</b> │ ├── <b>ArticlePresenter.php</b> | └── <b>add.latte</b> | └── <b>edit.latte</b>
V definici mapování dvojici Xyz\Xyz
představuje
**
. Následující zápis namapuje například presenter
Admin:Dashboard
na třídu
App\Modules\Admin\Dashboard\DashboardPresenter
:
application:
mapping: App\Modules\*\**Presenter
A co šablony? Pokud neexistuje podsložka (nebo nadsložka)
templates/
, dohledává metoda presenteru
formatTemplateFiles()
nově i šablony přímo ve složce
presenteru. Totéž se týká metody formatLayoutTemplateFiles()
,
která navíc dovoluje umístit šablonu s layoutem i o složku výše, tedy
na stejné úrovni jako jsou presenterové adresáře (viz struktura).
Budu rád, když to otestujete a napíšete připomínky a podněty.
- Šaman
- Člen | 2662
Super! Tuhle strukturu používám už dlouho, jen layout se dohledává
odspodu ve všech složkách presenterů od kterých se dědí, až dokud se
nenarazí na Nette\Application\UI\Presenter
. (Základní layout je
u BasePresenter, ale v něm mám vlastně jen tohle změněné dohledávání
šablon:)
Editoval Šaman (8. 4. 12:38)
- stpnkcrk
- Generous Backer | 190
@DavidGrudl Používám zanořené module, dřívější chování traverzovalo při hledání layoutu až „nahoru“ na úroveň prvního modulu. Prvek 4 v prvním výpisu.
Původní mapping: *: Skarab\*Module\Presenters\*Presenter
// Skarab\SystemModule\DeveloperModule\Presenters\DashboardPresenter
// $this->formatLayoutTemplateFiles()
0 => '/var/www/html/skarab/app/SystemModule/DeveloperModule/Presenters/templates/Dashboard/@layout.latte'
1 => '/var/www/html/skarab/app/SystemModule/DeveloperModule/Presenters/templates/Dashboard.@layout.latte'
2 => '/var/www/html/skarab/app/SystemModule/DeveloperModule/Presenters/templates/@layout.latte'
3 => '/var/www/html/skarab/app/SystemModule/DeveloperModule/templates/@layout.latte'
4 => '/var/www/html/skarab/app/SystemModule/templates/@layout.latte'
Tahle nová feature se v základu dívá jen na ty adresáře přímo kolem presenteru, ale už ne nahoru. Je to záměr?
Nový mapping: *: Skarab\*Module\Presenters\**Presenter
// Skarab\SystemModule\DeveloperModule\Presenters\Dashboard\DashboardPresenter
// $this->formatLayoutTemplateFiles()
0 => '/var/www/html/skarab/app/SystemModule/DeveloperModule/Presenters/Dashboard/@layout.latte'
1 => '/var/www/html/skarab/app/SystemModule/DeveloperModule/Presenters/@layout.latte'
Editoval stpnkcrk (8. 4. 14:36)
- David Grudl
- Nette Core | 8227
@stpnkcrk zatím to tam ještě není, protože si nejsem jistý,
jestli v kombinaci s absencí složky templates/
to nemůže
dělat něco nechtěného.
- MKI-Miro
- Člen | 278
Ahojte
Snazim sa prejst na novu adresarovu strukturu. Ked ale teraz zadam nevalidnu URL tak dostanem chybu
Nette\Application\BadRequestException #405
Method GET is not allowed by App\UI\Error\Error4xx\Error4xxPresenter search►
Pricom Error4xxPresenter vyzera uplne rovnako ako ten v ukazkovom web projekte
<?php
declare(strict_types=1);
namespace App\UI\Error\Error4xx;
use Nette;
use Nette\Application\Attributes\Requires;
/**
* Handles 4xx HTTP error responses.
*/
#[Requires(methods: '*')]
final class Error4xxPresenter extends Nette\Application\UI\Presenter
{
public function renderDefault(Nette\Application\BadRequestException $exception): void
{
// renders the appropriate error template based on the HTTP status code
$code = $exception->getCode();
$file = is_file($file = __DIR__ . "/$code.latte")
? $file
: __DIR__ . '/4xx.latte';
$this->template->httpCode = $code;
$this->template->setFile($file);
}
}
a config:
application:
errorPresenter:
4xx: Error:Error4xx
5xx: Error:Error5xx
catchExceptions: true # bude se při chybě volat error-presenter? (bool) výchozí je true v produkčním režimu
mapping: App\UI\*\**Presenter
Je nieco co som este nezaregistroval? dakujem
- David Grudl
- Nette Core | 8227
@MKI-Miro to #[Requires]
v kódu vyžaduje úplně
nejnovější verzi Nette Application, zkus composer update