Překreslení formulářových chyb v dialogové komponentě

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

Ahoj,

mám vytvořenou komponentu pro dialogové okno kde mám formulář. Vše mi funguje správně až na chybové hlášky. Potřebuju invalidovat při chybě pouze ty – proto jsem je obalil snippetem, ale invaliduje se mi celý dialog čímž se smažou některá data.

Ve vrácených snippetech vidím jak formErrors tak i celý dialog, potřebuju překreslit pouze formErrors.
Funguje správně odeslání formuláře, zavření formuláře, live validace formuláře. Tedy všechno kromě chyb, , které se generují až v PHP po odeslání formuláře.

Pomohl by mi někdo prosím?

Nevím, jestli je v pořádku mít 3 úrovně snippetů.

<?php

	public function processDialog(Form $form)
	{

		try {
			...
		} catch(\Exception $e) {
			$form->addError($e->getMessage());
			$this->redrawControl('formErrors');
			return;
		}
    }

	public function processDialogError(Form $form)
	{
		if ($this->presenter->isAjax()) {
			$this->redrawControl('formErrors');
		}
	}


<div n:snippet n:inner-if="$renderModal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="dialogModalTitle" aria-hidden="true">
	<div class="modal-dialog">
		<div class="modal-content ajax-overlay">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
				<h4 class="modal-title" id="dialogModalTitle">{_messages.Title}</h4>
			</div>

			<form n:name="calendarDialog" class="form-horizontal">
				<div class="modal-body">

					{snippet formErrors}
					<div class="alert alert-block alert-danger fade in" n:if="sizeof($form->getErrors())">
						<div n:foreach="$form->getErrors() as $error">{$error}</div>
					</div>
                    {/snippet}

					{input from}
				</div>
				<div class="modal-footer">
					<button n:name="send" class="btn btn-primary ajax">{_messages.Send}</button>
					<button type="button" class="btn btn-default" data-dismiss="modal">{_messages.Cancel}</button>
				</div>

			</form>

		</div>
	</div>
</div>



ve view pro presenter default.latte
{snippet dialogWrapper}
{control dialog}
{/snippet}

?>

edit: přidán výpis z view

Editoval Phalanx (6. 1. 2017 10:43)

Phalanx
Člen | 310
+
0
-

Přišel jsem na řešení. Ne tak hezké, ale funguje. Zakázal jsem překreslení všeho při chybě. Potom se jde do processDialogError, kde už se nastaví překreslení errors.

<?php
		try {
			...
		} catch(\Exception $e) {
			$form->addError($e->getMessage());
			$this->redrawControl(NULL, FALSE); // tento řádek je důležitý
			return;
		}

?>