2012-10-17 35 views
1

我有2个具有ManyToOne关系的表。在Sonata管理软件包中处理多对一的异常

class Parent 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * 
    * @ORM\OneToMany(cascade={"persist"},targetEntity="Child", mappedBy="parent") 
    */ 

    private $child; 

    // getters and setters 
} 

class child{ 

    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var Parent 
    * 
    * @ORM\ManyToOne(cascade={"persist"},targetEntity="Parent") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="parent_id", referencedColumnName="id") 
    * }) 
    * 
    */ 
    private $parent; 

    // getters and setters 

} 
  1. 现在如何处理产生一个异常时,父表中的行被删除?

  2. 如何在Sonata Admin Generator窗体中显示消息?

在此先感谢

回答

2

1:现在我该如何处理时,父表中的行删除生成异常?

溶胶:下面的步骤应该做的伎俩

  1. 覆盖由奏鸣曲管理包提供的CRUDController。确保重写的CRUDController与原来的CRUDController位于相同的位置。 ie.YourProject/AdminBundle/Controller/CRUDController.php

  2. 将deleteAction和batchActionDelete从原始控制器复制到覆盖控制器。即

    公共职能deleteAction($ ID) {

    $id  = $this->get('request')->get($this->admin->getIdParameter()); 
    
        $object = $this->admin->getObject($id); 
    
        if (!$object) { 
         throw new NotFoundHttpException(sprintf('unable to find the object with id : %s', $id)); 
        } 
    
        if (false === $this->admin->isGranted('DELETE', $object)) { 
         throw new AccessDeniedException(); 
        } 
    
        if ($this->getRequest()->getMethod() == 'DELETE') { 
    
        try { 
    
          $this->admin->delete($object); 
    
          $this->get('session')->setFlash('sonata_flash_success', 'flash_delete_success'); 
    
         } catch (\Exception $e) { 
    
          $this->get('session')->setFlash('sonata_flash_error', sprintf('Cannot Delete because it has Dependeny')); 
         } 
         return new RedirectResponse($this->admin->generateUrl('list')); 
         } 
    
        return $this->render($this->admin->getTemplate('delete'), array(
         'object' => $object, 
         'action' => 'delete' 
        )); 
    } 
    
  3. 的try catch块应该采取其他的事情。

2.如何在Sonata Admin Generator窗体中显示消息?

溶胶:在高速缓存块中的信息将显示在奏管理员束的形式

try { 

        $this->admin->delete($object); 

        $this->get('session')->setFlash('sonata_flash_success', 'flash_delete_success'); 

       } catch (\Exception $e) { 

        $this->get('session')->setFlash('sonata_flash_error', sprintf('Cannot Delete because it has Dependeny')); 
       } 

注意。确保你导入了所有必要的文件