Как заменить стандартный escapeHtmlHelper в форме (элемент textarea) в zf2?

Добрый день! Хочу реализовать возможность показывать в представлении html код. Соответственно, чтобы редактировать код нужно разрешить теги и в форме. Не нашел никаких стандартных способов заменить стандартный помощник формы для экранирования html на htmlPurifier, чтобы разрешить определенные теги. Решил переопределить метод в классе FormTextarea
public function render(ElementInterface $element)
    {
        $name   = $element->getName();
        if (empty($name) && $name !== 0) {
            throw new Exception\DomainException(sprintf(
                '%s requires that the element has an assigned name; none discovered',
                __METHOD__
            ));
        }

        $attributes         = $element->getAttributes();
        $attributes['name'] = $name;
        $content            = (string) $element->getValue();
        
        $escapeHtml         = $this->getEscapeHtmlHelper();

        return sprintf(
            '<textarea %s>%s</textarea>',
            $this->createAttributesString($attributes),
            $escapeHtml($content)
        );
    }

Я правильно понимаю, что нужно править здесь?
$escapeHtml         = $this->getEscapeHtmlHelper();

Может есть какие то стандартные способы? И предварительно необходимо создать объект HTMLPurifier со всеми настройками. Где это сделать? Спасибо!
  • Вопрос задан
  • 244 просмотра
Решения вопроса 2
27cm
@27cm
TODO: Написать статус
namespace Application\View\Helper;

use Zend\View\Helper\AbstractHelper;
use Zend\Form\View\Helper\FormTextarea;
use Zend\Form\ElementInterface;

use HTMLPurifier;
use HTMLPurifier_Config;
use HTMLPurifier_ConfigSchema;
use Soflomo\Purifier\View\Helper\Purifier;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;
use Zend\ServiceManager\ServiceLocatorInterface;
use Zend\ServiceManager\AbstractPluginManager;

class PurefierFormTextarea extends FormTextarea implements ServiceLocatorAwareInterface
{
    protected $serviceLocator = null;

    public function setServiceLocator(ServiceLocatorInterface $serviceLocator)
    {
        $this->serviceLocator = $serviceLocator;
        return $this;
    }

    public function getServiceLocator()
    {
        return $this->serviceLocator;
    }

    public function getMainServiceLocator()
    {
        if ($this->serviceLocator instanceof AbstractPluginManager) {
            return $this->serviceLocator->getServiceLocator();
        }
        return $this->serviceLocator;
    }

    public function render(ElementInterface $element)
    {
        // ...

        $this->getMainServiceLocator()->get('HTMLPurifier'); 

        // ...
    }
}
Ответ написан
Комментировать
micromax
@micromax Автор вопроса
1. По поводу того где и как создавать HtmlPurifier, посмотрите:
https://github.com/Soflomo/Purifier

Я его и использую.

2. Напишите свой класс для MyFormTextarea:
В конфигурационном файле модуля укажите свой помощник представления:

Также сделал.

В Вашем случае достаточно получить HtmlPurifier из ServiceManager'a, обработать им $content, а $this->getEscapeHtmlHelper(), скорее всего и вызывать не придётся. Хотя, если честно не понимаю, зачем Вы хотите делать это внутри хелпера.

Чтобы заменить стандартный escapeHtmlHelper на htmlPurifier.
Вот только пока не получается получить HtmlPurifier из ServiceManager'a.
Пробую так, но не работает
$purifier = $this->getServiceLocator()->get('HTMLPurifier');
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы