0

I want to create table Pracownik which can contain zero or few instances of Zaklady and control it using Sonata Admin. Both of tables are translated using a2lix_translatable.

So I have classes:

<?php

namespace JCuryllo\InstituteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;

/**
 * Pracownik
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Pracownik
{

use ORMBehaviors\Translatable\Translatable;

public function __call($method, $arguments)
{
    return $this->proxyCurrentLocaleTranslation($method, $arguments);
}

/**
 * @ORM\ManyToOne(targetEntity="ZakladyTranslation")
 **/
private $zaklady;


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



/**
 *  and other properties
*/


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

   /* and other getters and setter */

}

And Translation:

<?php

namespace JCuryllo\InstituteBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Knp\DoctrineBehaviors\Model as ORMBehaviors;

/**
 * @ORM\Entity
 */
class PracownikTranslation
{
use ORMBehaviors\Translatable\Translation;

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


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

/* and other properties */

 /**
 * Set name
 *
 * @param string $name
 * @return Pracownik
 */
public function setName($name)
{
    $this->name = $name;

    return $this;
}

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

/* and other getters and setter *.

}

I've used very similar code in Zaklady and ZakladyTranslation. Then in PracownikAdmin I try to do sth like:

protected function configureFormFields(FormMapper $formMapper)
{

    $formMapper
        ->add('zaklady', 'many_to_one',array(
         'required' => false,
         ))
        ->add('translations', 'a2lix_translations')

    ;
}

but it doesn't work (error: Could not load type "many_to_one").

2 Answers2

0

many_to_one is not an available form type for Sonata, you have to use sonata_type_model or sonata_type_model_list for a many to one relation.

Example:

protected function configureFormFields(FormMapper $formMapper)
{

    $formMapper
        ->add('zaklady', 'sonata_type_model_list',array(
            'required' => false,
        ))
        ->add('translations', 'a2lix_translations');
}

Documentation : http://sonata-project.org/bundles/doctrine-orm-admin/master/doc/reference/form_field_definition.html#advanced-usage-many-to-one

HypeR
  • 2,186
  • 16
  • 22
0

Ok, I have done it.

In Zaklady I added:

public function __toString()
{
    return $this->getTitle();  // getTitle is in ZakladyTranslation!
}

In Pracownik I changed:

/**
 * @ORM\ManyToOne(targetEntity="ZakladyTranslation")
 **/
private $zaklady;

to:

/**
 * @ORM\ManyToOne(targetEntity="Zaklady")
 **/
private $zaklady;

and PracownikAdmin:

  protected function configureFormFields(FormMapper $formMapper)
{

    $formMapper

        ->add('translations', 'a2lix_translations')
        ->add('zaklady', 'sonata_type_model', array(
            'multiple' => true,
            'by_reference' => false,
            'required' => false

        ))


    ;
}