Předávání parametru do control

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

Ahoj,

snažím se komponentu, ve které se zobrazí nějaká data z db, zobrazí se formulář, který se uloží. Komponentu má definovanou jako:

<?php
	private $comments;

	public function render(Nette\Database\Table\ActiveRow $article)
	{
		$this->template->setFile(__DIR__ . '/article.latte'); //Soubor se šablonou
		$this->template->article = $article;

		$this->comments = $article->related('comments');

		$this->template->comments = $this->comments;
		$this->template->render();
	}

	protected function createComponentCommentForm()
	{
		$form = new Form;
		foreach($comments as $comment) {
			$form->addCheckbox($comment->id,...);
		}

		$form->addSubmit(...);
		$form->onSuccess[] = callback($this,'commentFormSubmitted');
		return $form;
	}

?>

Komponenta se v pořádku zobrazí, ale pokud ji vyhodnotím, tak mi to vypíše, že nemám definovaný $comments. Ano, ty jsou definovaný až v části $render, která ještě neproběhla. Ale na získání dat do $comments potřebuju proměnou $article. Mohu ji dostat dřív než v render?

Dodám, že $article se do komponenty dostane přes šablonu něco jako: {control articleComments $article}

uestla
Backer | 799
+
0
-

Přesunul bych to do konstruktoru, přidal komponentě ještě jednu private propertu $article a vní si instanci ActiveRow uchovával. Nezapomenout hlavně na parent::__construct().

bojovyletoun
Člen | 667
+
0
-

vyhodnotí=odešle formulář?

Správně píšeš,že se tam musí dostat dřív než v render. Do komponenty dej property article.

class YControl{
	public $article;
}

///presenter
function createComponentarticleComments($name){ //továrničce je předáno jen jméno komponenty
	$c=new YControl;
	$c->article=$this->model->getByID($this->params['idClanku']); // z URL třeba
	return $&;
}

///
{control artcoments}

Hledal jsi? 1 , 2

Peetee
Člen | 75
+
0
-

Ahoj,

děkuji za odpovědi.

Ano, vyhodnotí = odešle formulář. Možná je má úvaha úplně špatná, nebo mám špatný návrh aplikace. Problém je v tom, že já mám „připravenou“ proměnou $article až v šabloně. Vlastně jsem chtěl napsat něco jako:

{foreach $articles as $article}
	{control articleComments $article}
{/foreach}

(Asi bych měl doplnit, proč se proboha pokouším o podobný návrh. Příklad s článkem a komentářema je jen testovací, zatím si hraju jak to půjde udělat. Pomocí tohoto návrhu bych chtěl realizovat například bloky na stránce. Například načtu $blocks = $page->related('blocks'); a potom udělat v šabloně projít všechny bloky: {foreach $blocks as $block}{control mBlock $block}{/foreach} s tím, že v daném bloku může být klidně formulář. Blok může být na stránce víckrát apod… )

Editoval Peetee (2. 1. 2012 9:35)

Nox
Člen | 378
+
0
-

Není to ona slavná https://github.com/…e/issues/160 ?

Editoval Nox (2. 1. 2012 9:43)

Peetee
Člen | 75
+
0
-

Tak si říkám, jestli jsem toto vlákno neměl umístit spíš do sekce Začátečníci a nezeptat se spíš zda k tomuto používat komponenty. Viz: https://github.com/…e/issues/160#… asi mi něco podstatného uniklo.

Snažím se o hezký návrh. Vím, že každá stránka se bude skládat z „bloků“, které můžeme přeskládat. Každý blok může obsahovat různé věci – třeba formuláře, ale prvky forumláře se načítají z db na základě toho, jaký blok se zrovna zobrazuje. Bloků může být na stránce více.

Myslel jsem si, že blok je typický příklad control, je znovu použitelná, uzavřená. Uvažuju správně? nebo mám naincludovat šablonu a formuláře definovat v presenteru?