Prekresleni komponenty s novymi parametry pomoci signalu

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

Ahoj, vytvářím si vlastní datagrid komponentu a potřeboval bych vědět jakým způsobem jí překreslit na základě nových parametrů.

Mám tento kód

<?php
namespace LGrid;
use Nette\Application\UI\Control;

class LGrid extends Control
{
	/** @var \Nette\Database\Context */
    private $db;

    public function __construct(\Nette\Database\Context $database)
    {
        $this->db = $database;
    }

    public function render($parameter1 = 1, $parameter2 = 2) {
    	// zpracovani parametru a zobrazeni datagridu
    }

    public function handleRender($parameter1, $parameter2){
    	// ? redrawControl ?
    }

 }

a z komponentové šablony volám například {link render!,3,4}, ale nevím jak ty nové parametry zpracovat, když z handlu zavolám znova metodu render() tak se komponenta vykreslí dvakrát, takže tudy asi cesta nevede?!

David Matějka
Moderator | 6445
+
0
-

parametry prijimane v metode render nejsou z URL, ale poslane ze sablony; treba pomoci:

{control foo $bar, $lorem}

v handle si ty parametry treba muzes nejak zpracovat, ulozit do clenske promenne. Nebo si proste v renderu ty parametry vytahni pomoci $this->getParameter('parameter1')

Dragonaut
Člen | 33
+
0
-

Děkuju, a když si zpracuji ty parametry, jak pak překreslím tu komponentu ?

$this->redrawControl();

nic neudělá

a

$this->template->render();

mě jí vykreslí znova, takže mám na stránce pak tu komponentu dvakrát, ikdyž to následně pak již funguje :p

Editoval Dragonaut (1. 10. 2014 9:32)

Dragonaut
Člen | 33
+
0
-

Jelikož mi to pořád nefunguje, tak jsem pro testovací účely vytvořil nejjednoduší komponentu, která mě napadla, která mi ale nefunguje a potřeboval bych poradit s úpravou.

Funkce:
Po kliknutí na odkaz „Click!“ se signálem přičte k proměnné jednička a dojde k překreslení.

komponenta:

<?php
namespace Test;
use Nette\Application\UI\Control;

class Test extends Control
{
	public function render($number = 1)
	{
		$this->template->setFile(__DIR__ . '/Test.latte');
		$this->template->number = $number;
		$this->template->render();
	}

	public function handleClick($number)
	{
		//Tady to vrací chybu a nevím jak to přepsat. Proměnnou jsem schopnej nastavit v té tříde, ale nevím jak jí pak dostat do šablony.
		//The variable 'number' does not exist in template.
		$this->template->number = $this->template->number + $number;
	}
}

šablona komponenty:

{$number}
<a href="{link click!,1}">Click!</a>

presenter:

	protected function createComponentTest()
	{
		return new \Test\Test();
	}

Project na GitHubu:
https://github.com/…FirstControl

Jelikož se parametr v signálu posílá přes URL, šlo by to udělat tak aby se parametr posílal přes post, ideálně pomocí AJAXu ?

Prosím o help, díky! :)

Editoval Dragonaut (6. 10. 2014 11:22)

David Matějka
Moderator | 6445
+
0
-

Jestli si chces drzet nejaky stav ty komponenty, tak si pridej persistentni promennou. Zhruba takhle:

class Test extends Control
{
	/** @var int @persistent */
	public $number = 1;

	public function render()
	{
		$this->template->setFile(__DIR__ . '/Test.latte');
		$this->template->number = $this->number;
		$this->template->render();
	}

	public function handleClick($add)
	{
		$this->number += $add;
		if(!$this->presenter->isAjax()) {
			$this->redirect('this');
		} else {
			$this->redrawControl();
		}
	}
}
Dragonaut
Člen | 33
+
0
-

Moc díky! funguje to bezvadně :-)

Dragonaut
Člen | 33
+
0
-

Ještě ale zkouším ten Ajax a možná mi něco pořád uniká. Posílám ajax požadavek, což jsem ověřil firebugem ale stránka nijak nereaguje. Zkoušel jsem GET i POST, ale žádný rozdíl, je potřeba ještě někde něco nastavit ? :)

<a href="{link click!,1}" class="ajax">Click!</a>

<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script type="text/javascript">
$(".ajax").on("click", function (event) {
    event.preventDefault();
    $.get(this.href);
});
</script>

Editoval Dragonaut (7. 10. 2014 13:02)

David Matějka
Moderator | 6445
+
0
-

Ten ajaxovy pozadavek vrati snippety, ktere je pak nutno zpracovat.

Nejlepsim resenim je nette.ajax.js

Dragonaut
Člen | 33
+
0
-

ahaa, já myslel, že ty snippety jsou volitelné, ok budu se muset na to podívat, ještě jednou díky.
edit: Resp, ale když zavolám v signálu při Ajaxu $this->redrawControl(); tak by se měla překreslit celá komponenta a když $this->redrawControl(‚nazev_snipetu‘); tak jen snipet ne ? A když ten $this->redrawControl(); zavolám tak se mi právě nic nepřekreslí :-)

Editoval Dragonaut (7. 10. 2014 13:26)

David Matějka
Moderator | 6445
+
0
-

Do ty sablony komponenty musis dat snippet, minimalne tedy

{snippet}
kod sablony
{/snippet}

(pripadne ho muzes pojmenovat, dat jich tam vic atd)

ale snippet je nutny – nette musi poznat, kterou cast stranky ma prekreslit – to si prave oznaci temi snippety

Dragonaut
Člen | 33
+
0
-

Aha, no koukám na příklad fifteen v examples a všiml jsem si, že to tam takhle je, ale stejně mi to pořád nefunguje :/:D Já to vyzkoušim ještě s tim nette ajax.

Editoval Dragonaut (7. 10. 2014 13:48)

David Matějka
Moderator | 6445
+
0
-

smazal si ten tvuj custom javascript? ten by se s tim totiz mlatil…

koukni treba do network, co se vraci v odpovedi, jestli tam jsou ty snippety…

Dragonaut
Člen | 33
+
0
-

oo tak s nette.ajax.js to už funguje, díky :-)

Dragonaut
Člen | 33
+
0
-

na nette.ajax.js požadavek nette vrací (komponenta se překreslí)

{"state":{"test-number":5},"snippets":{"snippet-test-":"5\n<a href=\"/?test-add=1&amp;test-number=5&amp;do=test-click\" class=\"ajax\">Click!</a>\n"}}

na ten jquery ajax požadavek (snippet je stejny, script jsem dal za neho) nette vrací (komponenta nepřekreslí, ale signál se provede)

{"state":{"test-number":2},"snippets":{"snippet-test-":"2\n<a href=\"/?test-add=1&amp;test-number=2&amp;do=test-click\" class=\"ajax\">Click!</a>\n"}}

Přijde mi to stejné, jen jedno funguje a druhé ne tak to je záhada pro mě :-)

Editoval Dragonaut (7. 10. 2014 14:04)

David Matějka
Moderator | 6445
+
0
-

Ano, ten pozadavek (a odpoved) vypada stejne. Rozdil je v tom, ze nette.ajax.js dokaze tu odpoved spravne zpracovat – tedy prekreslit snippety

Dragonaut
Člen | 33
+
0
-

Ok, už to chápu, díky moc! :)