Podmíněný setRequired nepřidá class

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

Zdravím a prosím o radu.

Mám následující podmíky ve formuláři:

$form->addPassword('password', 'Heslo:')
		->addConditionOn($form['id'], Form::BLANK)
		    ->setRequired('Vyplňte heslo !');

	$form->addPassword('password2', 'Heslo pro kontrolu:')
		->addConditionOn($form['password'], Form::FILLED)
		    ->addRule(Form::EQUAL, 'Hesla se neshodují.', $form["password"]);

Což funguje, jen to jako obvykle nepřidá na label class=„required“ ..

Jak na to prosím?

Diky!

Jan Mikeš
Člen | 771
+
0
-

Já na to používám workaround

	$form->addPassword('password2', 'Heslo pro kontrolu:')
		->setOption("class", "required") // z hlavy si nejsem jist, jestli náhodou nepoužívám ->setAttribute("class", "required") :-)
->addConditionOn($form['password'], Form::FILLED)
    ->addRule(Form::EQUAL, 'Hesla se neshodují.', $form["password"]);

Není to ideální ale funguje.

Editoval Jan Mikeš (22. 11. 2016 12:59)

MW
Člen | 626
+
0
-

Ale je to nepodmíněný class, že?
Mam stejný form pro add a edit a jen podle „id“ zjistuji o co jde…

David Matějka
Moderator | 6445
+
0
-

tak to ani nemusis resit pres addCondition, to staci pres if, ne?

a proc mas vubec hidden? k cemu je dobry? proc si nepredavas id pres url?

MW
Člen | 626
+
0
-

Postnu to tedy celé, třeba dělám nějakou blbost.

Když jsem to měl přes if, viz. to zakomentované, tak jsem odeslal formulář, ale nedošlo vůbec na ten poslední redirect, protože proste zmizelo někde to ID (asi) a vyhodil, že není vyplněný password.

Takto se mě to chová od chvíle, kdy jsem to předělal z presenteru do samostatné komponenty.

Tušíte?
Moc diky!

/**
     * @return Form
     */
    protected function createComponentForm() {
	$form = $this->formFactory->create();
	//$form->getElementPrototype()->class('ajax');
	$form->addHidden('id');
	$form->addText('email', 'E-mail:')
		->setRequired('Vyplňte e-mail !')
		->addRule(Form::EMAIL, 'Nevalidní e-mail');

//	if (!$this->getPresenter()->getParameter('id')) {
//	    $form->addPassword('password', 'Heslo:')
//		    ->setRequired('Vyplňte heslo !');
//	    $form->addPassword('password2', 'Opakuj heslo:')
//		    ->setRequired('Vyplňte heslo pro kontrolu !')
//		    ->addRule(Form::EQUAL, 'Hesla se neshodují.', $form["password"]);
//	} else {
//	    $form->addPassword('password', 'Heslo:');
//	    $form->addPassword('password2', 'Heslo pro kontrolu:')
//		    ->addConditionOn($form['password'], Form::FILLED)
//		    ->addRule(Form::EQUAL, 'Hesla se neshodují.', $form["password"]);
//	}

	$form->addPassword('password', 'Heslo:')
		->addConditionOn($form['id'], Form::BLANK)
		    ->setRequired('Vyplňte heslo !');

	$form->addPassword('password2', 'Heslo pro kontrolu:')
		->addConditionOn($form['password'], Form::FILLED)
		    ->addRule(Form::EQUAL, 'Hesla se neshodují.', $form["password"]);


	$form->addText('name', 'Jméno:')
		->setRequired('Vyplňte jméno !');
	$form->addSelect('role', 'Role:', array_combine($this->authorizator->getRoles(), $this->authorizator->getRoles()));
	$form->addSubmit('save', 'Uložit');
	$form->onSuccess[] = function (Form $form) {
	    $this->processForm($form, $form->getValues(TRUE));
	};

	if ($this->getPresenter()->getParameter('id')) {
	    $users = $this->usersModel->getUsers($this->getPresenter()->getParameter('id'));
	    if (!$users) {
		throw new Nette\Application\BadRequestException;
	    }
	    $form->setDefaults($users->toArray());
	}

	return $form;
    }

    private function processForm(Form $form, array $values) {

	try {
	    $this->getPresenter()->saveData($form);
	} catch (\Exception $e) {
		if($e->getCode() == '23000') {
		   $form->addError('Uživatel s tímto mailem již existuje.');
	       }
	    $this->getPresenter()->redrawControl('editForm');
	    return;
	}
	$form->form->setValues(array(), TRUE);
	$this->getPresenter()->redrawControl('hideModal');
	$this->getPresenter()->redrawControl('grid');

	$this->getPresenter()->redirect('Users:');
    }
