Search code examples
symfonysonata-admin

Symfony Form Error


I am new in symfony and i have this error :

The form's view data is expected to be an instance of class AppBundle\Entity\Competences, but is an instance of class AppBundle\Entity\CompetenceTranslations. You can avoid this error by setting the "data_class" option to null or by adding a view transformer that transforms an instance of class AppBundle\Entity\CompetenceTranslations to an instance of AppBundle\Entity\Competences.

Here is my code of competency entity and translations entity and form type entity.

Competency Admin

<?php

namespace AppBundle\Admin;

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Sonata\AdminBundle\Form\Type\CollectionType;
use AppBundle\Form\CompetencesType;
use AppBundle\Form\CompetenceTranslationsType;
use AppBundle\Entity\CompetenceTranslations;
use AppBundle\Entity\User;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\HttpFoundation\Response;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Admin\Admin;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use AppBundle\Entity\Competences;
use Exporter\Source\DoctrineORMQuerySourceIterator;

/**
 * Class CompetencyAdmin
 * @package AppBundle\Admin
 */
class CompetencyAdmin extends AbstractAdmin
{

    protected $datagridValues = array(
        '_sort_order' => 'DESC', // sort direction
        '_sort_by' => 'id' // field name
    );

    protected $perPageOptions = array(10, 20, 30, 40, 50);

    protected $maxPerPage = 10;

    public function getTemplate($name)
    {
        switch ($name) {
            case 'edit':
                return 'AppBundle:CompetencyAdmin:edit.html.twig';
                break;

            case 'list':
                return 'AppBundle:CompetencyAdmin:list.html.twig';
                break;

            default:
                return parent::getTemplate($name);
                break;
        }
    }

    public function configureRoutes(RouteCollection $collection)
    {
      $collection->remove('show');
    }


    public function prePersist($object) {
        parent::prePersist($object);

        $container = $this->getConfigurationPool()->getContainer();
        $entityManager = $container->get('doctrine.orm.entity_manager');
        $userId = $this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser()->getId();
        $object->setStatus(1);
        $object->setIsMaster(1);
        $object->setCreatedBy($userId);
        $object->setUpdatedBy($userId);
        $entityManager->persist($object);
        return $object;
    }

     public function getExportFields() {
        parent::getExportFields();
        $fields = $this->getModelManager()->getExportFields($this->getClass());
        $fields1 = $this->getModelManager()->getExportFields(LeadingServiceTranslations::class);
        foreach ($fields1 as $f) 
        {
            if($f == 'name')
            {
                $fields[] = $f;
            }
        }
        foreach ($this->getExtensions() as $extension) 
        {
            if (method_exists($extension, 'configureExportFields'))
            {
                $fields = $extension->configureExportFields($this, $fields);
            }
        }

        unset($fields[1]);
        unset($fields[2]);
        unset($fields[3]);
        unset($fields[4]);
        unset($fields[5]);
        unset($fields[6]);

        return $fields;
    }

    /**
     * @inheritdoc
    */
    protected function configureFormFields(FormMapper $formMapper)
    {
        // add/edit

        $container = $this->getConfigurationPool()->getContainer();
        $entityManager = $container->get('doctrine.orm.entity_manager');
        $subject = $this->getSubject();
//        dump($subject); 
        $translation_data = $subject->getTranslations();
        $lang_added = array();
        foreach($translation_data as $translations){
            $lang_added[] =  $translations->getLanguageCode();
        }
        $languages = $entityManager->getRepository('AppBundle:Language')->findBy(array('status' => 1));
        $userId = $this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser()->getId();
        foreach($languages as $lang){
            if(!in_array($lang->getCode(), $lang_added)){
                $competenceTranslations = new CompetenceTranslations();
                $competenceTranslations->setLanguageCode($lang->getCode());
                $competenceTranslations->setCreatedAt(new \DateTime());
                $competenceTranslations->setUpdatedAt(new \DateTime());
                $competenceTranslations->setCreatedBy($userId);
                $competenceTranslations->setCompetences($subject);
                $competenceTranslations->setUpdatedBy($userId);
                $subject->addTranslations($competenceTranslations);
                $entityManager->persist($competenceTranslations);
            }   
        }
        $formMapper
                ->add('translations', CollectionType::class,['entry_type' => CompetencesType::class,
                    'entry_options' => array('label' => false)]);
    }


