2

I have 2 "simple" entities, and i want to do the classical form embedding
but i have this error : "Neither the property "itemcode" nor one of the methods "getItemcode()", "itemcode()", "isItemcode()", "hasItemcode()", "__get()" exist and have public access in class "NWA\ItemSelectorBundle\Entity\ItemSelector"."

I've seen many posts with this error, but none provided the solution

In the entities i have getItemCode() but why would it be public ? What is wrong with my construction?

Thank you in advance

Here are my entities (parts relevant to the properties at fault)

class ItemSelector
{
    /**
     * @var Items[]
     *
     * @ORM\OneToMany(targetEntity="NWA\ItemSelectorBundle\Entity\Item", mappedBy="itemselector", cascade={"all"})
     */
    protected $items;

    /**
     * Class constructor
     */
    public function __construct()
    {
        $this->items = new ArrayCollection();
    }

    /**
     * Add item
     *
     * @param \NWA\ItemSelectorBundle\Entity\Item $item
     *
     * @return ItemSelector
     */
    public function addItem(\NWA\ItemSelectorBundle\Entity\Item $item)
    {
        $this->items[] = $item;
        //$item->setItemselector($this);
        return $this;
    }

    /**
     * Remove item
     *
     * @param \NWA\ItemSelectorBundle\Entity\Item $item
     */
    public function removeItem(\NWA\ItemSelectorBundle\Entity\Item $item)
    {
        $this->items->removeElement($item);
    }

    /**
     * Get items
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getItems()
    {
        return $this->items;
    }
}

and

class Item
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="itemcode", type="string", length=255)
     */
    protected $itemcode;


    /**
     * @var ItemSelector
     *
     * @ORM\ManyToOne(targetEntity="NWA\ItemSelectorBundle\Entity\ItemSelector", inversedBy="items")
     * @ORM\JoinColumn(name="itemselector_id", referencedColumnName="id")
     */
    protected $itemselector;

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set itemcode
     *
     * @param string $itemcode
     *
     * @return Item
     */
    public function setItemcode($itemcode)
    {
        $this->itemcode = $itemcode;

        return $this;
    }

    /**
     * Get itemcode
     *
     * @return string
     */
    public function getItemcode()
    {
        return $this->itemcode;
    }

    /**
     * Set itemselector
     *
     * @param \NWA\ItemSelectorBundle\Entity\ItemSelector $itemselector
     *
     * @return Item
     */
    public function setItemselector(\NWA\ItemSelectorBundle\Entity\ItemSelector $itemselector = null)
    {
        $this->itemselector = $itemselector;

        return $this;
    }

    /**
     * Get itemselector
     *
     * @return \NWA\ItemSelectorBundle\Entity\ItemSelector
     */
    public function getItemselector()
    {
        return $this->itemselector;
    }
}

Then the Form constructors

class ItemSelectorType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder

            ->add(
                'itemcode', 'collection', array(
                    'type'          => new ItemType(),
                    'prototype'     => true,
                    'allow_add'     => true,
                    'allow_delete'  => true
                )
            );
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'NWA\ItemSelectorBundle\Entity\ItemSelector',
            'translation_domain' => 'resource'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'nwa_itemselector';
    }
}

and

class ItemType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'itemcode', 'text', array(
                    'label' => 'Code'
                )
            );
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'NWA\ItemSelectorBundle\Entity\Item'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'nwa_itemselectorbundle_item';
    }
}

And finally the call in the Controller

public function chooseAction(Request $request, ItemSelector $itemSelector)
{
    $form = $this->get('form.factory')
        ->create(new ItemSelectorType(), $itemSelector);

    $form->handleRequest($request);
    if ($form->isValid()) {

    }

    return array(
        '_resource' => $itemSelector,
        'form'      => $form->createView(),
    );
}

1 Answer 1

2

Maybe you need to rename your field name itemcode to items in ItemSelectorType.

        ->add(
            'items', 'collection', array(
                'type'          => new ItemType(),
                'prototype'     => true,
                'allow_add'     => true,
                'allow_delete'  => true
            )
        );
Sign up to request clarification or add additional context in comments.

1 Comment

I'm so ashamed of myself right now. Such a stupid mistake. thanks

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.