Ako nastaviť setRequired pre create a odstrániť pre update

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

Zdravím,
vie mi niekto povedať, ako dosiahnem aby bol nejaký input vo formulári required pri akcii create ale pri update by už required nebol? Skúšal som to cca. takto:

public function create( $id = false )
{
		$form = new Form;
		$form->addPassword('password');

		if( ! $id )  // create
		{
			$form['password']->setRequired('Vylnte prosim heslo');
		}

Ale toto proste neprejde. Pri update a validácii na servri mi to vždy vyhodí required error. Pri create to správne vždy required požaduje.
Skúšal som to aj cez hidden id

$form->addPassword('password')
	->addConditionOn($form['id'], $form::EQUALS, 0)
		->setRequired('Heslo je povinne');

ale ani toto nefunguje. Update stále požaduje pole password. Vie niekto ako to obídem?

Ďakujem.

Editoval Čamo (26. 7. 2016 22:49)

GEpic
Člen | 566
+
0
-

Já to dělám na ‚rychlých‘ projektech tak, že mám metody renderCreate a renderEdit, poté stačí toto:

// uvnitř tvorby formuláře
$password = $form->addPassword('password');

if ($this->getAction() == 'create') {
	$password->setRequired('Heslo je povinné pole');
}

A nebo občas mám jen (pokud chceš na tvorbu / úpravu) jednu metodu i formulář:

	public function renderEdit($id = null)
	{
		if ($id !== null && $zaznam = $this->trebaClanky()->get($id) {
			// ok zaznam existuje, naplnime formular hodnotami (napr.)
		} else {
			// novy zaznam, necham formular prazdny
		}
	}

	public function createComponentClanekForm($name)
	{
		$form = new Form;

		// Tvuj awesome magic code

		$pass = $form->addPassword('pass');

		if ($this->getParameter('id') === null) {
			$pass->setRequired('Heslo je povinne');
		}

		// Tvuj awesome magic code

		return $form;
	}

Editoval GEpic (26. 7. 2016 23:05)

Altimit
Člen | 82
+
-1
-

Ahoj,
Pro info koukni se zde: https://doc.nette.org/cs/forms
jinak tady je možnost jiná:

public function createComponentNecoForm(){
	$form = new Form();
	$form->addText('name', 'Jméno:')
    	->setRequired('Zadejte prosím jméno');
	return $form;
}

a v style.css si pak hodíš toto:

.required label { color: maroon; }

nevím co ti má dělat toto: ` if( ! $id ) // create`
pokud to má ověřovat existenci zápisu z db tak to udělej tako, kdyby jsi hledal id v db

$post = $this->database->table('blog')->get($id);
if (!$post) {
	$this->flashMessage('Error: Článek neexistuje!', 'danger');
} else {...}
Čamo
Člen | 798
+
0
-

Altimit
Ja volám z presentera cez továreň metódu userForm->create( $this->id ). Podľa toho či id existuje sa rozhodne či ide o create alebo o update. Formulár je mimo presentera, takže nemôžem pýtať $this->id.

Čamo
Člen | 798
+
0
-

GEpic
Nie som si istý či rozumiem. Aký je rozdiel medzi tvojím

if ($this->getParameter('id') === null)
{
        $pass->setRequired('Heslo je povinne');
}

a mojím

if ( $id )
{
        $form['password']->setRequired('Heslo je povinne');
}

Editoval Čamo (27. 7. 2016 11:59)

GEpic
Člen | 566
+
0
-

Čamo napsal(a):

GEpic
Nie som si istý či rozumiem. Aký je rozdiel medzi tvojím

if ($this->getParameter('id') === null)
{
        $pass->setRequired('Heslo je povinne');
}

a mojím

if ( $id )
{
        $form['password']->('Heslo je povinne');
}

To že to své běžně používám a funguje mi to? :D

Zkontroluj si radši pořádně, co si předáváš do té továrničky do parametru ID.

Editoval GEpic (27. 7. 2016 10:16)

Čamo
Člen | 798
+
0
-

Do tej továrne predávam id takto:

	public function createComponentCreateEditEmployeeForm()
	{
		return $this->employeeFormFactory->create( $this->id );  // id nastaví presenter renderUpdate
	}

Asi bude chyba v tom, že to nastavuje render a nie action.

Editoval Čamo (27. 7. 2016 12:04)

GEpic
Člen | 566
+
0
-

Čamo napsal(a):

Do tej továrne predávam id takto:

	public function createComponentCreateEditEmployeeForm()
	{
		return $this->employeeFormFactory->create( $this->id );  // id nastaví presenter renderUpdate
	}

Asi bude chyba v tom, že to nastavuje render a nie action.

To určitě ano, render se vykonává v životním cyklu až později (po tvorbě formulářů).

Takže solved? :)

Popř. odkud bere renderUpdate to ID? pokud z requestu, pak ti pomůže moje řešení, takto:

return $this->employeeFormFactory->create( $this->getParameter('id') );

Editoval GEpic (28. 7. 2016 1:07)

CZechBoY
Člen | 3608
+
0
-

@GEpic tvorba formuláře/komponenty se může klidně volat až při renderování

Čamo
Člen | 798
+
0
-

Ano bolo to v tom, že id nastavovala render a nie action metóda.