Přístup k databázi, nebo ke službě ve filtru

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

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

Vyhod staticke metody, udelej klasicke a filtr zaregistruj do DIC pres neon treba

SamuelThorn
Člen | 29
+
0
-

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)

CZechBoY
Člen | 3608
+
0
-

Neon: Prvni parametr je nazev filtru, druhy je callback. Tady bych dal jako callback spis tu crossLinks… nebo chces mit univerzalni filtr?
Php: Common funkci asi nepotrebujes uz, staci jen ta crossLinks..

Editoval CZechBoY (12. 6. 2016 10:32)

blaztar
Člen | 93
+
0
-

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

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.