    /**
     * @inheritdoc
     */
    protected function configureDatagridFilters(DatagridMapper $dataGridMapper)
    {   
        $dataGridMapper->add('translations.name','',array('label' => 'Name'));
    }

    /**
     * @inheritdoc
     */
    protected function configureListFields(ListMapper $listMapper)
    {
        $listMapper->add('name','')->add('_action', 'actions', [
                'actions' => [
                    'edit' => [], 'delete' => [], 
                ],
            ]);
    }


    public function createQuery($context = 'list')
    {
        $query = parent::createQuery($context);
        $query->andWhere($query->expr()->eq($query->getRootAlias() . '.isMaster', 1));
         return $query;
    }

    /**
     * @inheritdoc
     */
    protected function configureShowFields(ShowMapper $showMapper)
    {
        $showMapper->add('name');

    }



}

Competency

<?php

namespace AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;

use Symfony\Component\Validator\Constraints as Assert;
use Doctrine\Common\Collections\Criteria;
/**
 * Competences
 *
 * @ORM\Table(name="competences")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\CompetencesRepository")
 */
class Competences
{
    private $defaultLang = 'en';

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

    /**
     * @var int|null
     *
     * @ORM\Column(name="status", type="integer", length=11, nullable=true)
     */
    private $status;

    /**
     * @var int|null
     *
     * @ORM\Column(name="is_master", type="integer", length=11, nullable=true)
     */
    private $isMaster;

    /**
     * @var \DateTime|null
     *
     * @ORM\Column(name="created_at", type="datetime", nullable=true)
     */
    private $createdAt;

    /**
     * @var \DateTime|null
     *
     * @ORM\Column(name="updated_at", type="datetime", nullable=true)
     */
    private $updatedAt;

    /**
     * @var int|null
     *
     * @ORM\Column(name="created_by", type="integer", nullable=true)
     */
    private $createdBy;

    /**
     * @var int|null
     *
     * @ORM\Column(name="updated_by", type="integer", nullable=true)
     */
    private $updatedBy;

    /**
     * @var CompetenceTranslations[]
     * @ORM\OneToMany(targetEntity="CompetenceTranslations", mappedBy="competences")
     */
    private $translations;

    /**
     * @var MedicalProviderCompetence[]
     * @ORM\OneToMany(targetEntity="MedicalProviderCompetence", mappedBy="competences")
     */
    private $medicalProviderCompetence;

    public function __construct()
    {
        $this->medicalProviderCompetence = new ArrayCollection();
        $this->translations = new ArrayCollection();
    }

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

    public function getMedicalProviderCompetence()
    {
        return $this->medicalProviderCompetence;
    }

    public function getTranslations()
    {
        return $this->translations;
    }

    /**
     * Add CompetenceTranslations
     *
     * @param CompetenceTranslations $translations
     *
     * @return Competences
     */
    public function addTranslations(CompetenceTranslations $translations)
    {
        $this->translations[] = $translations;

        return $this;
    }

    /**
     * Add CompetenceTranslations
     *
     * @param CompetenceTranslations $translations
     *
     * @return Competences
     */
    public function removeTranslations(CompetenceTranslations $translations)
    {
        $this->translations->removeElement($translations);
        $this->translations = new ArrayCollection(array_values($this->translations->toArray()));
    }

    /**
     * Remove CompetenceTranslations
     *
     * @param CompetenceTranslations $translations
     */
    public function setAllTranslations($translations)
    {
        $this->translations = $translations;
    }

     /**
     * @return string
     */
    public function __toString()
    {
        $default_string = 'null';
        $translationdata  = $this->getTranslations();
        //dump($translationdata); die;
        if($translationdata->count() > 0)
        {
            $criteria = new Criteria();
            $criteria->where($criteria->expr()->contains('languageCode', $this->defaultLang));
            $default_lang_data = $translationdata->matching($criteria);
            if($default_lang_data->count() > 0)
            {
                $default_string = $default_lang_data->first()->getName();

            }
            else
            {
                $default_string = '--NA--';
            }
        }
        else
        {
            $default_string = '--NA--';
        }
        return $default_string?$default_string:'--NA--';
    }

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

    /**
     * Set status.
     *
     * @param int|null $status
     *
     * @return LeadingServices
     */
    public function setStatus($status = null)
    {
        $this->status = $status;

        return $this;
    }

