Přístup k databázi, nebo ke službě ve filtru
- SamuelThorn
- Člen | 29
Ahoj,
bádám na způsobem, jak umožnit filtru pracovat s databází (nebo se službou, která s databází pracuje.
Situace
Z databáze mi přijdou data (HTML), která následně potřebuji dále
zpracovat. Jedná se o text, v němž jsou zmíněné epizody seriálu
uzavřené do tagů „<i></i>
“. Ty potřebuji
z textu vytáhnout, dohledat k nim v databázi ID a vyrobit z nich
odkazy.
Řešení
Do šablony jsem zapsal:
{$k->Udaje|noescape|crosslinksEpizody}
Filtr crosslinksEpizody
je zaregistrovaný. Používám
v dokumentaci nabízenou definici univerzálního filtru:
<?php
class CustomFilters
{
public static function common($filter, $value)
{
if (method_exists(__CLASS__, $filter)) {
$args = func_get_args();
array_shift($args);
return call_user_func_array([__CLASS__, $filter], $args);
}
}
public static function crosslinksEpizody($text) {
preg_match_all ("~<(?:i|em)>([^<]*)</(?:i|em)>~", $text, $epizody_array, PREG_PATTERN_ORDER);
foreach($epizody_array[1] as $e)
{
$epizoda = **--- a tady bych potřeboval z DB vytáhnout informaci o dané epizodě ---**
/*
další zpracování textu
*/
}
return $text;
}
}
Je prosím něco takového možné? Mám případně zvolit jiné
řešení?
Předem děkuji.
- Jiří Nápravník
- Člen | 710
Vyhod staticke metody, udelej klasicke a filtr zaregistruj do DIC pres neon treba
- SamuelThorn
- Člen | 29
Díky.
Pokusil jsem se o to:
config.neon
nette.latteFactory:
setup:
- addFilter(NULL, CustomFiltersDatabaze::common)
app\libs\CustomFiltersDatabaze.php
<?php
class CustomFiltersDatabaze
{
public function common($filter, $value)
{
if (method_exists(__CLASS__, $filter)) {
$args = func_get_args();
array_shift($args);
return call_user_func_array([__CLASS__, $filter], $args);
}
}
…
public function crosslinksEpizody($text) {
…
}
}
A bohužel skončím na této hlášce:
call_user_func_array() expects parameter 1 to be a valid callback, non-static method CustomFiltersDatabaze::common() should not be called statically
Přiznám se, že těm statickým metodám a spol. vůbec nerozumím, takže to jen slepě opisuji z různých návodů.
Nabízí se otázka, jestli toto vůbec správná cesta, kterou se vydávat?!
Editoval SamuelThorn (12. 6. 2016 10:15)
- blaztar
- Člen | 93
Zkus nějak takto:
services:
- Filter\Crosslink
nette.latteFactory:
setup:
- addFilter('crosslink', @Filter\Crosslink)
<?php
namespace Filter;
use Nette;
use Nette\Database\Context;
class Crosslink extends Nette\Object
{
private $db;
public function __construct(Context $db)
{
$this->db = $db;
}
public function __invoke($text)
{
// logic
}
}
?>
- SamuelThorn
- Člen | 29
Díky za odpovědi. Nakonec jsem použil blaztarovo řešení a jede to! Nemohu se sice zbavit dojmu, že je to tak trochu hack, ale tak snad se to nepokazí někdy v budoucnu s nějakou aktualizací. :) Ještě jednou díky.
CZechBoY:
Univerzální filtr by se mi hodil, protože podobných filtrů mám více, ale
když se nad nimi zamyslím, tak možná půjdou spojit do jednoho. Dělají
velmi podobné úkony.