用户组的奏鸣曲验证不起作用

时间:2017-02-20 16:15:25

标签: sonata-admin sonata

我正在使用带有fos用户捆绑的sonata 2.8,我扩展了用户实体和管理员,除了用户组的验证之外,它还能满足各种需求。

如果用户几乎没有选择任何一组,我会发出阻止发送数据的内联错误吗?

我已经尝试了

->add('groups', 'sonata_type_model', array(
                    'expanded' => true,
                    'multiple' => true,
                    'required'    => true
                ))

但是无法正常工作

问题出现在每个字段中,关系多对一或多对多,例如我有一个2实体paese,zone,

// paeseAdmin.php

$formMapper
        ->with('Zone')
            ->add('name', 'text' , array('label'=>"Paese"))
            ->add('zone','sonata_type_collection',array('by_reference' => false, 'required' => true,), array( 'edit' => 'inline','inline' => 'table', 'class' => 'test',))

        ->end() 
    ;

// paese  entity
/**
* @var Zona
* @ORM\OneToMany(targetEntity="Zona", mappedBy="paesi" ,  orphanRemoval=true, cascade={"persist"})
* @ORM\OrderBy({"nome" = "ASC"})
*/
private $zone;



// zona entity
/**
 * @var Paese
 * @ORM\ManyToOne(targetEntity="Paese", inversedBy="zone" )
 * @ORM\OrderBy({"nome" = "ASC"})
 * @ORM\JoinColumn(name="paese_id", referencedColumnName="id")
*/
private $paesi;

任何想法?谢谢

4 个答案:

答案 0 :(得分:1)

如果您使用的是Sonata Admin捆绑包,则可以使用validate继承的函数来进行高级验证(例如馆藏计数)

例如:

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\CoreBundle\Validator\ErrorElement;

class UserAdmin extends AbstractAdmin
{

    /// ...

    public function validate(ErrorElement $errorElement, $object)
    {
        if (!$object->getGroups()->count()) {
            $errorElement
                ->with('groups')
                ->addViolation('You should select at least one group')
                ->end();
        }

        parent::validate($errorElement, $object);
    }
}

答案 1 :(得分:0)

您需要'required' => false,然后'required' => true需要删除多余的

关于奏鸣曲类型集合的奏鸣曲文档

  

将'required'选项设置为true不会导致需要'至少一个'子实体。将'required'选项设置为false会导致所有嵌套表单字段也不再需要。

required => true添加到sonata_type_collection字段时,您只允许在子表单中包含必填字段。

答案 2 :(得分:0)

因此您必须在实体用户

中添加这些行
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;


    /**
     * @Assert\Callback(methods={"isGroupValid"})
     */
     public function isGroupValid(ExecutionContextInterface $context)
    {
        if ($this->groups->count()==0) {
            $context
                 ->buildViolation('choisir au minimum un group!', array(), null)
                 ->atPath('groups')
                 ->addViolation()`enter code here`;
        }
    }

答案 3 :(得分:0)

在我的奏鸣曲版本中,对我没有任何作用。

sonata-project / admin-bundle 3.51.0

friendsofsymfony /用户捆绑包v2.1.2

无论如何都不会调用validate方法。

所以我最终写了一个验证:

#File: src/Application/Sonata/UserBundle/Resources/config/validation.xml

    <property name="groups">
        <constraint name="Count">
            <option name="min">1</option>
            <option name="minMessage">Please choose one group.</option>
        </constraint>
    </property>