Komponta v komponentně & parametry

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

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

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

@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
+
+5
-

status jsem měl jako protected.

kdybys mel nainstalovany nette plugin do phpstormu :)

Pavel Janda
Člen | 977
+
0
-

@DavidMatějka Nechcete něco napsat i pro sublime? :)

David Matějka
Moderator | 6445
+
+9
-

@PavelJanda a nechces radeji prejit na phpstorm? :)

Pavel Janda
Člen | 977
+
-4
-

@DavidMatějka No jako chtěl bych. Kdyby to fungovalo stejně rychle jako texťák. :D

Pavel Kravčík
Člen | 1196
+
0
-

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

Smysl by to mělo, kdyby uměl phpStorm anotace typu:

vsechno bude :)

CZechBoY
Člen | 3608
+
0
-

Latte plugin do phpstormu je zatim ve fazi kdy je lepsi pouzit Smarty :(

David Matějka
Moderator | 6445
+
+1
-

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

@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í.

Martk
Člen | 661
+
+1
-

@CZechBoY Jestli tě to opravdu štve, můžeš udělat toto a potom invalidovat cache:

/**
 * @property-read \stdClass|ITemplate $template
 */
class Presenter {
CZechBoY
Člen | 3608
+
0
-

@Antik To by šlo :-) taky jsem četl, že ta inspekce ignoruje zapisování do \stdClass. Díky :-)