Jak vykreslit kontejner (Nette\Forms\Container)?
- Myiyk
- Člen | 321
Ahoj,
mám delší formulář a snažím se to zjednodušit. Potřebuji tam mít
i texty s informacemi, co do políček vyplnit. Proto formulář musím trochu
rozdělit na části.
Rozdělil jsem jej do kontejnerů.
Jak ale vykrestli ten kontejner?
Můj formulář zjednodušeně
$form = new Form(); // Nette\Application\UI\Form
$main = $form->addContainer('main');
$main->addText('name', "Název");
$form->getRenderer()->renderControls($form['main']); // vrátí ""
$form->getRenderer()->renderControls($form); // vrátí taky "", bug ?
php 7, Nette 2.4
- Myiyk
- Člen | 321
Lexi napsal(a):
Zkusil bych https://api.nette.org/…enderer.html#… ;)
Render controls neumí vypsat ani formulář ani Container.
Edit: Kdo neveří, ať si spustí
<?php
require_once __DIR__ . '/../vendor/autoload.php';
\Tester\Environment::setup();
use Tester\Assert;
$form = new \Nette\Application\UI\Form();
$form->addText('a', "a");
$container = $form->addContainer('container');
$container->addText('b', "b");
Assert::same($form->getRenderer()->renderControls($form), "");
Assert::same($form->getRenderer()->renderControls($form['container']), "");
Projde to bez chyby. Obojí vrací ""
.
Editoval Myiyk (13. 9. 2016 14:36)
- Myiyk
- Člen | 321
Lexi napsal(a):
V šabloně by toto opravdu fungovat mělo (osobně tento přístup používám):
{form myForm} {var $renderer = $form->getRenderer()} {$renderer->renderControls($form["main"])|noescape} {/form}
Přesně tohle jsem zkoušel, ono to bohužel ale opravdu nefunguje.
Mám defaultní renderer. Jestli máš svůj, tak ti to může fungovat.
Editoval Myiyk (13. 9. 2016 14:41)
- jiri.pudil
- Nette Blogger | 1032
Když to použiješ samostatně, nemá ten renderer nastavený form a neprojde tu ta poslední podmínka.
Moc nechápu, proč jsou ty metody vlastně public, když závisí na tom,
že se pustí přes render
, kde se rendereru nastaví form? To je
trošku wtf
- Myiyk
- Člen | 321
Nechápu smysl té podmínky. Byla tam přidána v commitu https://github.com/…3ba72153842f
(leden 2009)
Tehdy se ten soubor jmenoval ConventionalRenderer.php
Není tam zmíněno, proč tam je ta podmínka.
Nějaký nápad proč tam má být? Nebo se může vyhodit?
Editoval Myiyk (13. 9. 2016 16:03)
- CZechBoY
- Člen | 3608
Ještě by to šlo ohackovat a chtít po rendereru aby to nastavil a nic nerenderoval
$form = new Form;
$form->getRenderer()->render($form, 'neco mimo zname mode');
{form myForm}
{var $renderer = $form->getRenderer()}
{$renderer->renderControls($form["main"])|noescape}
{/form}
- Myiyk
- Člen | 321
CZechBoY napsal(a):
Ještě by to šlo ohackovat a chtít po rendereru aby to nastavil a nic nerenderoval
$form = new Form; $form->getRenderer()->render($form, 'neco mimo zname mode');
{form myForm} {var $renderer = $form->getRenderer()} {$renderer->renderControls($form["main"])|noescape} {/form}
Ano, tenhle mírný hack funguje.
{var $renderer = $form->getRenderer()}
{php $renderer->render($form, '__no_render_pls__')}
{$renderer->renderControls($form['main'])|noescape}
Šlo by to udělat jednodušší?
ping @DavidGrudl
- maxj
- Člen | 1
Jsem v Nette úplným nováčkem, ale podařilo se mi vykreslit kontejner takto :
{form pokusForm}
{foreach $form[main]->getControls() as $sid => $cntrl}
{label $cntrl /}{input $cntrl}
{/foreach}
{/form}
main
je název kontejneru.
Snad to nějak pomůže.
EDIT: inspirace zde : https://doc.nette.org/cs/forms#…
Editoval maxj (24. 5. 2017 11:12)
- Michal Schneider
- Člen | 13
Ahoj,
řeším podobný problém. Tento fígl funguje:
{php $renderer->render($form, '__no_render_pls__')}
Ale pokud ve vlastním rendereru nastavím celému formuláři nějakou třídu, tak je to potřeba udělat dokonce takhle:
{var $someForm = $presenter['someForm']}
{var $renderer = $someForm->getRenderer()}
{php $renderer->render($someForm, '__no_render_pls__')}
{form $someForm}
{$renderer->renderControls($form['main'])|noescape}
{/form}
Pokud to takhle neudělám a zavolám metodu render až uvnitř makra form, formulář o třídě nastavené v rendereru nemá ponětí.
Nebo někde něco nevidím?
Moc dík za případné navedení!
Editoval Michal Schneider (21. 10. 2018 9:46)
- Polki
- Člen | 553
Pokud vím, tak containery mají vlastní makra na vykreslení:
{form pokusForm}
{input jmenoInputuVeFormu}
{$form['jmenoInputuVeFormu']->hasErrors()}
{formContainer jmenoContaineru}
{input jmenoInputuV_Containeru}
{$formContainer['jmenoInputuV_Containeru']->hasErrors()}
{/formContainer}
{/form}
Editoval Polki (10. 10. 2019 17:10)