我有(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,其中每个函数都有一个空的定义。