Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php symfony 2动态下拉菜单_Php_Symfony_Drop Down Menu - Fatal编程技术网

Php symfony 2动态下拉菜单

Php symfony 2动态下拉菜单,php,symfony,drop-down-menu,Php,Symfony,Drop Down Menu,如何使用symfony 2创建动态下拉列表 我有这样的东西 $builder->add('gender', 'choice', array( 'choices' => array(1 => 'campus1', 2 => 'campus2'), 'required' => false, )); 我不想硬编码任何东西,我不希望它是在树枝或前端侧,我想有一些在控制器。 下面是需要加载到下拉列表中的实体 <?php name

如何使用symfony 2创建动态下拉列表 我有这样的东西

$builder->add('gender', 'choice', array(
         'choices'  => array(1 => 'campus1', 2 => 'campus2'),
         'required' => false,
));
我不想硬编码任何东西,我不希望它是在树枝或前端侧,我想有一些在控制器。 下面是需要加载到下拉列表中的实体

<?php

namespace Test\Bundle\TestBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Campus
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="..\Entity\CampusRepository")
 */
class Campus
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @ORM\ManyToOne(targetEntity="University", inversedBy="campus")
 * @ORM\JoinColumn(name="university_id", referencedColumnName="id")
 */
private $university;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255)
 * @Assert\NotBlank
 * @Assert\Length(
 *                  min=3,
 *                  max=35,
 *                  minMessage= "Name Field should contains at least 3 characters",
 *                  maxMessage = "Name Field Cannot contain more than 35 characters"
 *               )
 * @Assert\Regex(pattern="/[^a-z\s-]/i", match=false , message="Name can only contain letters")
 */
private $name;

/**
 * @var string
 * @ORM\Column(name="address", type="string", length=255)
 * @Assert\NotBlank()
 * @Assert\Length(
 *                 min = 10,
 *                 max = 80,
 *                 minMessage = "Address must be more specific",
 *                 maxMessage = "80 characters limit exceeded"
 *              )
 */
private $address;


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

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

    return $this;
}

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

/**
 * Set address
 *
 * @param string $address
 * @return Campus
 */
public function setAddress($address)
{
    $this->address = $address;

    return $this;
}

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

/**
 * Set university
 *
 * @param \Test\Bundle\TestBundle\Entity\University $university
 * @return Campus
 */
public function setUniversity(\Test\Bundle\TestBundle\Entity\University $university = null)
{
    $this->university = $university;

    return $this;
}

/**
 * Get university
 *
 * @return \Test\Bundle\TestBundle\Entity\University 
 */
public function getUniversity()
{
    return $this->university;
}
id;
}
/**
*设置名称
*
*@param string$name
*@返回校园
*/
公共函数setName($name)
{
$this->name=$name;
退还$this;
}
/**
*得名
*
*@返回字符串
*/
公共函数getName()
{
返回$this->name;
}
/**
*设定地址
*
*@param string$地址
*@返回校园
*/
公共函数setAddress($address)
{
$this->address=$address;
退还$this;
}
/**
*获取地址
*
*@返回字符串
*/
公共函数getAddress()
{
返回$this->address;
}
/**
*赛特大学
*
*@param\Test\Bundle\TestBundle\Entity\University$University
*@返回校园
*/
公共函数setUniversity(\Test\Bundle\TestBundle\Entity\University$University=null)
{
$this->university=$university;
退还$this;
}
/**
*上大学
*
*@return\Test\Bundle\TestBundle\Entity\University
*/
大学的公共职能()
{
返回$this->university;
}
}

选择下拉列表并提交表单时,我将使用实体中的其他字段,因此在提交表单时需要整个对象


那么,如何使用symfony2功能从数据库中填充数据呢?

那么,构建一个数组并传递它就很简单了

$camps=$em->getRepository('TestTestBundle:Campus')->findAll();
$choices=array();
foreach ($camps as $campus) {
    $choices[$campus->getId()] = $campus->getName();
}
$builder->add('gender', 'choice', array(
         'choices'  => $choices,
         'required' => false,
));
然后,您可以通过id查找实体,使用表单字段类型,这是一种特殊类型的选择字段,用于从条令实体加载选项。e、 g:

$builder->add('campus', 'entity', array(
    'class' => 'TestBundleTestBundle:Campus',
    'property' => 'name',
    'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('c')
            ->orderBy('c.name', 'ASC');
    },
));

提交表单时,“校园”字段的表单数据将是校园类的实例。如果您的表单数据是一个实体而不是一个数组,那么该实体将需要有一个对应的“校园”字段,该字段表示与校园实体的关系。

您可能还想签出此字段。是的,我通读了此字段,请您用外行术语向我解释它的含义,php和symfony的第一周对我来说真是一个好机会doozy@noobDeDaa我刚刚添加了一个答案,解释了如何使用实体字段类型。@redbirdo啊,谢谢,我会仔细检查它。如果它有效,我还会检查另一种方法,就像使用实体字段类型一样,并决定哪一个更好。本质上,对于相同的过程,实体字段类型应该是一个好的、性能好的包装器,所以最好使用实体表单字段类型