Jak řešit v nette 2.3 filtry závislé na datech z DB
- Marsme
- Člen | 75
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
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
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
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])
- Tomáš Votruba
- Moderator | 1114
Pokud bys filtrů měl více a chtěl dokonce využít modularitu, mrkni na doplněk Zenify/ModularLatteFilters