Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在同一页面上多次生成相同的表单类型Symfony2_Php_Symfony_Formbuilder - Fatal编程技术网

Php 在同一页面上多次生成相同的表单类型Symfony2

Php 在同一页面上多次生成相同的表单类型Symfony2,php,symfony,formbuilder,Php,Symfony,Formbuilder,我试图生成一个表单类型,特别是“ProductLanguageType” 我希望生成ProductLanguageType的次数与Language表中现有语言的当前数量相同 例如,如果语言表中有(英语、法语、俄语、汉语),它将在同一页面上生成4个ProductLanguageType表单 我想知道如何查询语言表并在同一页面上生成多个相同类型的表单,表单生成器是否能够这样做,或者是否有其他解决方法?有一段时间以来,我一直有一些问题,我很高兴能找到一个很好的解决办法 ProductLanguageT

我试图生成一个表单类型,特别是“ProductLanguageType”

我希望生成ProductLanguageType的次数与Language表中现有语言的当前数量相同

例如,如果语言表中有(英语、法语、俄语、汉语),它将在同一页面上生成4个ProductLanguageType表单

我想知道如何查询语言表并在同一页面上生成多个相同类型的表单,表单生成器是否能够这样做,或者是否有其他解决方法?有一段时间以来,我一直有一些问题,我很高兴能找到一个很好的解决办法

ProductLanguageType:

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;
}