Podmíněný setRequired nepřidá class
- MW
- Člen | 626
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
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)
- David Matějka
- Moderator | 6445
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
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
mas u prislusne akce presenteru (asi actionDefault, prip renderDefault)
v parametrech uvedene $id
? to se jinak ztrati
- MW
- Člen | 626
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
@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
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)