Editace formuláře jako komponenty
- abc
- Člen | 92
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ů:
- 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;
}
- 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
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
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
Díky za odpovědi, 1) funguje.
- 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
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