L
L
lilwings2020-02-02 08:29:28
Yii
lilwings, 2020-02-02 08:29:28

Yii2 PurifyBehavior did I understand the logic correctly?

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); //удалить пары пустых тегов​
                }
            )
        ];
    }
}


Questions:

1) We allow only such tags, all others will be deleted

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


2) We allow the necessary tag attributes, and filter them, all other tags will be deleted

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


3) These photos must be selected, i.e. they are required, or do you need to add something else?

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


Did I get it right?)

Answer the question

In order to leave comments, you need to log in

[[+comments_count]] answer(s)
M
Mylistryx, 2020-02-03
@Mylistryx

array_diff if I understood the question correctly
$new = Yii:$app-post;...
$delete = array_diff($old, $new); // Remove tags
$add = array_diff($new, $old); // Add tags
What's next and how - I won't write, FanatPHP will merge my solution anyway, and most likely his solution will be better!

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question