Editační vs. přidávací formulář

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Jan Tvrdík
Nette guru | 2595
+
0
-

Jak řešíte podobnost editačního a přidavacího formuláře?

crempa
Člen | 198
+
0
-

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

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

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.

Honza Marek
Člen | 1664
+
0
-

llook

Taky to tak dělám…