Woj*_*ski 7 forms entity-attribute-value symfony
我想基于存储在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;
Run Code Online (Sandbox Code Playgroud)
特定对象(公司对象)的参数值即将存储在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;
Run Code Online (Sandbox Code Playgroud)
当然,公司实体包含参数属性,该属性仅存储已为公司指定的参数.
/**
* @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;
Run Code Online (Sandbox Code Playgroud)
如何创建从DB动态获取所有参数的Form,创建具有特定标签的文本字段(label = Parameter-> getName())并获取已与公司关联的参数的ParameterValues(用于编辑操作)?
我已经创建了获取ParameterValues的'collection'字段,但问题是我得到的表单包含已用于公司但没有其他参数的参数字段.当然我无法获得标签,因为集合字段类型是ParameterType而不是Parameter.
小智 14
我最近不得不做类似的事情.我将分享我的经验并尝试纳入您的观点.您可能需要修改一些以满足您的需要.
我的公司实体与您的公司类似.我希望每个公司都存储有动态数量的参数和值,并使用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; }
}
Run Code Online (Sandbox Code Playgroud)
使用类创建一个新变量并将参数发送给它.
$parameters = $em->getRepository("YourBundle:Parameter")->findAll();
$companyparameter = new CompanyParameter($parameters);
Run Code Online (Sandbox Code Playgroud)
您现在拥有一个包含您要管理的所有动态参数的实体.(如果要加载具有已存储值的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);
Run Code Online (Sandbox Code Playgroud)
在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"]));
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们将$ 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++;
}
Run Code Online (Sandbox Code Playgroud)
如果您正在编辑参数
$data = $companyparameter->get();
foreach ($parameters as $k => $value) {
$value->setValue($data[$value->getParameterid()]["value"]);
$em->persist($value);
}
Run Code Online (Sandbox Code Playgroud)
希望这会有所帮助.我第一次发帖,我不习惯"解释"代码,所以请记住.
| 归档时间: |
|
| 查看次数: |
13343 次 |
| 最近记录: |