Ekonomie, kontejnery a další žhavé novinky v Nette Forms

před 5 lety od David Grudl  

Přehled nejdůležitějších novinek v balíčku nette/forms 3.0.x.

Ekonomické checkbox listy

CheckboxList odesílaný metodou GET se nepřenáší zrovna úsporně, plýtvají znaky a vytváří v URL dlouhou nudli:

?filter[]=val1&filter[]=val2&filter[]=val3&filter[]=val4&filter[]=val5

Novinkou je úspornější a čitelnější přenos ve tvaru:

?filter=val1,val2,val3,val4,val5

Změnu formátu má na starosti skript netteForms.js, který nezapomeňte také zaktualizovat. Tato novinka běží v testovacím režimu a je třeba ji aktivovat pomocí data atributu:

$form = new Form;
$form->setMethod('GET');
$form->setHtmlAttribute('data-nette-compact');

Napište nám do komentářů, jak se vám zjednodušený formát líbí.

Makro {formPrint}

Další novinkou je makro {formPrint nazev-formulare}, které vám usnadní psaní, když si potřebujete pohrát s výstupní podobu formuláře. Makro přepne výstup do speciálního režimu, kdy se místo stránky vygeneruje kód v Latte vykreslující daný formulář. Ten lze snadno označit, zkopírovat do schránky a vložit do šablony, kde už jej upravíte podle potřeby.

Výstup může vypadat třeba takto:

<form n:name="signInForm">
<ul class="error" n:ifcontent>
	<li n:foreach="$form->getOwnErrors() as $error">{$error}</li>
</ul>

<table>
<tr class="required">
	<th>{label username/}</th>
	<td>{input username} <span class="error" n:ifcontent>{inputError username}</span></td>
</tr>
<tr class="required">
	<th>{label password/}</th>
	<td>{input password} <span class="error" n:ifcontent>{inputError password}</span></td>
</tr>
<tr>
	<th></th>
	<td>{input send}</td>
</tr>
</table>
</form>

Respektují se všechna nastavení pro vykreslovač pomocí $form->getRenderer()->wrappers.

Mapování kontejnerů na třídy v PHP 7.4

Používáte formulářové kontejnery, mapování na třídy a PHP 7.4? Pak nemusíte u kontejnerů volat setMappedType(), stačí jen definovat property type:

class FormData
{
	public string $title;
	public AddressFormData $address;
}

class AddressFormData
{
	public string $street;
	public string $city;
	public string $zip;
}

$form = new Form;
$address = $form->addContainer('address');
$address->addText('street');
$address->addText('city');
$address->addText('zip');
$form->onSuccess[] = function ($form, FormData $data) {
	// $data->address je instance AddressFormData
	$street = $data->address->street;
}

Pokud data přijímáte jako pole function ($form, array $data), pak bude pole i $data['address'].

Další novinky letem světem

  • pole addHidden() mají metody setNullable() a addFilter(), stejně jako textové inputy.
  • pole addUpload() si automaticky nastaví pravidlo MAX_FILE_SIZE na maximální povolenou velikost uploadovaného souboru dle PHP konfigurace upload_max_filesize, takže pokus o nahrání většího souboru je zastavený už na straně prohlížeče skriptem netteForms.js.
  • netteForms.js kontroluje na straně prohlížeče i MIME-TYPE. Kontrola byla v minulosti vypnuta kvůli chybě ve Firefoxu.
  • netteForms.js také akceptuje image/webp jakožto obrázek

Komentáře

  1. Teda jako {formPrint} je dokonalej nápad!

    před 5 lety
  2. Jen by mě zajímalo, když budu mít FormData ve zpracování formuláře
    a ve formuláři budu mít $form->addHidden(‚id‘);

    a já budu očekávat id jako int, tak to na mě bude řvát
    FormData ::$id must be int, string used

    takže jak to mám řešit u editaci formuláře?

    před 4 lety · replied [3] Zdeno1981
  3. #2 Zdeno1981 tak jsem si to našel, tak stačí navěsit Rule na $form->addHidden(‚id‘)->addRule(Form::INTEGER);

    před 4 lety

Chcete-li odeslat komentář, přihlaste se