Manuální vykreslení dynamického kontejneru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
lukendo
Člen | 96
+
0
-

Zdravím mám takovýto formulář s kontejnerem, ale nevím ani jestli to je dobrá volba takhle použít. Nicméně nedaří se mi jej manuálně vykreslit kvůli stylování. Mám to v tom kontejneru právě proto abych mohl při odeslání postupně pracovat s jednotlivými hodnotami toho checkboxu.

$users = $control->addContainer('users');
		foreach($usersRowsSelected as $member)
		{
			$users->addCheckBox($member->id, $member->name)
				->setValue($member->notify);
		}
		return $control;

Vykreslování (Zkoušel jsem všelijaké varianty s foreachem, různým indexováním ale většinou to vyhodí chybu že $u je null)

{form setUsersStatusForm}
		{foreach $form['users'] as $u}
			{$u->getControlPart()}
            {$u->getLabelPart()}
		{/foreach}
{/form}
CZechBoY
Člen | 3608
+
+1
-

Pouzij CheckboxList.

lukendo
Člen | 96
+
0
-

CZechBoY napsal(a):

Pouzij CheckboxList.

tak jsem to teda použil, ale ten formulář se pak s tím checkboxlistem neodešle

		$users = array();
		foreach ($usersRowsSelected as $row) {
			$users[$row->id] = $row;
		}
		$control->addCheckboxList('users_id', '', $users);
		return $control;

Latte:

{form setUsersStatusForm class => 'ui form'}
		{foreach $form['users_id']->items as $row}
			<div class="field">
  			<div class="ui checkbox">
  				{if $row->notify}
  					<input type="checkbox" name="{$row->id}" checked="">
  				{else}
  					<input type="checkbox" name="{$row->id}">
  				{/if}
  				<label for="{$row->id}">{$row->name}</label>
          	</div>
          	{dump $row}
          	</div>
		{/foreach}
		{input send}
	{/form}
CZechBoY
Člen | 3608
+
0
-

Odešle, ale ty tam ten checkboxlist nijak nerenderuješ a asi ani neodesíláš…
Myslim že by se to mělo dělat nějak tahle:

{form setUsersStatusForm class => 'ui form'}
        {foreach $form['users_id']->items as $row}
            <div class="field">
            <div class="ui checkbox">
                {if $row->notify}
                    <input type="checkbox" n:name="users_id:$row->id" checked="">
                {else}
                    <input type="checkbox" n:name="users_id:$row->id">
                {/if}
                <label for="{$row->id}">{$row->name}</label>
            </div>
            {dump $row}
            </div>
        {/foreach}
        {input send}
    {/form}

Editoval CZechBoY (21. 8. 2016 14:10)

lukendo
Člen | 96
+
0
-

CZechBoY napsal(a):

Odešle, ale ty tam ten checkboxlist nijak nerenderuješ a asi ani neodesíláš…
Myslim že by se to mělo dělat nějak tahle:

{form setUsersStatusForm class => 'ui form'}
        {foreach $form['users_id']->items as $row}
            <div class="field">
            <div class="ui checkbox">
                {if $row->notify}
                    <input type="checkbox" n:name="users_id:$row->id" checked="">
                {else}
                    <input type="checkbox" n:name="users_id:$row->id">
                {/if}
                <label for="{$row->id}">{$row->name}</label>
            </div>
            {dump $row}
            </div>
        {/foreach}
        {input send}
    {/form}

díky, funguje :)
edit: akorát když to odešlu tak se uloží jenom ty záznamy které se zašktrtli, nejde to nějak aby se odeslali i ty co se změnili z true na false?

Editoval lukendo (21. 8. 2016 14:18)

lukendo
Člen | 96
+
0
-

Tak jsem to vyřešil, ale trochu punkově :D jelikož ten form odešle jenom ty checkboxy co byli nastaveny, tak nejdříve všechny řádky v db nastavím na false a pak projedu ty checkboxy co mi přišli a ty odpovídající řádky nastavím na true. Je mi jasný že se může stát, že se po nastavení všeho na false může přerušit spojení z databází, ale jedná se maximálně o 50 řádků, tak by to nemuselo mít v případě tohoto problému fatální následky.

Pavel Kravčík
Člen | 1196
+
0
-

Nebo můžeš nejdříve vytáhnout původní hodnoty, srovnat je s novými a ten výsledek následně uložit. I kdybys ztratil spojení (edge-case) tak o ty data nepřijdeš. Maximálně o ty nově zadaná, což Tě bude trápit méně hádám díky setDefaults().

CZechBoY
Člen | 3608
+
0
-

Můžeš ještě použít databázovou transakci a zabalit oba updaty do jedné transakce a potom ji commitnout.