/ Gists / Nette-Forms

Gists - Nette-Forms

On gists

Nette form - filter

Nette Nette-Forms Helpers-Filters-Plugins

nette-filter.php #

<?php

$form->addText('zip', 'PSČ:')
    ->addCondition($form::FILLED)
    ->addFilter(function ($value) {
        return str_replace(' ', '', $value);
    });

On gists

Nette - error hlášky

Nette Nette-Forms

nette-form-error-msg.latte #

{$form[name]->errors} - vraci pole chyb toho inputu
{$form[name]->error} - vraci retezec s chybami spojenych mezerou (obvykle ma input jen jeden error, takze tohle je asi nejlepsi)
{inputError name} - makro, ktere vypise chybu inputu


{$form[name]->hasErrors()}


<input n:name="number">
<span class=error n:ifcontent>{inputError number}</span>

On gists

Nette reset hodnot ve formuláři po odeslání

Nette Nette-Forms

nette-reset.php #

<?php

 $form->setValues(array(), TRUE);

On gists

From https://forum.nette.org/cs/24327-jak-ve-formulari-vypnout-editaci-pole-ale-zobrazit-data#p162878

Nette Nette-Forms Nette-Tricks

nette-readonly.php #

$input = $form->addInput('text');
$input->setDisabled(true); // nejdřív vypnout editaci
$input->setOmitted(false); // potom vypnout neodesílání

On gists

Ruční vykreslení formuláře v Nette (skoro ruční)

Nette Nette-Forms Nette-Tricks Nette-Latte

semi-manual-form-renderning.latt #

{form $form}
<ul class=error n:if="$form->ownErrors">
	<li n:foreach="$form->ownErrors as $error">{$error}</li>
</ul>

<table>
<tr n:foreach="$form->controls as $input" n:class="$input->required ? required">
	<th>{label $input /}</th>
	<td>{input $input} <span class=error n:ifcontent>{$input->error}</span></td>
</tr>
</table>
{/form}

On gists

From http://pavelbier.cz/tagged/nette

Nette Nette-Forms

nette-formular-ukazka.php #

require_once('./Nette/loader.php');

define(HESLO_MIN_ZNAKU,6);
define(URL_ADRESA_OBCHODNICH_PODMINEK,'http://www.example.com/');

function loginValidator($item){
  return dibi::query('SELECT [id] FROM [zakaznici] WHERE [nick]=%s LIMIT 1',$item->getValue())->count() == 0 ? true : false;
}


$form = new Form('registracni_formular');
$form->setMethod('post');
$form->getElementPrototype()->id = 'registrace';
$form->getElementPrototype()->class = 'formular';
$form->addGroup('Přihlašovací údaje');
$form->addText('nick','Login:',25)
     ->addRule(Form::FILLED, 'Login nebyl vyplněn')
     ->addRule('loginValidator', 'Tento login již existuje');
$form->addPassword('heslo','Heslo:',25)
      ->addRule(Form::FILLED, 'Heslo nebylo vyplněno')
      ->addRule(Form::MIN_LENGTH, 'Heslo je příliš krátké', HESLO_MIN_ZNAKU)
      ->setOption('description','Heslo musí mít minimálně '.HESLO_MIN_ZNAKU.' znaků'); 
$form->addPassword('heslo2','Zopakujte heslo:',25)
      ->addRule(Form::FILLED, 'Heslo nebylo vyplněno')
      ->addRule(Form::EQUAL, 'Hesla se neshodují',$form['heslo']); 

$form->addGroup('Povinné údaje');

$form->addText('email', 'Email:',35)
      ->addRule(Form::FILLED, 'Email nebyl vyplněn')
      ->addRule(Form::EMAIL, 'Zadaný email není platným emailem')
      ->emptyValue = '@';

$typ_osoby = array(
  '1' => 'Fyzická osoba',
  '2' => 'Právnická osoba',
);

$form->addRadioList('typ', 'Typ:', $typ_osoby)->addRule(Form::FILLED, 'Vyberte typ registrovaného subjektu')->addCondition(Form::EQUAL, 2)->toggle('povinneUdajePravnicka');
$form->addText('jmeno','Jméno:',35)->addRule(Form::FILLED, 'Zadejte jméno');
$form->addText('prijmeni','Příjmení:',35)->addRule(Form::FILLED, 'Zadejte příjmení');
$form->addText('ulice','Ulice:',35)->addRule(Form::FILLED, 'Zadejte ulici');
$form->addText('mesto','Město:',35)->addRule(Form::FILLED, 'Zadejte město');
$form->addText('psc','PSČ:',35)->addRule(Form::FILLED, 'Zadejte PSČ');
$souhlasLabel = Html::el()->setHtml('Souhlasím s <a href="'.URL_ADRESA_OBCHODNICH_PODMINEK.'" target="_blank">obchodními</a> podmínkami.');
$form->addCheckbox('souhlas', $souhlasLabel)->addRule(Form::FILLED, 'Pro pokračování je nutné souhlasit s podmínkami.');

