【问题标题】:sonata validation of user group not working用户组的奏鸣曲验证不起作用
【发布时间】:2017-07-10 00:24:01
【问题描述】:

我正在使用带有 fos 用户包的奏鸣曲 2.8,我扩展了用户实体和管理员,除了用户组的验证之外,它可以处理所有内容。

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

我已经试过了

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

但不工作

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

// 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;

有什么想法吗?谢谢

【问题讨论】:

    标签: sonata-admin sonata


    【解决方案1】:

    在我的奏鸣曲版本中,没有什么对我有用。

    奏鸣曲项目/管理包 3.51.0

    friendsofsymfony/user-bundle 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>
    

    【讨论】:

      【解决方案2】:

      如果您使用 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);
          }
      }
      
      

      【讨论】:

      • 非常感谢!文档没有提到这一点
      【解决方案3】:

      所以你必须在你的实体用户中添加这些行

      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`;
              }
          }
      

      【讨论】:

        【解决方案4】:

        你有'required' =&gt; false,然后'required' =&gt; true你需要删除多余的

        来自奏鸣曲类型集合的奏鸣曲文档

        将“必需”选项设置为 true 不会导致要求“至少一个”子实体。将“必需”选项设置为 false 会导致所有嵌套表单字段也变为不需要。

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

        【讨论】:

        • 删除后没有任何变化
        • 如果您有required =&gt; true,您应该会出现一个工具提示,告诉您在提交表单时必须从列表中选择一个元素。无论如何您可能不想看@987654321 @它是为了将 FOSuser 集成到 Sonata admin 中,所以它应该可以为您节省一些麻烦
        • 我有 Sonatauserbundle,但我的验证仍然无效
        • 问题出在每个领域都是多对一和多对多
        • 所以不可能验证?
        猜你喜欢
        • 2013-07-03
        • 2018-04-30
        • 2016-06-12
        • 2019-10-13
        • 2018-11-08
        • 2019-02-12
        • 1970-01-01
        • 2017-04-14
        • 2019-05-17
        相关资源
        最近更新 更多