Pokud si zájemce o web přeje základní formátování textů, vetšinou nejprve sáhnu po Texy. Nemám rád weby které vypadají jako omalovánky (ano, tomu kdo dá tu práci aby každé písmenko ve slově mělo jinou barvu se to moc líbí ale spoustu návštěvníků to odradí). Texy je jednoduchý nástroj kterým můžete bez odborných znalostí psát HTML kód. Příklad si ukážeme na jednoduchém formuláři, jehož odesláním naformátujeme zadaný text přes Texy.
Pojďme si ukázat jak zprovoznit Nette společně s Texy!
Ukázka je na poslední verzi Nette (2.2.6) a poslední verzi Texy (2.6).
Instalace Nette
Stáhneme Nette sandbox (přes composer):
composer create-project nette/sandbox nette-texy
příkazem se vytvoří složka nette-texy do které se nahraje Nette + sandbox. Document root pro virtualhost nasměrujeme do nette-texy/www/
Instalace Texy
nainstalujeme samozřejmě přes composer :
composer require dg/texy:~2.0
Zprovoznění Texy
Uděláme si pořádek na hřišti. Nahradíme obsah šablony pro titulní stránku: app/templates/Homepage/default.latte:
{block content} {ifset $text} {$text|texy|noescape} {/ifset} {control texyForm} {/block}
Vytvoření formuláře
app/presenters/HomepagePresenter.php:
<?php namespace App\Presenters; use Nette; class HomepagePresenter extends BasePresenter { protected function createComponentTexyForm() { $form = new Nette\Application\UI\Form; $form->addTextarea('text', 'Text:') ->setAttribute('cols', 80) ->setAttribute('rows', 10); $form->addSubmit('send', 'Send'); $form->onSuccess[] = $this->texyFormSucceeded; return $form; } public function texyFormSucceeded($form, $values) { $this->template->text = $values->text; } }
Máme formulář který při odeslání odešle do šablony (proměnná $text ) zadaný text.
Zapnutí Texy
Nejprve je nutné přidat Texy do neon.config aby o Nette o Texy vědělo:
app/config/config.neon:
services: - App\Model\UserManager - App\RouterFactory router: @App\RouterFactory::createRouter texy: Texy
V souboru app/presenters/BasePresenter.php je nutné vytvořit helper, který bude fomárovat text přes Texy.
<?php namespace App\Presenters; use Nette; use TexyConfigurator; abstract class BasePresenter extends Nette\Application\UI\Presenter { /** @var \Texy */ private $texy; public function injectTexy( \Texy $texy ) { $this->texy = $texy; //$this->texy->allowed['heading/underlined'] = FALSE;// podtržené titulky //$this->texy->allowed['heading/surrounded'] = FALSE;// ohraničené titulky //TexyConfigurator::safeMode( $this->texy ); //nastaveni pro diskuse, ktere nepovoli vlozeni kompromitovaneho kodu //TexyConfigurator::disableLinks( $this->texy ); //TexyConfigurator::disableImages( $this->texy ); } protected function createTemplate( $class = NULL ) { $template = parent::createTemplate( $class ); $template->registerHelper( 'texy', callback( $this->texy, 'process' ) ); return $template; } }
V nové verzi Nette (>=2.4) se helper (filtr) registruje takto, metodu createTemplate můžete úplně vynechat):
protected function beforeRender() { parent::beforeRender(); $this->template->addFilter('texy', function ($text) { return $this->texy->process($text); }); }
Nejlepší cesta
Kvůli bezpečnosti, doporučuji tento způsob použití, ve kterém filtr vrací Nette\Utils\Html, který nemusíme nonescapovat. Registrujeme filter klasicky v beforeRender:
protected function beforeRender() { parent::beforeRender(); $this->template->addFilter('texy', function ($text) { //return $this->texy->process($text); return Nette\Utils\Html::el()->setHtml($texy->process($text)); }); }
A pak již pouze v šabloně vypíšeme:
{$text|texy}