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 | 43
+
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 | 43
+
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 | 43
+
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.

RSS tématu Téma zavřeno