%PDF- %PDF-
Direktori : /www/varak.net/losik.varak.net/vendor/nette/forms/src/Forms/Rendering/ |
Current File : /www/varak.net/losik.varak.net/vendor/nette/forms/src/Forms/Rendering/LatteRenderer.php |
<?php /** * This file is part of the Nette Framework (https://nette.org) * Copyright (c) 2004 David Grudl (https://davidgrudl.com) */ declare(strict_types=1); namespace Nette\Forms\Rendering; use Nette; use Nette\Forms\Form; /** * Generates Latte blueprint of form. */ final class LatteRenderer { public function render(Form $form): string { $dict = new \SplObjectStorage; $dummyForm = new class extends Form { protected function receiveHttpData(): ?array { return []; } }; foreach ($form->getControls() as $name => $input) { $dict[$input] = $dummyInput = new class extends Nette\Forms\Controls\BaseControl { public $inner; public function getLabel($name = null) { return $this->inner->getLabel() ? '{label ' . $this->inner->lookupPath(Form::class) . '/}' : null; } public function getControl() { return '{input ' . $this->inner->lookupPath(Form::class) . '}'; } public function isRequired(): bool { return $this->inner->isRequired(); } public function getOption($key) { return $key === 'rendered' ? parent::getOption($key) : $this->inner->getOption($key); } }; $dummyInput->inner = $input; $dummyForm->addComponent($dummyInput, (string) $dict->count()); $dummyInput->addError('{inputError ' . $input->lookupPath(Form::class) . '}'); } foreach ($form->getGroups() as $group) { $dummyGroup = $dummyForm->addGroup(); foreach ($group->getOptions() as $k => $v) { $dummyGroup->setOption($k, $v); } foreach ($group->getControls() as $control) { if ($dict[$control]) { $dummyGroup->add($dict[$control]); } } } $renderer = clone $form->getRenderer(); $dummyForm->setRenderer($renderer); $dummyForm->onRender = $form->onRender; $dummyForm->fireRenderEvents(); if ($renderer instanceof DefaultFormRenderer) { $renderer->wrappers['error']['container'] = $renderer->getWrapper('error container')->setAttribute('n:ifcontent', true); $renderer->wrappers['error']['item'] = $renderer->getWrapper('error item')->setAttribute('n:foreach', '$form->getOwnErrors() as $error'); $renderer->wrappers['control']['errorcontainer'] = $renderer->getWrapper('control errorcontainer')->setAttribute('n:ifcontent', true); $dummyForm->addError('{$error}'); ob_start(); $dummyForm->render('end'); $end = ob_get_clean(); } ob_start(); $dummyForm->render(); $body = ob_get_clean(); $body = str_replace($dummyForm->getElementPrototype()->startTag(), '<form n:name="' . $form->getName() . '">', $body); $body = str_replace($end ?? '', '</form>', $body); return $body; } }