2014-09-03 5 views
1

У меня есть PersonType форму, а затем у меня LegalPersonType и NaturalPersonType формы и оба простирается от PersonType, так как они имеют общее поле на этой форме (отображенного на уровне Entity). Например, это код для 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'; 
    } 

} 

Тогда в SaveFormController/orderAction() Я делаю это:

$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".

Отношения находятся на уровне сущности, как я исправляю эту ошибку?

Заранее спасибо

первое возможное решение

После предложений от пользователя здесь меняю, в 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.

EDIT:

Я не знаю, почему именно вы используете этот подход (который я никогда не использовал в своих проектах), но ИМО PersonType, NaturalPersonType и LegalPersonType должен быть только «FormType/FieldType» инициализированную inherit_data (а не сущности, как в вашем коде), который содержит поля, связанные с их использованием, в то время как OrdersType должен быть составлен с блоком форм, необходимым для типа человека, который его заполняет, и data_class, установленным на объекте UNIQUE, который хранит данные выведенный формой.

+0

Привет, вы можете взглянуть на мое издание? У меня все еще есть некоторые проблемы после попытки заставить код работать с вашим предложением – ReynierPM

+0

Я обновил свой ответ –

+0

Ummm Я потерялся в этот момент, не могли бы вы оставить пример кода? – ReynierPM

Смежные вопросы