Jeden formulář v každém řádku tabulky, různé hidden value
- sadovsf
- Člen | 11
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
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
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
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#…
- ViPEr*CZ*
- Člen | 817
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
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
Parametr lze předat komponentě v metodě render()
. Tedy
v komponentě např.:
public function render($id)
{
$this["rowForm"]["hiddenId"]->setValue($id);
// ...
}
- ViPEr*CZ*
- Člen | 817
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
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
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í.
- Jan Mikeš
- Člen | 771
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
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
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);
}