skládání formuláře z několika menších formulářů

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tatyalien
Člen | 239
+
0
-

Chci se zeptat, dá se nějak jednoduše skládat výsledný formulář? Jedná se mě o to, že bych si chtěl poskládat z několika továrniček jeden velký formulář (abych nemusel 2× zadávat stejný formulář a ten pak jen trochu upravovat…)

/app/form/reklamujiciForm
/app/form/zboziForm
 atd…

A já bych si chtěl udělat jeden maxi form poskládáním formulářů a ten pak vykreslit, s tím, že bych buď pak dodal tlačítka na konci, nebo je taky přišoupl.

Formuláře vytvářím:
reklamujiciForm:

<?php
class reklamaceForm extends AppForm
{
    //put your code here
    public function __construct(Nette\IComponentContainer $parent = null, $name = null)
    {
        parent::__construct($parent, $name);

        $this->buildForm();

    }
    protected function buildForm()
    {
        $this->addText('name', 'Jméno')->addRule(Form::MAX_LENGTH, 'Maximální délka smí být %d znaků', 50);
	...
    }
?>

A v presenteru si ho vytvořím:

<?php
        protected function createComponentReklamaceForm($name) {
             $form = new reklamaceForm($this, $name);

             $form['ok']->onClick[] = callback($this, 'okClicked');
             $form['pridat']->onClick[] = callback($this, 'pridatClicked');
             $form['vymazat']->onClick[] = callback($this, 'vymazatClicked');

             return $form;
        }
?>

Editoval tatyalien (29. 4. 2011 12:08)

Filip Procházka
Moderator | 4668
+
0
-

Nechceš raději použít containery?

PS: Tomuhle, co se snažíš udělat, se říká builder http://sourcemaking.com/…erns/builder

Editoval HosipLan (29. 4. 2011 14:24)

tatyalien
Člen | 239
+
0
-

Asi ty containery. Zkoušel jsem rozjet to co jsi tam psal ty [https://forum.nette.org/…ad-pro-dalsi#…].

Udělal jsem si v prezenteru:

<?php
use Nette\Forms\FormContainer,
Nette\Forms\Form,
Nette\Application\AppForm;


class PokusPresenter extends BasePresenter
{

	public function renderDefault()
	{
		$this->template->anyVariable = 'any value';
	}

protected function createComponentUzivatelForm($name)
{
        $form = new AppForm($this, $name);
        $form['user'] = new UzivatelContainer;
        $form->addSubmit('save', 'Uložit');
}

protected function createComponentStudentForm($name)
{
        $form = new AppForm($this, $name);
        $form['user'] = new StudentContainer;
        $form->addSubmit('save', 'Uložit');
}


}
?>

v /app/containers/ (nebo to dávat někam jinam)?
StudentContainer
UcitelContainer
UzivatelContainer

Příklad učitele:

<?php
class UcitelContainer extends UzivatelContainer
{
        protected function attached($obj)
        {
                parent::attached($obj);
                if (!$obj instanceof Nette\Forms\FormContainer) {
                        return ;
                }

                $this->addText('gfgf', 'Něco od učitele');
        }
}
?>

?>

ale když si to vykreslím v šabloně

<?php
{control studentForm}
?>

Tak se mě zobrazí pouze odesílací tlačítko, které se dodává v presenteru… co tam dělám blbě?

Editoval tatyalien (29. 4. 2011 15:22)

Filip Procházka
Moderator | 4668
+
0
-

Nemáš tam špatně názvy tříd? instanceof nekřičí, když kontroluješ instanci proti neexistující/nenačtené třídě.

tatyalien
Člen | 239
+
0
-

Mám tam to viz tady A laděnka vůbec neřvala… dneska už to balím, kouknu na to až se vrátím z víkendu (v neděli)…
Přeji hezký víkend.

Editoval tatyalien (29. 4. 2011 16:55)

tatyalien
Člen | 239
+
0
-

Tak jsem na to koukal znovu, ale nedokážu to rozjet, nevím co tam dělám blbě. Uložil jsem sandbox s dodanýma containerama, může se někdo na to kouknout a říct v čem je zakopanej pes? Fakt bych se chtěl dozvědět jak ty containery používat :-(

link na zdroj:http://www.ulozto.cz/…ontainer-rar

Editoval tatyalien (1. 5. 2011 20:07)

Martin
Člen | 171
+
0
-

Tak jsem na tom strávil hodinu, ale alespoň jsem se zase poučil o vnitřnostech Nette. Po prohlédnutí zdrojového kódu třídy Component a dalších mám pocit, že Ti tam chybí zavolání monitoru. Takto to už callback attached() volá:

class UzivatelContainer extends Nette\Forms\FormContainer
{
	public function __construct(IComponentContainer $parent = NULL, $name = NULL)
	{
                parent::__construct($parent, $name);
                $this->monitor('Nette\Forms\Form');
	}

        protected function attached($obj)
        {
                parent::attached($obj);
                if (!$obj instanceof Nette\Forms\FormContainer) {
                        return ;
                }

                ...
        }
}

Nejsem si ale vůbec jist, že je to navržené tak, že by právě v attached() měla být tvorba formuláře, jak to máš. Nemám ale čas to víc studovat, třeba to je BP.

Editoval Martin (1. 5. 2011 21:21)

tatyalien
Člen | 239
+
0
-

No já sám nevím, takhle mě na to odkázal HosipLan, netuším co to je monitor :-D (v nette) :-D

Otestováno… fachá… díky za tu hodinu tvého času Martine.

HospiLan: Má se to tedy takto dělat? Containery?

Editoval tatyalien (1. 5. 2011 21:33)

Martin
Člen | 171
+
0
-

Z toho si nic nedělej, já to taky netuším. Asi to ví jen David, Václav Klaus a pár zasvěcenců. Jen jsem prošel zdrojáky Nette :-)

Mrkni na https://doc.nette.org/…n/components

Editoval Martin (1. 5. 2011 21:33)

tatyalien
Člen | 239
+
0
-

Příště asi budu hledat více ve zdrojácích. Dík
PS: Componenty přečteny, zejtr to raději přečtu ještě jednou, dnes už to balím.

Editoval tatyalien (1. 5. 2011 21:36)

mejla
Člen | 14
+
0
-

Chtěl bych se ještě zeptat na skládání formuláře a to konkrétně: jak spojovat šablony? Kdyby měl každý modul formuláře ručně vytvořenou šablonu?

Příklad modulů formuláře pro administraci stránky jistého typu:

  • Hlavička (název, datum vytvoření)
  • Popis (wysiwyg editor)
  • Fotogalerie
  • Připojení souborů

A teď vůbec nevím jak sjednotit ty šablony modulů v jeden formulář.