contributte / planette-site

💀 [DISCONTINUED] All the roads go through the Planette
https://planette.vercel.app
MIT License
9 stars 3 forks source link

2015-04-24: dynamicky-formular-jako-modul-draft #35

Open paveljanda opened 7 years ago

paveljanda commented 7 years ago

Tento návod by měl posloužit všem, kteří s Nette frameworkem teprve začínají a potřebují detailnější návod krok za krokem. Dozvíte se zde, jak v Nette framework založit nový modul, který bude obsahovat formulář s dynamickým počtem prvků a závislými selecty.

Co budeme potřebovat

Slovníček pojmů

Dynamický formulář:

Začínáme s Nette Frameworkem

Pro samotné rozchození Nette Frameworku existuje nejeden detailní návod. Bude tedy následovat jen zjednodušený postup.

Stažení a rozbalení frameworku

Ze stránek Nette Framework download stáhneme nejnovější zip archiv zvýrazněný v samotném záhlaví stránky. V době psaní tohoto návodu se jedná o Nette Framework 2.0.3 pro PHP 5.3 nebo 5.4

Po rozbalení tohoto archivu nalezneme složku nazvanou "sandbox", která obsahuje základní a doporučenou adresářovou strukturu aplikace. Obsah složky sandbox zkopírujeme do složky projektu. Význam a obsah jednotlivých složek je popsán ve výborném návodu nazvaném začínáme. Pokud jsme udělali všechno správně, měla by nás po zadání webové adresy projektu do prohlížeče přivítat následující stránka.

nette-framework-quickstart.png

Vytvoření modulu

Když bychom chtěli mít na jedné webové adrese více než jednu aplikaci (například webovou prezentaci, eshop, redakční systém a třeba nástroj na faktury), je technologie modulů to co nám umožní zachovat i v tak rozsáhlém kódu pořádek. Umožňuje oddělit jednotlivé "aplikace" do samostatných složek a přesto zachovat doporučenou strukturu pro oddělení Modelů, Presenterů a Tempalte.

Osobně preferuji vždy ukládat kód do modulů, jelikož nikdy nevím, kdy se bude muset přidat další technologie, která se stávajícím projektem nemá nic společného, nebo kdy se rozhodnu jednotlivou část umístit na vlastní server například z důvodu bezpečnosti nebo výkonu.

Nejprve upravíme výchozí routu v souboru bootstrap.php aby směřovala na nově vznikající modul. Detailní rozbor jak vytvářet routy nalezneme v manuálu Routování URL. Pro účel tohoto návodu postačí, když nahradíme výchozí routy za následující kód:

// Setup router
//$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
//$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
$container->router[] = new Route('index.php', 'DynamicForm:DynamicForm:default', Route::ONE_WAY);
$container->router[] = new Route('<presenter>/<action>[/<id>]', array(
        'module' => 'DynamicForm',
        'presenter' => 'DynamicForm',
        'action' => 'default'
));

Tím jsme řekli Nette Frameworku, že když někdo zadá do prohlížeče adresu našeho projektu, první co uvidí bude akce default umístěná v presenteru DynamicForm který bude umístěn v modulu DynamicForm. Jelikož modul ani jeho presenter ještě neexistuje, přivítá nás následující stránka, která nám pomůže vytvořit vše potřebné.

cannot-load-presenter.png

Jak je z chybové zprávy patrnné, budeme potřebovat založit složku modulu. Bude vhodné rovnou založit i základní strukturu podsložek (models, presenters a templates) to vše ve složce app umístěné v kořenovém adresáři projektu. Měli bychom dodržet jmennou konvenci a v názvu uvést, že se jedná o modul uvedením koncovky "Module". Výsledek by tedy měl vypadat následovně:

app/
+-- config/
+-- DynamicFormModule
        +-- models
        +-- presenters
        +-- temlates
+-- models/
+-- presenters/
+-- templates/
+-- bootstrap.php

Do složky presenters v adresáři modulu vytvoříme soubor BasePresenter.php který bude obsahovat základní presenter našeho modulu. Tento presenter nám poslouží vždy, když budeme potřebovat nastavit něco společného pro všechny presentery v tomto modulu, ale nebudeme tím chtít ovlivnit jiné moduly. A to se může stát dříve či později, tak se na to připravíme a vytvoříme si základní presenter. Však nám ruce neupadnou. ;) Soubor BasePresenter.php bude obsahovat následující kód:

<?php

namespace DynamicFormModule;

/**
 * BasePresenter
 * @author Pavel Železný <info@pavelzelezny.cz>
 */
class BasePresenter extends \BasePresenter
{

}

Jak můžeme vidět, aby se nepletl BasePresenter modulu od BasePresenteru celé aplikace, využívá se technologie jmenných prostorů, která přichází až s PHP 5.3.

Dále vytvoříme soubor DynamicFormPresenter.php který bude obsluhovat vykreslovaní našeho formuláře a který umístíme do složky presenters v adresáři našeho modulu. Obsah tohoto souboru bude následnovný:

<?php

namespace DynamicFormModule;

/**
 * DynamicFormPresenter
 * @author Pavel Železný <info@pavelzelezny.cz>
 */
class DynamicFormPresenter extends \DynamicFormModule\BasePresenter
{

        /**
         * Render default action
         * @author Pavel Železný <info@pavelzelezny.cz>
         * @return void
         */
        public function renderDefault()
        {

        }

}

Doporučení Davida Grudla zde na fóru (Nápověda k editaci stránek) je neuvádět zbytečně jmenné prostory při volání tříd, ale posuďte sami, jak snadno se jeden zplete, když se základní presenter aplikace a modulu jemnují stejně a rozdíl by zde byl pouze v uvední zpětného lomíka před názvem \BasePresenter.

Od tohoto momentu máme připravený základ modulu. Nyní nás po zadání webové adresy projektu do prohlížeče přivítá následující stránka:

page-not-found.png

Zde nás Nette Framework informoval, že mu ještě schází výchozí latte šablona pro náši akci. Vytvoříme tedy soubor default.latte umístěný v příslušném adresáři (///app/DynamicFormModule/templates/DynamicForm/default.latte//), jak nám radí chybová zpráva. Obsah souboru bude následovný:

{**
  * Template for default action of DynamicFormPresenter
  * @author Pavel Železný <info@pavelzelezny.cz>
  *}

{block content}
<div id="banner">
        <h1>Dynamic Form</h1>
</div>
<div id="content">
        <h2>You have successfully created your Nette Framework module.</h2>
</div>
{/block}

Jakmile teď vstoupíme na adresu našeho projektu, uvítá nás následující stránka:

dynamic-form-module-start.png

Tímto máme připravený píseček v podobě nového modulu, do kterého budeme následovně vykreslovat dynamický formulář s dynamickým počtem prvků a závislými selectboxy.

paveljanda commented 7 years ago

author: 2027 ()