Editační vs. přidávací formulář
- crempa
- Člen | 198
je to ve zkratce takze jsem nejake detaily vypustil, ale cca nejak takhle…
<?php
//....
public function actionForm($editId = NULL)
{
if(isset($editId))
{
if(is_numeric($editId))
{
$this->editMode = true;
$this->editId = $editId;
}
else
{
$this->flashMessage('Wrong record ID', 'error');
$this->redirect("default");
}
}
}
//....
public function actionForm()
{
//...definice formulare
$form->addSubmit('frmbtn', $this->editMode ? 'Edit' : 'Add')->onClick[] = array($this, 'formSubmited');
$this->template->form = $form;
if (!$form->isSubmitted() and $this->editMode)
{
$defaultValues = $this->mainModel->getItem($this->editId);
$form->setDefaults($defaultValues);
}
//...
}
//....
public function formSubmited($data)
{
if($this->editMode)
{
$this->mainModel->updateItem($this->editId, $data->getForm()->getValues());
$this->flashMessage('Položka byla editována');
}
else
{
$this->mainModel->addItem($data->getForm()->getValues());
$this->flashMessage('Položka byla přidána');
}
$this->redirect("default");
}
//...
?>
tusim ze je to asi znacne vzdalene od nejakeho idealu, ale funguje to :-)
- romansklenar
- Člen | 655
Taky mě napadlo, že se zeptám :) Dělám to cca následovně:
/**
* Component factory
* @see Nette/ComponentContainer#createComponent()
*/
protected function createComponent($name)
{
if (preg_match('/[new|detail|edit]FormName/i', $name)) {
// definice formuláře
$form = new AppForm($this, $name);
// ... definice všech možných prvků pro formulář včetně pravidel
// group Personal data
$form->addGroup('Personal data')
->setOption('description', 'We value your privacy and we ensure that the information you give to us will not be shared to other entities.');
$form->addHidden('userid');
$form->addText('name', 'Your name:', 35)
->addRule(Form::FILLED, 'Enter your name');
$form->addText('age', 'Your age:', 5)
->addRule(Form::FILLED, 'Enter your age')
->addRule(Form::INTEGER, 'Age must be numeric value')
->addRule(Form::RANGE, 'Age must be in range from %d to %d', array(10, 100));
$form->addRadioList('gender', 'Your gender:', $sex);
$form->addGroup('Some other stuff');
// ... všelijaké společné nastavení vykreslování
$form->setRenderer(new CustomRenderer);
$renderer = $form->getRenderer();
$renderer->wrappers['controls']['container'] = NULL;
$renderer->wrappers['label']['container'] = NULL;
$renderer->wrappers['control']['container'] = NULL;
}
switch ($name) {
case 'detailFormName':
// v detailu nebudu potřebovat poslední container
$form->removeComponent($form['Some other stuff']);
// a nastavím všechny prvky formuláře readonly (checkboxy a selectboxy disabled)
foreach ($form->getControls() as $control) {
if ($control instanceof Checkbox || $control instanceof Selectbox) $control->setDisabled();
else $control->setReadOnly();
}
return $form;
case 'newFormName':
// při vytváření mě např nezajíma hidden s ID uživatele, generuje se až v modelu při vkládání do db
$form->removeComponent($form['userid']);
// nebo naopak můžu ještě něco přidat
$form->addText('email', 'E-mail:', 35)
->setEmptyValue('@')
->addCondition(Form::FILLED)
->addRule(Form::EMAIL, 'Incorrect E-mail Address');
case 'editFormName':
// jinak jsou formuláře shodné, proto return až zde
return $form;
case ...
default:
parent::createComponent($name);
return;
}
}
Kód není odzkoušený, je to jen nástin. EDIT: u editačního a detailového formu samozřejmě ještě naplnit hodnotama z DB
- llook
- Člen | 407
Já to dělával tak, že jsem měl jednu společnou definici formuláře (třídu, dědící z Form a v konstruktoru vytvářející všechny ty fieldy). View pro přidání záznamu ho nechalo prázdný, view pro úpravu záznamu do něj nahustilo data z db. Jedna společná akce pro uložení se pak podle existence ID (u přidávacího formuláře bylo skryté pole s ID prázdné) rozhodla pro insert nebo update.
Pokud by se ty formuláře měly v něčem menším lišit, tak bych asi rozvětvil konstruktor toho formuláře.