nette/application 3.2: presentery ve vlastních adresářích

- David Grudl
- Nette Core | 8285
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 | 2668
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. 2024 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. 2024 14:36)

- David Grudl
- Nette Core | 8285
@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 | 281
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 | 8285
@MKI-Miro to #[Requires] v kódu vyžaduje úplně
nejnovější verzi Nette Application, zkus composer update