Generování linku v komponentě a invalidace

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

Zdravím vespolek! Zasekl jsem se na naprosto základní věci jakou je ajaxová invalidace komponenty. Našla by se zde prosím nějaká dobrá duše která by mi vysvětlila proč se to chová tak jak se to chová? Uvádím osekané části kódu.
Bootstrap:

$router[] = new Route('<id>', 'EconomicEntity:default');

Presenter:

class EconomicEntityPresenter extends BasePresenter
{
    public function renderDefault()
    {
	$id = $this->getParam('id');
        $economicEntity = MongoEconomicEntity::getById($id);
    }

    protected function createComponentObchodniRejstrik()
    {
	$id = $this->getParam('id');
        $economicEntity = MongoEconomicEntity::getById($id);

        $obchodniRejstrik = new ObchodniRejstrikControl();
        $obchodniRejstrik->setEconomicEntity($economicEntity);

	return $obchodniRejstrik;
    }

Komponenta:

class ObchodniRejstrikControl extends Control
{
    private $economicEntity;

    public function setEconomicEntity(MongoEconomicEntity $economicEntity)
    {
        $this->economicEntity = $economicEntity;
    }

    public function handleDownload()
    {
	$id = $this->economicEntity->id; // nefunguje, resp. sem se vubec nedostanu, skoncim na vyjimce jiz pri tvorbe komponenty v createComponentObchodniRejstrik() pri pokusu vytvorit instanci MongoEconomicEntity s NULL ID

        if (!$this->presenter->isAjax()) {
	    $this->presenter->redirect('this');
	} else {
	    $this->invalidateControl();
	}
    }

Šablona komponenty:

{snippet}
$("#nejaky_odkaz").click(function() {
    $.get({link download});
});
{/snippet}

Zjistil jsem, že se mi odkaz v šabloně komponenty vygeneruje sice na aktuální presenter, ale v URL již není obsaženo ID entity, konkrétně: /economic-entity/?do=obchodniRejstrik-download. Díky tomu nejsem v metodě handleDownload() schopen přistoupit k dané entitě (neznám její ID). Ale proč, to je standardní chování? Když už se generuje URL pro presenter, proč se nevygeneruje podle routy i s aktuálním parametrem ID, to tam musím ten parametr předávat ručně? Spíš bych si tipnul že je jako vždy chyba u mně mezi židlí a klávesnicí. 2.0 beta PHP 5.3.

Editoval elendir (16. 3. 2012 9:52)

elendir
Člen | 31
+
0
-

Omlouvám se, asi jsem svůj dotaz neformuloval dostatečně srozumitelně a stručně, zkusím to ještě jednou:

1. Bootstrap:

$router[] = new Route('<id>', 'EconomicEntity:default');

2. Na stránce www.example.com/3 mám snippet obchodniRejstrik. V šabloně tohoto snippetu je makro:

{link download}

3. Toto makro se přeloží jako www.example.com/…omic-entity/?…. Očekával bych www.example.com/3/?…. Je to tak schválně nebo mám spíš hledat chybu ve svém kódu? Díky!

Etch
Člen | 403
+
0
-

To je zcela normální chování. Pokud chceš, aby se nějaký parametr přenášel automaticky, tak je nutné ho definovat jako persistentní.

Presenter si uprav nějak takto:

class EconomicEntityPresenter extends BasePresenter
{
	/** @persistent **/
	public $id;

	public function renderDefault()
	{
	        $economicEntity = MongoEconomicEntity::getById($this->id);
	}

	protected function createComponentObchodniRejstrik()
	{
	        $economicEntity = MongoEconomicEntity::getById($this->id);

        	$obchodniRejstrik = new ObchodniRejstrikControl();
	        $obchodniRejstrik->setEconomicEntity($economicEntity);

        	return $obchodniRejstrik;
	}
}
elendir
Člen | 31
+
0
-

Ahoj, děkuju moc za info! Jelikož jsou na mě persistentní parametry (a obecně definice anotací) až moc magické, zkoušel jsem ještě různé jiné varianty. Nebudete věřit tomu čím se to nakonec vyřešilo: v presenteru jsem místo

public function renderDefault()
{
    $id = $this->getParam('id');
    $economicEntity = MongoEconomicEntity::getById($id);
}

zkusil

public function renderDefault($id)
{
    $economicEntity = MongoEconomicEntity::getById($id);
}

a v komponentě se začal se generovat link ve tvaru jaký jsem původně očekával. Naprosto mi uniká proč to tak je, ale třeba to pochopím až se lépe seznámím s komponentami. Každopádně ještě jednou děkuju za pomoc!

Ascaria
Člen | 187
+
0
-

No Nette podle argumentů metody hledá v $_GET ty proměnné automaticky a samo je přiřazuje.

Co se týče tvojeho problému, zkusil bych něco jako:

{snippet}
$("#nejaky_odkaz").click(function() {
    $.get({link download, id => $id});
});
{/snippet}

Takto předáš IDčko tomu makru {link}, to se mě zdá nejlepší, protože si přesně definuješ, co tomu odkazu dáš i bez persistentních parametrů.

A být tebou tak ten snippet pojmenuju třeba {snippet odkaz} a pak invaliduju invalidateControl(‚odkaz‘).

Editoval Ascaria (21. 3. 2012 19:48)

elendir
Člen | 31
+
0
-

Jj, tak by to určitě také šlo. Mně začalo po výše uvedené změně v presenteru fungovat vše přesně dle představ, nicméně tvé řešení přecejen asi také vyzkouším. Takže díky!