Přesměrování formuláře na stranku dle vytvoreneheho id zaznamu v DB

michal.ksada
Člen | 7
+
0
-

Ahoj, zkousel jsem hledat na foru, ale nepovedlo se mi najit reseni problemu.

Mam stejny formular pro vytvareni a editaci profilu uzivatele. Pokud uzivatel jiz exituje, tzn znam jeho id z DB tak do nej nacitam defaultni data z DB a nasledne. Pokud ID neexistuje, vytvari se novy zaznam. A ted chci, aby se po odeslani formulare vzdy formular presmeroval na link s ID. Bohuzel nevim, jak to ID dostat do presenteru, abych to mohl presmerovat spravne. Kdyz upravuji exitujiciho uzivatele, presmeruji jednoduse $this->redirect(‚this‘);, ale v pripade ze se zaznam vytvari, potrebuji do redirectu pridat parametr s ID

Zjenodusene mam neco takoveho:

V presenteru mam:

/** @var UserForm @inject */
public $categoryFormFactory;

public function renderEdit($id = null)
	{
		if ($id)
		{
			$this['userForm']->setDefaults($this->userManager->get($id)->toArray());
		}
	}

protected function createComponentUserForm()
	{
		$form = $this->categoryFormFactory->create();

		$form->onSuccess[] = function (Form $form) {

			$this->flashMessage("Ulozeno", 'alert-success alert');

			$this->redirect('this');
		};

		return $form;
	}

Tovarnicka na form

namespace App\Model\User;


use Kdyby\Translation\Translator;
use Nette\Application\UI\Control;
use Nette\Application\UI\Form;
use Nette\Database\Connection;

class UserForm extends Control {
	private $database;

	private $translator;

	private $userManager;

	public function __construct(Connection $database, Translator $translator, User $user)
	{
		$this->database = $database;
		$this->translator = $translator;
		$this->userManager= $user;
	}

	public function create()
	{
		$form = new Form();

		$form->addHidden("id");

		$form->addText("firstName", "jmeno");

		$form->addSubmit('send', 'Odeslat');
		$form->onSuccess[] = [$this, 'processForm'];

		return $form;
	}

	public function processForm($form, $values)
	{
		$result = $this->userManager->update($form, $values); //toto vraci ID zaznamu v DB

		return $result;
	}
}

Jak se dostanu k return hodnote, kterou vraci funkce processForm v presenteru v metode onSuccess?

Predem diky za odpovedi

Gappa
Nette Blogger | 199
+
0
-
David Matějka
Moderator | 6445
+
0
-

Ahoj, divne tam pouzivas komponentu, kterou ale pouzivas pouze jako tovarnu na komponentu.

takze bud to muzes nechat jako tovarnu, pak to ale nemusi dedit od Control. Pak si muzes do create() predat callback a ten pak zavolas ve zpracovani formulare s tim id

// tovarna
public function create(callable $saveCallback)
{
 ....
  $form->onSuccess[] = function ($form, $values) use ($saveCallback) {
    $id = $this->userManager->update($form, $values);
    $saveCallback($id);
  }
}
// presenter
$this->categoryFormFactory->create(function ($id) {
	$this->redirect('edit', ['id' => $id]);
});

Druha moznost je pouzit formular jako komponentu: https://doc.nette.org/…s/form-reuse

michal.ksada
Člen | 7
+
0
-

Diky za rychle odpovedi, tohle jsem presne potreboval!