David Matějka
Moderator | 6445
+
+2
-

mas u prislusne akce presenteru (asi actionDefault, prip renderDefault) v parametrech uvedene $id? to se jinak ztrati

MW
Člen | 626
+
0
-

nj.. v tomto případě tyto metody vůbec nepoužívám :)
Mám tam čistě jen komponentu gridu a formulářem:

final class UsersPresenter extends BasePresenter {

    /** @persistent */
    public $pag = 25;

    /**
     * @var UsersModel
     */
    private $usersModel;

    /**
     * @var UserEditFormControlFactory
     */
    private $userEditFormControlFactory;

    /**
     * @var usersGridControlFactory
     */
    private $usersGridControlFactory;

    public function __construct(
    UsersModel $usersModel, UserEditFormControlFactory $userEditFormControlFactory, UsersGridControlFactory $usersGridControlFactory
    ) {
	$this->usersModel = $usersModel;
	$this->userEditFormControlFactory = $userEditFormControlFactory;
	$this->usersGridControlFactory = $usersGridControlFactory;
    }

    public function startup() {
	parent::startup();

	if (!$this->getUser()->isAllowed('uzivatele', 'view') OR ! $this->getUser()->isLoggedIn()) {
	    $this->flashMessage('Neoprávněný přístup');
	    $this->redirect('Pages:');
	}
    }

    protected function createComponentUsersGrid() {
	return $this->usersGridControlFactory->create();
    }

    protected function createComponentUserForm() {
	return $this->userEditFormControlFactory->create();
    }


    public function saveData($form) {
	$data = $form->getValues();

	if (empty($data['password'])) {
	    unset($data['password']);
	    unset($data['password2']);
	} else {
	    $data['password'] = md5($data['password']);
	    unset($data['password2']);
	}

	$this->usersModel->saveData($data);
    }

    public function handleDelete($id) {
	$this->usersModel->deleteData($id);
	$this->redrawControl('grid');
    }
}

Editoval MW (22. 11. 2016 13:53)

CZechBoY
Člen | 3608
+
0
-

@MW
Hele to je nějaký zmatený…

Proč voláš ukládací metodu na presenteru když ji můžeš mít v tý komponentě?

Vytvoř si klidně prázdnou akci s parametrem (jak radí @DavidMatějka).
Potom bych si to id předal přes konstruktor nebo přes setter (záleží jestli to chceš mít povinně editační form nebo i form na přidání uživatele).

Pokud ten formulář má i nějakou šablonu tak si udělej komponentu (aha, už máš), která bude mít ten formulář jako subkomponentu – tady narážím na invalidaci snippetů u presenteru z formuláře.

Editoval CZechBoY (22. 11. 2016 14:01)

MW
Člen | 626
+
0
-

Tak jestli jsem to pochopil správně, tak se form před samotným zpracováním ještě překreslí?
Jinak si nedovedu vysvětlit to, že zůstane viset a chtít password.

Jako pokud přidám toto, tak to je v pořádku:

public function renderEdit($id = null){
	$this->id = $this->getParameter('id');
    }

vlastně stačí o toto :)

public function renderEdit($id = null){

    }

Editoval MW (22. 11. 2016 14:26)