    /**
     * Get status.
     *
     * @return tinyint|null
     */
    public function getStatus()
    {
        return $this->status;
    }


    /**
     * Set IsMaster.
     *
     * @param int|null $is_master
     *
     * @return LeadingServices
     */
    public function setIsMaster($isMaster = null)
    {
        $this->isMaster = $isMaster;

        return $this;
    }

    /**
     * Get IsMaster.
     *
     * @return int|null
     */
    public function getIsMaster()
    {
        return $this->isMaster;
    }


    /**
     * Set createdAt.
     *
     * @param \DateTime|null $createdAt
     *
     * @return Competences
     */
    public function setCreatedAt($createdAt = null)
    {
        $this->createdAt = $createdAt;

        return $this;
    }

    /**
     * Get createdAt.
     *
     * @return \DateTime|null
     */
    public function getCreatedAt()
    {
        return $this->createdAt;
    }

    /**
     * Set updatedAt.
     *
     * @param \DateTime|null $upadtedAt
     *
     * @return Competences
     */
    public function setUpdatedAt($updatedAt = null)
    {
        $this->updatedAt = $updatedAt;

        return $this;
    }

    /**
     * Get updatedAt.
     *
     * @return \DateTime|null
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    /**
     * Set createdBy.
     *
     * @param int|null $createdBy
     *
     * @return Competences
     */
    public function setCreatedBy($createdBy = null)
    {
        $this->createdBy = $createdBy;

        return $this;
    }

    /**
     * Get createdBy.
     *
     * @return int|null
     */
    public function getCreatedBy()
    {
        return $this->createdBy;
    }

    /**
     * Set updatedBy.
     *
     * @param int|null $updatedBy
     *
     * @return Competences
     */
    public function setUpdatedBy($updatedBy = null)
    {
        $this->updatedBy = $updatedBy;

        return $this;
    }

    /**
     * Get updatedBy.
     *
     * @return int|null
     */
    public function getUpdatedBy()
    {
        return $this->modifiedBy;
    }
}

Competency Type

<?php

namespace AppBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Sonata\AdminBundle\Form\Type\CollectionType;
use AppBundle\Form\CompetenceTranslationsType;

/**
 * Class Competences
 * @package AppBundle\Form
 */
class CompetencesType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
                ->add('translations', CollectionType::class,['entry_type' => CompetenceTranslationsType::class,
                        'entry_options' => array('label' => false)])
                ->add('id','hidden');
    }



    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(['data_class' => 'AppBundle\Entity\Competences']);
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'competences';
    }
}

Please help me with this.

Thanks in advance.


Solution

  • I got the solution.

    Actual error is here :

        protected function configureFormFields(FormMapper $formMapper)
        {
            // add/edit
    
            $container = $this->getConfigurationPool()->getContainer();
            $entityManager = $container->get('doctrine.orm.entity_manager');
            $subject = $this->getSubject();
    //        dump($subject); 
            $translation_data = $subject->getTranslations();
            $lang_added = array();
            foreach($translation_data as $translations){
                $lang_added[] =  $translations->getLanguageCode();
            }
            $languages = $entityManager->getRepository('AppBundle:Language')->findBy(array('status' => 1));
            $userId = $this->getConfigurationPool()->getContainer()->get('security.token_storage')->getToken()->getUser()->getId();
            foreach($languages as $lang){
                if(!in_array($lang->getCode(), $lang_added)){
                    $competenceTranslations = new CompetenceTranslations();
                    $competenceTranslations->setLanguageCode($lang->getCode());
                    $competenceTranslations->setCreatedAt(new \DateTime());
                    $competenceTranslations->setUpdatedAt(new \DateTime());
                    $competenceTranslations->setCreatedBy($userId);
                    $competenceTranslations->setCompetences($subject);
                    $competenceTranslations->setUpdatedBy($userId);
                    $subject->addTranslations($competenceTranslations);
                    $entityManager->persist($competenceTranslations);
                }   
            }
            $formMapper
                    ->add('translations', CollectionType::class,['entry_type' => CompetencesType::class,
                        'entry_options' => array('label' => false)]);
        }
    

    In formmapper i have to use CompetenceTranslations instead of CompetencesType as a entry_rype.