0
votes

I just recently updated to 2.8 and now I get the following error when calling the create function of the Form Factory.

Error: Class Symfony\Component\Form\Extension\Core\Type\FormType contains 1 
abstract method and must therefore be declared abstract or implement the 
remaining methods (Symfony\Component\Form\FormTypeInterface::setDefaultOptions)

The call of the FormFactory looks like this:

$this->formFactory->create(
        get_class(new ProductType()),
        $product,
        [
            'method' => 'POST',
            'type' => $type,
            'locales' => $context->shop->getLocales(),
            'product' => $product,
            'numberDataTransformer' => $this->numberTransformerFactory->createFromLocale(
                $context->user->getLocale(),
                $context->shop->getDefaultLocale()
            ),
            'priceType' => $context->shop->getConfiguration()->getProductConfiguration()->getPricesBackend(),
            'isShortDescriptionEnabled' => $context->shop->getConfiguration()->getProductConfiguration()->isShortDescriptionEnabled()
        ]);

I tried several ways to pass the ProductType to the function, but none seems to work. I always get one out of two results: Either the result is that the type cannot be found or the error is returned that the FormType does not implement setDefaultOptions.

What did I miss?

EDIT:

Here are some additional code:

The declaration of the formFactory parameter:

public function __construct(Request $request, FormFactoryInterface $formFactory)
{
    $this->request = $request;
    $this->formFactory = $formFactory;
}

The ProductType class

<?php

namespace CustomNamespace\BackendBundle\Product\Form;

use CustomNamespace\BackendBundle\Common\NumberDataTransformer;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use CustomNamespace\BackendBundle\Product\Form\ImageType;
use ShopwareEasy\BackendBundle\Product\Form\AttachmentType;
use Symfony\Component\Validator\Exception\InvalidOptionsException;

/**
 * Form element type for products.
 */
class ProductType extends AbstractType
{
    /**
     * @var string
     */
    private $method;

    /**
     * @var string
     */
    private $type;

    /**
     * @var array
     */
    private $locales;

    /**
     * @var Product
     */
    private $product;

    /**
     * @var \CustomNamespace\BackendBundle\Common\NumberDataTransformer
     */
    private $numberDataTransformer;

    /**
     * @var string
     */
    private $priceType;

    /**
     * @var bool
     */
    private $isShortDescriptionEnabled;

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     * @return void
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder->setMethod($this->method);
        $regionType = new RegionShippingTimeType();

        if ($this->type == 'download') {
            $regionType->enableForDownloadableProduct();
        }

        $builder->add('regions', 'collection', array(
            'type'   => $regionType,
            'label' => false,
            'options'  => array(
                'required'  => false,
                'attr'      => array('class' => 'email-box')
            ),
        ));

        $builder->add('vendor', 'text', ['label' => 'form_product_vendor']);
        if ($this->type == 'normal') {
            $builder->add(
                'mainVariant',
                new MainVariantNormalType(
                    $this->method,
                    $this->locales,
                    $this->product,
                    $this->numberDataTransformer,
                    $this->priceType,
                    $this->isShortDescriptionEnabled
                ),
                ['error_bubbling' => false, 'label' => false]
            );
        } elseif ($this->type == 'download') {
            $builder->add(
                'mainVariant',
                new MainVariantDownloadType(
                    $this->method,
                    $this->locales,
                    $this->product,
                    $this->numberDataTransformer,
                    $this->priceType,
                    $this->isShortDescriptionEnabled
                ),
                ['error_bubbling' => false, 'label' => false]
            );
        } elseif ($this->type == 'variant') {
            $builder->add(
                'mainVariant',
                new MainVariantVariantType(
                    $this->method,
                    $this->locales,
                    $this->product,
                    $this->numberDataTransformer,
                    $this->priceType,
                    $this->isShortDescriptionEnabled
                ),
                ['error_bubbling' => false, 'label' => false]
            );
        }

        if ($this->method == 'PUT') {
            $builder->add(
                'images',
                new ImageType(),
                ['error_bubbling' => true, 'label' => false]
            );

            $builder->add(
                'attachments',
                new AttachmentType(),
                ['error_bubbling' => true, 'label' => false]
            );
        }
    }

    /**
     * @param \Symfony\Component\OptionsResolver\OptionsResolverInterface $resolver
     */
    public function configureOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(
            array(
                'data_class' => 'CustomNamespace\\BackendBundle\\Product\\Product',
                'csrf_protection' => false,
                'error_bubbling' => false,
                'cascade_validation' => true,
                'method' => 'POST',
                'type' => 'normal'
            )
        );

        parent::configureOptions($resolver);
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver) {
        /** @var OptionResolver $resolver */
        $this->configureOptions($resolver);
    }

    public function getName() {
        return get_class($this);
    }
}
1
Provide us with more code.Michael Sivolobov
@MichaelSivolobov What else do you need? Thats the single important spot. I guess its not necessary to post the symfony 2.8 code in here ;)SvenFinke
Post here your ProductType code. What is in your $this->formFactory? Where did you load it?Michael Sivolobov
@MichaelSivolobov I added the ProductType class. The Factory is an implementation of the FormFactoryInterface, dumping the FQCN shows me that it is symfonies standard FormFactorySvenFinke
Why do you not want to use normal names? Why do you want this Symfony3-like style? Make typical name product and use it.Michael Sivolobov

1 Answers

0
votes

The problem was produced by files that were not updated at all.. The implementation of setDefaultOptions should still exist in the Symfony 2.8 classes - but they didn't. After destroying my vagrant and recreating it again, everything worked just fine.

But thanks everyone for the help!