skládání formuláře z několika menších formulářů
- tatyalien
- Člen | 239
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
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
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
Nemáš tam špatně názvy tříd? instanceof
nekřičí, když
kontroluješ instanci proti neexistující/nenačtené třídě.
- tatyalien
- Člen | 239
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
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)
- Martin
- Člen | 171
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)
- mejla
- Člen | 14
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ář.