Jak řešit v nette 2.3 filtry závislé na datech z DB

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

Aktualizuji aplikaci z Nette 2.1 na nette 2.3 – s tím se pojí přepsání helperů/filtrů.

Pokud bych chtěl filtry registrovat všechny z jedné třídy je potřeba je mít jako statické metody. Viz dokumentace. To by ani nebyl problém jako to že potřebuji fitrům předat nějaká data z databáze na základě kterých filtr zformátuje data jak je potřeba.

Existuje vůbec nějaká čistá cesta jak to udělat aniž bych musel filtr registrovat každý zvlášť?

Unlink
Člen | 298
+
0
-

Nieje potrebné aby to bola statická metóda.

Sprav z toho službu, zaregistuj ju v configu, a potom to pôjde.

Respektíve, mám to nejako takto

services:
	- App\Utils\EmailProtection
	nette.latteFactory:
		setup:
			- addFilter(email, [@App\Utils\EmailProtection, protect])

A taktiež by malo ísť aj registrovať viacero filtrov pomocou jednej triedy, tak ako to máš doteraz, len z toho sprav službu a sprav z toho inštančné nie statické metódy.

Editoval Unlink (3. 6. 2015 20:56)

Marsme
Člen | 75
+
0
-

A jak by jsi napsal loader pro ten hromadný filtr ?

public function loader($filter)
	{
		if (method_exists(__CLASS__, $filter)) {
			$args = func_get_args();
			array_shift($args);
			return call_user_func_array(array(__CLASS__, $filter), $args);
		}
	}

tento je v dokumentaci ale takto nejsem schopen předat té třídě service která dodá data tak abych je v jednotlivých metodách mohl používat. Možná nad tím přemýšlím špatně ale nějak mě nenapadá jak to udělat.

Unlink
Člen | 298
+
+1
-

Namiesto __CLASS__ by som skúsil $this

	public function loader($filter)
    {
        if (method_exists($this, $filter)) {
            $args = func_get_args();
            array_shift($args);
            return call_user_func_array(array($this, $filter), $args);
        }
    }

Potom si sprav konštuktor kde si predáš to pripojenie k databáze alebo čo už budeš potrebovať.

namespace Filtre;

class FilterLoader {

	private $db;

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

	public function loader($filter)
    {
		//...
	}

	public function filter1($args) {
		// $this->db->...
	}

}
services:
    - Filtre\FilterLoader
    nette.latteFactory:
        setup:
            - addFilter(NULL, [@Filtre\FilterLoader, loader])
Marsme
Člen | 75
+
0
-

JJ díky toto je přesně ono.

Tomáš Votruba
Moderator | 1114
+
0
-

Pokud bys filtrů měl více a chtěl dokonce využít modularitu, mrkni na doplněk Zenify/ModularLatteFilters