Jak vykreslit kontejner (Nette\Forms\Container)?

Myiyk
Člen | 321
+
+1
-

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

CZechBoY
Člen | 3608
+
0
-

V latte bych to tipoval na

{control $form['main']}
Myiyk
Člen | 321
+
0
-

CZechBoY napsal(a):

V latte bych to tipoval na

{control $form['main']}

To by byla nádhera, ale bohužel. Container neumí render.

Call to undefined method Nette\Forms\Container::render().
Myiyk
Člen | 321
+
0
-

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)

David Matějka
Moderator | 6445
+
0
-

Umí. jak si to zkousel a co tam neslo?

Jan Mikeš
Člen | 771
+
+1
-

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}
Myiyk
Člen | 321
+
0
-

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 | 1028
+
+2
-

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
+
0
-

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
+
+1
-

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
+
+1
-

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
+
+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
+
0
-

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
+
+1
-

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)