forms - Symfony2 - 如何根据来自数据库的动态参数创建表单? (EAV)

标签 forms symfony entity-attribute-value

我想根据存储在数据库中的动态参数创建表单。
所以我创建了一个名为 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", referencedColumnName="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;

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

我已经创建了获取 ParameterValues 的“集合”字段,但问题是我得到的表单包含已用于公司但没有其他参数的字段。当然我无法获得标签,因为集合字段类型是 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

在您的 Controller 中创建一个新表单:
$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);
}

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

关于forms - Symfony2 - 如何根据来自数据库的动态参数创建表单? (EAV),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7316461/

相关文章:

嵌入在 <table> 标签中的 HTML 表单未正确呈现?

jQuery .css 不适用于 chrome 但适用于 FF、Safari、IE9

mysql - 交响乐 3.4 : how to log the history of user actions?

mysql - EAV 与直接表操作的注意事项?

mysql - Magento:MySql 显示缺少索引的慢查询

javascript - 使用单选按钮更改 Div 的背景图像

javascript - 自动滚动到焦点输入 View

php - 批量请求错误 : [arg] cannot be changed from type [long] to [float]

symfony - 在我的 Behat 场景中传递强制参数

database - 选择一种方法来存储用户配置文件?