Predani promenne samostatne komponente

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

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

do createComponent nejde predat dalsi parametry. co presne potrebujes? mozna ti pomuze Multiplier

Šaman
Člen | 2666
+
0
-
  • 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
+
0
-

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

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é.

akadlec
Člen | 1326
+
0
-

@marcelxy: zbytečně složitě. V action metodě si zjistíš ID případně vytáhneš celý objekt co chceš editovat, uložíš do proměnné presenteru $this->editovanaVec a v createComponentEditacniForm si to jen vezmeš a zpracuješ jak potřebuješ.

marcelxy
Člen | 70
+
0
-

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

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

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

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

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

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

no jestli v ContactForm potrebujes to id, tak si v ContactForm udelej setter setId a hodnotu tam nastav z createComponentContactForm metody

Oli
Člen | 1215
+
0
-

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,
		//...
	));
}