我们如何在发布后从扩展表单类型中捕获/获取字段


How we can catch/get a field from an Extends Form Type after POSTing

我有(FormType2)作为FormType1

的扩展表单类型。 出现 FormType2 的新字段,也出现 FormType1 的新字段,这意味着我的扩展类型正常工作......但是当我发布表格时。无法检索 FormType2 的字段...我收到此错误消息:

属性 "nychaCode" 和 "getNychaCode()"、"isNychaCode()"、"

hasNychaCode()"、"__get()" 都不存在,并且在类 "Bundle''Model''DiscountCode" 中具有公共访问权限。

我该如何解决这个问题?谢谢。

我的抽象类型扩展

namespace MyBundle'Form'Type;
use MyBundle'Model'DiscountCodeNYCHA;
use Symfony'Component'Form'AbstractTypeExtension;
use Symfony'Component'Form'FormBuilderInterface;
class DiscountCodeNYCHAType extends AbstractTypeExtension{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add(DiscountCodeNYCHA::ATTRIBUTE_NYCHA_CODE, null, array('label' => 'NYCHA Tenant Account Number', 'attr' => array('autocomplete' => 'off'));
        $builder->add(DiscountCodeNYCHA::ATTRIBUTE_BIRTH_YEAR, null, array('label' => 'Birth Year', 'attr' => array('autocomplete' => 'off'));
        $builder->add(DiscountCodeNYCHA::ATTRIBUTE_BIRTH_DAY, null, array('label' => 'Birth Day', 'attr' => array('autocomplete' => 'off'));
    }
    public function getExtendedType()
    {
        return 'edDiscountCode';
    }
}

型号折扣代码NYCHA

namespace MyBundle'Model;

use Bundle'Model'DiscountCode;
class DiscountCodeNYCHA extends DiscountCode {
    const ATTRIBUTE_NYCHA_CODE = 'nychaCode';
    const ATTRIBUTE_BIRTH_YEAR = 'birthYear';
    const ATTRIBUTE_BIRTH_DAY = 'birthDay';
    private $nychaCode;
    private $birthYear;
    private $birthDay;
    /**
     * @return mixed
     */
    public function getNychaCode()
    {
        return $this->nychaCode;
    }
    /**
     * @param mixed $nychaCode
     */
    public function setNychaCode($nychaCode)
    {
        $this->nychaCode = $nychaCode;
    }
    /**
     * @return mixed
     */
    public function getBirthDay()
    {
        return $this->birthDay;
    }
    /**
     * @param mixed $birthDay
     */
    public function setBirthDay($birthDay)
    {
        $this->birthDay = $birthDay;
    }
    /**
     * @return mixed
     */
    public function getBirthYear()
    {
        return $this->birthYear;
    }
    /**
     * @param mixed $birthYear
     */
    public function setBirthYear($birthYear)
    {
        $this->birthYear = $birthYear;
    }
    public function isEmpty(){
        if(is_null($this->nychaCode) && is_null($this->birthYear) && is_null($this->birthDay)){
            return true;
        }
    }
}

我的表单类型

use Bundle'Model'DiscountCode;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormBuilderInterface;
use Symfony'Component'OptionsResolver'OptionsResolverInterface;
class DiscountCodeType extends AbstractType {
    function __construct() {
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add(DiscountCode::ATTRIBUTE_FIRST_TWO_LETTERS_FIRST_NAME, null, array('label'=>'First two letters of first name','attr' => array('autocomplete' => 'off')));
        $builder->add(DiscountCode::ATTRIBUTE_FIRST_TWO_LETTERS_LAST_NAME, null, array('label'=>'First two letters of last name','attr' => array('autocomplete' => 'off')));
        $builder->add(DiscountCode::ATTRIBUTE_LAST_FOUR_DIGITS_SSN, null, array('label'=>'Last four digits of Social Security Number','attr' => array('autocomplete' => 'off')));
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        parent::setDefaultOptions($resolver);
        $resolver->setDefaults([
            'data_class' => get_class(new DiscountCode()),
            'translation_domain' => 'DiscountCodeType',
        ]);
    }
    /**
     * Returns the name of this type.
     *
     * @return string The name of this type
     */
    public function getName() {
        return 'edDiscountCode';
    }
}

型号折扣代码 :

namespace Bundle'Model;
class DiscountCode {
    const ATTRIBUTE_FIRST_TWO_LETTERS_FIRST_NAME = 'firstTwoLettersFirstName'; // First two letters of first name
    const ATTRIBUTE_FIRST_TWO_LETTERS_LAST_NAME = 'firstTwoLettersLastName'; // First two letters of last name
    const ATTRIBUTE_LAST_FOUR_DIGITS_SSN = 'lastFourDigitsSsn'; // Last four digits of Social Security Number
    private $firstTwoLettersFirstName;
    private $firstTwoLettersLastName;
    private $lastFourDigitsSsn;
    /**
     * @return mixed
     */
    public function getFirstTwoLettersFirstName()
    {
        return $this->firstTwoLettersFirstName;
    }
    /**
     * @param mixed $firstTwoLettersFirstName
     */
    public function setFirstTwoLettersFirstName($firstTwoLettersFirstName)
    {
        $this->firstTwoLettersFirstName = $firstTwoLettersFirstName;
    }
    /**
     * @return mixed
     */
    public function getFirstTwoLettersLastName()
    {
        return $this->firstTwoLettersLastName;
    }
    /**
     * @param mixed $firstTwoLettersLastName
     */
    public function setFirstTwoLettersLastName($firstTwoLettersLastName)
    {
        $this->firstTwoLettersLastName = $firstTwoLettersLastName;
    }
    /**
     * @return mixed
     */
    public function getLastFourDigitsSsn()
    {
        return $this->lastFourDigitsSsn;
    }
    /**
     * @param mixed $lastFourDigitsSsn
     */
    public function setLastFourDigitsSsn($lastFourDigitsSsn)
    {
        $this->lastFourDigitsSsn = $lastFourDigitsSsn;
    }
    public function isEmpty(){
        if(is_null($this->firstTwoLettersFirstName) && is_null($this->firstTwoLettersLastName) && is_null($this->lastFourDigitsSsn)){
            return true;
        }
    }
}

更新:我只是将DiscountCodeNYCHA的设置者和获取者更新为公众访问,受到保护。

问题是您没有告诉扩展窗体类型使用扩展模型类。 由于您不覆盖 setDefaultOptions,因此它使用来自 DiscountCodeType 的定义,其中data_class设置为 DiscountType。

将此添加到 折扣代码NYCHAType:

public function setDefaultOptions(OptionsResolverInterface $resolver) {
    $resolver->setDefaults([
        'data_class' => get_class(new DiscountCodeNYCHA()),
        'translation_domain' => 'DiscountCodeType',
    ]);
}

此外,在折扣代码类型中,您不必调用

parent::setDefaultOptions($resolver);

因为你正在扩展Symfony''Component''Form''AbstractType,其中每个函数都有一个空的定义。