Predani promenne samostatne komponente
- marcelxy
- Člen | 70
Prosim o malou pomoc,potrebuji predavat promenou samostatne komponente ktera
ma svou sablonu coz cinim pres
{control nazev $promena} mam ji pak k dispozici v rendr ($promena) { v kterem
pak volam
this->template = this->getComponent(‚nazev‘,a tady bych potreboval
predat komponente tu promenou $promena !) }
ale nejdeto hlasi to ze Missing argument 2 v createComponentNazev() ! a ta
componenta pak je
createComponentNazev($nazev,$promena){..} takze ten argument tam je! ale stejne
ho nevidi proc? jak predam promenou komponente z rendru? diky za radu.
Editoval marcelxy (8. 1. 2014 20:10)
- David Matějka
- Moderator | 6445
do createComponent nejde predat dalsi parametry. co presne potrebujes? mozna ti pomuze Multiplier
- Šaman
- Člen | 2666
- pokud ti stačí proměnnou předat do render metody komponenty, děláš to správně přes {control name param}.
- pokud tu proměnnou potřebuješ dříve (např. předat formuláři repozitář, ze kterého si bude načítat třeba hodnoty selectů), tak pak tu proměnnou musíš předat setterem v továrničce, kde komponentu vytváříš.
- marcelxy
- Člen | 70
No to ja vim ze tam asi ta promena predat nejde proto to vyhazuje ze Missing
argument 2 v createComponentNazev() ! ale ja ji tam potrebuji nebot ta
komponenta je form ktery edituje zaznam v tabulce takze se musi nacitat
dynamicky podle nejakeho id ktere se meni. Ktere bez problemu mam a muzu s nim
pracovat v rendr($id) ale uz nevim jak ji predat dal do te komponenty?? Tak
jsem to vyresil asi fuserskym spusobem ? ze vtom rendru si ji dam do globalni
promene!
$_SESSION[‚promena‘] = $id; a v te komponente coz je metoda hned za tim
rendrem si ji zas ztoho
$_SESSION[‚promena‘] vezmu a funguje to!!! ale je to asi prasarna? tak se
ptam jak se to $id da z
rendr($id) predat do te komponety cisteji nebo elegantneji??Diky za odpoved.
- Oli
- Člen | 1215
Správně, prasárna!
Správně to uděláš tak, ze si zavolas metodu a v ni nastavíš defaultní hodnoty pro formular. Podívej se sem https://doc.nette.org/…editing-form jak se správně předává parametr. Případně to aplikuj na svoje řešení, ale myslím, ze to děláš zbytecne složité.
- marcelxy
- Člen | 70
Šaman napsal(a):
- pokud ti stačí proměnnou předat do render metody komponenty, děláš to správně přes {control name param}.
- pokud tu proměnnou potřebuješ dříve (např. předat formuláři repozitář, ze kterého si bude načítat třeba hodnoty selectů), tak pak tu proměnnou musíš předat setterem v továrničce, kde komponentu vytváříš.
Jojo diky za odpoved toto by byla asi cesta ale jak to udelam kdyz tu
promenou vidim pouze v
rendr($promena){pouze zde ji vidim nikde jinde!, tady zadavam sablonu a pak
volam getComponent(‚nazev‘,a chtel bych ji zde predat tu $promenou ale nejde
to!)} a chci ji predat metode createComponentNazev($nazev,$promena){..tedy tu
$promenou potrebuji! } !
Na to musi existovat nejaky elegantni spusob? ted to delam pres
$GLOBALS[‚neco‘] a tu pak muzu pouzivat v dalsich metodach treba
v creteComp.. ale to je spatne! to ja vim! takze jak pouzit setter() abych
nemusel pouzivat to me $GLOBALS ??
Ja tu komponetu nevytvarim v presenteru na zaklade nejake action tu componentu
vola control v sablone a kde ji taky predava ten parametr {control nazev
param}.protoze potrebuji aby mela svoji vlastni sablonu! v presenteru ji pouze
injektuji a volam interface ->create() takze ji tam vubec nemam mam ji
samostatne v App\komponety jako samostatnou tridu class mojeComponenta {
rendr($promena) createComponent($form){a tu $promenou potrebuji aby mi nacetla
zaznam v tabulce} a pak uz jen ulozeni() a smazani() to je vse!}.Diky
za rady
Editoval marcelxy (9. 1. 2014 22:51)
- David Matějka
- Moderator | 6445
v sablone uz je (respektive muze byt) pozde na predani parametru
createComponent* metode.
pokud ten parametr slouzi k nastaveni sablony, melo by preci stacit ho poslat
do renderu, ne?
a za druhy, ten parametr v sablone ziskavas jak? to ten parametr nemas
k dispozici v presenteru v action* metode?
napis presne co potrebujes tim parametrem ovlivnit a kde ten parametr ziskavas
Editoval matej21 (9. 1. 2014 22:23)
- marcelxy
- Člen | 70
Ano ja to $id v action samozdrejme mam ale nevim jek ho poslat do te
samostetne komponenty kdyz v tom presenteru mam pouze iject db,
creteComponetNazev(){$neco = $this->neco->create()}
a ta komponenta je v samostatne class mojeComponenta extends Control {
rendr($id){…getComponent('nazev¨)..a sablona pro ni a rendr() } a pak
createComponent($form){a tady to $id potrebuji aby mi dynamicky nacietla zaznamy
v tabulce} a pak uz jen ulozeni($id) a smazani($id) to je vse!} Diky za
trpelivost!
Editoval marcelxy (9. 1. 2014 23:41)
- David Matějka
- Moderator | 6445
no a nebude ti proste v presenteru stacit
protected function createComponentNazev()
{
$control = $this->neco->create();
$control->setId($this->getParameter('id'));
return $control;
}
- Oli
- Člen | 1215
To je jednoduchy. Napriklad si v te MojeComponenta nadefinuj seter
public function setId($id)
{
$this->id = $id;
}
v presenteru předej komponentě pomocí toho seteru
public function createComponentNazev(){...}
public function activeDefault()
{
$this['nazev']->setId($id);
}
a mas Id z presenteru v $this->id v komponente.
PS. priste ty kody pis do bloku k tomu urcenymu. takhle se to hrozne blbe cte ;-)
Editoval Oli (9. 1. 2014 23:47)
- marcelxy
- Člen | 70
matej21 napsal(a):
no a nebude ti proste v presenteru stacit
protected function createComponentNazev() { $control = $this->neco->create(); $control->setId($this->getParameter('id')); return $control; }
A to je ekvivalentni tomuto? moc to jeste nechapu
/**
* @var \App\KontaktFormFactory
* @inject
*/
public $KontaktFormFactory;
protected function createComponentContaktForm()
{
$KontaktForm = $this->KontaktFormFactory->create();
return $KontaktForm;
}
to create() je interface ! ne metoda me komponenty. A vsechno ostatni i iject db zustane funkcni?
- David Matějka
- Moderator | 6445
no jestli v ContactForm potrebujes to id, tak si v ContactForm udelej
setter setId
a hodnotu tam nastav
z createComponentContactForm metody
- Oli
- Člen | 1215
marcelxy napsal(a):
A to je ekvivalentni tomuto? moc to jeste nechapu/** * @var \App\KontaktFormFactory * @inject */ public $KontaktFormFactory; protected function createComponentContaktForm() { $KontaktForm = $this->KontaktFormFactory->create(); return $KontaktForm; }
to create() je interface ! ne metoda me komponenty. A vsechno ostatni i iject db zustane funkcni?
Inject zustane funkcni. S tim id muzes pracovat na dvou místech. Bud si ho
vytáhneš pomocí getParameter a pak s ním můžeš pracovat kdekoli. Nebo
můžeš kdekoli v presenteru zavolat tu vytvořenou komponentu tím tvarem jak
jsem psal já. Já jsem třeba zvyklej pracovat s $id v actionNeco, takže to
potom vypadá zhruba takhle:
presenter:
@inject // inject formulare se zavislostmi definovanymi v configu
function actionEdit($id)
{
$row = $this->dotazDoDatabaze->getById($id);
$this['formular']->fillData($row);
}
function createComponentFormular()
{
return $this->formular;
}
komponenta:
function createComponentForm()
{
$form = new Form();
//...
return $form;
}
public function fillData($data)
{
$this['form']->setDefaults(array(
'name' => $data->name, // ze sloupce name z tabulky, kterou jsem mu predal z presenteru
'email' => $data->email,
//...
));
}