yii2 PurifyBehavior
  • 732

Создаем поведение yii2 PurifyBehavior для очистки данных из формы.

Автор: admin | 20 июня (Ср.) 2018г. в 20ч.01м.

Создаем поведение.

Создадим в папке common/components/behaviors PurifyBehavior.php с таким кодом:
<?php
namespace common\components\behaviors;


use yii\base\Behavior;
use yii\db\ActiveRecord;
use yii\helpers\HtmlPurifier;
/**
 * Class PurifyBehavior
 *
 * 
 */
class PurifyBehavior extends Behavior
{
    /**
     * @var array attributes
     */
    public $attributes = [];
    /**
     * @var null The config to use for HtmlPurifier
     */
    public $config = null;
    /**
     * Declares event handlers for the [[owner]]'s events.
     *
     * Child classes may override this method to declare what PHP callbacks should
     * be attached to the events of the [[owner]] component.
     *
     * The callbacks will be attached to the [[owner]]'s events when the behavior is
     * attached to the owner; and they will be detached from the events when
     * the behavior is detached from the component.
     **/
    public function events()
    {
        return [
            ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
        ];
    }
    /**
     * Before validate event
     */
    public function beforeValidate()
    {
        foreach ($this->attributes as $attribute) {
            $this->owner->$attribute = HtmlPurifier::process($this->owner->$attribute, $this->config);
        }
    }
}​

С помощью этого поведения в нашей модели будем прогонять контент, который должен быть очищен,
через HtmlPurifier::process() в которую первым параметром попадает атрибут модели, а вторым
конфигурация метода очистки.

Класс HtmlPurifier это обертка над библиотекой HTML Purifier.
HTML Purifier - это стандартная библиотека фильтров HTML, написанная на PHP.

Подключаем поведение в модели.

В файле вида есть форма с полем, которое будет очищаться:
<?= $form->field($model, 'text')->textInput(['maxlength' => true]) ?>​

Добавляем в модель поведение PurifyBehavior.

use Yii;
use common\components\behaviors\PurifyBehavior;

class BlogArticles extends \yii\db\ActiveRecord
{
    //другой код
    //...
    
    public function behaviors()
    {
        return [
            'purify' => [
                'class' => PurifyBehavior::className(),
                'attributes' => ['text'],
                
            ]
        ];
    }
}  

Теперь все данные, указанные в поведении, которые приходят с формы будут очищаться перед валидацией.

Иногда бывает нужно настроить фильтр очистки, чтобы некоторые элементы все же оставались
в контенте.

'purify' => [
    'class' => PurifyBehavior::className(),
    'attributes' => ['text'],
    'config' => function ($config) {
                    $def = $config->getHTMLDefinition(true);
                    $def->addElement('mark', 'Inline', 'Inline', 'Common');
                    $def->addAttribute('a', 'id', 'Text');
                    $def->addAttribute('img', 'class', 'Text');
                    $def->addAttribute('a', 'target', 'Text');
                }
],

Для настройки фильтра будем работать с ключом config. В данном примере были разрешены тег mark, атрибут targer и id у ссылки, и class у изображения. По умолчанию эти элементы попадают под фильтр, а в конфигурации мы их разрешили. 

О возможных вариантах настройки фильтрации можно почитать на сайте создателей библиотеки HTML Purifier, который легко ищется в гугле.

Приветствую!

Меня зовут Сергей. Я - автор этого блога.

Если Вам был полезен материал на моем сайте, поддержите пожалуйста мой проект, чтобы о нем узнали другие люди - кликните plizz :) на иконку в соц. сети, чтобы поделиться материалом с другими.