Jak implementovat Texy v nette/tutorial-quickstart?

buffus
Člen | 101
+
+1
-

PHP 8.0, Nette 3.1, Texy 3.1

Ahoj, prosím o radu.

1. V rozchozené aplikaci tutoriálu nette/tutorial-quickstart v3.1 (Píšeme první aplikaci) jsem si upravil v databázi content článku Article One do Texy syntaxe:

Vítejte!
--------

Můžete používat syntax Texy!, pokud Vám vyhovuje:
- třeba **tučné** písmo nebo *kurzíva*
- a takto se dělá "odkaz":https://texy.info
- více najdete na stránce "syntax":[syntax]

2. upravil v Homepage/default.latte {$post->content} na:

{$post->content|texy|noescape}

3. přidal do composer.json "texy/texy": "^3.1":

composer require texy/texy

4. a přidal do common.neon :

services:
	nette.latteFactory:
		setup:
			- addFilter('texy', [\Texy(), process])

Nyní Texy funguje.

Chtěl bych však ještě Texy konfigurovat, např.:

$texy = new Texy\Texy;
$texy->headingModule->generateID = true;

Ale nevím, kam a jak to v tom quickstartu napsat?

Editoval buffus (6. 8. 7:18)

IJVo
Člen | 34
+
0
-

Ahoj, já mám v config.neon (tvůj common.neon):

services:
	texy:
		class: Texy\Texy

V BasePresenter.php mám injectnuté to Texy a pak ve funkci startup mám tu konfiguraci:

abstract class BasePresenter extends Nette\Application\UI\Presenter
{

	/** @var \Texy\Texy @inject */
	public $texy;

	protected function startup()
	{
		parent::startup();
		$this->texy->allowed['table'] = true;
        $texy->headingModule->generateID = true;
	}
}

A tím mám Texy ve všech Presenterech. Pokud je potřebuji v komponentě, tak si je tam předávám přes constructor.

V Presenteeru, kde chci Texy použít, tak dávám do funkce createTemplate to nastavení addFilter() -protože to nechci všude.
Ty to máš v common.neon – jen by tam asi mělo být taky Texy\Texy().
I když to má David asi ošetřené, protože to funguje i jen s Texy()

	protected function createTemplate(): \Nette\Application\UI\ITemplate
	{
		$template = parent::createTemplate();
		$template->addFilter('texy', [$this->texy, 'process']);
		return $template;
	}
buffus
Člen | 101
+
0
-

Díky moc za odpověď.

Tvým způsobem, který výše popisuješ, mám implementované Texy dosud na vlastním projektu (na PHP 7.3). Teď přecházím na PHP 8.0 a aktuální knihovny uvedené v quickstartu pro Nette 3.1 a trochu refaktoruji.

(Implementaci Texy se snažím demonstrovat pro zjednodušení či pro ostatní na funkční aplikaci nette/tutorial-quickstart v3.1.)

Tebou popisované řešení (včetně konfigurace Texy) mi funguje i na PHP 8.0 a Nette v3.1, avšak IDE (VS Code) mi hlásí v:

protected function createTemplate(): Nette\Application\UI\ITemplate
{
	$template = parent::createTemplate();
	$template->addFilter('texy', [$this->texy, 'process']);
	return $template;
}

'Nette\Application\UI\ITemplate is deprecated.

To tedy přepisuji na doporučené Nette\Application\UI\Template (To je OK.).

Ale stále mi IDE hlásí pro:
$template->addFilter('texy', [$this->texy, 'process']);

Undefined method ‚addFilter. (Ale přesto mi tento způsob implementace Texy (filtru texy v Latte) funfuje, to moc nechápu.)

IDE hlásí Undefined method ‚addFilter‘ asi proto, že metoda ‚addFilter‘ je v Latte\Engine a ne v Nette\Application\UI\Template.

To červeně podtržené Undefined method ‚addFilter‘ se mi ale v IDE nelíbí…

Já si pořád myslím, že ta konfigurace Texy by měla jít rovnou i cestou v souboru common.neon a klíč k řešení zápisu je někde dle vzoru (setup database) tady:
https://doc.nette.org/…/di-services#…

Ale pořád si mi tu konfiguraci nedaří napsat…

Martk
Člen | 621
+
+3
-

Nejlepší řešení je vytvořit si factory na texy (včetně interface, ale tady dám pro rychlost bez interface)

class TexyFactory {

	public function create() { return new Texy(); } // upravíš podle sebe

}

Zaregistruješ službu:

services:
	- TexyFactory

Uděláš filter loader:

class LatteFilterLoader {

	public function __construct(TexyFactory $texyFactory) {
		$this->texy = $texyFactory->create();
	}

	public function load(string $name): ?callable {
		return $name !== 'load' && method_exists($this, $name) ? [$this, $name] : null;
	}

	public function texy(string $content): string { ... }

}

a zaregistruješ do configu

services:
	filterLoader: LatteFilterLoader
	latte.latteFactory:
		setup:
			- addFilterLoader([@filterLoader, 'load'])

Filtr ti teď bude fungovat kdekoliv. Jinak k tvému Undefined method ‚addFilter‘ stačí udělat toto:

assert($template instanceof Nette\Bridges\ApplicationLatte\Template);