How to list objects with a simple array type field on a Symfony project with the Sonata Admin Bundle

StackOverflow https://stackoverflow.com/questions/23520849

  •  17-07-2023
  •  | 
  •  

Question

I've a class that represent a product with a property mapped as simple array that represents a sizes collection

<?php

namespace Middleware\MainBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Product
 *
 * @ORM\Table(name="product", uniqueConstraints={...})
 * @ORM\Entity(repositoryClass="...")
 */
class Product {

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

    // more properties
    // ...   


    /**
     * @ORM\Column(type="simple_array", nullable=true)
     */
    private $sizes;



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




    /**
     * Set sizes
     *
     * @param array $sizes
     * @return Product
     */
    public function setSizes($sizes)
    {
        $this->sizes = $sizes;

        return $this;
    }

    /**
     * Get sizes
     *
     * @return array 
     */
    public function getSizes()
    {
        return $this->sizes;
    }

}

My ProducAdmin class is like follows

    <?php

namespace Middleware\MainBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;

class ProductAdmin extends Admin
{
    /**
     * @param DatagridMapper $datagridMapper
     */
    protected function configureDatagridFilters(DatagridMapper $datagridMapper)
    {
        $datagridMapper
            ->add('id')
            ->add('sizes') // I get a error ContextErrorException: Notice: Array to string conversion
        ;
    }

    /**
     * @param ListMapper $listMapper
     */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->add('id')            
            ->add('sizes') // I get a error ContextErrorException: Notice: Array to string conversion
            ->add('_action', 'actions', array(
                'actions' => array(
                    'show' => array(),
                    'edit' => array(),
                    'delete' => array(),
                )
            ))
        ;
    }

    /**
     * @param FormMapper $formMapper
     */
    protected function configureFormFields(FormMapper $formMapper)
    {
        $sizes = array();
        for ($index = 35; $index <= 48; $index++) {
            $sizes[$index] = $index . ""; 
        }

        $formMapper            
            ->add('sizes', 'choice', array('required' => false, 'expanded' => true, 'multiple' => true, 'choices' => $sizes)) // works fine
        ;
    }

    /**
     * @param ShowMapper $showMapper
     */
    protected function configureShowFields(ShowMapper $showMapper)
    {
        $showMapper
            ->add('id')            
            ->add('sizes') // I get a error ContextErrorException: Notice: Array to string conversion
        ;
    }
}

How could I manage a field like sizes with Sonata Admin Bundle? Thanks very much

Était-ce utile?

La solution

Although the result is not beautiful. I've solved the problem just adding 'array' type to 'sizes' field on configureShowFields and configureListFields methods. The result shows sizes field like [0 => 38] [1 => 40] [2 => 42] [3 => 43] [4 => 45] [5 => 46] and I would like it as similar to 38, 40, 42, 43, 45, 46

The change I've made:

    /**
     * @param ListMapper $listMapper
     */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper
            ->add('id')                
            ->add('sizes', 'array') // I've just added array type
            ->add('_action', 'actions', array(
                'actions' => array(
                    'show' => array(),
                    'edit' => array(),
                    'delete' => array(),
                )
            ))
        ;
    }
    /**
     * @param ShowMapper $showMapper
     */
    protected function configureShowFields(ShowMapper $showMapper)
    {
        $showMapper
            ->add('id')                
            ->add('sizes', 'array') // I've just added array type
        ;
    }

I would appreciate a better way. Thanks

Types availables on Sonata Admin Bundle Forms

Autres conseils

You have to specifie that sizes is a collection , add 'sizes', 'collection'. This is working line SF2 form. Types can be found here, you'll found collections' attributes too: http://symfony.com/fr/doc/current/reference/forms/types.html

The 'collection' tricks is working well for simple entity.

Exemple for my Tag entity :

protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper->addIdentifier('name')
            ...
            ->add('tags', ' collection')
            ...
}

Then you need a toString method in your entity.

function __toString() {
    return $this->getName();
}

Easy billy :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top