属性和方法之一都不存在,并且在自定义FieldType中的类中具有公共访问权限

时间:2016-11-22 21:37:12

标签: php symfony custom-field-type

我在symfony项目中添加了一个自定义FieldTypeExtension。我想扩展SubmitType,SubmitTypeExtension.php看起来像:

class SubmitTypeExtension extends AbstractTypeExtension
{
    /**
     * Returns the name of the type being extended.
     *
     * @return string The name of the type being extended
     */
    public function getExtendedType()
    {
        return SubmitType::class;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefined(array('button_image','button_color'));
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if (isset($options['button_image'])) {
            $parentData = $form->getParent()->getData();

            $buttonImage = null;
            if (null !== $parentData) {
                $accessor = PropertyAccess::createPropertyAccessor();
                $buttonImage = $accessor->getValue($parentData, $options['button_image']);
            }

            $view->vars['button_image'] = $buttonImage;
        }
        if (isset($options['button_color'])) {
            $parentData = $form->getParent()->getData();

            $buttonColor = null;
            if (null !== $parentData) {
                $accessor = PropertyAccess::createPropertyAccessor();
                $buttonColor = $accessor->getValue($parentData, $options['button_color']);
            }

            $view->vars['button_color'] = $buttonColor;
        }
    }
}

我在自定义类型中调用字段类型:

class VereinType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class)
            ->add('save', SubmitType::class, array(
                'label' => 'Speichern',
                'button_image' => 'check',
                'button_color' => 'rgba(13, 135, 13, 1)'
            ))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'TeilnehmerBundle\Entity\Verein',
        ));
    }
}

我需要这个用glyphicon自定义我的submitType。

{% extends 'bootstrap_3_layout.html.twig' %}

{%- block submit_widget -%}
    {% set attr = attr|merge({class: (attr.class|default('btn-default') ~ ' btn btn-lg btn-sm')|trim}) %}
    {%- if label is empty -%}
        {%- if label_format is not empty -%}
            {% set label = label_format|replace({
            '%name%': name,
            '%id%': id,
            }) %}
        {%- else -%}
            {% set label = name|humanize %}
        {%- endif -%}
    {%- endif -%}
    <button type="{{ type|default('submit') }}" {{ block('button_attributes') }}><span class="glyphicon glyphicon-{{ button_image }}" aria-hidden="true" style="color: {{ button_color }};"></span><b>{{ translation_domain is same as(false) ? label : label|trans({}, translation_domain) }}</b></button>
{%- endblock submit_widget -%}

在services.yml中我添加了服务

  app.submit_type_extension:
    class: TeilnehmerBundle\Form\Extension\SubmitTypeExtension
    tags:
      - { name: form.type_extension, extended_type: Symfony\Component\Form\Extension\Core\Type\SubmitType }

但现在我收到以下错误

Neither the property "check" nor one of the methods "getCheck()", "check()", "isCheck()", "hasCheck()", "__get()" exist and have public access in class "TeilnehmerBundle\Entity\Verein". 

问题是,我不能拥有像我添加的那两个属性,因为我只使用它们来自定义我的按钮。 任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

在我的SubmitTypeExtension中修改了以下内容:

class SubmitTypeExtension extends AbstractTypeExtension
{
    /**
     * Returns the name of the type being extended.
     *
     * @return string The name of the type being extended
     */
    public function getExtendedType()
    {
        return SubmitType::class;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefined(array('button_image','button_color'));
    }

    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if(isset($options['button_image']))
            $view->vars['button_image'] = $options['button_image'];
        else
            $view->vars['button_image'] = NULL;

        if(isset($options['button_color']))
            $view->vars['button_color'] = $options['button_color'];
        else
            $view->vars['button_color'] = NULL;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'button_image' => null,
            'button_color' => null,
        ));
    }
}

现在一切正常:)