Jak implementovat Texy v nette/tutorial-quickstart?
- buffus
- Člen | 101
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. 2021 7:18)
- IJVo
- Člen | 38
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
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/…ion/services#…
Ale pořád si mi tu konfiguraci nedaří napsat…
- Martk
- Člen | 661
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);