Jeden formulář v každém řádku tabulky, různé hidden value

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

Zdravím,
nevíte někdo náhodou jak by se dal vytvořit a použít formulář pro tuto situaci:
Na každém řádku tabulky chci mít na konci <input><submit> tabulka je generována z mysql a já potřebuji podle vyplněného čísla ve formu upravit číslo v mysql. Je nějaký způsob jak předat třeba z lette id položky třeba do hidden prvku?

Mysql:
<id> <user> <number>
Tabulka na webu:
<user> <number> <input><submit>

PHP: 5.3.3–7+squeeze9
Nette: 2.0.3

Editoval sadovsf (10. 7. 2012 11:14)

ViPEr*CZ*
Člen | 817
+
0
-

Si udělejte klidně toto:

Tabulka na webu:
„<user> <number>“ <input><submit>

A toto „<user> <number>“ bude label toho inputu, pak je klasický input a vedle něj si vygenerujte submit. Klidně pak můžete i mezi dát nějaké hidden pole. Každopádně si takto můžete vytvořit komponentu formuláře s jedním tím userem. Pak už stačí obalit nějakou rodičovskou komponentou, co v sobě bude mít ty jednotlivý formy a postará se o jejich vytvoření.

sadovsf
Člen | 11
+
0
-

Obávám se že stále naprosto netuším co s tím… Podle mě by bylo nejjednodušší, jestli to vůbec jde, kdyby byla componenta formuláře už v presenteru vytvořená a při vkládání do stránky v lette by bylo možné předat parametr value do hidden prvku. V Nette jsem stále začátečník, potřeboval bych tedy případný postup každopádně trochu lépe popsat. Děkuji mnohokrát…

Editoval sadovsf (10. 7. 2012 12:05)

ViPEr*CZ*
Člen | 817
+
0
-

Není to lette, ale latte. Mrkněte na video o komponentách: https://www.youtube.com/watch?…

Vkládat value do hidden prvku přímo v latte je špatně. Formulářové prvky spravujte přes Nette\Application\UI\Form případně přes Nette\Forms. Do šablony pak stačí už jen zavolat {constrol mujForm} a vše se vygeneruje. Případně si můžete přímo udělat šablonu pro vykreslení: https://doc.nette.org/cs/forms#…

motorcb
Člen | 552
+
0
-

ViPErCZ:

Mám stejný problém. Na každém řádku chci mít samostatný formulář, který když odešlu, projeví se změna pouze u zadaného řádku.
Jak ale rozlišovat o jaký se jedná řádek? Mám k dispozici id záznamu.

ViPEr*CZ*
Člen | 817
+
0
-

motorcb napsal(a):

ViPErCZ:

Mám stejný problém. Na každém řádku chci mít samostatný formulář, který když odešlu, projeví se změna pouze u zadaného řádku.
Jak ale rozlišovat o jaký se jedná řádek? Mám k dispozici id záznamu.

Že by přes to ID záznamu? Běžně využívám hidden pole k tomuto rozlišení.

motorcb
Člen | 552
+
0
-

ViPErCZ:
Ale jak ho dostanu do komponenty?

{foreach $rows as $row}
  <tr>
    <td>...</td>
    <td>{control rowForm, $row->id}</td>
  </tr>
{/foreach}
protected function createComponentRowForm( $id )
 {
     echo "*".$id."*";
     $form = new Form();
     $aTips = array(
       '1' => "Nevhodný",
       '2' => "Navrhuji na titulní stránku",
       '3' => "Koš",
     );

     $form->addSubmit('create', 'Odeslat');
     return $form;
 }
Tomáš Votruba
Moderator | 1114
+
0
-

Parametr lze předat komponentě v metodě render(). Tedy v komponentě např.:

public function render($id)
{
	$this["rowForm"]["hiddenId"]->setValue($id);
	// ...
}
22
Člen | 1478
+
0
-

ja bych tedy řek, že by se to mělo udělat v action fázi, protože v render už je pozdě plnit data formuláře..

ViPEr*CZ*
Člen | 817
+
0
-

No spíš bych to asi řešil tak, že v šabloně bych vykreslil například komponentu rowForm a tadle komponenta by obsahovala komponenty například rowUpdateForm1, rowUpdateForm2, atd. a bude jich právě (for $x = 0; $x < $rows->count(); $x++). Jak se dělá s těmito kontejnery je vidět ve videu, jehož odkaz jsem dával výše.

Formulář rowUpdateForm1 by se pak tvořil:

$form = new Form();
$aTips = array(
       '1' => "Nevhodný",
       '2' => "Navrhuji na titulní stránku",
       '3' => "Koš",
);
$form->addHidden('objID')->setValue($objID);
$form->addSubmit('create', 'Odeslat');

