Nette 3 – Manuální vykreslení formuláře ignoruje renderer?

sidrach
Člen | 23
+
0
-

Zdravím,

snažím se upgradovat na nette 3 a locknul jsem se na tom, že používám instante bootstrap renderer, extended latte macros (primárně {pair}) a datetime picker forknutý z nextras. Ani jedno z toho není kompatibilní s v3 a tak jsem se pustil do vlastní implementace inspirované contributte forms, kdyby a nextras.

Problém ale nastal ve chvíli kdy se snažím použít latte makra {input} a {label}, které ať dělám co dělám renderují elementy bez toho co k nim přidává renderer. Pokud si v templatu dumpnu $form->getRenderer(), tak tam je ten co tam má být.

<?php
// renderer
https://github.com/tvaliasek/yabsform/blob/master/app/src/Renderers/BootstrapFormRenderer.php

// formFactory
class BootstrapFormFactory
{
    public function create(): Form
    {
        $form = new Form();
        $form->setRenderer(new BootstrapFormRenderer());
        return $form;
    }
}

// form
protected function createComponentManualForm(): Nette\Application\UI\Form
{
    $form = $this->formFactory->create();
    $form->addText('text', 'Text input label')
        ->setRequired(true);
    $form->addSubmit('submit', 'Submit');
    return $form;
}

// template
{form manualForm}
 	{label text /}
  	{input text}

	<p>
    	{input submit}
	</p>
{/form}

// vyrenderuje

<form action="/" method="post" id="frm-manualForm">
	<label for="frm-manualForm-text">Text input label</label>
	<input type="text" name="text" id="frm-manualForm-text" required data-nette-rules='[{"op":":filled","msg":"This field is required."}]'>
	<p>
		<input type="submit" name="_submit" value="Submit">
	</p>
	<input type="hidden" name="_do" value="manualForm-submit"><!--[if IE]><input type=IEbug disabled style="display:none"<![endif]-->
</form>

// {control manualForm}

<form action="/" method="post" id="frm-manualForm" novalidate>
	<div class="form-group required">
		<label for="frm-manualForm-text" class="required">Text input label</label>
		<input type="text" name="text" class="form-control text" id="frm-manualForm-text" required data-nette-rules='[{"op":":filled","msg":"This field is required."}]'>
	</div>
	<div class="form-group">
		<input type="submit" name="_submit" class="btn btn-primary button" value="Submit">
	</div>
	<div class="d-none"><input type="hidden" name="_do" value="manualForm-submit"><!--[if IE]><input type=IEbug disabled style="display:none"><![endif]--></div>
</form>
?>

Dělám něco blbě, nebo to tak je a musím přepsat makra/form/renderer?

Kód si prototypuju tady, v app\src: https://github.com/…sek/yabsform

Editoval sidrach (12. 5. 2019 22:55)

Šaman
Člen | 2635
+
0
-

Jestli se něco nezměnilo, tak makra {input} a {label} jsou záležitost manuálního renderování.
Renderer se použije jen (?) pokud zadám {control fooForm}, což je obdoba

<?php
$presenter['fooForm']->render();
?>

Editoval Šaman (13. 5. 2019 0:30)

sidrach
Člen | 23
+
0
-

Šaman napsal(a):

Jestli se něco nezměnilo, tak makra {input} a {label} jsou záležitost manuálního renderování.
Renderer se použije jen (?) pokud zadám {control fooForm}, což je obdoba

<?php
$presenter['fooForm']->render();
?>

Ok, zkusím se mrknout co provolává kód co generují ty makra. Dík

sidrach
Člen | 23
+
+4
-

Kdyby se to někdy někomu hodilo:

{input} a {label} interně volají $control->getLabel nebo getLabelPart, respektive $control->getControl nebo $control->getControlPart, kdežto renderer volá render($mode), a ten pak start, body, pair, atd až ke renderControl a renderLabel s vyjímkou buttonů na konci formu, které renderuje renderPairMulti.

Vytvořil jsem si tedy další macroset s makry bsInput, bsLabel a bsPair, které místo vypsání html z metody controlu volají $_form->getRenderer()->renderLabel($control), renderControl a renderPair. Nevím jak moc je to čisté, ale zatím se to zdá funkční a nemění to funkci původních maker ani formu.

David Ďurika
Člen | 328
+
0
-

@DavidGrudl toto je BC break vo v3… zrejme ‚nahodou‘… asi by bolo dobre to fixnut…

David Grudl
Nette Core | 8136
+
0
-

V čem přesně se liší v3 od v2.4?