Ako získať premennú z {widget } vo funkcii createComponent?
- gawan
- Člen | 110
Zdravím,
je možné nejako získať premennú $param1 zo šablony
<?php
// šablona
{widget Form $param1}
?>
a použiť ju v továrničke?
<?php
public function createComponentForm($name) {
$form = new AppForm($this, $name);
$param1 = ?????
if ($param1) {
....
}
return $form;
}
?>
viem, že $param1 sa pošle ako parameter do metódy render, ale ak vytváram AppForm, potom nepoužívam render, ale priamo v createComponent vytváram formulár a na základe $param1 by som chcel niektoré položky do formulára pridať a niektoré nepridať. Ako to môžem urobiť? Ďakujem.
- Ondřej Mirtes
- Člen | 1536
Bohužel, to nijak nejde a odporuje to i logice. Všechno nastavení formuláře už musí být přístupné v továrničce. Kdybys mu předal nějaká nastavení až při renderování widgetu, tak by o nich při zpracování (v submit metodě) vůbec nevěděl.
Napiš, co konkrétního chceš provést, a najdeme alternativní řešení.
- gawan
- Člen | 110
Len som si chcel ušetriť písanie. Mám dva podobné formuáre, ktoré sa líšia len v jednej položke. Napríklad:
<?php
public function createComponentFormAAA($name) {
$form = new AppForm($this, $name);
$form->addText('spolocne1', 'spoločná položka 1');
$form->addText('spolocne2', 'spoločná položka 2');
// ... atď
$form->addText('aaa', 'specialna položka pre form AAA');
return $form;
}
public function createComponentFormBBB($name) {
$form = new AppForm($this, $name);
$form->addText('spolocne1', 'spoločná položka 1');
$form->addText('spolocne2', 'spoločná položka 2');
// ... atď
$form->addText('bbb', 'specialna položka pre form BBB');
return $form;
}
?>
a myslel som, že by sa to dalo robiť pomocou jednej metódy nejako takto:
<?php
public function createComponentForm($name) {
$form = new AppForm($this, $name);
$form->addText('spolocne1', 'spoločná položka 1');
$form->addText('spolocne2', 'spoločná položka 2');
// ... atď
if ($premenna_widget == 'AAA' {
$form->addText('aaa', 'specialna položka pre form AAA');
} else {
$form->addText('bbb', 'specialna položka pre form BBB');
}
return $form;
}
?>
a potom by mi stačilo v šablóne akurát použiť:
<?php
{widget form 'AAA'}
{widget form 'BBB'}
?>
je niečo také možné?
- _Martin_
- Generous Backer | 679
Protože na tohle není žádné Best Practice, řešil bych to asi takto:
private function createComponentFormBase()
{
$form = new AppForm;
$form->addText('spolocne1', 'spoločná položka 1');
$form->addText('spolocne2', 'spoločná položka 2');
return $form;
}
protected function createComponent($name)
{
if($name == 'FormAAA') {
$form = $this['formBase'];
$form->addText('aaa', 'specialna položka pre form AAA');
return $form;
} elseif($name == 'FormBBB') {
$form = $this['formBase'];
$form->addText('bbb', 'specialna položka pre form BBB');
return $form;
} else {
return parent::createComponent($name);
}
}
Popravdě, osobně bych si udělal „vlastní továrničku“ na ten formulář (tj. ne createComponentXXX) a potom dvě standardní továrničky pro formulář AAA a BBB a v nich bych si zavolal tu vlastní a k získanému formu bych přidal potřebný prvek.
- LuKo
- Člen | 116
Šlo by to i tímto způsobem?
<?php
private function createBaseForm($name) {
$form = new AppForm($this, $name);
$form->addText('spolocne1', 'spoločná položka 1');
$form->addText('spolocne2', 'spoločná položka 2');
// ... atď
return $form;
}
public function createComponentFormAAA($name) {
$form = createBaseForm($name);
$form->addText('aaa', 'specialna položka pre form AAA');
return $form;
}
public function createComponentFormBBB($name) {
$form = createBaseForm($name);
$form->addText('bbb', 'specialna položka pre form BBB');
return $form;
}
?>
{widget formAAA}
{widget formBBB}
- Ondřej Mirtes
- Člen | 1536
Zrušil bych ty atributy $name (ty metody tento parametr nepotřebují, viz https://forum.nette.org/…iewtopic.php?…), protože by mohly dělat nepořádek, jinak je to imho v pořádku.
- v6ak
- Člen | 206
Odporuje logice? To snad ne. Ale odporuje to současnému systému.
Stačí si představit, že máš továrnu na továrnu na formuláře. (Už
vidím tu výrobní linku, ze které vyjíždí továrny…) To by šlo už
teď, jen by se to blbě používalo.
Tak jinak: instance továrnou již vytvořeného objektu (zde formuláře) by
byla identifikována jak názvem továrny, tak jejími parametry, nejlépe
v nějakém normalizovaném tvaru. Pak v tom nevidím jakýkoli problém.
- Ondřej Mirtes
- Člen | 1536
Ano, rozhodně by to nějakým způsobem šlo udělat, ale rozhodně ne předáváním parametrů až v render fázi, což gawan dělal. Tím jsem myslel, že to odporuje logice.
- v6ak
- Člen | 206
No ten můj způsob to dělá přesně tak.
Teď mě ale napadá, že by byl problém s identifikací formulářů (zpracování odeslání). Řešit by to šlo strukturovaným ID, ale to by bylo ještě větší překopání frameworku.
A stále si myslím, že to neodporuje logice, jen je to (možná poněkud zásadnější) změna současného systému.
- Ondřej Mirtes
- Člen | 1536
A jak se formulář dozví o tom, jak má být nastavený (např. při zpracování), když je tato informace až v render fázi – šabloně?
- LuKo
- Člen | 116
Tato úprava chování Control
u po vzoru
Presenter
u je asi nesmysl, že?
<?php
class MyControl extends Control
{
public function action($param) { ... }
public function render($param) { ... }
public function actionSmall($param) { ... }
public function renderSmall($param) { ... }
}
class MyPresenter extends Presenter
{
public function createComponentMyControl()
{
return new MyControl;
}
}
?>
{control myControl "AAA"}
{control myControl:small "BBB"}
- Ondřej Mirtes
- Člen | 1536
Jak zajistíš volání těch action metod? Nezapomeň na zavolání i před přijímáním signálu.
- Jan Tvrdík
- Nette guru | 2595
Zatím vyjdi z předpokladu, že je to totální blbost a dále se tím nezabývej.