Ako do $formData pridat id?

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

Ako mam do datacollection z formulara pridat id, prip. dalsie property? Teraz pridam:

$form->addHidden('id', $id);

Ale to je security issue :-(

Pytat si z url idcko v modely je bad practice. Ako to robite vy?

Editoval steelbull (15. 4. 2016 7:55)

CZechBoY
Člen | 3608
+
+1
-

Tak si dej volitelnej parametr do konstruktoru formulare, pokud formularova komponenta zajistuje jak novy zaznamy tak upravu stavajicich zaznamu.

steelbull
Člen | 241
+
0
-

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
+
+1
-

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

Oli
Člen | 1215
+
0
-
CZechBoY
Člen | 3608
+
0
-

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);
}
Oli
Člen | 1215
+
0
-

@CZechBoY k volitelnym parametrum imho slouzi hlavne setter metody. Do konstruktoru davam jen povinny parametry. Je to i jednodusi na implementaci… :)

CZechBoY
Člen | 3608
+
0
-

@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;
}
Oli
Člen | 1215
+
0
-

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.

Přesně tak jsem to myslel :-)

Altimit
Člen | 82
+
-1
-

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');
steelbull
Člen | 241
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

Nějakej důvod mít ID ve formuláři a ještě (asi) v url?

steelbull
Člen | 241
+
0
-

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">&times;</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)