link z presenteru na signál komponenty
- michal.vrabel
- Člen | 1
S nette začínam a snažím sa urobiť typický jednoduchý výpis z db
(stránkovanie, radenie + vyhľadávanie).
O akcie s tým výpisom sa ma starať komponenta až na to že nechcem mať
pre ňu ďalšiu šablónu takže všetko mám
v presenter->template, komponenta je v podstate úplne podľa
dokumentácie prepojená s presenterom problem je v tom že keď z tej
šablóny presenteru mam link na signal tak mi síce handle{signal}
volá ale parametre sa do komponenty „nedostanú“.
kód:
Presenter:
<?php
class DefaultPresenter extends BasePresenter
{
public function actionData_list($params){
$vypisdat = new vypisdat($params);
$this['vypisdat'] = $vypisdat;
}
public function renderData_list(){
$this['vypisdat']->action();
...
}
... ďalší kód napr. nastavujúci vlasnosti vypisu dat
}
?>
Komponenta:
<?php
class vypisdat extends Control{
...
public function __construct($params = NULL){
parent::__construct();
...
}
public function handlePage($pagenum){
if( $pagenum ... ){
$this->paginator->page=$pagenum;
}
}
public function action(){
$this->loadData();
$this->generatePagination();
...
}
...
}
?>
data_list.phtml
... {link vypisdat-page! $page['n']} ...
adresu mi to generuje takúto
...?params=2&do=vypisdat-page
Takže ešte raz link mi síce zavolá handlePage ale bez parametru a parameter „posiela“ actionData_list($params)
Čo robím zle?
- Filip Procházka
- Moderator | 4668
Myslím si že máš minimálně dvě možnosti
- udělat templaty i pro vypisdat a stránkování
- předávat data jinak, konkrétně ke komponentám můžeš přistupovat
v metodách presenteru i takhle:
$this['nazevKomponenty']
. Tzn že když si nadefinuješ dvě metody na předávání signálů, jednu v presenteru a druhou v komponěntě mohlo by to fungovat zhruba takhle:
<?php
class MujPresenter extends BasePresenter
{
// ...
public function handlePage($page)
{
$this['strankovani']->setPage($page);
}
public function createComponentStrankovani($name)
{
$strankovani = new Strankovani($this, $name);
}
// ...
}
class Strankovani extends Control
{
// ...
public function setPage($page)
{
$this->page = $page;
}
// ...
}
a potom už jenom posíláš signál presenteru
{link page! $page}
, ale stejně si myslím že je jednodužší
mít templaty pro jednotlivé komponenty :) ušetříš si spousty
zbytečností
- musa
- Člen | 28
Ja mam podobny problem, ale sablonu dana komponenta ma. Pokud signal strcim do presenteru parametry jsou v poradku, pokud signal je v komponente sice se zavola ale bez parametru. Zatim to resim pres $this->getPresenter()->getParam(). Kde muze byt problem?
Komponenta je potomek Control, pridavana pres
<?php
function createComponentNeco() {
return new NecoControl;
}
?>
a v sablone presenteru vlozena jako {control neco}
- Ondřej Mirtes
- Člen | 1536
Určitě je správné, aby komponenta měla svoje šablony. Jinak to není komponenta a ty handlery signálů můžeš přesunout do Presenteru. Stejně tak je chyba volat signál komponenty z Presenteru, celou obsluhu by si měla zařizovat ona sama.
musa: nepřepisuješ náhodou konstruktor Controlu?
- musa
- Člen | 28
Problem je v tom ze odkaz pro ten pozadavek skladam takto js funkci:
function togglePermission(allow, role_id, resource_id, privilege_id, scope, manager) {
$.post({link togglePermission!}, {'add': allow, 'role_id': role_id, 'resource_id': resource_id, 'privilege_id': privilege_id, 'scope': scope, 'has_manager': manager});
}
Jmeno parametru tim padem nema predponu se jmenem komponenty a presenter tedy nevi ke ktere komponente se parametr vaze (predpokladam). Mozne reseni:
function togglePermission(allow, role_id, resource_id, privilege_id, scope, manager) {
$.post({link togglePermission!}, {'{!$control->name}-add': allow, '{!$control->name}-role_id': role_id, '{!$control->name}-resource_id': resource_id, '{!$control->name}-privilege_id': privilege_id, '{!$control->name}-scope': scope, '{!$control->name}-has_manager': manager});
}