2017-05-24 8 views
0

부모 및 자녀 엔티티가 있습니다. 모든 하위 엔티티가 삭제 된 후에도 symfony는 부모 엔티티도 삭제합니다. 나는 그런 행동을 좋아하지 않는다. 부모 엔티티는 자식이있을 때마다 존재해야한다. 자녀 여기Symfony Doctrine : 일대 다 관계가 상위 엔티티를 삭제합니다.

/** 
    * @OneToMany(targetEntity="Gallery", mappedBy="promotion", cascade={"persist", "remove"}) 
    */ 
    private $galleries; 

public function __construct() { 
     $this->galleries = new ArrayCollection(); 
    } 

    public function getGalleries() { 
     return $this->galleries; 
    } 

    public function addGallery($gallery) 
    { 
     $gallery->setPromotion($this); 
     $this->galleries[] = $gallery; 

     return $this; 
    } 

    public function removeGallery($gallery) 
    { 
     $gallery->setPromotion(null); 
     $this->galleries->removeElement($gallery); 
    } 

그리고 :

/** 
    * @ManyToOne(targetEntity="Promotion", inversedBy="galleries") 
    */ 

    private $promotion; 

나는 이미 이것에 시간을 보내고있는 무엇을 해야할지하지 않습니다 ...

그것을 여기에 부모에 대한 내 코드입니다 쉬운 관리 번들에 의해 처리되므로 도움이되지 않습니다.

namespace AppBundle\Controller; 

use JavierEguiluz\Bundle\EasyAdminBundle\Event\EasyAdminEvents; 
use Symfony\Component\Security\Acl\Exception\Exception; 
use AppBundle\Entity\Promotion; 
use Symfony\Component\HttpFoundation\JsonResponse; 

class PromotionController extends PageController { 
    protected $folder = 'promotions'; 
    protected $htmlFileName = 'default-template.html'; 

    protected function rearangeAction() { 
     $ids = json_decode($this->request->get('ids')); 
     $order = 1; 

     foreach($ids as $id) {    
      $this->em->createQuery('UPDATE AppBundle:Promotion p SET p.order = :order WHERE p.id = :id') 
       ->setParameter('order', $order++) 
       ->setParameter('id', $id) 
       ->execute(); 
     } 

     return $this->redirectToRoute('easyadmin', $this->prepareRouteParams()); 
    } 

    protected function checkFolderAction() {   
     $row = $this->em->createQuery('SELECT p FROM AppBundle:Promotion p WHERE p.language = :language AND p.subfolder = :subfolder') 
       ->setParameter('language', $this->language) 
       ->setParameter('subfolder', $this->request->get('subfolder')) 
       ->getOneOrNullResult(); 

     if($row) { 
      return new JsonResponse(array('duplicity' => 1)); 
     } else { 
      return new JsonResponse(array('duplicity' => 0)); 
     } 
    } 

    protected function deleteFiles($databaseSubFolders) { 
     $mainFolder = $this->baseDir.'/'.$this->folder.'/'.$this->language; 

     $databaseSubFolders[] = '..'; 
     $databaseSubFolders[] = '.'; 

     $subFolders = array_diff(scandir($mainFolder), $databaseSubFolders); 

     foreach($subFolders as $subFolder) { 
      $this->deleteFolder($mainFolder.'/'.$subFolder); 
     } 
    } 

    protected function exportAction() { 
     $query = $this->em->createQuery('SELECT p FROM AppBundle:Promotion p WHERE p.language = :language') 
       ->setParameter('language', $this->language); 

     $subFolders = array(); 

     foreach($query->getArrayResult() as $key => $val) { 
      $subFolders[] = $val['subfolder']; 

      // pridanie novych a uprava starych 

      $image = basename($val['headerImage']); 
      $imageName = substr($image, 0 ,strpos($image,'.')); 

      $all = '<div class="header"> 
         <div class="row"> 
          <h2> 
           '.$val['headerTitle'].' 
          </h2> 
          <p> 
           '.$val['headerTeaser'].' 
          </p> 
         </div> 
        </div><img src="{{::promo.imgPath}}/'.$image.'" alt="'.$imageName.'">'; 

      $all .= $this->changeMarkdownToHtml($val['html']); 
      $all .= $this->changeMarkdownToHtml($val['terms']); 

      file_put_contents($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$val['subfolder'].'/html/'.$val['filename'], $all); 
     } 

     // zmazanie starych zloziek 

     $this->deleteFiles($subFolders);   

     parent::exportAction(); 

     return $this->redirectToRoute('easyadmin', $this->prepareRouteParams()); 
    } 

