Symfony2 - 如何基于来自db的动态参数创建表单? (EAV) [英] Symfony2 - how to create form based on dynamic parameters from db? (EAV)

查看:178
本文介绍了Symfony2 - 如何基于来自db的动态参数创建表单? (EAV)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想根据存储在数据库中的动态参数创建表单。
因此,我创建了一个名为Parameter的实体,它定义了参数名称,该实体应显示为表单字段标签。

  / ** 
* @ ORM \实体
* /
class参数
{
/ **
* @ ORM \Id
* @ ORM \Column(type =integer)
* @ ORM\GeneratedValue(strategy =AUTO)
* /
保护$ id;
/ **
* @ ORM\Column(type =string,length =255)
* @ Assert\NotBlank()
* /
保护$名称;
/ **
* @ ORM\OneToMany(targetEntity =ParameterValue,mappedBy =parameter)
* /
保护$值;

特定对象(公司对象)的参数值将被存储在ParameterValue tabel中。

  / ** 
* @ ORM \实体
* /
类ParameterValue
{
/ **
* @ ORM\Id
* @ ORM\Column(type =integer)
* @ ORM\GeneratedValue(strategy =AUTO )
* /
保护$ id;
/ **
* @ ORM\ManyToOne(targetEntity =Parameter,inversedBy =values)
* @ ORM\JoinColumn(name =parameter_id,referencedColumnName = id,nullable = false)
* /
保护$参数;
/ **
* @ ORM\ManyToOne(targetEntity =Company,inversedBy =parameters)
* @ ORM\JoinColumn(name =company_id,referencedColumnName = id,nullable = false)
* /
保护$ company;

当然,公司实体包含的参数属性仅存储已为公司指定的参数。 / p>

  / ** 
* @ ORM \实体
* /
类公司
$ b $ **
* @ ORM\Id
* @ ORM\Column(type =integer)
* @ ORM\GeneratedValue(strategy = AUTO)
* /
保护$ id;
/ **
* @ ORM\Column(type =string,length =255)
* /
保护$ name;
/ **
* @ ORM\OneToMany(targetEntity =ParameterValue,mappedBy =hotel)
* /
保护$参数;

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

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

解决方案

我最近不得不做类似的事情。我将分享我的经验,并尝试纳入您的观点。您可能需要修改这些以适应您的需要。



我的公司实体与您的公司实体类似。我希望每个存储的公司都有一个动态数量的参数和与它们相关的值,并且可以使用symfony2表单框架编辑这些表单。



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

  class CompanyParameter {
protected $ data;
public function __construct($ parameters,$ edit = false)
{
if($ edit == false){
foreach($参数为$ k => $ value ){
$ name = $ value-> getId();
$ this-> data [$ name] = array(label=> $ value-> getName(),value=>);
$ this-> {$ name} =;
$ b} 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; }
}

用这个类创建一个新变量并发送参数给它。 / p>

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






$ b如果我们将$ form-> createView()填写表格并将表格的提交发送回相同的操作。



填写表格并将表格的提交发送回相同的操作。

p>

在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 ++;

$ / code>

如果您正在编辑参数

  $ data = $ companyparameter-> get(); 
foreach($参数为$ k => $ value){
$ value-> setValue($ data [$ value-> getParameterid()] [value]);
$ em-> persist($ value);
}

希望这对一些人有所帮助。我第一次发帖,我不习惯于解释代码,所以请记住。


I would like to create form based on dynamic parameters that are stored in DB. So I've created an entity called Parameter that defines parameter name, which should be displayed as form field label.

/**
 * @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;

Parameter values for specific object (Company object) are about to be stored in ParameterValue tabel.

/**
 * @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", referencedColumnName="id", nullable=false)
     */
    protected $company;

And of course Company entity contains parameters attribute that stores only those parameters that has been specified for 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;

How can I create Form that dynamically fetches all Parameters from DB, creates text fields with specific labels (label=Parameter->getName()) and gets ParameterValues for parameters that has already been associated with Company (for edit action)?

I have already created 'collection' field that gets ParameterValues but the problem is that I get form with fields for parameters that has been used for Company but no others. And of course I cannot get label because collection field type is ParameterType not Parameter.

解决方案

I recently had to do something similar. I will share my experience and try an incorporate your point of view. You may have to modify this some to fit your need.

I had my Company entity similar to yours. I wanted each Company stored to have a dynamic amount of parameters and values associated with them and able to edit these in forms using the symfony2 form framework.

I first created an entity called CompanyParameter. Add namespace and save somewhere in your bundle.

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

Create a new variable with the class and send your parameters to it.

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

You now have an entity with all the dynamic parameters you want to manage. (If you want to load the CompanyParameter with already stored values for edit purpose, just send CompanyParameter an array of ParameterValue entities instead and set $edit=true in constructor.

Create a CompanyParameterFormType like described at http://symfony.com/doc/current/book/forms.html#creating-form-classes Make sure data_class points to CompanyParameter

Create a new form in your controller:

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

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

If we would $form->createView() we would now have a form with the two fields "Company name" and "CEO".

Fill in the form and send the submit of the form back to the same action.

In the action check for post and $form->bindRequest($this->getRequest()).

CompanyParameter now contains all the values for the parameters belonging to current company. To persist this data:

$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++;
}

If You are instead editing the parameters

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

Hope this helps some. My first time posting and I'm not that used to "explaining" code yet so keep in mind please.

这篇关于Symfony2 - 如何基于来自db的动态参数创建表单? (EAV)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