Php 在同一页面上多次生成相同的表单类型Symfony2
我试图生成一个表单类型,特别是“ProductLanguageType” 我希望生成ProductLanguageType的次数与Language表中现有语言的当前数量相同 例如,如果语言表中有(英语、法语、俄语、汉语),它将在同一页面上生成4个ProductLanguageType表单 我想知道如何查询语言表并在同一页面上生成多个相同类型的表单,表单生成器是否能够这样做,或者是否有其他解决方法?有一段时间以来,我一直有一些问题,我很高兴能找到一个很好的解决办法 ProductLanguageType:Php 在同一页面上多次生成相同的表单类型Symfony2,php,symfony,formbuilder,Php,Symfony,Formbuilder,我试图生成一个表单类型,特别是“ProductLanguageType” 我希望生成ProductLanguageType的次数与Language表中现有语言的当前数量相同 例如,如果语言表中有(英语、法语、俄语、汉语),它将在同一页面上生成4个ProductLanguageType表单 我想知道如何查询语言表并在同一页面上生成多个相同类型的表单,表单生成器是否能够这样做,或者是否有其他解决方法?有一段时间以来,我一直有一些问题,我很高兴能找到一个很好的解决办法 ProductLanguageT
class ProductLanguageType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options){
$builder->add('id_language', 'entity', array(
'class' => 'AdminBundle:Language',
'data_class' => 'Main\AdminBundle\Entity\Language',
'property' => 'language'
)
)
->add('name', 'text')
->add('description', 'ckeditor', array(
'config_name' => 'admin',
'config' => array(
'filebrowser_image_browse_url' => array(
'route' => 'elfinder',
'route_parameters' => array('instance' => 'default'),
),
)
))
->add('short_description', 'text');
}
public function getName(){
return 'productLanguage';
}
}
ProductType(此处嵌入ProductLanguageType):
希望这能帮助别人 正确的方法是使用Symfony的form.factory服务创建一个命名的生成器,然后从中创建一个表单。我建议为表单创建过程创建一个函数,因为(据我所知,如果我错了,请更正我),每个FormBuilder实例必须不同才能创建不同的表单 作为对守则目的的解释: 我需要在帮助系统中显示一个打开的票证列表,该列表能够根据登录令牌为票证分配一个人(未登录而授权)。这需要在单个页面上显示N个表单,这些表单是唯一的,但如果您愿意,可以从单个“模板”或类型生成 这段代码在没有任何黑客攻击的情况下实现了这一点。从控制器AFAIK创建具有特定ID(名称)的表单没有速记方法 前 (这是重要部分)ticketAssignInvokeType如下所示:
class TicketAssignInvokeType extends AbstractType {
private $nameSuffix = null;
private $name = 'ticket_assign_invoke';
public function __constructor(string $suffix = null) {
//parent::__construct();
$this->nameSuffix = $this->generateNameSuffix();
}
private function generateNameSuffix() {
if ($this->nameSuffix == null || $this->nameSuffix == '') {
$generator = new SecureRandom();
//change data to alphanumeric string
return bin2hex($generator->nextBytes(10));
}
return $this->nameSuffix;
}
/**
*
* @param string $suffix When set suffix added to form will use selected
* string (note it should be unique for all forms on a page).
*/
public function setNameSuffix($suffix){
$this->nameSuffix = $suffix;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('loginToken',new AuthenticateTokenType())
->add('ticket',new TicketIDType())
->add('save', 'submit', array('label' => 'form.button.assign'))
;
}
public function getName() {
if ($this->nameSuffix == null || $this->nameSuffix == "" ) {
$this->nameSuffix = $this->generateNameSuffix();
}
return $this->name .'_'. $this->nameSuffix;
}
public function configureOptions(OptionsResolver $resolver) {
// ...
}
}
这是有点过于复杂的逻辑和名称后缀测试,但在某个点上,我不明白为什么我去的是没有后缀的形式名称,因此复杂性
另外,我已经将表单创建为服务,稍后将测试是否可以使用服务,因为这是我的第一个意图
PS2。我还不确定
setAutoinitialize
方法,但还将进一步测试它。现在在Symfony 3.0中,他们更改了createNamedBuilder,因此只需调用:
use AppBundle\Form\ShippingTrackCodeReturnType;
$uniqueForm = $this->get('form.factory')->createNamedBuilder('ship_form_'.$orderRecord->getId(), ShippingTrackCodeReturnType::class, $orderRecord)->getForm();
因此,您只需循环显示并保存它们:
foreach ($invoice->getOrderRecords() as $key => $orderRecord)
{
// creates the forms with different names
$returnShipTrackCodeForm = $this->get('form.factory')->createNamedBuilder('ship_form_'.$orderRecord->getId(), ShippingTrackCodeReturnType::class, $orderRecord)->getForm();
$returnShipTrackCodeForm->handleRequest($request);
if ($returnShipTrackCodeForm->isSubmitted() && $returnShipTrackCodeForm->isValid())
{
// flush object
}
$returnForms[$orderRecord->getId()] = $returnShipTrackCodeForm;
}
使用集合怎么样?我多次尝试生成表单,但它似乎没有出现。它出现了,谢谢!我已经删除了setAutoinitialize,因为默认情况下它似乎处于打开状态。还从_构造()中删除了未使用的参数。
use AppBundle\Form\ShippingTrackCodeReturnType;
$uniqueForm = $this->get('form.factory')->createNamedBuilder('ship_form_'.$orderRecord->getId(), ShippingTrackCodeReturnType::class, $orderRecord)->getForm();
foreach ($invoice->getOrderRecords() as $key => $orderRecord)
{
// creates the forms with different names
$returnShipTrackCodeForm = $this->get('form.factory')->createNamedBuilder('ship_form_'.$orderRecord->getId(), ShippingTrackCodeReturnType::class, $orderRecord)->getForm();
$returnShipTrackCodeForm->handleRequest($request);
if ($returnShipTrackCodeForm->isSubmitted() && $returnShipTrackCodeForm->isValid())
{
// flush object
}
$returnForms[$orderRecord->getId()] = $returnShipTrackCodeForm;
}