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.
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.