Мне недавно пришлось сделать что-то подобное. Я поделюсь своим опытом и попробую изложить вашу точку зрения. Возможно, вам придется изменить это в соответствии с вашими потребностями.
Моя компания была похожа на вашу. Я хотел, чтобы каждая компания хранила динамическое количество параметров и значений, связанных с ними, и могла редактировать их в формах, используя каркас форм 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);
Внутри компанииParameterFormType:
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 (), у нас теперь была бы форма с двумя полями «Название компании» и «Генеральный директор».
Заполните форму и отправьте отправку формы обратно на то же действие.
В действии проверьте 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);
}
Надеюсь, это поможет некоторым. Моя первая публикация, и я еще не привык «объяснять» код, так что имейте в виду, пожалуйста.