Ekonomie, kontejnery a další žhavé novinky v Nette Forms
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í pravidloMAX_FILE_SIZE
na maximální povolenou velikost uploadovaného souboru dle PHP konfiguraceupload_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
Teda jako {formPrint} je dokonalej nápad!
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?
#2 Zdeno1981 tak jsem si to našel, tak stačí navěsit Rule na $form->addHidden(‚id‘)->addRule(Form::INTEGER);
Chcete-li odeslat komentář, přihlaste se