$form->addGroup('Povinné údaje právnické osoby')->setOption('container', Html::el('fieldset')->id('povinneUdajePravnicka'));
$form->addText('firma','Firma:',35)->addConditionOn($form['typ'], Form::EQUAL, 2)->addRule(Form::FILLED,'Zadejte firmu');
$form->addText('ico','IČO:',35)->addConditionOn($form['typ'], Form::EQUAL, 2)->addRule(Form::FILLED,'Zadejte IČO');
$form->addText('dic','DIČ:',35)->addConditionOn($form['typ'], Form::EQUAL, 2)->addRule(Form::FILLED,'Zadejte DIČ');
$form->addGroup('Nepovinné údaje')->setOption('container', Html::el('fieldset')->id('nepovinneUdaje'));
$form->addText('telefon','Telefon:',35);
$form->addText('mobil','Mobil:',35);
$form->addText('fax','Fax:',35);
$form->setCurrentGroup(NULL);

$form->addSubmit('ok','Registrovat se')->getControlPrototype()->class = 'submit';
$form->addProtection('Vypršela platnost formuláře.');

if ($form->isSubmitted() and $form->isValid()) {
  $values = $form->getValues();
  unset($values['heslo2']);
  unset($values['souhlas']);
  $ok = dibi::query('INSERT INTO [zakaznici] %v',$values);
  //..... nasleduje redirect
  
} else {

  $defaults = array('typ'=>1);
  $form->setDefaults($defaults);
  
}

On gists

Nette rendering - containers (form)

Nette-Forms

form.latte #

					{form ratingForm}
						<div class="rating-form">
						{foreach $form['container']->components as $name => $container}
							<div class="double-line">
								<div class="headline">
									{$form["container-$name-question"]->caption}	
								</div>
								<div class="inputs">
									{* <textarea placeholder="Komentář" class="common autosize" rows="1"></textarea> *}
									{input container-$name-question class => "common autosize", rows => "1"}
									<!-- <input type="text" class="common" placeholder="Komentář" /> -->
									<div class="radio-group">
										<label class="fakeradio">
							            	{input container-$name-question_checkbox_yes}

								            <span class="fakeradio">
								                <span></span>
								            </span>    
								            <span class="text">{$form["container-$name-question_checkbox_yes"]->caption}</span> 
							            </label>								
							            <label class="fakeradio">
							            	{input container-$name-question_checkbox_no}
								            <span class="fakeradio">
								                <span></span>
								            </span>    
								            <span class="text">{$form["container-$name-question_checkbox_no"]->caption}</span> 
							            </label>
						            </div>
								</div>
							</div>
							{/foreach}
							

							<div>
								<a class="cart-button arrow-right blue formSubmit" href=""><span class="inner">{_}Odeslat{/_}</span></a>
							</div>

						</div>
						{input submit class => "nod"}
					{/form}

On gists

form.latte

Nette-Forms

form.latte #

<form n:name=$form class="form">	
	<div class="row">
		<div class="col-md-12">
		<ul class=error n:if="$form->ownErrors">
			<li n:foreach="$form->ownErrors as $error">{$error}</li>
		</ul>
		</div>
	</div>
	<div class="row">
		{foreach $form->controls as $input}
			{* get_class($input) *} 
			<div n:if="$input instanceof Nette\Forms\Controls\Checkbox" class="form-group {$class} {$input->required ? required}">
				<label n:if="$input->caption" n:name="$input->name">
					<input type="checkbox" n:name="$input">
					{$input->caption}				
				</label>																
				<span class=error n:ifcontent>{$input->error}</span>				
			</div>			
			<div n:if="$input instanceof Nette\Forms\Controls\TextInput" class="form-group {$class} {$input->required ? required}">
				<label n:if="$input->label" n:name="$input" class="control-label">{$input->caption}</label>
				<input n:if="$input instanceof Nette\Forms\Controls\TextInput" n:name="$input" class="form-control">
				<span class=error n:ifcontent>{$input->error}</span>
			</div>
		{/foreach}
	</div>
	<div class="row">
		{foreach $form->controls as $input}
			<div n:if="$input instanceof Nette\Forms\Controls\SubmitButton" class="col-md-3">
				<input n:name="$input" class="btn btn-success">
			</div>
		{/foreach}
	</div>
</form>

On gists

Manuální renderování chyb -- inline

Nette-Forms

Manuall form rendering #


{form $form}
<ul class=error n:if="$form->ownErrors">
<li n:foreach="$form->ownErrors as $error">{$error}</li>
</ul>
<table>
<tr n:foreach="$form->controls as $input" n:class="$input->required ? required">
<th>{label $input /}</th>
<td>{input $input} <span class=error n:ifcontent>{$input->error}</span></td>
</tr>
</table>
{/form}