Komponta v komponentně & parametry
- Pavel Kravčík
- Člen | 1196
Předpokládám, že mi něco uniká nebo jsem hloupý. Udělám si
komponentu se signály a vnitřním stavem $status
. Jeden handle
přepíná vnitřní stav komponenty a překreslí snippet ve kterém je
nějaký datagrid. Kdykoliv ale kliknu na paginator toho datagridu – status
rodiče se „smaže“ a najednou jsou v gridu jiné údaje.
Řeším to, že status držím v session, ale přijde mi to nehezké. Persistentní parametry nepomohly. Existuje na to nějaké best practise nebo postupuji špatným způsobem. Zjednodušená verze vypadá takto:
public function handleList($status)
{
$this->status = $status;
$this->Session['status'] = $status;
$this['listDatagrid']->reload();
$this->redrawControl('list');
}
protected function createComponentListDatagrid($name)
{
$grid->setDataSource($this->ContractModel->contractMonth($this->Session['status'], FALSE));
}
- Pavel Janda
- Člen | 977
Zkusil jsem naimplementovat to, co jsi psal (nehledě na přiložený příklad) a vše mi funguje..
defaut.latte:
{control c}
c.latte:
<a n:href="changeStatus! status => 0">Offline</a> |
<a n:href="changeStatus! status => 1">Online</a> |
<a n:href="changeStatus! status => 2">Standby</a>
<br>
{control testingGrid}
C.php:
class C extends Nette\Application\UI\Control
{
/**
* @var int
* @persistent
*/
public $status = 1;
/**
* @var Dibi\Connection
*/
private $c;
function __construct(Dibi\Connection $c)
{
$this->c = $c;
}
public function render()
{
$this->template->setFile(__DIR__ . '/templates/c.latte')->render();
}
public function createComponentTestingGrid($name)
{
$grid = new DataGrid($this, $name);
$grid->setDataSource(
$this->c->select('*')
->from('ublaboo_example')
->where('status = ?', $this->status)
);
$grid->addColumnText('name', 'Name');
$grid->addColumnText('status', 'Status');
}
public function handleChangeStatus($status)
{
$this->status = $status;
$this->redrawControl();
}
}
I když tam přidám $this['testingGrid']->reload()
, tak to
jede. Persistentní parametry jsou přesně to, co musí pomoci.
Pravděpodobně bude zádrhel někde jinde, než v samotném „tomto“.
Editoval Pavel Janda (9. 3. 2016 13:35)
- Pavel Kravčík
- Člen | 1196
@PavelJanda: Díky za příklad. „Přesně takhle“ to mám napsané.
Ale samozřejmě jsem idiot a status jsem měl jako protected. :) Proto se ten parametr nepřenášel do vnořené komponenty. Teď mi to došlo, dává to najednou perfektní smysl.
- David Matějka
- Moderator | 6445
status jsem měl jako protected.
kdybys mel nainstalovany nette plugin do phpstormu :)
- Pavel Janda
- Člen | 977
@DavidMatějka No jako chtěl bych. Kdyby to fungovalo stejně rychle jako texťák. :D
- Pavel Kravčík
- Člen | 1196
@DavidMatějka: Hodně pěkný. Nějak nemám důvod přecházet z Netbeans na Phpstorm.
Smysl by to mělo, kdyby uměl phpStorm anotace typu:
{* @var $articleEntity \Project\ArticleEntity *}
{$articleEntity->... //napovídá public metody a proměnné
- David Matějka
- Moderator | 6445
@CZechBoY Latte plugin je zatim v tehle fazi :) jen jsem se zatim nedostal k tomu, abych to releasnul, zatim muzes stahnout devbuild: http://files.matej21.cz/…e-plugin.jar
- CZechBoY
- Člen | 3608
@DavidMatějka ok, tak už jsem si switchnul na latte :-) super
práce!
Jsou v plánu i nějaký další inspekce? Jak pro latte tak pro nette? Celkem
mě štve přiřazování do templatu s tím, že mi to všude píše
Field declared dynamically
takže když někde opravdu zapomenu
definovat property tak to přehlídnu.
Taky by se mi líbila inspekce na předávání parametrů v
{control}
, pokud předávám parametry a to makro není ve snippetu
tak hrozí, že se určitě parametry při překreslení nepředají.