Ako do $formData pridat id?
- steelbull
- Člen | 241
CZechBoY napsal(a):
Tak si dej volitelnej parametr do konstruktoru formulare, pokud formularova komponenta zajistuje jak novy zaznamy tak upravu stavajicich zaznamu.
Nerozumiem, ako potom spravne odovzdam idcko modelu? Najlepsie by bolo, keby som ho vedel pridat do subbmitnutych dat.
- ViPEr*CZ*
- Člen | 818
Do submitnutých dat dává smysl, ale budete s tím mít nějakou práci.
Nette nabízí možnost tzv. persistentního parametru (určitě najdete
v dokumentaci). Tedy controler dostane od Nette nastavenou hodnotu tohoto
parametru z URL a dále ho použije, když komunikuje z modelem.
To je celá logika.
Pokud se nepletu, tak příklad najdete v nějakém examplu zde: https://github.com/nette/examples
- CZechBoY
- Člen | 3608
Myslel jsem to nějak takto:
class MujForm extends Control
{
private $id;
public function __construct($id = null)
{
$this->id = $id;
}
protected function createComponentForm()
{
$form = new Form;
$form->onSuccess[] = [$this, 'formSucceeded'];
return $form;
}
public function formSucceeded($form $values)
{
if ($this->id) {
// aktualizace stávajícího
} else {
// přidání nového
}
}
public function render()
{
$this['form']->render();
}
}
interface IMujFormFactory
{
/**
* @return MujForm
**/
function create($id = null);
}
- CZechBoY
- Člen | 3608
@Oli Jako jo, ale pokud děláš formulář, tak ten bys musel
podědit a přidat tam nějakou setId metodu.
Případně to udělat jako formulář v komponentě, jak jsem psal před
chvilkou já, s tím, že by se to ID nastavovalo setterem.
Upravený příklad se setterem:
class MujForm extends Control
{
private $id;
public function setId($id)
{
$this->id = $id;
}
protected function createComponentForm()
{
$form = new Form;
$form->onSuccess[] = [$this, 'formSucceeded'];
return $form;
}
public function formSucceeded($form $values)
{
if ($this->id) {
// aktualizace stávajícího
} else {
// přidání nového
}
}
public function render()
{
$this['form']->render();
}
}
interface IMujFormFactory
{
/**
* @return MujForm
**/
function create();
}
potom v presenteru
protected function createComponentForm()
{
$form = $this->factory->create();
if ($this->id) {
$form->setId($this->id);
}
return $form;
}
- steelbull
- Člen | 241
Oli napsal(a):
Resi se to takhle https://doc.nette.org/…editing-form
Tento spôsob sa mi nepáči. Chcem mať idčko vo values, nie ako samostatný parameter.
- steelbull
- Člen | 241
Altimit napsal(a):
pokud chceš ID z odkazu třeba: něco.cz/admin/blog/edit/1 (kde 1 je id) tak můžeš použít pro výsledek formuláře použít toto:
$id = $this->getParameter('id');
Tento spôsob sa mi tiež nepáči, lebo mám na jednej stránke formulár1, ktorý editujem:
Formulár1 obsahuje napr.:
<form...>
<input type="text" name="productName"....>
<select name="category">
<option value="volvo">Volvo</option>
<option value="saab">Saab</option>
<option value="opel">Opel</option>
<option value="audi">Audi</option>
</select>
</form>
Ale v bootstrape mám sktrytý ďalší formulár2, ktorý zobrazím vtedy, keď používateľ klikne na tlačidlo Pridaj novú položku.
<!-- Button trigger modal -->
<button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#myModal">
Pridaj novú položku
</button>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h4 class="modal-title" id="myModalLabel">Modal title</h4>
</div>
<div class="modal-body">
<form...>
<input type="text" name="categoryName"....>
....
....
....
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary">Save changes</button>
</div>
</div>
</div>
</div>
Formulár 2 je však univerzálny. Môže byť použitý ako samostatný formulár alebo môže byť použitý ako sub-formulár v rámci iného formulára, kde sa vyskytuje položka, pre ktorú je potrebné, aby si ju mohol používateľ dynamicky zmazať.
PROBLÉM: Id z URL adresy sa použije pri jednom aj druhom formulári, čo je nezmysel. Mohol by som oddeliť názvy v url napr. categoryId, ItemId a pod. ale kto by si to pamätal, najmä ak tých subformulárov mám naraz zobrazených aj viac, ako 10.
PODĽA MŇA RIEŠENIE:
Keď editujem, vyčítam predtým id z DB a pridám ho k subbmittnutému data
collection. Ale ako? Ako to id pridať, keď data collection je read-only?
Editoval steelbull (23. 5. 2016 19:43)