InputLists: RadioList & CheckboxList

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Dovolil jsem si implementovat novou verzi RadioListu a CheckboxListu. Poněvadž skoro každý měsíc se někdo trápí s renderováním jednoho z těchto prvků unikátním způsobem, zaměřil jsem své verze na pohodlnou custom renderovatelnost. Prvky lze přidávat pomocí metod addMultiRadio a addMultiCheckbox. Oba prvky se chovají jako své známé originály (RadioList z Nette, CheckboxList jako známý doplněk). Nepodporují však předání klíče metodě getControl. Kromě této změny zachovávají plnou zpětnou kompatibilitu.

Co umí navíc? Především manuální renderování. Viz README

Github: vojtech-dobes/nette-forms-inputlist
Composer: vojtech-dobes/nette-forms-inputlist
Instalace:

$configurator->onCompile[] = function ($configurator, $compiler) {
	$compiler->addExtension('inputlist', new VojtechDobes\NetteForms\InputListExtension);
};
Michalek
Člen | 210
+
0
-

Díky moc.

Já bych jen dodal pár věcí :-)


1. pro aktuální beta Nette (version 2.1-dev released on 2012–12–29) je potřeba jedna úprava.

- InputListExtension.php
use Nette\Utils\PhpGenerator\ClassType; => use Nette\PhpGenerator\ClassType;

2. Kromě {inputlist name ...}...{/inputlist} lze stále používat {input name} – pak se vygeneruje všechno samo. Fakt to z toho nevyplývá a ztratil jsem kvůli tomu spoustu času, tak ať to mají ostatní lehčí :)


3. V případě použití makra {inputlist} je také nutné zaregistrovat makra pomocí \VojtechDobes\NetteForms\InputListMacros::install($compiler);

Editoval Michalek (5. 1. 2013 1:17)

enumag
Člen | 2118
+
0
-

@Michalek: Instalaci makra si to extension zařídí samo.

JakubTN
Bronze Partner | 49
+
0
-

Zdravim, addon vypada vyborne! :)

Snazim sa ho pouzit podla navodu, no dostavam hlasku od ladenky: http://cl.ly/…0S3k3E2Z0z1f

V presenteri mam

$form->addMultiRadio('deliveryoption', 'Spôsob doručenia', $options);

V sablone potom

{inputlist deliveryoption as $key => $label}
     {input} {label /}
{/inputlist}

Neviete kde by mohla byt chyba? Prehliadol som nieco?

Dakujem za pomoc.

Michalek
Člen | 210
+
0
-

Jo, to jsem viděl, někde se tomu nepředává nějaká proměnná, já to vyřešil změnou $item[‚counter‘] za $key a vypadá to že to funguje ;-)

JakubTN
Bronze Partner | 49
+
0
-

Super dik, pomohlo :)

No este aj tak som musel spravit drobnu zmenu v getItemLabel() v RadioList.php, konkretne $item[‚label‘] nahradit $item.

Teraz uz vsetko funguje v pohode.

enumag
Člen | 2118
+
0
-

@Michalek, @JakubTN: Co ty změny strčit na GitHub jako pull requesty? :-)

JakubTN
Bronze Partner | 49
+
0
-

Uz je to tam od ineho usera ;-)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Mergnuto, díky přátelé za pull requesty, reporty a trpělivost se slepým programátorem…

enumag
Člen | 2118
+
0
-

Potřebuji nějaký CheckBoxList, rozhoduji se mezi tímto a Nextras verzí. Ten tvůj (zdá se) nemá vyřešenou JS validaci, je to tak?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Určitě jsem ji neřešil – jakou JS validaci má ten z Nextras?

enumag
Člen | 2118
+
0
-

Ne že bych té implementaci dvakrát rozuměl. :-D https://github.com/…kboxList.php#…

Zkusil jsem na ty dva doplňky dát diff a fakt nevim co má jaké výhody a nevýhody. Ty zdrojáky se liší dost výrazně.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Určitě by to chtělo prozkoušet, jak se validace na tom mém chová – zkusí to co nejdřív zjistit.

Stic
Člen | 28
+
0
-

opat trochu blba pripomienka, no pre zaciatocnikov by sa zisli naozaj trosku lepsie popisane instrukcie :)

do bootstrap.php som dal

<?php
$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('inputlist', new VojtechDobes\NetteForms\InputListExtension);
};

$container = $configurator->createContainer();
?>

v presenteri mam

<?php
 	protected function createComponentScreenTestForm()
	{

		$form = new Form;

		$form->addMultiRadio('sex', 'Sex:', array(
		    'male' => 'Male',
		    'female' => 'Female',
		));

		// call method signInFormSucceeded() on success
		$form->onSuccess[] = $this->signInFormSucceeded;
		return $form;
	}
?>

no a v sablone

<?php
{form screenTestForm}
    {inputlist sex as $key => $label}
        {input} {label /} {sep}<br>{/sep}
    {/inputlist}
{/form}
?>

No troskotam na hlaske : Unknown macro {inputlist} in …/Screen/default.latte:12

Subory som skusil raz nakopirovat do lib/ adresara, raz do components/ ale evidentne to robim naprt :)

Kde presne prosim ich treba dat? Dakujem

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

@Stic Vymazání cache nepomůže? Jak vypadá vygenerovaný SystemContainer? Obávám se, že postup instalace je popsaný dostatečně :).