    private function actualImage($id, $i) { 
     $row = $this->em->createQuery('SELECT p FROM AppBundle:Promotion p WHERE p.id = :id') 
       ->setParameter('id', $id) 
       ->getOneOrNullResult(); 

     return call_user_func_array(array($row,'getImage'.$i), array()); 
    } 

    protected function preDeleteEntity($id) { 
     // mazanie obrazkov 


    } 

    protected function preSearchEntity($entity) { 
     $entity['search']['dql_filter'] = "entity.language = '".$this->language."'"; 

     return $entity; 
    } 

    protected function prePersistEntity($entity) { 
     // ukladanie dalsich dat 

     $entity->setLanguage($this->language); 
     $entity->setFilename($this->htmlFileName); 

     $row = $this->em->createQuery('SELECT MAX(p.order)+1 FROM AppBundle:Promotion p') 
       ->getOneOrNullResult(); 

     $entity->setOrder($row[1]); 

     return $entity; 
    } 

    protected function postPersistEntity($entity) { 
     if(!is_dir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder())) {     
      mkdir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder()); 
      mkdir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder().'/'.'header'); 
      mkdir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder().'/'.'html'); 
      mkdir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder().'/'.'img'); 
     } 

     // presun obrazkov 

     $images = array(); 

     foreach($entity->getGalleries()->getSnapshot() as $snapshot) { 
      $image = $snapshot->getImage(); 

      $from = $this->get('kernel')->getRootDir().'/../web/uploads/temp/'.basename($image); 
      $to = $this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder().'/img/'.$image; 

      $this->copyFile($from, $to); 

      $images[] = $image; 
     } 

     $getImage = $entity->getHeaderImage(); 

     $from = $this->get('kernel')->getRootDir().'/../web/uploads/temp/'.basename($getImage); 
     $to = $this->baseDir.'/'.$this->folder.'/'.$this->language.$getImage; 

     $this->copyFile($from, $to); 

     $entity->setHtml($this->replaceImages($entity->getHtml(), $images)); 

     return $entity; 
    } 

    protected function preRemoveEntity($entity) { 
     //if($_POST['_method'] != 'DELETE') { 
//   var_dump($entity); 
//   die(); 
     //} 

     return $entity; 
    } 

    protected function editAction() {  
     $id = $this->request->query->get('id'); 

     $this->dispatch(EasyAdminEvents::PRE_EDIT); 
     $this->executeDynamicMethod('preEdit<EntityName>Entity', array($id)); 

     $easyadmin = $this->request->attributes->get('easyadmin'); 
     $entity = $easyadmin['item'];   

     if ($this->request->isXmlHttpRequest() && $property = $this->request->query->get('property')) { 
      $newValue = 'true' === mb_strtolower($this->request->query->get('newValue')); 
      $fieldsMetadata = $this->entity['list']['fields']; 

      if (!isset($fieldsMetadata[$property]) || 'toggle' !== $fieldsMetadata[$property]['dataType']) { 
       throw new \RuntimeException(sprintf('The type of the "%s" property is not "toggle".', $property)); 
      } 

      $this->updateEntityProperty($entity, $property, $newValue); 

      return new Response((string) $newValue); 
     } 

     $fields = $this->entity['edit']['fields']; 

     $editForm = $this->executeDynamicMethod('create<EntityName>EditForm', array($entity, $fields)); 

     $deleteForm = $this->createDeleteForm($this->entity['name'], $id); 

     // kontrola pre presun 

     $row = $this->em->createQuery('SELECT p FROM AppBundle:Promotion p WHERE p.id = :id') 
        ->setParameter('id', $id) 
        ->getOneOrNullResult(); 

     $previousSubfolder = $row->getSubfolder(); 

     $editForm->handleRequest($this->request); 

     if ($editForm->isSubmitted() && $editForm->isValid()) { 
      $this->dispatch(EasyAdminEvents::PRE_UPDATE, array('entity' => $entity));    
      $entity = $this->executeDynamicMethod('preUpdate2<EntityName>Entity', array($entity,$previousSubfolder)); 

      $this->em->flush(); 

      $this->dispatch(EasyAdminEvents::POST_UPDATE, array('entity' => $entity));    
      $entity = $this->executeDynamicMethod('postUpdate2<EntityName>Entity', array($entity,$previousSubfolder)); 

      $refererUrl = $this->request->query->get('referer', '');   

      return !empty($refererUrl) 
       ? $this->redirect(urldecode($refererUrl)) 
       : $this->redirect($this->generateUrl('easyadmin', array('action' => 'list', 'entity' => $this->entity['name']))); 
     } 

     $this->dispatch(EasyAdminEvents::POST_EDIT);   
     $entity = $this->executeDynamicMethod('postEdit<EntityName>Entity', array($entity)); 

     return $this->render($this->entity['templates']['edit'], array(
      'form' => $editForm->createView(), 
      'entity_fields' => $fields, 
      'entity' => $entity, 
      'delete_form' => $deleteForm->createView(), 
     )); 
    } 

    protected function preUpdate2Entity($entity, $previousSubfolder) { 


//  if($_POST['delete_form']['_easyadmin_delete_flag'] == 1) { 
//   $this->em->createQuery('DELETE FROM AppBundle:Gallery g WHERE g.promotion = :id') 
//     ->setParameter('id', $id) 
//     ->execute(); 
//  } 


     $images = array();   

     foreach($entity->getGalleries()->getSnapshot() as $snapshot) { 
      $image = $snapshot->getImage(); 

      $images[] = $image; 
     } 



     $entity->setHtml($this->replaceImages($entity->getHtml(), $images)); 

     return $entity; 
    } 

    protected function postUpdate2Entity($entity, $previousSubfolder) { 
     if(!is_dir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder())) {     
      mkdir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder()); 
      mkdir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder().'/'.'header'); 
      mkdir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder().'/'.'html'); 
      mkdir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder().'/'.'img'); 
     } 

     // presun obrazkov 

     $images = array(); 

     foreach($entity->getGalleries()->getSnapshot() as $snapshot) { 
      $image = $snapshot->getImage(); 

      $from = $this->get('kernel')->getRootDir().'/../web/uploads/temp/'.basename($image); 
      $to = $this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder().'/img/'.$image; 

      if(!file_exists($from)) {     
       $from = $this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$previousSubfolder.'/img/'.$image; 
      } 

      $this->copyFile($from, $to); 
      $images[] = $image; 
     } 

     // zmazanie obrazkov 

     $folderImages = array_diff(scandir($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$previousSubfolder.'/img/'), array('..', '.')); 

     foreach($folderImages as $folderImage) { 
      if(!in_array($folderImage, $images)) { 
       unlink($this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$previousSubfolder.'/img/'.$folderImage); 
      } 
     } 

     $getImage = $entity->getHeaderImage(); 

     $from = $this->get('kernel')->getRootDir().'/../web/uploads/temp/'.basename($getImage); 

     if(!file_exists($from)) { 
      $from = $this->baseDir.'/'.$this->folder.'/'.$this->language.$getImage; 
     } 

     $to = $this->baseDir.'/'.$this->folder.'/'.$this->language.'/'.$entity->getSubfolder().'/header/'.basename($getImage); 

     $this->copyFile($from, $to); 

     return $entity; 
    } 

    protected function postEditEntity($entity) { 
     // cesta pre obrazky   

     $entity->setHeaderImage(null, '/uploads/'.$this->container->getParameter('repo.folder').'/'.$this->folder.'/'.$this->language.$entity->getHeaderImage()); 

     return $entity; 
    } 

    protected function preListEntity($entity) { 
     $entity['list']['dql_filter'] = "entity.language = '".$this->language."'"; 

     return $entity; 
    } 

    protected function postListEntity($fields) { 
     // cesta pre obrazky   

     $fields['headerImage']['base_path'] = '/uploads/'.$this->container->getParameter('repo.folder').'/'.$this->folder.'/'.$this->language; 

     return $fields; 
    } 

    protected function postSearchEntity($fields) { 
     // cesta pre obrazky 

     $fields['headerImage']['base_path'] = '/uploads/'.$this->container->getParameter('repo.folder').'/'.$this->folder.'/'.$this->language; 

     return $fields; 
    } 
} 
+0

속성 캐스케이드를 삭제하려고 했습니까? –

+0

[양방향 일대 다 캐스케이드 제거 및 교리 상 삭제 동작] (http://www.inanzzz.com/index.php/post/ur2x/bidirectional-one-to-many-cascade-remove-and-orphan) Doctrine에 의해 실행 된 "cascade = {"remove "}"연산에 의해 엔터티가 실수로 삭제되었을 수 있습니다 : – BentCoder

+0

이미 시도했습니다. 결과는 실수로 삭제되었을 수 있습니다. –

답변

0

캐스케이드 주석을 모두 제거하십시오. 나머지는 좋아 보인다.