У меня есть 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
следует ли удалить параметры по умолчанию из этой формы или оставить их там? Как я могу исправить проблему сейчас? Что мне не хватает?
Привет, вы можете взглянуть на мое издание? У меня все еще есть некоторые проблемы после попытки заставить код работать с вашим предложением – ReynierPM
Я обновил свой ответ –
Ummm Я потерялся в этот момент, не могли бы вы оставить пример кода? – ReynierPM