Stic
Člen | 28
+
0
-

tak vyzera ze vymazanie cache pomohlo :) my apologies a dakujem :)

Václav Mašín
Člen | 26
+
0
-

Dovolím si se připojit s „reklamací“ na patrně opravdu nefunkční JS validaci.

Jeví se mi to tak, že je problém v tom, že se při použití {inputlist} makra do výsledného HTML kódu <input> elementu nevygenerují ony data-nette-rules atributy.

Konkrétně tento kód v presenteru:

<?php
		$this->processForm->addMultiRadio(
			'correct',
			_('Correct answer:'),
			$radios
		)->setRequired(_('Please select the correct answer.'));
?>

a tento kód v šabloně:

				{inputlist correct as $key => $label}
				<tr>
					<td>{input}</td>
					<td>{label /}</td>
				</tr>
				{/inputlist}

dá jako výsledek:

<tr>
	<td style="padding: 10px"><input type="radio" name="correct" id="frminterviewStepForm-correct-0" required="required" value="13" /></td>
	<td style="padding: 10px"><label for="frminterviewStepForm-correct-0">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</label></td>
</tr>
<tr>
	<td style="padding: 10px"><input type="radio" name="correct" id="frminterviewStepForm-correct-1" required="required" value="14" /></td>
	<td style="padding: 10px"><label for="frminterviewStepForm-correct-1">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</label></td>
</tr>
<tr>
	<td style="padding: 10px"><input type="radio" name="correct" id="frminterviewStepForm-correct-2" required="required" value="15" /></td>
	<td style="padding: 10px"><label for="frminterviewStepForm-correct-2">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</label></td>
</tr>
<tr>
	<td style="padding: 10px"><input type="radio" name="correct" id="frminterviewStepForm-correct-3" required="required" value="16" /></td>
	<td style="padding: 10px"><label for="frminterviewStepForm-correct-3">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</label></td>
</tr>

Přičemž při změně kódu šablony na obvyklé:

{input correct}

je výsledkem:

<input type="radio" name="correct" id="frminterviewStepForm-correct-0" required="required" data-nette-rules="{op:':filled',msg:&quot;Vyberte pros\u00edm spr\u00e1vnou odpov\u011b\u010f.&quot;}" value="13" /><label for="frminterviewStepForm-correct-0">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</label><input type="radio" name="correct" id="frminterviewStepForm-correct-1" required="required" value="14" /><label for="frminterviewStepForm-correct-1">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</label><input type="radio" name="correct" id="frminterviewStepForm-correct-2" required="required" value="15" /><label for="frminterviewStepForm-correct-2">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</label><input type="radio" name="correct" id="frminterviewStepForm-correct-3" required="required" value="16" /><label for="frminterviewStepForm-correct-3">Lorem Ipsum is simply dummy text of the printing and typesetting industry.</label><br />

(Tady se mi BTW taky moc nezdají ty chybějící <br> oddělovače mezi jednotlivými volbami).

Každopádně moc díky za toto rozšíření – zrovna jsem něco takového potřeboval. :-)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nenechám se kolegou hrachem zahanbit a taky dodělám Javacriptovou validaci :). Co nejdřív.

enumag
Člen | 2118
+
0
-

Spíš by bylo lepší kdybys obě ty verze nějak mergnul, aby zůstala jedna „ultimate“. ;-) Tzn. celkově projít rozdíly a jednotit to. Hrachova verze se mi zdála propracovanější, nespornou výhodou té tvé jsou ty vykreslovací makra.

hrach
Člen | 1836
+
0
-

Dovolil bych si upresnit, ze mam tez vykreslovaci makra ;)

enumag
Člen | 2118
+
0
-

@hrach: Už to vidim, ode dneška. :-D Chudák Vojta, sebrals mu jeho možná jedinou konkurenční výhodu. XD Ale nemáš tam to makro inputlist, které mi připadá docela fajn.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Vydána verze 1.0.3

  • doplněna serverová i client-side validace
iguana007
Člen | 970
+
0
-

Pecka! Díky! ;)

JakubTN
Bronze Partner | 49
+
0
-

A ako je to s toggle() v kombinacii s RadioListom? :)

Editoval JakubTN (15. 3. 2013 16:20)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

JakubTN Co máš přesně na mysli?

pavelplzak
Člen | 21
+
0
-

Někdo tip jak k MultiRadioListu rozchodit Live Form Validation ( https://gist.github.com/redhead/552273 ) ? :-)

orech
Člen | 40
+
0
-

Zdravím, mám problém rozbehať inputlist, hlási:

Class ‚VojtechDobes\NetteForms\InputListExtension‘ not found

\libs\composer\autoload_namespaces.php (tu sú súbory zo src):

'VojtechDobes\\NetteForms' => array($vendorDir.'/InputList/'),

bootstrap.php:

/ Configure application
$configurator = new Nette\Config\Configurator;

// InputList
$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('inputlist', new \VojtechDobes\NetteForms\InputListExtension);
};

// Enable Nette Debugger for error visualisation & logging
$configurator->setDebugMode(true);
$configurator->enableDebugger(__DIR__ . '/../log');

Skúšal som niekoľkokrát premazať cache a editovať neon, no nepomohlo to.

Vopred ďakujem za pomoc

Editoval orech (12. 12. 2013 7:59)