表单 – Symfony2 – 如何根据db的动态参数创建表单? (EAV)

前端之家收集整理的这篇文章主要介绍了表单 – Symfony2 – 如何根据db的动态参数创建表单? (EAV)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想基于存储在DB中的动态参数创建表单.
所以我创建了一个名为Parameter的实体来定义参数名称,该实体应该显示为表单字段标签.
/**
 * @ORM\Entity
 */
class Parameter
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(type="string",length="255")
     * @Assert\NotBlank()
     */
    protected $name; 
    /**
     * @ORM\OneToMany(targetEntity="ParameterValue",mappedBy="parameter")
     */
    protected $values;

特定对象(公司对象)的参数值即将存储在ParameterValue表格中.

/**
 * @ORM\Entity
 */
class ParameterValue
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\ManyToOne(targetEntity="Parameter",inversedBy="values")
     * @ORM\JoinColumn(name="parameter_id",referencedColumnName="id",nullable=false)
     */
    protected $parameter;
    /**
     * @ORM\ManyToOne(targetEntity="Company",inversedBy="parameters")
     * @ORM\JoinColumn(name="company_id",nullable=false)
     */
    protected $company;

当然,公司实体包含参数属性,该属性仅存储已为公司指定的参数.

/**
 * @ORM\Entity
 */
class Company
{    
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @ORM\Column(type="string",length="255")
     */
    protected $name;
    /**
     * @ORM\OneToMany(targetEntity="ParameterValue",mappedBy="hotel")
     */
    protected $parameters;

如何创建从DB动态获取所有参数的表单,创建具有特定标签的文本字段(label = Parameter-> getName())并获取已与公司关联的参数的ParameterValues(用于编辑操作)?

我已经创建了获取ParameterValues的’collection’字段,但问题是我得到的表单包含已用于公司但没有其他参数的参数字段.当然我无法获得标签,因为集合字段类型是ParameterType而不是Parameter.

解决方法

我最近不得不做类似的事情.我将分享我的经验并尝试纳入您的观点.您可能需要修改一些以满足您的需要.

我的公司实体与您的公司实体相似.我希望每个公司都存储有动态数量的参数和与之关联的值,并且能够使用symfony2表单框架在表单中编辑这些参数和值.

我首先创建了一个名为CompanyParameter的实体.添加命名空间并保存在捆绑包中的某个位置.

class CompanyParameter {    
        protected $data;    
        public function __construct($parameters,$edit=false)
        {
               if ($edit==false) {
                foreach ($parameters as $k => $value) {
                        $name = $value->getId();
                        $this->data[$name] = array("label"=>$value->getName(),"value"=>"");
                        $this->{$name} = "";                    
                }
                } else {
                foreach ($parameters as $k => $value) {
                        $name = $value->getParameterid();
                        $pvalue = $value->getValue();
                        $this->data[$name] = array("label"=>$value->getName(),"value"=>$pvalue);
                        $this->{$name} = $pvalue;                    
                }
}
        }    
        public function get() { return $this->data; }    
    }

使用类创建一个新变量并将参数发送给它.

$parameters = $em->getRepository("YourBundle:Parameter")->findAll();
$companyparameter = new CompanyParameter($parameters);

您现在拥有一个包含您要管理的所有动态参数的实体. (如果要加载带有已存储值的CompanyParameter以进行编辑,只需向CompanyParameter发送一个ParameterValue实体数组,并在构造函数中设置$edit = true.

创建一个CompanyParameterFormType,如http://symfony.com/doc/current/book/forms.html#creating-form-classes所述
确保data_class指向CompanyParameter

在控制器中创建一个新表单:

$form = $this->createForm(new CompanyParameterTypeBundle(),$companyparameter);

在CompanyParameterFormType中:

public function buildForm(FormBuilder $builder,array $options)
    {
        $data = $options["data"]->get();      
        foreach ($data as $k => $value) {
             $builder->add($k,"text",array("label"=>$value["label"]));
        }           
    }

如果我们将$form-> createView(),我们现在将拥有一个包含“公司名称”和“CEO”两个字段的表单.

填写表格并将表格的提交发回给同一行动.

在post和$form-> bindRequest($this-> getRequest())的操作检查中.

CompanyParameter现在包含属于当前公司的参数的所有值.要保留此数据:

$data = $companyparameter->get();
$counter = 0;
foreach($data as $k => $value) {
$parameter = new ParameterValue();
$parameter->setCompany($company);
$parameter->setParameter($parameters[$counter]);
$parameter->setValue($value["value"]);
$em->persist($parameter);
$counter++;
}

如果您正在编辑参数

$data = $companyparameter->get();
foreach ($parameters as $k => $value) {
$value->setValue($data[$value->getParameterid()]["value"]);
$em->persist($value);
}

希望这会有所帮助.我第一次发帖,我不习惯“解释”代码,所以请记住.

猜你在找的HTML相关文章