Každá komponenta by pak měla svojí třídu. Parent komponenta by byla:

class rowForm extends Nette\Application\UI\Control {
...
}

Každá komponenta co bude v této parent bude mít vlastní render se svojí šablonou, kde si ručně vykreslíte formulář jak potřebujete. Parent komponenta bude pak mít svojí šablonu:

<table>
{for $x = 0; $x < $rows->count(); $x++}
  <tr>
    <td>...</td>
    <td>{control rowUpdateForm.$x}</td>
  </tr>
{/for}
</table>

Je to psaný z hlavy, tak brát s rezervou. Ta hlavní myšlenka tam je snad zachycena.

Editoval ViPEr*CZ* (10. 7. 2012 20:40)

sadovsf
Člen | 11
+
0
-

Stále po pravdě nevidím to vysvětlení deklarace… Dopředu totiž nevím kolik by těch tříd rowUpdateForm# bylo a tudíž nevím kolik jich mám nadeklarovat… Nejspíš je chyba na mé straně ale dynamicky deklarované třídy jsem ještě nepoužil a nevím ani jak by se to mělo v praxi provézt… Zkusím ještě prostudovat to video třeba mě něco napadne…

ViPEr*CZ*
Člen | 817
+
0
-

sadovsf napsal(a):

Stále po pravdě nevidím to vysvětlení deklarace… Dopředu totiž nevím kolik by těch tříd rowUpdateForm# bylo a tudíž nevím kolik jich mám nadeklarovat… Nejspíš je chyba na mé straně ale dynamicky deklarované třídy jsem ještě nepoužil a nevím ani jak by se to mělo v praxi provézt… Zkusím ještě prostudovat to video třeba mě něco napadne…

Třída jen jedna, jen bude x jejich instancí.

motorcb
Člen | 552
+
0
-

ViPErCZ:
A jak budu ty komponenty klovoat? Z toho videa jsem to moc nepobral, protože tam přidává další komponenty do již existující komponenty. Já chci vytvořit několik samostatných komponent

Tabetha
Člen | 140
+
0
-

a nepomohol by Multiplier? https://doc.nette.org/…n/multiplier

Jan Mikeš
Člen | 771
+
0
-

Mozna ti trosku poradi toto https://forum.nette.org/…zbozi-kosiku jedna se o podobnou problematiku, klonovani jednoho stejneho formulare s jinymi value ud id inputu

motorcb
Člen | 552
+
0
-

Tabetha:
Díky, to je přesně ono :)

Jen se mi nedaří odesílat formulář:

<?php

use Nette\Application\UI\Multiplier;
use Nette\Application\UI\Form;

class HomepagePresenter extends SecuredPresenter
{
  protected function createComponentShopForm()
  {
      return new Multiplier(function ($id) {
          $form = new Form();
	  $aTips = array(
      		'1' => "Nevhodný",
       		'2' => "Navrhuji na titulní stránku",
       		'3' => "Koš",
     	  );

          $form->addSelect('tip', 'Tip:', $aTips);
          $form->addHidden('rowId', $id);
          $form->onSuccess[] = callback( $this, 'shopFormSubmitted');
          $form->addSubmit('create', 'OK');

          return $form;
      });
  }

  public function shopFormSubmitted(Form $form)
  {
      $aValues = $form->getValues(TRUE); // same as: (array) $form->values;
      echo "".$aValues["rowId"]."*";
  }

}

Hlásí: Undefined variable: this
na řádku: $form->onSuccess[] = callback( $this, ‚shopFormSubmitted‘);

Jak to opravit?

Editoval motorcb (11. 7. 2012 10:05)

Tabetha
Člen | 140
+
0
-

no tak mas tam dane to $this … daj si to takto …ty tam voláš $this v tom mulitpliere a ty to potrebuješ na úrovni presenteru..ak som to správne napísal :D

protected function createComponentProduktView()
	 {
	 $presenter = $this ;
	 return new Multiplier(function ($itemID) use ($presenter)
			    {
			  //kod
			    $form->addSubmit('send' , 'Pridať do košíka') ;
			    $form->onSuccess[] = callback($presenter , 'vlozDoKosika') ;
			    return $form ;
			    }) ;

	 }
	 public function vlozDoKosika($form)
	      {
	      $values = $form->getValues();
	      dump($values);
	      }
motorcb
Člen | 552
+
0
-

Tabetha:
Seš fakt dobrej, to je přesně ono. Máš u mne pivo :)

Tabetha
Člen | 140
+
0
-

:D dobre ne…len som to par dni dozadu hladal :D … škoda že nepijem :D ale díky :D