2016-03-10 38 views
0

我有一个管理员类,其中包括另一个管理员类。SonataAdminBundle嵌入表单验证错误

  • 的Symfony 2.7.9
  • 索纳塔联系包2.3.7

我有它在标签结构,而问题是,当有在任何领域的验证错误嵌入式表单没有以任何方式标记它所在的标签。

这是我的示例代码: 实体Products.php

<?php 

namespace AppBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* Products 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="AppBundle\Entity\ProductsRepository") 
*/ 
class Products 
{ 

    //... 

    /** 
    * 
    * @ORM\OneToMany(targetEntity="Modules", mappedBy="products", cascade={"persist"}, orphanRemoval=true) 
    * @ORM\OrderBy({"position" = "ASC"}) 
    */ 
    protected $module; 

    /** 
    * Constructor 
    */ 
    public function __construct() 
    { 
     $this->module= new ArrayCollection(); 
    } 

    //... 

    /** 
    * Set module 
    * 
    * @param Doctrine\ORM\PersistentCollection $module 
    * 
    */ 
    public function setModule(\Doctrine\ORM\PersistentCollection $module) { 

     if (count($module) > 0) { 
      foreach ($module as $m) { 
       $this->addModule($m); 
      } 
     } 

     return $this; 
    } 

    /** 
    * Remove module 
    * 
    * @param \AppBundle\Entity\Modules $module 
    */ 
    public function removeModule(\AppBundle\Entity\Modules $module) 
    { 
     foreach ($this->module as $k => $s) { 
      if ($s->getId() == $module->getId()) { 
       unset($this->module[$k]); 
      } 
     } 

    } 

    /** 
    * Get module 
    * 
    * @return \Doctrine\Common\Collections\Collection 
    */ 
    public function getModule() 
    { 
     return $this->module; 
    } 


    /** 
    * Add module 
    * 
    * @param \AppBundle\Entity\Modules $module 
    * @return Products 
    */ 
    public function addModule(\AppBundle\Entity\Modules $module) 
    { 
     $module->setProducts($this); 
     $this->module[] = $module; 

    } 

    //... 

} 

实体Modules.php

<?php 
namespace AppBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* Modules 
* 
* @ORM\Table() 
* @ORM\Entity(repositoryClass="AppBundle\Entity\ModulesRepository") 
*/ 
class Modules 
{ 
    //... 

    /** 
    * @ORM\ManyToOne(targetEntity="Products", inversedBy="module") 
    * @ORM\JoinColumn(name="product_id", referencedColumnName="id") 
    */ 
    protected $products; 


    /** 
    * Constructor 
    */ 
    public function __construct() { 
     $this->products = new ArrayCollection(); 
    } 

    /** 
    * Set products 
    * 
    * @param \AppBundle\Entity\Products $products 
    * @return Modules 
    */ 
    public function setProducts(\AppBundle\Entity\Products $products = null) 
    { 
     $this->products = $products; 

     return $this; 
    } 

    /** 
    * Get products 
    * 
    * @return \AppBundle\Entity\Products 
    */ 
    public function getProducts() 
    { 
     return $this->products; 
    } 

    //... 
} 

实体admin.yml

services: 

    sonata.admin.product.modules: 
     class: AppBundle\Admin\ModulesAdmin 
     tags: 
      - {name: sonata.admin, manager_type: orm, label: Products} 
     arguments: 
      - ~ 
      - AppBundle\Entity\Modules 
      - 'SonataAdminBundle:CRUD' 
     calls: 
      - [ setTranslationDomain, [ProductsAdmin]] 
      - [ setLabelTranslatorStrategy, ["@sonata.admin.label.strategy.underscore"]] 

实体ProductsAdmin.php

<?php 

namespace AppBundle\Admin; 

class ProductsAdmin extends Admin { 

    public $supportsPreviewMode = true; 
    protected $formOptions = array(
     'cascade_validation' => true   
    ); 

    //... 

    protected function configureFormFields(FormMapper $formMapper) { 

     $formMapper 
       ->tab('General') 
       ->end() 
       ->tab('Modules')   
        ->add('module', 'sonata_type_collection', array(
         'type_options' => array(
          'delete' => true 
         ) 
          ), array(
         'edit' => 'inline', 
         'inline' => 'table', 
         'sortable' => 'position', 
         'admin_code' => 'sonata.admin.product.modules' 
        ))  
       ->end() 
     ; 
    } 

    public function prePersist($products) { 
     $this->preUpdate($products); 
    } 

    public function preUpdate($products) { 

     $products->setModule($products->getModule()); 
    } 

    //... 

} 

实体ModulesAdmin.php

<?php 

namespace AppBundle\Admin; 

class ModulesAdmin extends Admin { 

    public $supportsPreviewMode = true; 
    protected $formOptions = array(
     'cascade_validation' => true 
    ); 
    protected $baseRouteName = 'admin_app_product_modules'; 
    protected $baseRoutePattern = 'app/product-modules'; 

    //... 

} 

我想知道如何指示在嵌入形式,存在验证错误的标签他们的领域是。

回答

2

这有可能已经被固定的,但我固定它是这样的:

在自己的管理类我说:

protected $formOptions = array(
    'cascade_validation' => true   
); 
我sonata_type_collection项

我也补充道:

'cascade_validation' => true 

这会导致表单上的元素在非嵌入表单的情况下添加类'has-error',或者在嵌入的sonata_type_collection嵌入表单的情况下添加'error'是一个验证错误。

为了突出正确的标签,我不得不使用jQuery。默认情况下,选项卡按钮本身总是包含以下内容:

<i class="fa fa-exclamation-circle has-errors hide"></i> 

所以这是很容易使用的代码一点点地瞄准这一点,并删除“隐藏”类。

// Highlight tabs if there is a validation error on an element in them 
$('.tab-pane').each(function(index, element) { 
    var btn = $('a[href^="#'+$(this).attr('id')+'"]'); 
    var jumpToTab = false; 
    $(this).find('td, div').each(function(i, e) { 
     if ($(this).hasClass('error') || $(this).hasClass('has-error')) { 
      if (jumpToTab == false) { 
       btn.tab('show'); 
       jumpToTab = true; 
      } 
      btn.find('i').removeClass('hide'); 
      btn.addClass('error'); 
     } 
    }); 
}); 

我向btn添加了一个'错误'类,因为我想改变链接颜色,但就是这样。现在提交错误表单会突出显示其中存在错误元素的所有标签。

+0

谢谢,我会试试;) –