Vnitrni chyby: addError a makro form

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

Ahoj,

nefunguje mi addError pri pouzivani makra form.. Nevite kde by mohla byt chybka? Diky..

Filip Procházka
Moderator | 4668
+
0
-

Pravděpodobně špatně používáš metodu addError. Nemáš zač.

Ale vážně :) Makro form vůbec nepoužívá DefaultRenderer. Řešením je buď napsat si vlastní makro, nebo je vypsat „ručně“.

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

Něco podobného jsem si tuhle bastil:

use Nette;
use Nette\Latte;
use Nette\Latte\MacroNode;


/**
 * Macros for Nette\Forms.
 *
 * - {notif signInform}
 * - {notif component}
 *
 * @author Filip Procházka
 */
class UIMacros extends Latte\Macros\MacroSet
{

	/**
	 * @param Latte\Parser $parser
	 */
	public static function install(Latte\Parser $parser)
	{
		$me = new static($parser);
		$me->addMacro('notif', callback($me, 'macroNotif'));
	}



	/**
	 * @param MacroNode $node
	 * @param Latte\PhpWriter $writer
	 */
	public function macroNotif(MacroNode $node, $writer)
	{
		$name = $node->tokenizer->fetchWord();
		if ($name === FALSE) {
			throw new ParseException("Missing control name in {notif}");
		}

		$name = $writer->formatWord($name);

		// find control
		$cmd = ($name[0] === '$' ? "if(is_object($name))\$_ctrl = $name;else" : '')
			. '$_ctrl = $control->getWidget(' . $name . ');';

		// if control, list flashes
		$cmd .= 'if($_ctrl instanceof Nette\Application\UI\Control && $presenter && $presenter->hasFlashSession()){'
				. '$_id = $_ctrl->getParamId("flash"); $_msgs = $presenter->getFlashSession()->$_id;}';

		// if form list errors
		$cmd .= 'if($_ctrl instanceof Nette\Forms\Form){'
				. '$_msgs = $_ctrl->getErrors();}';

		// iteration begin
		$cmd .= 'foreach ($_msgs as $_msg): ?>';

		// write message
		$cmd .= "\n"
			. '<div class="notif <?php echo %escape((is_object($_msg) && isset($_msg->type)) ? $_msg->type : "error"); ?>">'
			. "\n\t" . '<?php echo %escape((is_object($_msg) && isset($_msg->message)) ? $_msg->message : $_msg); ?>'
			. "\n\n</div>\n" . '<?php';

		// iteration end
		$cmd .= ' endforeach;';

		return $writer->write($cmd);
	}

}

Název „notif“ je dost blbý, ale určitě si to zvládneš přejmenovat :)

{notif $control} flash zprávičky
{notif jmenoFormulare} chyby formuláře

Editoval HosipLan (10. 8. 2011 8:42)

neznalek
Člen | 60
+
0
-

Nedari se mi to nejk registrovat.. Vytvoril jsem si tridu a hlasi to ze nemohl najit macro.. Musi se nejak registrovat vzlast?

22
Člen | 1478
+
0
-

dokumnentace zase nejede? https://latte.nette.org/en/develop#…

neznalek
Člen | 60
+
0
-

Jo dokumentace jede, ale nejak nechapu jak to registrovat..

22
Člen | 1478
+
0
-

a ten odkaz jsi viděl?

neznalek
Člen | 60
+
0
-

Jo dival jsem se na nej.. Ale to je makro a tam to je componenta..

22
Člen | 1478
+
0
-

protože makro {form} automaticky nevypisuje chyby, takže si buď udělej svoje makro nebo vypsat ručně. Myslím, že HosipLan ti už odpověděl, jak se dívám ..