search

Home  >  Q&A  >  body text

php - symfony2 表单和entity疑问

例如:我想添加一篇博客,里面有一个分类,我应该有一个category_id字段,然后在添加博客的时候可以通过下拉列表选择。

疑问:
我的下拉列表中怎么才能有我添加好的分类列表呢!
posts和category的关系

#Demo\TestBundle\Entity\Posts
Demo\TestBundle\Entity\Posts:
type: entity
table: posts
repositoryClass: Demo\TestBundle\Repository\PostsRepository
id:
    id:
        type: integer
        id: true
        genertor: { strategy: AUTO }
fields:
    title: 
        type: string
        length: 64
    author:
        type: string
        length: 32
    create_at:
        type: integer
    update_at:
        type: integer
manyToOne:
    category:
        targetEntity: Category
        inversedBy: posts


Demo\TestBundle\Entity\Category:
type: entity
table: category
repositoryClass: Demo\TestBundle\Repository\CategoryRepository
id:
    id:
        type: integer
        id: true
        genertor: 
            strategy: AUTO
fields:
    title: 
        type: string
        length: 16
    create_at:
        type: integer
    update_at:
        type: integer
oneToMany:
    posts:
        targetEntity: Posts
        mappedBy: category

form表单时通过命令生成的:php app/console doctrine:generate:form DemoTestBundle:Posts

<?php

namespace Demo\TestBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class PostsType extends AbstractType
{
    /**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('id')
        ->add('title')
        ->add('author')
        ->add('create_at')
        ->add('update_at')
        ->add('category')
    ;
}

/**
 * @param OptionsResolverInterface $resolver
 */
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Demo\TestBundle\Entity\Posts'
    ));
}

/**
 * 表单标示符, name属性
 * @return string
 */
public function getName()
{
    return 'posts';
}

}

大概就是这样子,不知道哪里要调还是代码错误了,希望跟路大侠指教。

PHP中文网PHP中文网2902 days ago422

reply all(4)I'll reply

  • 迷茫

    迷茫2017-04-10 14:52:39

    如果要用到 doctrine relationship 就用 ->add('product', 'entity' , array(...))
    如果不要 doctrine relationship 就在

    class PostsType extends AbstractType {
        private $choices;
    
        public function __construct( $choices)
        {
            $this->choices = $choices;
        }
    
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            ....
            $builder->add('category' , 'choices' , array(
            'choices' => $this->choices , 
            ) );
        }
    }
    
    在你要实例化表单的时候
    public function xxxAction(){
        $this->createForm( new PostsType( $this->getChoices() ) );
    }
    
    同样在Action中加入
    private function getChoices()
    {
        //从Entitiy获取choices选项或者自己定义
        return array(1 => '...' , 2 =>'....' );
    }
    

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 14:52:39

    把这个
    ->add('category')
    改成
    ->add('category', 'choice')
    试一下看看

    reply
    0
  • PHPz

    PHPz2017-04-10 14:52:39

    ->add('category', null, array('property' => 'title'));
    ->add('product', 'entity', array( 'class' => 'Demo\TestBundle\Entity\Category', 'property' => 'title' ))

    reply
    0
  • 迷茫

    迷茫2017-04-10 14:52:39

    看出错提示是说Category实体内没有实现__toString()这个方法。所以解决之道就是到Category实体里面去实现这个方法。你可以在__toString()这个方法里面返回要显示在下拉列表中的东西。比如用titile:

    // file: Demo/TestBundle/Entity/Category.php
    public funciton __toString() {
        return $this->getTitle();
    }
    

    reply
    0
  • Cancelreply