Naja – validácia formuláru v modale

minimal
Člen | 12
+
0
-

Zdravím,

snažíme sa začať používať naja.js. Narazili sme na problém s ktorým si nevieme poradiť.

Máme modal v ktorom sa nachádza formulár a však ak ho v onSuccess[] zvalidujeme a vyhodíme chybu tak sa chyba nezobrazí. Rovnako je nejaký postup ako ten modal zavrieť v prípade úspechu ? Nie som JSkár len kolega sa nevie pohnúť z miesta. Nie som si istý či mu potrebujem posielať ešte nejaké dáta alebo … ? Celý formulár je vo vlastnej továrničke nie v presenteri.

/**
		 * @param Form                        $form
		 * @param CreateAdministratorFormData $values
		 */
		$form->onSuccess[] = function (Form $form, CreateAdministratorFormData $values) use ($onSuccess) {
			$values->password = $this->passwords->hash($values->password);

			try {
				$this->administratorRepository->insert((array)$values);
			} catch (UniqueConstraintViolationException $exception) {
				$form['email']->addError('Pre tento email nie je možné vytvoriť administrátora.');
                return;
			}

			$onSuccess($values);
		};
<!--begin::Modal body-->
               <div class="modal-body scroll-y mx-5 mx-xl-15 my-7">
                   <!--begin::Form-->
                   <form id="kt_modal_new_card_form" class="form ajax" n:name="createAdministratorForm">

                       <ul class="errors" n:if="$form->hasErrors()">
                           <li n:foreach="$form->errors as $error">{$error}</li>
                       </ul>

                       <!--begin::Input group-->
                       <div class="d-flex mb-7 fv-row row">
                           <div class="col-sm-12">
                               <label class="d-flex align-items-center fs-6 fw-bold form-label mb-2">
                                   <span class="required">{label full_name}</span>
                                   <i class="fas fa-exclamation-circle ms-2 fs-7" data-bs-toggle="tooltip" title="Priezvisko používateľa"></i>
                               </label>
                               <!--end::Label-->
                               <input n:name="full_name" type="text" class="form-control form-control-solid">
                           </div>

                       </div>
                       <!--end::Input group-->
                       <!--begin::Input group-->
                       <div class="d-flex flex-column mb-7 fv-row">
                           <!--begin::Label-->
                           <label class=" fs-6 fw-bold form-label mb-2"> <span class="required">{label email}</span>
                               <i class="fas fa-exclamation-circle ms-2 fs-7" data-bs-toggle="tooltip" title="Prihlasovací email"></i>
                           </label>
                           <!--end::Label-->
                           <!--begin::Input wrapper-->
                           <div class="position-relative">
                               <!--begin::Input-->
                               <input n:name="email" type="text" class="form-control form-control-solid">
                               <!--end::Input-->
                           </div>
                           <!--end::Input wrapper-->
                       </div>
                       <!--end::Input group-->
                       <!--begin::Input group-->
                       <div class="d-flex flex-column mb-7 fv-row">
                           <!--begin::Label-->
                           <label class=" fs-6 fw-bold form-label mb-2"> <span class="required">{label password}</span>
                               <i class="fas fa-exclamation-circle ms-2 fs-7" data-bs-toggle="tooltip" title="Prihlasovacie heslo"></i>
                           </label>
                           <!--end::Label-->
                           <!--begin::Input wrapper-->
                           <div class="position-relative">
                               <!--begin::Input-->
                               <input n:name="password" type="password" class="form-control form-control-solid">
                               <!--end::Input-->
                           </div>
                           <!--end::Input wrapper-->
                       </div>
                       <!--end::Input group-->
                       <!--begin::Actions-->
                       <div class="text-center pt-15">
                           <button type="reset" id="kt_modal_new_card_cancel" class="btn btn-light me-3" data-bs-dismiss="modal">Zrušiť</button>
                           {input submit, 'class'=>'btn btn-primary ajax'}
                       </div>
                       <!--end::Actions-->
                   </form>
                   <!--end::Form-->
               </div>
               <!--end::Modal body-->
