代码之家  ›  专栏  ›  技术社区  ›  Parth Khatri

Symfony表单错误

  •  0
  • Parth Khatri  · 技术社区  · 8 年前

    表单的视图数据应为类AppBundle\实体\能力的实例,但应为类AppBundle\实体\能力翻译的实例。您可以通过将“data\u class”选项设置为null或添加视图转换器来避免此错误,该视图转换器将类AppBundle\Entity\Competencies Translations的实例转换为AppBundle\Entity\Competencies的实例。

    <?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');
    
        }
    
    
    
    }
    

    能力

    <?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;
        }
    }
    

    能力类型

    <?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';
        }
    }
    

    提前谢谢。

    1 回复  |  直到 8 年前
        1
  •  1
  •   t-n-y    8 年前

    我找到了解决办法。

    实际误差如下:

        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)]);
        }
    

    在formmapper中,我必须使用 能力翻译 而不是 能力类型 作为条目。