Editace formuláře jako komponenty

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

Ahoj,
pišu si takový jednoduchý formulář jako komponentu a chtěl bych aby komponenta uměla přidávat nové položky a zároveň i obsluhovat editaci.
Moje idea je taková, že bych komponentě při vytváření v presenteru předal parametr ID konkrétního položky a komponenta by následně vykreslila formulář s předvyplněnými daty.
Bohužel jsem ale narazil na několik problémů:

  1. Jak předat komponentě nepovinný parametr? Přes setter?

Zkoušel jsem v configu něco jako:

implement: App\Forms\IMyFormFactory
		parameters: [id]
		arguments: [...,%id% = NULL]

Tady ale končím na chybě

Unable to pass specified arguments to App\Forms\SpacesForm::__construct().

Konstruktor vypadá takto:

public function __construct(\App\Model\SomeRepository $SR, $id = NULL) {
    parent::__construct();
    $this->someRepository = $SR;
    $this->id = $id;
}
  1. Další problém mám při editaci:
  • jak správně přenést parametr ID při odeslání formuláře, tak aby se správně zpracovala editace?

Zkoušel jsem přes persistentní parametr, ale ten se mi nepřenesl
Aktuálně jsem si to dal do formuláře jako hidden pole, ale to se mi moc nelíbí.

Díky všem

David Matějka
Moderator | 6445
+
0
-

1.
to, ze je parametr optional musis uvest na urovni parameters, nikoliv arguments (+ ho uvest jako optional i v interfacu tovarnicky

interface FooFactory
{
	public function create($id = NULL);
}
implement: FooFactory
parameters: [id: null] #defaultni hodnota se tedy zapisuje takto
arguments: [..., %id%]

2.
persistentni parametr by mel fungovat, divny (mel si to public?). Ale ani neni potreba, staci

class FooPresenter
{
	public function actionEdit($id)
	{
		...
	}
}
vymak
Člen | 92
+
0
-

U sebe to řeším takhle, i když to co píše @matej21 je více správné

Komponenta:

	public $update;

	protected function createComponentForm()
{
    $form = new Form;

    ...

    if ($this->update) {
        $form->addHidden('id');
        $form->onSuccess[] = $this->onSuccessUpdate;
    } else {
        $form->onSuccess[] = $this->onSuccessInsert;
    }

    $form->addProtection();
    $form->addSubmit('send', $this->update ? 'Upravit novinku' : 'Vložit novinku');
    return $form;
}

Presenter:

	public function actionEdit($id)
{
    $model = $this->texts->getById($id);
    if (!$model) {
        $this->error();
    }

    $this['news']->update = TRUE;
    $this['news']['form']->setDefaults($model);
}

Editoval vymak (15. 10. 2014 8:44)

abc
Člen | 92
+
0
-

Díky za odpovědi, 1) funguje.

  1. možná sem to špatně popsal – mám presenter Settings, action např. space-edit, id např. 3

v space-edit.latte mám control spaceForm a chtěl bych tu editaci vyřídit v rámci té komponenty, protože v Settings presenteru bude edit akcí hodně (možná to dělám blbě :-)).

Aktuálně má komponenta render metodu, kde se nastaví šablona, kde je znovu control spaceForm
Komponenta následně vyrobí formulář a podle zadaného id vyplní hodnoty.
Po odeslání nových hodnot se formulář zpracovává v další metodě a tady bych chtěl na základě znalosti ID provést update nebo insert.
Jak jsem psal, aktuálně si do formu přidám hidden s id a následně rozhodnu podle toho, ale moc se mi to nelíbí, tak by mě zajímalo best-practise.

Díky

abc
Člen | 92
+
0
-

Ještě mě napadlo, že bych si udělal v Admin modulu ještě modul Settings a v tomto settings už by mohly být presentery jako jednotlivé sekce nastavení.

Přijde mi to jako moc psaní a možná zbytečná route v routeru, co Vy na to?

Jak vůbec řešíte situaci, kdy je potřeba aplikaci nějak konfigurovat v administraci?

A ještě by mě zajímalo, jak řešíte, když se do aplikace může přihlašovat více uživatelů, kteří se mohou registrovat sami, ale admin samozřejmě může upravovat jejich oprávnění.
Tak jestli na vytvoření nového uživatele a na jeho editaci používáte stejný formulář, ve kterém změníte, že je heslo nepovinné apod. nebo máte 2 formy na add a edit user.

Díky

abc
Člen | 92
+
0
-

Tak díky za odpovědi..