link z presenteru na signál komponenty

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

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

Myslím si že máš minimálně dvě možnosti

  1. udělat templaty i pro vypisdat a stránkování
  2. 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
+
0
-

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

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

Ondřej Mirtes napsal(a):

musa: nepřepisuješ náhodou konstruktor Controlu?

Neprepisuju. Jak si najdu trochu casu tak kouknu, kde se ty parametry na signal predavaji, zajimalo by me kde je zakopanej pes.

musa
Člen | 28
+
0
-

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});
}