2014-09-03 1 views
1

나는 PersonType 양식을 가지고 있으며 LegalPersonType 및 양식을 가지고 있으며 둘 모두 PersonType에서 확장됩니다 (엔터티 수준에서 매핑 됨) 양식에 공통 필드가 있기 때문에 두 양식 모두 PersonType에서 확장됩니다. 예를 들어,이 SaveFormController에서/orderAction 그런 NaturalPersonType.php양식 상속 관련 문제

use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Tanane\FrontendBundle\DBAL\Types\CIType; 
use Tanane\FrontendBundle\Form\Type\PersonType; 

class NaturalPersonType extends PersonType { 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 

     $builder 
       ->add('identification_type', 'choice', array(
        'label' => 'Número de Cédula', 
        'choices' => CIType::getChoices() 
       )) 
       ->add('ci', 'number', array(
        'required' => true, 
        'label' => false, 
        'attr' => array(
         'maxlength' => 8, 
        )) 
       ) 
       ->add('lives_in_ccs', 'checkbox', array(
        'label' => false, 
        'required' => false, 
        'value' => 1, 
     )); 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Tanane\FrontendBundle\Entity\NaturalPerson' 
     )); 
    } 

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

} 

() 나는이 일을 해요에 대한 코드는 다음과 같습니다

$order = new Orders(); 
$orderForm = $this->createForm(new OrdersType(array($type)), $order, array('action' => $this->generateUrl('save_order'))); 

그러나 언제든지 내가이 오류가 양식을 렌더링하려고 :

Neither the property "nat" nor one of the methods "getNat()", "nat()", "isNat()", "hasNat()", "__get()" exist and have public access in class "Tanane\FrontendBundle\Entity\Orders".

관계는 엔티티 수준에서 어떻게 그 오류를 수정합니까? 사전에

덕분에 내가 변경 여기에 사용자의 제안에 따라

1 가능한 솔루션

, OrderType.php이 내 코드를 양식 :

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Tanane\FrontendBundle\DBAL\Types\SFType; 

class OrdersType extends AbstractType { 

    /** 
    * @var string 
    */ 
    protected $register_type; 

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

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // here goes $builder with default options remove for see less code 

     if ($this->register_type[0] == "natural") 
     { 
      $builder->add('nat', new NaturalPersonType(), array(
       'data_class' => 'Tanane\FrontendBundle\Entity\NaturalPerson' 
      )); 
     } 
     elseif ($this->register_type[0] == "legal") 
     { 
      $builder->add('leg', new LegalPersonType(), array(
       'data_class' => 'Tanane\FrontendBundle\Entity\LegalPerson' 
      )); 
     } 
    } 

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Tanane\FrontendBundle\Entity\Orders', 
      'render_fieldset' => FALSE, 
      'show_legend' => FALSE 
     )); 
    } 

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

} 

내가 'mapped' => FALSE을 추가하여 해결했습니다 각각의 새 FormType에 대해 OrdersType에 추가하지만 이것이 맞는지는 알 수 없습니다. 또한 여기에 data_class을 정의하면 NaturalType은 그 양식에서 기본 옵션을 제거해야합니까? OrdersType에 직접 액세스 할 수 없으며 그대로 두어야합니까? 문제를 지금 어떻게 해결할 수 있습니까? 내가 뭘 놓치고있어?

답변

1

이 귀하의 질문에 직접 대답은 아니지만 그렇게하기 전에, 어쩌면 약간의 문제를 해결할 수 ... 내가 대신 AbstractType 연장의이 같은 양식을 확장하는 것이 가능하다 본 기억하지

, 그러나 문서에서 설명한 것처럼 서로 다른 유형의 양식간에 공유 할 공통 필드가있는 경우 inherit_data이 제공하는 기본 프레임 워크 모듈을 사용해야합니다.

좀 더 구체적으로 (일부 필드에서 실행하기위한 몇 가지 특별한 방법이 필요하다면) create a new field type 또는 extend an existing one을 사용하면 AbstractTypeExtension을 사용할 수 있습니다.

편집 : 당신이 초기화이 (내 프로젝트에 사용 결코) 접근하지만, IMO PersonType, NaturalPersonTypeLegalPersonType는 "FormType/FieldType"이어야합니다을 사용하는 이유를 정확히 모르는

inherit_data (사용자 코드와 같은 엔티티가 아닌)은 사용과 관련된 필드를 포함하고 OrdersType은 채우는 사람 유형에 필요한 양식 블록으로 구성되어야하며 데이터를 저장하는 UNIQUE 엔티티에 data_class이 설정되어야합니다 양식에 의해 출력됩니다.

+0

안녕하세요, 제 에디션을 사용해 볼 수 있습니까? 난 아직도 당신의 제안 작업 코드를 시도한 후 몇 가지 문제가있어. – ReynierPM

+0

내 대답을 업데이트 –

+0

음 내가이 시점에서 길을 잃었 어, 당신은 코드 예제를 남길 수 있을까? – ReynierPM