我有这个配置:
ModuleModelType
| - title
| - created
| - subform
| - DevField1
| - DevField2
| - etc...
我想要的是这样的:
ModuleModelType
| - title
| - created
| - subform
| | - DevField1
| | - DevField2
| | - etc...
但是问题是我不知道要向表单中添加哪些用户,因为我正在创建可重用的包,并且我不希望名称冲突。
这是我的代码,如何使它容易实现?我希望开发人员可以创建一个类并将其自己的表单添加到现有表单中。以下现有代码将开发人员的表单添加到第一个表单中,并且如果密钥相同,则可以替换一些现有密钥。实际上,我想将所有开发人员的字段都添加到其中并subform
避免这种情况。
<?php
// Into a controller
/** @var ModuleInterface $instance */
$instance = ... ;
$form = $this->createForm(ModuleModelType::class);
$subform= $this->createForm(new FormType());
$instance->buildForm($subform);
$form->add('subform',$subform); // I want to make something like that
interface ModuleInterface
{
public function buildForm(Form &$form);
}
class Foo implements ModuleInterface
{
public function buildForm(Form &$builder)
{
$builder->add("DevField1", /* type */);
$builder->add("DevField2", /* type */);
}
}
class ModuleModelType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('created')
->add('subform')
;
}
}
我们将假设一些事实:
此行为可以很容易地通过构造函数传递子表单来完成。因为您要与Symfony对抗,所以您会遇到问题,请考虑以下一种标准方式:
您的实体:(请考虑使用generate:doctrine:entities生成getter和setter)
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Foo
*
* @ORM\Table(name="foo")
* @ORM\Entity(repositoryClass="AppBundle\Repository\FooRepository")
*/
class Foo
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="some_informations", type="string", length=255)
*/
private $someInformations;
/**
* @var string
*
* @ORM\Column(name="Data", type="string", length=255)
*/
private $data;
/**
* @var string
*
* @ORM\Column(name="data", type="array")
*/
private $data;
您的表格:
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormTypeInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class FooType extends AbstractType
{
protected $dataFormName;
public function __construct($dataFormName)
{
$this->dataFormName = $dataFormName;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('someInformations')
->add('data', $this->dataFormName)
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Foo'
));
}
}
您的子表单:
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class SubformType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('content')
->add('some_data')
;
}
}
此时,您应该可以使用以下命令生成表单:
$foo = new Foo();
$form = $this->createForm('service_name_for_the_form_with_second_embedded', $foo);
旧答案:
在这种情况下,您应该假定ModuleInterface扩展了FormTypeInterface。要在$ form-> add中用作FormType,您的类应看起来像一个表单。在这一点上,使用ModuleInterface似乎是无用的。我可以用这种方式为您服务:
<?php
// Into a controller
$instance = new Foo();
$form = $this->createForm(new ModuleModelType($instance));
class Foo extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add("DevField1");
$builder->add("DevField2");
}
}
class ModuleModelType extends AbstractType
{
protected $subform;
function __construct(FormTypeInterface $subform)
{
$this->subform = $subform;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title')
->add('created')
->add('subform', $this->subform)
;
}
}
您还可以使用依赖项注入通过__construct注入$ instance。注意“ Foo”类的命名约定,应为FooType;)
如果您执行这样的操作,那么您的预期表格就可以了。
祝你今天过得愉快,
盖尔
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句