2014-12-16 3 views
5

데이터베이스 테이블을 사용하여 로그 이벤트를 사람이 읽을 수있는 동등한 것으로 변환하여보고를 수행하는 로그 파서에서 작업하고 있습니다.Symfony2에서 많은 관련이없는 엔티티로 폼을 만들려면 어떻게해야합니까?

는 예를 들어,"start_application_minecraft"와 같은 로그 항목이 로 변환되는 것 "마인 크래프트 시작".

표시 텍스트를 추가/업데이트하기위한 웹 인터페이스를 만들고 싶습니다. 그러나이를 Symfony Form 객체에 가져 오는 방법을 알아낼 수 없습니다.

ID, TextDisplayText의 속성을 가진 LogEvent 엔티티가 있으며 이러한 속성에 해당하는 양식 유형을 만들었습니다.

한 번에 하나의 이벤트를 수정하는 데는 문제가 없지만 모든 항목을 업데이트하기 위해 하나의 제출 버튼이있는 한 페이지에 모든 항목이 있어야합니다. 문제는 Forms를 포함 할 때 찾을 수있는 모든 문서가 관련있는 엔티티 (예 : 여러 제품이 포함 된 카테고리)를 다루지 만 제 경우에는 내가 작업해야하는 엔티티가 완전히 관련이 없다는 것입니다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까?

+0

나 ': 당신의 편집 작업 로그 이벤트를 통해 루프 당신이해야 할 무엇이든 할 수있는 그런

public function indexAction() { // replace findAll() with a more restrictive query if you need to $logEvents = $this->getDoctrine()->getManager() ->getRepository('MyBundle:LogEvent')->findAll(); $form = $this->createForm( new MultiLogEventType(), array('logEvents' => $logEvents) ); return array('form' => $form->createView()); } 

을 d는 이것에 대한 답을 정말 갖고 싶어! :) 해결 방법은 모든'LogEvent'를 마스터 엔티티에 첨부하는 것일 수 있다고 생각합니다. 그런 다음 해당 마스터 엔티티의 양식을 작성하고'LogEvent' 양식을 그 안에 삽입하십시오. – paulgv

+0

로그 이벤트의 배열을 만들고이를 'collection'요소가있는 양식으로 전달하십시오. http://symfony.com/doc/current/cookbook/form/form_collections.html – Cerad

답변

1

Symfony 'Collection'양식 필드 유형을 사용하고 Doctrine을 사용하여 원하는 LogEvent 엔티티를 찾고이를 Collection으로 전달하십시오.

예 : http://symfony.com/doc/current/cookbook/form/form_collections.html

참조 :

:

class LogEventType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('text'); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'My\Bundle\Entity\LogEvent', 
     )); 
    } 

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

그런 다음 LOGEVENT 엔티티의 컬렉션을 보유하고 양식 유형을 : http://symfony.com/doc/current/reference/forms/types/collection.html

그래서 먼저 당신은 당신의 LOGEVENT 양식 유형을 만들 것

class MultiLogEventType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add(
      'logEvents', 'collection', array('type' => new LogEventType()) 
     ); 
    } 

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

T 당신의 컨트롤러에서 암탉, 그것은 당신의 로그 이벤트를 양식을 작성하고 전달합니다

public function editAction(Request $request) 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $editForm = $this->createForm(new MultiLogEventType()); 
    $editForm->handleRequest($request); 

    if ($editForm->isValid()) 
    { 
     foreach ($logEvents as $logEvent) { 
      // perform any logic you need to here 
      // (ex: removing the log event; $em->remove($logEvent);) 
     } 
     $em->flush(); 
    } 

    return $this->redirect($this->generateUrl('log_event_edit')); 
} 
+1

예제 코드로 업데이트되었습니다. –

1

모든 엔터티를 자식으로 추가하는 양식 유형을 만들 수 있습니다. "데이터"를 배열로 만들면 임의의 수의 양식 항목을 가질 수 있습니다.

관련 문제