Prekresleni komponenty s novymi parametry pomoci signalu
- Dragonaut
- Člen | 33
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
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
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
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
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
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
Ten ajaxovy pozadavek vrati snippety, ktere je pak nutno zpracovat.
Nejlepsim resenim je nette.ajax.js
- Dragonaut
- Člen | 33
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
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
- David Matějka
- Moderator | 6445
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
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&test-number=5&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&test-number=2&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
Ano, ten pozadavek (a odpoved) vypada stejne. Rozdil je v tom, ze nette.ajax.js dokaze tu odpoved spravne zpracovat – tedy prekreslit snippety