emololftw
Člen | 82
+
0
-

v js souboru stačí kontrolovat payload (např. @layout.latte):

naja.addEventListener('success', event => {
	if (typeof event.detail.payload.closeModal !== 'undefined') {
		$('.modal').modal('hide');
	}
});

V onSuccess[] metodě je potřeba volat payload s hodnotou např. true

Pokud by jsi měl v budoucnu v presenteru tak:

$this->payload->closeModal = true;

nebo jestli máš vytvořenou továrničku tak tento způsob:

V továrničce:

$form->getPresenter()->payload->closeModal = true;

EDIT: formulář musí mít třídu ajax (aby se jednalo o ajaxový formulář)

Editoval emololftw (7. 12. 2021 13:59)

minimal
Člen | 12
+
0
-

emololftw napsal(a):

v js souboru stačí kontrolovat payload (např. @layout.latte):

naja.addEventListener('success', event => {
	if (typeof event.detail.payload.closeModal !== 'undefined') {
		$('.modal').modal('hide');
	}
});

V onSuccess[] metodě je potřeba volat payload s hodnotou např. true

Pokud by jsi měl v budoucnu v presenteru tak:

$this->payload->closeModal = true;

nebo jestli máš vytvořenou továrničku tak tento způsob:

V továrničce:

$form->getPresenter()->payload->closeModal = true;

EDIT: formulář musí mít třídu ajax (aby se jednalo o ajaxový formulář)

Výborne zajtra to kolega otestuje. Ešte by ma zaujímalo ako riešiť to zobrazovanie chýb ? Tým že to riešim v $onSuccess kde vraciam len formuláru error tiež asi nejakým spôsobom potrebujem prekresliť Form Errors v latte. Riešiť to cez snippety alebo ?

emololftw
Člen | 82
+
0
-

minimal napsal(a):

emololftw napsal(a):

v js souboru stačí kontrolovat payload (např. @layout.latte):

naja.addEventListener('success', event => {
	if (typeof event.detail.payload.closeModal !== 'undefined') {
		$('.modal').modal('hide');
	}
});

V onSuccess[] metodě je potřeba volat payload s hodnotou např. true

Pokud by jsi měl v budoucnu v presenteru tak:

$this->payload->closeModal = true;

nebo jestli máš vytvořenou továrničku tak tento způsob:

V továrničce:

$form->getPresenter()->payload->closeModal = true;

EDIT: formulář musí mít třídu ajax (aby se jednalo o ajaxový formulář)

Výborne zajtra to kolega otestuje. Ešte by ma zaujímalo ako riešiť to zobrazovanie chýb ? Tým že to riešim v $onSuccess kde vraciam len formuláru error tiež asi nejakým spôsobom potrebujem prekresliť Form Errors v latte. Riešiť to cez snippety alebo ?

Ano, zobrazovat chyby pomocí snippetu je super volba. Překreslujte pouze formulář a nikoliv celý modal (při volání $this->redrawControl() by se zavřel. Obalte snippetem pouze formulář nějak takto:

<div class="modal">
	<div class="title"></div>
	{snippet form}
		{control form}
	{/snippet}
</div>

formulář potom v onError[] metodě překreslíte pomocí $this->redrawControl('form'). Následně můžete validovat formulář, že si vypisujete všechny chyby do listu takto:

<div 	n:inner-foreach="$form->getErrors() as $error"
		n:class="flash_login, alert-danger">
	{$error}
</div>

nebo validujete přímo zasažený prvek, vidím, že používáte bootstrap takže něco takového:

{var $input = $form['interval_start']}
<label n:name=$input class="form-label">{$input->getLabel()->getText()}</label>
<input n:class="$input->getErrors() ? is-invalid, form-control" n:name=$input>
<div class="invalid-feedback" n:ifcontent>
	{inputError $input}
</div>