标签: symfony-forms

如何在Symfony2中设置多对多的表单

我有三个实体,ChannelEntity - > MatchChannelEntity < - MatchEntity,MatchChannelEntity保存其他两个表之间的多对多关系,我希望表单使用复选框列出所有通道,如果匹配有一个通道,选中该频道的复选框,我该怎么做?

这是Form类型代码:

class MatchhType extends AbstractType
{
    public function buildForm(FormBuilder $builder, array $options)
    {
        $builder
            ->add('channels', 'entity', array('label' => 'Channels', 
                                          'class'         => 'Mikay\MikiBundle\Entity\Channel',
                                          'multiple'      => true,
                                          'expanded'      => true,
                                          'query_builder' => function ($repository) 
                                          { 
                                            return $repository->createQueryBuilder('c')->orderBy('c.name', 'ASC'); 
                                          },))
Run Code Online (Sandbox Code Playgroud)

MatchChannel类型:

class MatchChannel
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var integer $match_id
     * @ORM\ManyToOne(targetEntity="Matchh", inversedBy="channels")
     * @ORM\JoinColumn(name="match_id", referencedColumnName="id", nullable="true")
     */
     private $match;

    /** …
Run Code Online (Sandbox Code Playgroud)

doctrine symfony-forms symfony doctrine-orm

7
推荐指数
1
解决办法
2万
查看次数

奏鸣曲:致命错误:嵌入表格时达到了'100'的最大函数嵌套级别

编辑:对于任何有兴趣解决相同问题的人来说,这就是诀窍:

echo `'xdebug.max_nesting_level = 250' >> /etc/php5/conf.d/xdebug.ini` 
Run Code Online (Sandbox Code Playgroud)

我为3个相互链接的实体创建了3个管理员,其中A Admin嵌入了B Admin,B Admin嵌入了C Admin.B实体与A和B实体具有ManyToOne关系.

实体使用以下代码嵌入B实体:

$formMapper->add('b', 'sonata_type_collection', array(
    'by_reference' => false
), array(
    'edit' => 'inline',
    'inline' => 'table',
    'sortable'  => 'position'
) );
Run Code Online (Sandbox Code Playgroud)

B实体嵌入C实体,具体如下:

 $formMapper->add( 'c', 'sonata_type_model', array( 
    'required'  => true, 
    'label'     => ucfirst( $this->trans( 'c', array(), $this->translationDomain, $this->langCode ) )
    ), array( 'edit' => 'list' ) );
Run Code Online (Sandbox Code Playgroud)

注意:改变'edit' => 'list'有利于'edit' => 'standard'避免以下错误.

array( 'edit' => 'list' )sonata_type_model表单类型上放置B Admin实体会在编辑A enity时出现以下错误.如果使用而不是array( 'edit' => 'standard' …

symfony-forms symfony doctrine-orm symfony-sonata sonata-admin

7
推荐指数
2
解决办法
2682
查看次数

验证不在表单中但在实体中的字段

我有一个用户注册表单,表单中只有用户名字段.在我的表单中,我希望只允许用户输入用户名.Nicename与注册时的用户名相同.

此表单绑定到User实体,即在我的表单类型类中:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Some\Bundle\Entity\User',
    ));
}
Run Code Online (Sandbox Code Playgroud)

实体User,具有为username和nicename设置的NotBlank约束.

namespace Some\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Constraints;

//...

class User
{
    //...

    /**
     * @var string $username
     *
     * @ORM\Column(name="user_login", type="string", length=60, unique=true)
     * @Constraints\NotBlank()
     */
    private $username;

    /**
     * @var string $nicename
     *
     * @ORM\Column(name="user_nicename", type="string", length=64)
     * @Constraints\NotBlank()
     */
    private $nicename;

    //...
Run Code Online (Sandbox Code Playgroud)

但是,如果我构建一个只有用户名而不是nicename的表单,则在验证时即$form->isValid()无法验证.

为了绕过这个,我想出了以下内容:

namespace Some\Bundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Some\Bundle\Form\Type\RegisterType;
//...

class UserController extends Controller
{
   //...
public function …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony

7
推荐指数
1
解决办法
2763
查看次数

Symfony2.1使用方法GET的形式

我需要有关使用带有method = GET的Symfony2.1表单和干净的URL空间的帮助.

我正在创建一个"过滤器",我想在URL中设置,以便人们可以为他们的链接添加书签.

所以,非常简单的代码:

$form = $this->createFormBuilder($defaultData)
    ->add('from', 'date', array('required' => false, 'widget' => 'single_text', 'format' => 'dd.MM.yyyy'))
Run Code Online (Sandbox Code Playgroud)

我渲染表单小部件,一切都很好.

但是,当我提交表单时,它会产生非常丑陋的GET参数:

/app_dev.php/de/event?form%5Bfrom%5D=17.11.2012
Run Code Online (Sandbox Code Playgroud)

这是因为输入名称当然是 form[from]

所以为了清理URL空间,我自己做了一个主题:

{% block widget_attributes %}
{% spaceless %}
    id="{{ id }}" name="{{ id }}"{% if read_only %} disabled="disabled"{% endif %}{% if required %} required="required"{% endif %}{% if max_length %} maxlength="{{ max_length }}"{% endif %}{% if pattern %} pattern="{{ pattern }}"{% endif %}
    {% for attrname,attrvalue in attr %}{{attrname}}="{{attrvalue}}" {% endfor %}
{% endspaceless %}
{% endblock …
Run Code Online (Sandbox Code Playgroud)

url symfony-forms symfony-2.1

7
推荐指数
2
解决办法
6157
查看次数

Symfony表单设计

我有一个Event实体,People可以参加的实体.事件发生后,事件的主持人坐下来,应该会看到这样的表格.

         user a    user b     user c      user d     user e    user f     user g
user a     _
user b               _
user c                          _
user d                                      _
user e                                                 _
user f                                                           _
user g                                                                      _
Run Code Online (Sandbox Code Playgroud)

无论用户是否喜欢其他用户,所有空白都是复选框.下划线被禁用复选框,因为用户不能喜欢自己.我应该使用choice_list吗?我想像这样处理输入:

foreach(guests as guest)//horizontal
{
    foreach(guests as other)//vertical
    {
         if(guest != other && guest.likes(other) && other.likes(guest))
         {
             //do something
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何使用formbuilder来实现这样的目标?

symfony-forms symfony doctrine-orm

7
推荐指数
1
解决办法
184
查看次数

symfony2:一个表单的多个实体

我有2个实体:

ADS\LinkBundle\Entity\Link:
type: entity
table: null
repositoryClass: ADS\LinkBundle\Entity\LinkRepository
id:
    id:
        type: integer
        id: true
        generator:
            strategy: AUTO
fields:
    dateAdded:
        type: datetime
    expirationDate:
        type: datetime
        nullable: true
    designator:
        type: string
        length: 255
        nullable: false
        unique: true
    slug:
        type: string
        length: 255
        nullable: true
        unique: true
manyToOne:
    company:
        targetEntity: ADS\UserBundle\Entity\Company
        inversedBy: link
        joinColumn:
            name: company_id
            referencedColumnName: id
        nullable: true
    createdBy:
        targetEntity: ADS\UserBundle\Entity\User
        inversedBy: link
        joinColumn:
            name: createdBy_id
            referencedColumnName: id
    domain:
        targetEntity: ADS\DomainBundle\Entity\Domain
        inversedBy: link
        joinColumn:
            name: domain_id
            referencedColumnNames: id
oneToMany:
        paths:
            targetEntity: …
Run Code Online (Sandbox Code Playgroud)

symfony-forms symfony

7
推荐指数
1
解决办法
3万
查看次数

如何在测试中加载表单类型

<?php
namespace Tabl\VenueBundle\Tests\Form;

use Symfony\Component\Form\Test\TypeTestCase;
use Tabl\VenueBundle\Entity\Venue;
use Tabl\VenueBundle\Form\VenueType;

class VenueTypeTest extends TypeTestCase
{

    public function testSubmitValidData() {
        $formData = array(
            'title' => 'Hello World',
        );

        $type = new VenueType();
        $form = $this->factory->create($type);

        $object = new Venue();
        $object->setTitle('Hello World');

        // submit the data to the form directly
        $form->submit($formData);

        $this->assertTrue($form->isSynchronized());
        $this->assertEquals($object, $form->getData());

        $view = $form->createView();
        $children = $view->children;

        foreach (array_keys($formData) as $key) {
            $this->assertArrayHasKey($key, $children);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我一直收到此错误消息:

Symfony\Component\Form\Exception\InvalidArgumentException: Could not load type "places_autocomplete"

怎么解决这个问题?如何加载此类型以便我可以在表单上执行功能测试?

places_autocompleteIvory GMaps Bundle …

php phpunit symfony-forms symfony

6
推荐指数
2
解决办法
3119
查看次数

如何在symfony 2中的同一模板中呈现具有不同主题的表单

我想在Symfony中自定义表单呈现.我查看了文档,发现可以使用{{ form_theme }}标记设置渲染主题.如果当时只有一个表单存在,但如果在同一模板中有多个表单则不起作用,这种方法非常有效.

我的index.html.twig中的一个简单示例

{% extends 'base.html.twig' %}
{% block body %}

<h1>Hello Form 1</h1>
{% form_theme form1 'bootstrap_3_layout.html.twig'  %}

{{  form_start( form1 ) }}
{{  form_end( form1 ) }}

<h1>Hello Form 2</h1>
{% form_theme form2 'bootstrap_3_horizontal_layout.html.twig'  %}

{{  form_start( form2 ) }}
{{  form_end( form2 ) }}

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

正如你可以看到有两个表单变量,我想form1与渲染'bootstrap_3_layout.html.twig',并form2'bootstrap_3_horizontal_layout.html.twig'.我不知道Twig内部,但我认为主题覆盖了他们的块定义.

结果看起来像这样

在此输入图像描述

所以我的问题是如何渲染具有给定主题的表单而不会相互干扰.有没有办法在单独的干净枝条过程中渲染表单?

我尝试使用自定义函数的Twig扩展,但似乎该函数使用相同的Twig_Environment.我还尝试使用{%render}%的子请求,但这也不起作用.

symfony-forms symfony twig

6
推荐指数
1
解决办法
5674
查看次数

有没有办法在Symfony2中重命名表单中的字段?

我正在使用symfony2,我想知道是否可以重命名表单中的字段.

我的意思是......假设我有一个实体

class MyEntity{
    private $name 
    //more code
}
Run Code Online (Sandbox Code Playgroud)

我为这个实体创建了一个类型:

class MyEntityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle\Entity\MyEntity'
        ));
    }

    public function getName()
    {
        return 'entity';
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法重命名name窗体中的字段,但映射name属性工作.就像是:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('MySuperName', null, array("mapping" => "name"))
            ;
    }
Run Code Online (Sandbox Code Playgroud)

那么表单参数名称变为entity[MySuperName]而不是entity[name]填充name实体上的属性?

symfony-forms symfony

6
推荐指数
1
解决办法
5176
查看次数

Symfony2嵌入表单不会将数据持久保存到数据库

我希望你能帮助我.我正在使用Symfony 2.x和Doctrine 2.x,我想创建一个由两个实体组成的表单.通过填写这一表格,我想将数据保存到两个学说实体.

为简单起见,我举了一个例子.多语种网上商店需要有英文和法文的名称和产品描述.我想用一个表单来创建一个新产品.此创建表单将包含Product实体(id; productTranslations; price,productTranslations)以及ProductTranslation实体(id; name; description; language,product)中的数据.生成的创建产品表单包含以下字段(名称;描述;语言(EN/FR);价格).

Product和ProductTranslation实体通过双向一对多关系相互关联.关系的拥有站点是ProductTranslation.

提交表单后,我希望将数据持久保存到两个实体(Product和ProductTranslation).这是出错的地方.我不能坚持这些数据.

因此,我尝试了以下内容:

产品实体:

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * Product
 *
 * @ORM\Table(name="product")
 * @ORM\Entity(repositoryClass="AppBundle\Repository\ProductRepository")
 */
class Product
{   
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="price", type="decimal", precision=10, scale=0)
     */
    private $price;

    /**
     * @ORM\OneToMany(targetEntity="AppBundle\Entity\ProductTranslation", mappedBy="product")
     */
    private $productTranslations; …
Run Code Online (Sandbox Code Playgroud)

forms symfony-forms symfony doctrine-orm

6
推荐指数
2
解决办法
1466
查看次数