EasyAdminBundle:验证不适用于CKEditorType

时间:2019-01-06 13:03:03

标签: symfony ckeditor symfony4 easyadmin

在使用EasyAdminBundle创建的管理面板中,我的表单验证仅适用于没有CKEditorType的字段。一些字段需要编辑,因此我使用FOSCKEditorBundle实现了所见即所得。

相关字段的摘录:

- { property: 'content', type: 'FOS\CKEditorBundle\Form\Type\CKEditorType'} 

当我提交带有空白“内容”字段的表单时,我得到一个InvalidArgumentException,错误为:Expected argument of type "string", "NULL" given.,而不是诸如的验证错误。请填写此字段。

没有CKEditor的相关字段的摘录:

- { property: 'content' } 

=>验证效果很好。

我的实体字段:

    /**
     * @ORM\Column(type="text")
     * @Assert\NotBlank
     * @Assert\NotNull
     */
    private $content;

Symfony探查器显示此字段确实具有required属性。

如何使用CKEditor字段类型启用验证?

2 个答案:

答案 0 :(得分:4)

这与ckeditor无关。您所需要做的就是修复您的内容设置器,以通过参数接受 NULL 。然后,验证过程应正确触发:

public function setContent(?string $content) {
    $this->content = $content;

    retrun $this;
}

在将请求值设置为表单数据(在您的情况下为实体)字段后执行验证。您可以在此处找到表单提交流程:https://symfony.com/doc/current/form/events.html#submitting-a-form-formevents-pre-submit-formevents-submit-and-formevents-post-submit

答案 1 :(得分:0)

要依靠Symfony的“表单”构建器克服此问题,我在“ CKEditorField”中添加了约束“ NotBlank”。

在控制器上看起来像这样:

...
use App\Admin\Field\CKEditorField;
use Symfony\Component\Validator\Constraints\NotBlank;
...

public function configureFields(string $pageName): iterable
{    
    return [
        IdField::new('id')->hideOnForm(),
        TextField::new('title')->setFormTypeOption('required',true),
        CKEditorField::new('description')->setFormTypeOption('required',true)
        ->setFormTypeOption('constraints',[
            new NotBlank(),
        ])
    ];
}
...

以及控制器中使用的EasyAdmin字段类文件(添加此文件以遵循EasyAdmin的方法):

<?php

namespace App\Admin\Field;

use EasyCorp\Bundle\EasyAdminBundle\Contracts\Field\FieldInterface;
use EasyCorp\Bundle\EasyAdminBundle\Field\FieldTrait;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use FOS\CKEditorBundle\Form\Type\CKEditorType;

final class CKEditorField implements FieldInterface
{
    use FieldTrait;

    public static function new(string $propertyName, ?string $label = null):self
    {
        return (new self())

            ->setProperty($propertyName)
            ->setLabel($label)
            ->setFormType(CKEditorType::class)
            ->onlyOnForms()
        ;
    }
}