@lilwings

Yii2 PurifyBehavior правильно ли я понял логику?

PurifyBehavior:

namespace common\components\behaviors;

use yii\base\Behavior;
use yii\db\ActiveRecord;
use yii\helpers\HtmlPurifier;

class PurifyBehavior extends Behavior
{
    public $attributes = [];
    public $config = null;

    public function events()
    {
        return [
            ActiveRecord::EVENT_BEFORE_VALIDATE => 'beforeValidate',
        ];
    }

    public function beforeValidate()
    {
        foreach ($this->attributes as $attribute) {
            $this->owner->$attribute = HtmlPurifier::process($this->owner->$attribute, $this->config);
        }
    }
}


Model:

namespace backend\models;

use common\components\behaviors\PurifyBehavior;
use yii\db\ActiveRecord;

class Info extends ActiveRecord
{
    public static function tableName()
    {
        return '{{info}}';
    }

    public function rules() {
        return [
            [['title', 'preview'], 'string', 'max' => 255, 'filter', 'filter' => ['strip_tags', 'trim'], 'required'],
            ['description_seo', 'string', 'filter', 'filter' => ['strip_tags', 'trim'], 'required'],
            [['img_preview', 'img_full'], 'file', 'extensions' => ['webp'], 'maxSize' => 1024*1024],
            ['description', 'safe'],
        ];
    }

    public function behaviors()
    {
        return [
            'purify' => array(
                'class' => PurifyBehavior::className(),
                'attributes' => array('description'),
                'config' => function ($config) {
                    $def = $config->getHTMLDefinition(true);

                    $def->set('HTML.AllowedElements', array('p', 'span', 'h1', 'h2', 'h3', 'h4', 'a', 'br', 'strong', 'em', 'del', 'u', 'pre', 'code', 'blockquote')); // Разрешонные теги

                    $def->addAttribute('a', 'url', 'Text'); // Разрешить аттрибут url с очисткой
                    $def->addAttribute('a', 'title', 'Text'); // Разрешить аттрибут title с очисткой
                    $def->addAttribute('a', 'target', 'Text'); // Разрешить аттрибут target с очисткой

                    $def->addAttribute('p', 'style', 'Text'); // Разрешить аттрибут style с очисткой
                    $def->addAttribute('span', 'style', 'Text'); // Разрешить аттрибут style с очисткой
                    $def->addAttribute('del', 'style', 'Text'); // Разрешить аттрибут style с очисткой
                    $def->addAttribute('u', 'style', 'Text'); // Разрешить аттрибут style с очисткой
                    $def->addAttribute('em', 'style', 'Text'); // Разрешить аттрибут style с очисткой

                    $def->addAttribute('img', 'src', 'Text'); // Разрешить аттрибут src с очисткой
                    $def->addAttribute('img', 'alt', 'Text'); // Разрешить аттрибут alt с очисткой

                    $def->set('HTML.SafeIframe', true); // Сохранить iframe
                    $def->set('URI.SafeIframeRegexp', '%^(http:|https:)?//(www.youtube(?:-nocookie)?.com/embed/|player.vimeo.com/video/)%'); // Сохранить видео с youtube

                    $def->set('AutoFormat.RemoveEmpty', true); //удалить пары пустых тегов
                    $def->set('AutoFormat.RemoveEmpty.RemoveNbsp', true); //удалите пустой, даже если он содержит  
                    $def->set('AutoFormat.AutoParagraph', true); //удалить пары пустых тегов​
                }
            )
        ];
    }
}


Вопросы:

1) Разрешаем только такие теги, все остальные будут удалены

$def->set('HTML.AllowedElements', array('p', 'span', 'h1', 'h2', 'h3', 'h4', 'a', 'br', 'strong', 'em', 'del', 'u', 'pre', 'code', 'blockquote'));


2) Разрешаем нужные аттрибуты тегов, и фильтруем их, все другие теги будут удалены

$def->addAttribute('a', 'url', 'Text'); // Разрешить аттрибут url с очисткой


3) Данные фотографии должны быть обязательно выбраны т.е они required, или нужно что то еще добавить?

[['img_preview', 'img_full'], 'file', 'extensions' => ['webp'], 'maxSize' => 1024*1024],


Я все верно понял?)
  • Вопрос задан
  • 175 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Mylistryx
array_diff, если я правильно понял вопрос
$new = Yii:$app-post;...
$delete = array_diff($old, $new); // Удалить теги
$add = array_diff($new, $old); // Добавить теги
Что дальше и как - писать не буду, FanatPHP все равно сольет мое решение, и скорее всего его решение будет лучше!
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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