Link na signal subkomponenty
- petas
- Člen | 2
Zdravim,
prosim o radu s chybou „The signal receiver component ‚pageContent1-file3‘ is not found.“, protoze nejsem schopny po celkem dukladnem precteni fora najit reseni.
Pokousim se o jednoduche CMS. Navrh je asi takovy: 1 presenter s componentou pageContent, ktera obsahuje dynamicky pocet subkomponent paragraph, image, file, atd. Jednotlive komponenty jsou vytvareny pres tovarnicky (pageContent v presenteru a subkomponenty v komponente pageContent).
V sablone subkomponenty file potrebuji vytvorit link, na metodu
downloadFile.
Vytvarim ho takto v render subkomponenty file:
$template->downLink = $this->link('downloadFile', $this->data['nazev']);
Vytvori mi toto:
?pageContent1-file3-nazev=client-instalace.zip&do=pageContent1-file3-downloadFile
Kliknutim na link dostanu vyse uvedenou chybu BadSignalException #403.
Nejsem si jisty, jestli soucasti linku nema byt i presenter. tzn
?presenter-komponenta-subkomponenta…
Vypada to podle prispevku tady na foru na neprovazani prezenteru, komponent a
subkomponent, ale kdyz
dumpnu components presenteru, tak vypis vypada OK:
Nette\ComponentModel\RecursiveComponentIterator #b28b
pageContent1 => PageContentControl #cd11
configf protected => "/var/www-netteprojects/cis-obsah/APC/stranka.json" (56)
actualPath protected => "APAC" (4)
pageContent protected => array (5)
nadpis => "APAC" (4)
poznamka => "Úvodní stránka popisu hotovosti IS APC" (42)
datumPublikace => "1.8.2014" (8)
datumPlatnostiDo => "31.12.2999" (10)
obsah => array (4) [ ... ]
ParagraphControlFactory private => NULL
FileControlFactory private => NULL
ImageControlFactory private => NULL
templateFactory private => NULL
template private => Nette\Bridges\ApplicationLatte\Template #fe5d
latte private => Latte\Engine #2d96 { ... }
file private => "/var/www-netteprojects/cis/app/components/PageContentControl.latte" (72)
params private => array (13) [ ... ]
invalidSnippets private => array ()
snippetMode => NULL
params protected => array ()
components private => array (4)
paragraph0 => ParagraphControl #ced1 { ... }
image1 => ImageControl #e6a1 { ... }
paragraph2 => ParagraphControl #ed22 { ... }
file3 => FileControl #ef92 { ... }
cloning private => NULL
parent private => App\Presenters\HomepagePresenter #55bd
name private => "pageContent1" (12)
monitors private => array (1)
"Nette\Application\UI\Presenter" => array (4) [ ... ]
Diky predem za kazde nakopnuti.
petas
P.S. Pokud budou potreba kody, poslu. Nechtel jsem, aby byl dotaz moc dlouhy…
- petas
- Člen | 2
Trosicku jsem se posunul. Link z komponenty pageContent funguje.
HomepagePresenter (zkraceny):
class HomepagePresenter extends BasePresenter
{
public function injectPageContentControlFactory(\IPageContentControlFactory $factory)
{
$this->PageContentControlFactory = $factory;
}
protected function createComponentPageContent()
{
return $this->PageContentControlFactory->create($this->actualPath);
}
}
Homepage/default.latte:
{block content}
{control pageContent}
{/block}
Komponenta pageContent se vytvori „na vyzadani“ ze sablony a korektne se
attachne k presenteru a linky funguji.
U subkomponent jsem neprisel na to, jak je atachnout ke komponente pageContent,
protoze nevim kolik jich bude a jakeho typu, loaduji se dynamicky, pridavam
index ke jmenu kazde subkomponenty, takze tovarnicku s konstantnim jmenem
nemuzu pouzit. Zkousim pridavat subkomponenty pomoci
addComponent()
v metode render komponenty pageContent, ale tohle vyhazuje pak na linku BadSignalException:
class PageContentControl extends UI\Control {
public function render() {
.........
$i = 0;
$items = $this->pageContent['obsah'];
foreach ($items['castiObsahu'] as $item) {
.........
if ($item['typ']=='soubor') {
$control = new \FileControl($item, $this->actualPath);
$this->addComponent($control, 'file'.$i);
$control->setParent($this);
}
.........
$i++;
}
.........
}
}
Existuje nejake reseni v ramci komponenty pageContent nebo je jediny zpusob vytvorit vsechny subkomponenty v tovarnicce komponenty v presenteru?