Nette 3 – Manuální vykreslení formuláře ignoruje renderer?
- sidrach
- Člen | 23
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)
- sidrach
- Člen | 23
Š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
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
@DavidGrudl toto je BC break vo v3… zrejme ‚nahodou‘… asi by bolo dobre to fixnut…