Rubriky
Programování

Nette + Texy

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}