Předávání parametru do control
- Peetee
- Člen | 75
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}
- bojovyletoun
- Člen | 667
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}
- Peetee
- Člen | 75
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)
- Peetee
- Člen | 75
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?