2014-10-14 4 views
0

sf2 양식에서 몇 가지 저장 버튼 (유형 제출)이있는 양식을 관리하는 방법이 궁금합니다. 내 양식이 개체에 매핑되어 있으며 'savePersonn'단추를 클릭 할 때 personn 필드 만 유지하려고합니다.Symfony 2 : 여러 제출 저장 버튼이있는 매핑 된 폼을 처리하는 방법

또한 'saveAdress'버튼을 클릭했을 때만 주소 입력란을 유지하고 싶습니다. 마지막으로 'saveAll'버튼을 클릭하면 모든 양식 정보를 저장하고 싶습니다. 아무도 그 방법을 알고 있습니까? 현재 나의 처리기에서는 모든 정보가 유지됩니다. 내 formType의 코드 : 당신이 후있어하는 것은 다음은 "단지 엔티티의 일부를 저장"부분보다는 "다른 버튼을 클릭 할 경우 다른 일을하는 방법"부분 인 경우

<?php 

namespace Foobar\OwnerBundle\Form\Type; 

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

class OwnerType extends AbstractType { 

    public function buildForm(FormBuilderInterface $builder, array $options) { 
     $builder->add('firstName', null); 
     $builder->add('lastName', null); 
     $builder->add('dateOfBirth', null); 
     $builder->add('savePersonn', 'submit'); 

     $builder->add('address', null); 
     $builder->add('country', null); 
     $builder->add('saveAdress', 'submit'); 

     $builder->add('saveAll', 'submit'); 

    } 

     public function setDefaultOptions(OptionsResolverInterface $resolver) { 
     $resolver->setDefaults(array(
      'data_class' => 'Foobar\CarBundle\Entity\Owner' 
     )); 
    } 

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

} 
+0

클릭하여 저장하는 것보다 실제로하는 것이 분명하도록이 내용을 편집하는 것이 좋습니다. – frumious

답변

0

옵션은 DB에서 새로운 것과 변경된 Entity를 비교하는 것에 대해 아래에서 암시 한 것입니다.

$ownerRepo = $this->getRepository('Bundle:Owner'); 
$changedOwner = $ownerRepo->find($id); 

//Handle request etc, $changedOwner gets data from submitted form 

if ($form->isValid()) { 

    $em = $this->getDoctrine()->getManager(); 

    if ($form->get('saveAll')->isClicked()) 
    { 
     $em->flush(); //$changedOwner was already managed, just need to save all changes 
    } 
    elseif ($form->get('saveAdress')->isClicked()) 
    { 
     //Save just address 
     $em->detach($changedOwner); //Don't want everything in this to be persisted 
     $freshOwner = $ownerRepo->find($id); //untouched 
     $freshOwner->setAddress($changedOwner->getAddress()); //and other fields 
     $em->flush(); //Update $freshOwner 
    } 
    elseif ($form->get('savePersonn')->isClicked()) 
    { 
     //Save just person 
     //As above, but with person rather than address 
    } 

    return $this->redirect(); 
} 


잘못된 궤도에 올드 대답

Symfony Form Docs에 설명 된대로 컨트롤러에이 같은 클릭 된 버튼을 테스트 할 수 있습니다 : 당신은거야

if ($form->isValid()) { 

    if ($form->get('saveAll')->isClicked()) 
    { 
     //Save entire entity 
    } 
    elseif ($form->get('saveAdress')->isClicked()) 
    { 
     //Save just address 
    } 
    elseif ($form->get('savePersonn')->isClicked()) 
    { 
     //Save just person 
    } 

    return $this->redirect(); 
} 

을 엔티티의 일부만 저장하는 방법을 스스로 결정해야합니다. DB에서 다른 사본을 검색하고, 양식에서 채워진 사본과 비교하고, 지속하기 전에 관련 필드 만 선택적으로 갱신 할 수 있습니다.

+0

응용 프로그램의 논리를 적용하면 좋은 생각이 아니라 더 나은 서비스/이벤트 리스너가됩니다. 이 경우 FormEvents :: SUBMIT 이벤트에 이벤트 리스너를 사용하십시오. – jamek

+0

@jamek 동의 할 지 모르겠으니 생각하기에 완벽한 장소라고 생각합니다! 이벤트를 사용하는 것만 큼 복잡한 것은 아닙니다. 대부분의 공식 Symfony 예제는 다음과 같습니다. 물론 Asker에게는 선택권이있어서 좋았습니다. – frumious

+0

안녕하세요, 고맙습니다. 저는 이미 isclicked() 메소드를 알고있었습니다. 내 문제는 기본 객체의 일부 속성 만 저장하는 것입니다. 현재 모든 개체 속성이 유지됩니다. 예 : 'firstName', 'lastName', 'dateOfBirth'필드는 'savePersonn'전용 제출시 다른 정보를 유지하지 않고 계속 유지하는 방법은 무엇입니까? 'saveAdress'를 클릭하면 똑같은 것을 구현하고 싶습니다. –