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

David Grudl
Nette Core | 8147
+
+9
-

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 | 2635
+
+1
-

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

@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 | 8147
+
+1
-

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

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

@MKI-Miro to #[Requires] v kódu vyžaduje úplně nejnovější verzi Nette Application, zkus composer update

MKI-Miro
Člen | 271
+
0
-

dakujem nevsimol som si ze je uz aj 3.2.3 verzia