2013-02-05 36 views
3

我想要構建一個特殊的窗體來管理LogEntry實體(從Loggable Behavioral)並處理實體回覆以允許管理員將某些實體恢復到舊版本。建立一個窗體來處理從Doctrine Loggable擴展的實體恢復

我試了下FormType生成與分配給特定LogEntry實體的版本的列表形式:

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

use Gedmo\Loggable\Entity\Repository\LogEntryRepository as EntityRepository; 

class LogItemVersionsType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // In that point, I would need the entity assigned to that specific LogEntry to be able to load the diferent versions 
     $entity = $builder->getData(); 
     //var_dump($data); 
     $builder 
      ->add('version', 'entity', array(
       'class' => 'Gedmo\Loggable\Entity\LogEntry', 
       'property' => 'version', 
       'query_builder' => function(EntityRepository $er) { 
        return $er->getLogEntriesQuery($entity); 
       }, 
      )) 
     ; 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Gedmo\Loggable\Entity\LogEntry' 
     )); 
    } 

    public function getName() 
    { 
     return 'zashost_zaspanelbundle_logitemversionstype'; 
    } 
} 

但我有如下疑問:

  • 的LogEntry有沒有方法來檢索記錄的對象。我應該創建一個繼承LogEntry的中間類來添加該方法嗎?請注意,分配給LogEntry的實體是可變的,所以我應該將該方法放在LogEntry實體類中?

回答

4

什麼最後我已經做了,如果它可以幫助別人:

在形式I型設置回滾作爲__construct方法的參數實體,這樣我就可以得到該特定對象具有版本構建形式:

class LogItemVersionsType extends AbstractType 
{ 
    protected $entity; 

    public function __construct($entity = null) 
    { 
     $this->entity = $entity; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $entity = $this->entity; 
     $builder 
      ->add('version', 'entity', array(
       'mapped' => false, 
       'class' => 'Gedmo\Loggable\Entity\LogEntry', 
       'property' => 'version', 
       'query_builder' => function(EntityRepository $er) use ($entity) { 
        return $er->createQueryBuilder('le')->where('le.objectId = ?1')->setParameter('1', $entity->getId()); 
       }, 
      )) 
     ; 
    } 
} 

在控制器我得到的associed實體,然後我傳遞給FormType構造,之後,在updateAction我再次獲取對象和版本通過恢復方法:

/** 
* LogItem controller. 
* 
*/ 
class LogItemController extends Controller 
{ 
    /** 
    * Finds and displays a LogItem entity versions form. 
    * 
    */ 
    public function versionsAction($id) 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $entity = $em->getRepository('GedmoLoggable:LogEntry')->find($id); 

     if (!$entity) { 
      throw $this->createNotFoundException('Unable to find HttpdHost entity.'); 
     } 

     $loggedobject = $em->getRepository($entity->getObjectClass())->find($entity->getObjectId()); 

     $editForm = $this->createForm(new LogItemVersionsType($loggedobject), $entity); 

     return $this->render('ZashostZaspanelBundle:LogItem:versions.html.twig', array(
      'entity'  => $entity, 
      'edit_form' => $editForm->createView(), 
     )); 

    } 

    /** 
    * Edits an existing LogItem entity. 
    * 
    */ 
    public function updateAction(Request $request, $id) 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $entity = $em->getRepository('GedmoLoggable:LogEntry')->find($id); 

     if (!$entity) { 
      throw $this->createNotFoundException('Unable to find LogItem entity.'); 
     } 

     $refobjrepo = $em->getRepository($entity->getObjectClass()); 

     $refobject = $refobjrepo->find($entity->getObjectId()); 

     $editForm = $this->createForm(new LogItemVersionsType($refobject), $entity); 
     $editForm->bind($request); 

     if ($editForm->isValid()) { 
      $repo = $em->getRepository('GedmoLoggable:LogEntry'); 
      $values = $request->request->get('zashost_zaspanelbundle_logitemversionstype'); 

      $version = intval($values['version']); 

      $repo->revert($refobject , $version); 

      $em->persist($refobject); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('logs')); 
     } 

     return $this->render('ZashostZaspanelBundle:LogItem:versions.html.twig', array(
      'entity'  => $entity, 
      'edit_form' => $editForm->createView(), 
     )); 
    } 


}