形式

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

任务类表示并存储数据为单个任务:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27
/ / src / Acme / / Task.php TaskBundle /实体名称空间Acme\TaskBundle\实体;任务{受保护的美元任务;受保护的美元dueDate;公共函数getTask(){返回美元- >任务;}公共函数setTask(美元任务){美元- >任务=美元任务;}公共函数getDueDate(){返回美元- >dueDate;}公共函数setDueDate(\ DateTime美元dueDate= null){美元- >dueDate =美元dueDate;}}

请注意

如果你编码和这个例子中,创建的AcmeTaskBundle首先通过运行以下命令(和接受所有默认选项):

1
php应用程序/控制台生成:美元= Acme / TaskBundle包——名称空间

这个类是一个“plain-old-PHP-object”,因为,到目前为止,它已经与Symfony或任何其他图书馆。ob娱乐下载很简单的一个正常的PHP对象里面直接解决问题<新兴市场>你的应用程序(例如,需要在应用程序中代表一个任务)。当然,在本章结束时,您将能够提交数据任务实例(通过HTML表单),验证其数据,并保存到数据库。

任务类,下一步是创建和渲染实际的HTML表单。Symob娱乐下载fony2,这是通过构建一个form对象,然后呈现在一个模板。现在,从在一个控制器都可以做到这一点:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25日26日
/ / src / Acme / TaskBundle /控制器/ DefaultController.php名称空间Acme\TaskBundle\控制器;使用ob娱乐下载\\FrameworkBundle\控制器\控制器;使用Acme\TaskBundle\实体\任务;使用ob娱乐下载\组件\HttpFoundation\请求;DefaultController扩展控制器{公共函数newAction(请求美元请求){/ /创建一个任务,给它一些虚拟的数据对于这个示例美元任务=任务();美元任务- >setTask (“写博客”);美元任务- >setDueDate (\ DateTime (“明天”));美元形式=美元- >createFormBuilder (美元任务)- >add (“任务”,“文本”)- >add (“dueDate”,“日期”)- >getForm ();返回美元- >呈现(“AcmeTaskBundle:违约:new.html.twig”,数组(“形式”= >美元形式- >createView ()));}}

提示

这个例子展示了如何构建表单直接控制器。后,在“形式”部分中,您将学习如何构建表单在一个独立的类,这是推荐为表单变得可重用。

创建一个表单需要相对较少的代码,因为Symfony2表单对象构建“形式构建器”。ob娱乐下载表单生成器的目的是允许您编写简单的形式“食谱”,并让它做所有的重型起重建筑形式。

在这个示例中,您已经添加了形式——两个字段任务dueDate- - - - - -对应任务dueDate的属性任务类。你也分配每一个“类型”(如。文本,日期),除此之外,确定哪些HTML表单标签(s)呈现。

ob娱乐下载Symfony2有很多内置的类型(见不久将讨论形式)。

$形式- > createView ()在上面的控制器),使用一组表单辅助函数:

  • 嫩枝
  • PHP
1 2 3 4 5 6
{# src / Acme / TaskBundle /资源/视图/ / new.html违约。树枝#}<形式行动={{路径(task_new)}}方法=“职位”{{form_enctype(形式)}}>{{form_widget(形式)}}<输入类型=“提交”/ >< /形式>

请注意

这个示例假设您已经创建了一个路线task_new指向AcmeTaskBundle:默认值:新的前面创建的控制器。

就是这样!通过印刷form_widget(形式)每个字段的形式呈现,以及一个标签和错误消息(如果有的话)。像这是那么容易,不是非常灵活的(还)。通常情况下,你要单独渲染每个表单字段,这样你就可以控制形式的样子。你将学习如何在“形式”一节。

在继续之前,请注意如何呈现任务输入字段的值任务财产的美元的任务对象(即。“写博客”)。这是第一份工作的一种形式:把数据从一个对象转换成适合的格式,会呈现在一个HTML表单。

提示

表单系统是足够聪明来访问受保护的价值任务属性通过getTask ()setTask ()方法任务类。除非一个属性是公共的,它<新兴市场>必须有“getter”和“setter”方法,以便表单组件可以get和put数据到财产。对于一个布尔属性,您可以使用一个“伊塞”或“有”的方法(如。发表()hasReminder ())而不是一个getter(如。个短篇()getReminder ())。

2.1

支持“有”的方法是添加在Symfony 2.1。ob娱乐下载

2.1

绑定在Symfony 2.1方法更加灵活。ob娱乐下载现在接受原始客户端数据(和以前一样)或Symfony请求对象。ob娱乐下载这是首选的弃用bindRequest方法。

当提交表单时,控制器结合提交的数据形式,这意味着数据回任务dueDate的属性美元的任务对象。这些都是通过bind ()方法。

请注意

一旦bind ()被调用时,提交的数据立即转移到底层对象。这种情况不管底层数据是有效的。

这个控制器处理形式,遵循一个共同的模式,有三个可能的路径:

  1. 最初在浏览器中加载页面时,请求方法得到形式是简单地创建和渲染;
  2. 当用户提交表单(即方法帖子)和无效数据(验证将在下一节中讨论),表单绑定,然后呈现,这一次显示所有的验证错误;
  3. 与有效数据,当用户提交表单,表单绑定,你有机会使用执行一些操作美元的任务对象(例如持久化到数据库)之前将用户重定向到其他页面(例如,一个“谢谢”或“成功”页面)。

请注意

重定向用户表单提交成功后可以防止用户能够点击“刷新”并转发数据。

任务)。换句话说,问题不是“形式”是否有效,但是否美元的任务对象是有效的表单之后应用提交的数据。调用$ - > isValid形式()是一个快捷方式,要求吗美元的任务对象是否有效的数据。

验证是通过添加一组规则一个类(称为约束)。看到这,以便添加验证约束任务字段不能为空,dueDate字段不能为空,必须有效的DateTime对象。

  • YAML
  • 注释
  • XML
  • PHP
1 2 3 4 5 6 7 8
# Acme / TaskBundle /资源/ config / validation.ymlAcme实体\ TaskBundle \ \任务:属性:任务:- - - - - -NotBlank:~dueDate:- - - - - -NotBlank:~- - - - - -类型:\ DateTime

就是这样!如果你重新提交表单无效数据,您将看到相应的错误打印的形式。

HTML5,许多本地浏览器可以在客户端上执行特定的验证约束。最常见的验证激活呈现要求属性字段是必需的。对于支持HTML5的浏览器,这将导致原生浏览器消息显示,如果用户试图提交表单字段空白。

生成的形式充分利用这个新特性添加合理的HTML属性触发验证。然而,客户端验证可以通过添加禁用已经属性的形式标签或formnovalidate提交标记。这是特别有用,当你想测试您的服务器端验证约束,但被浏览器阻止了,例如,提交空白领域。

Symfony2验证是一个非常强大的特性,都有它自己的ob娱乐下载专用的章

验证组,您需要指定验证组(s)表单应该使用:

1 2 3
美元形式=美元- >createFormBuilder (美元用户,数组(“validation_groups”= >数组(“注册”)))- >添加(…);

如果你创建表单类(一个好的实践),那么你需要添加以下setDefaultOptions ()方法:

1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“validation_groups”= >数组(“注册”)));}

在这两种情况下,<新兴市场>只有登记验证小组将被用来验证底层对象。

如果你需要一些先进的逻辑来确定验证组织(如根据提交的数据),可以设置validation_groups选项数组回调或关闭:

1 2 3 4 5 6 7 8
使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“validation_groups”= >数组(“Acme \ \ AcmeBundle实体\ \ \ \客户”,“determineValidationGroups”)));}

这将调用静态方法determineValidationGroups ()客户端类绑定表单之后,但在执行验证。表单对象作为参数传递给该方法(见下一个示例)。您还可以定义整个逻辑内联使用闭包:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\组件\形式\FormInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“validation_groups”= >函数(FormInterface美元形式){美元数据=美元形式- >getData ();如果(实体\客户::TYPE_PERSON = =美元数据- >方法()){返回数组(“人”);}其他的{返回数组(“公司”);}});}

  • 形式
  • 您还可以创建自己的自定义字段类型。这个话题覆盖在“如何创建一个自定义表单字段类型”文章的食谱。

    dueDate领域目前正呈现为3选择框。然而,日期字段可以配置为显示为一个单一的文本框(用户输入的日期作为一个字符串在盒子里):

    1
    - >add (“dueDate”,“日期”,数组(“部件”= >“single_text”))

    每个字段类型都有许多不同的选项,可以传递给它。这些特定于字段类型和细节可以在每种类型的文档中找到。欧宝官网下载app

    最常见的选项要求选项,它可以应用于任何领域。默认情况下,要求选项设置为真正的,这意味着准备好了支持html5技术的浏览器将客户端验证字段留空。如果你不希望这种行为,设置要求选择在你的领域禁用HTML5验证

    还要注意,设置要求选项真正的导致应用服务器端验证。换句话说,如果用户提交一个空白字段的值(用旧浏览器或web服务,例如),它会被接受作为一个有效的值,除非你使用Symfony的ob娱乐下载NotBlankNotNull验证约束。

    换句话说,要求选择“好”,但真正的服务器端验证<新兴市场>总是被使用。

    表单字段的标签可以设置使用标签选项,它可以应用于任何领域:

    1 2 3 4
    - >add (“dueDate”,“日期”,数组(“部件”= >“single_text”,“标签”= >“到期日”,))

    字段的标签也可以在模板设置呈现形式,见下文。

    任务类,Symfoob娱乐下载ny已经知道一点关于你的领域。如果你允许,Symfony会“猜”ob娱乐下载字段的类型和设置它。在这个例子中,Symfony的验证ob娱乐下载规则可以猜到了任务字段是一个正常的文本场和dueDate字段是一个日期字段:

    1 2 3 4 5 6 7 8 9
    公共函数newAction(){美元任务=任务();美元形式=美元- >createFormBuilder (美元任务)- >add (“任务”)- >add (“dueDate”,,数组(“部件”= >“single_text”))- >getForm ();}

    “猜测”被激活时省略第二个参数add ()方法(或者如果你通过它)。如果你通过选项数组作为第三个参数(完蛋了dueDate上图),这些选项应用到猜。

    谨慎

    如果你的表单使用一个特定的验证组,字段类型猜测者仍然会考虑<新兴市场>所有验证约束当猜测你的字段类型(包括验证组的约束不属于被使用)。

    • 要求:要求选项可以猜测基于验证规则(即是NotBlankNotNull)或教义的元数据(即可以为空)。这是非常有用的,因为你的客户端验证将自动匹配您的验证规则。
    • max_length:如果字段是某种文本字段,然后max_length选择从验证约束(如果可以猜到了长度范围使用)或教义的元数据(通过字段的长度)。

    请注意

    这些字段选项<新兴市场>只有猜如果你使用Symfony猜字段类型(即省略或通ob娱乐下载过作为第二个参数add ())。

    如果你想改变一个的猜测值,您可以重写它通过选项选项字段数组:

    1
    - >add (“任务”,,数组(“max_length”= >4))

    看看每个部分:

    大部分的工作是做的form_row辅助显示标签,错误和在每个字段的HTML表单小部件div默认的标签。在形式节中,您将了解如何form_row输出可以定制在许多不同的水平。

    提示

    你可以通过访问你的当前数据形式form.vars.value:

    • 嫩枝
    • PHP
    1
    {{form.vars.value。任务}}

    form_row助手是伟大的,因为你可以很快呈现每个字段的表单(和标记用于“行”也可以定制)。但由于生活并不总是那么简单,你也可以完全由手工渲染每个字段。后的最终产品使用时是一样的form_row助手:

    • 嫩枝
    • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    {{form_errors(形式)}}<div>{{了form_label (form.task)}}{{form_errors (form.task)}}{{form_widget (form.task)}}< /div><div>{{了form_label (form.dueDate)}}{{form_errors (form.dueDate)}}{{form_widget (form.dueDate)}}< /div>{{form_rest(形式)}}

    如果字段的自动生成的标签并不十分正确,可以显式地指定:

    • 嫩枝
    • PHP
    1
    {{了form_label(形式。任务,“工作描述”)}}

    一些字段类型额外的渲染选项,可以传递到小部件。这些选项被记录与每个类型,但一个共同的选择attr,它允许您修改属性表单元素。以下将增加task_field类来呈现输入文本字段:

    • 嫩枝
    • PHP
    1
    {{form_widget(形式。任务,{“attr”:{“类”:“task_field”}})}}

    如果你需要渲染表单字段“手工”然后你可以访问个人价值观等领域id,的名字标签。例如获得id:

    • 嫩枝
    • PHP
    1
    {{form.task.vars。id}}

    得到的值用于表单字段的名称属性需要使用full_name值:

    • 嫩枝
    • PHP
    1
    {{form.task.vars。full_name}}

    参考手册。读这篇文章了解可用的助手和可以使用的选项。

    这个新类包含所需的所有方向形式(注意,创建任务getName ()方法应该返回一个唯一标识符形式“类型”)。它可以用于快速构建一个表单对象的控制器:

    1 2 3 4 5 6 7 8 9 10 11 12
    / / src / Acme / TaskBundle /控制器/ DefaultController.php/ /添加这个新的使用声明的类使用Acme\TaskBundle\形式\类型\TaskType;公共函数newAction(){美元任务=……;美元形式=美元- >createForm (TaskType (),美元任务);/ /……}

    把形式逻辑分类意味着形式可以很容易地在你的项目中重用。这是最好的方法来创建表单,但最终取决于你的选择。

    每个表单需要知道类的名称,底层数据(例如Acme实体\ TaskBundle \ \任务)。通常情况下,这仅仅是猜测的基于对象传递给第二个参数createForm(即。美元的任务)。后来,当你开始嵌入形式,这将不再是足够的。所以,虽然并不总是必要的,通常是一个好主意来显式地指定data_class选择通过添加以下表单类型类:

    1 2 3 4 5 6 7 8
    使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“data_class”= >“Acme实体\ TaskBundle \ \任务”));}

    提示

    当映射对象的形式,所有字段映射。任何字段映射对象的形式,不存在会导致抛出一个异常。

    在这种情况下,您需要额外的字段的形式(例如:“你同意这些条款”复选框),将不会被映射到底层对象,您需要设置映射选项:

    1 2 3 4 5 6 7
    使用ob娱乐下载\组件\形式\FormBuilderInterface;公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器- >add (“任务”);美元构建器- >add (“dueDate”,,数组(“映射”= >));}

    另外,如果有任何字段的形式不包括在提交数据,将显式地设置这些字段

    可以访问字段数据的控制器:

    1
    美元形式- >get (“dueDate”)- >getData ();

    就是这样!现在你可以直接使用表单类型控制器:

    1 2 3 4 5 6 7 8 9 10
    / / src / Acme / TaskBundle /控制器/ DefaultController.php/ /……公共函数newAction(){美元任务=……;美元形式=美元- >createForm (“任务”,美元任务);/ /……}

    甚至从内部使用另一种形式的表单类型:

    1 2 3 4 5 6 7 8 9 10 11 12
    / / src / Acme / TaskBundle /形式/类型/ ListType.php/ /……ListType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){/ /……美元构建器- >add (“someTask”,“任务”);}}

    如何创建一个自定义表单字段类型为更多的信息。

    任务)一个HTML表单,然后将用户提交的数据回到原来的对象。因此,坚持的主题任务对象到数据库是完全无关的主题形式。但是,如果你配置了任务类通过教义被持久化(即你补充道映射元数据),然后坚持它在表单提交时可以做形式是有效的:

    1 2 3 4 5 6 7
    如果(美元形式- >isValid ()) {美元新兴市场=美元- >getDoctrine ()- >getManager ();美元新兴市场- >persist (美元任务);美元新兴市场- >冲洗();返回美元- >重定向(美元- >generateUrl (“task_success”));}

    如果出于某种原因,你没有访问你的原创美元的任务对象,您可以获取它的形式:

    1
    美元任务=美元形式- >getData ();

    有关更多信息,请参见教义ORM章

    关键的理解是,当表单绑定,提交的数据立即转移到底层对象。如果你想保存这些数据,你只需要持久化对象本身(已经包含提交的数据)。

    用户对象以及许多地址对象。幸运的是,这很容易和自然与表单组件。

    任务属于一个简单类别对象。首先,当然,通过创建类别对象:

    1 2 3 4 5 6 7 8 9 10 11 12
    / / src / Acme / / Category.php TaskBundle /实体名称空间Acme\TaskBundle\实体;使用ob娱乐下载\组件\验证器\约束作为断言;类别{/ * * *@Assert\ NotBlank () * /公共美元的名字;}

    接下来,添加一个新的类别财产任务类:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
    / /……任务{/ /……/ * * *@Assert\类型(Type =“Acme \ \ TaskBundle \实体类别”)* /受保护的美元类别;/ /……公共函数getCategory(){返回美元- >类别;}公共函数setCategory(类别美元类别= null){美元- >类别=美元类别;}}

    现在,您的应用程序已经更新以反映新的需求,创建一个类,这样一个形式类别对象由用户可以修改:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25日26日
    / / src / Acme / TaskBundle /形式/类型/ CategoryType.php名称空间Acme\TaskBundle\形式\类型;使用ob娱乐下载\组件\形式\AbstractType;使用ob娱乐下载\组件\形式\FormBuilderInterface;使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;CategoryType扩展AbstractType{公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){美元构建器- >add (“名字”);}公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“data_class”= >“Acme \ \ TaskBundle \实体类别”));}公共函数getName(){返回“类别”;}}

    最终目标是允许的类别任务在任务表单本身要修改的权利。为此,添加一个类别场的TaskType对象的类型的新实例CategoryType类:

    1 2 3 4 5 6 7 8
    使用ob娱乐下载\组件\形式\FormBuilderInterface;公共函数buildForm(FormBuilderInterface美元构建器数组,美元选项){/ /……美元构建器- >add (“类别”,CategoryType ());}

    的字段CategoryType现在可以一起呈现的TaskType类。激活验证CategoryType,添加cascade_validation选项TaskType:

    1 2 3 4 5 6 7
    公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“data_class”= >“Acme实体\ TaskBundle \ \任务”,“cascade_validation”= >真正的));}

    呈现类别字段一样原始任务字段:

    • 嫩枝
    • PHP
    1 2 3 4 5 6 7 8 9
    {#……#}<h3>类别< /h3><div=“类别”>{{form_row (form.category.name)}}< /div>{{form_rest(形式)}}{#……#}

    当用户提交表单时,提交的数据类别字段是用于构造的一个实例类别,然后套上类别场的任务实例。

    类别自然通过实例访问$任务- > getCategory ()并且可以但是你需要持久化到数据库或使用。

    文本区域标签应该呈现。没有限制,可以用在不同的地方和不同的定制。

    ob娱乐下载Symfony使用模板来呈现每一种形式的一部分,等标签标签,输入标签,和其他所有错误消息。

    在小枝,每个表单“片段”是由一块树枝。定制任何部分的形式呈现,你只需要覆盖适当的块。

    在PHP中,每个表单呈现“片段”通过一个单独的模板文件。定制任何部分的形式呈现,你只需要覆盖现有的模板通过创建一个新的。

    要理解这是如何工作的,定制的form_row片段和添加一个类属性div元素周围每一行。为此,创建一个新模板文件存储新的标记:

    • 嫩枝
    • PHP
    1 2 3 4 5 6 7 8 9 10
    {# src / Acme / TaskBundle /资源/视图/形式/ fields.html。树枝#}{%form_row %}{%没有余地的%}<div=“form_row”>{{了form_label(形式)}}{{form_errors(形式)}}{{form_widget(形式)}}< /div>{%endspaceless%}{%endblockform_row %}

    form_row表单片段是大多数字段通过渲染时使用form_row函数。告诉组件使用你的新形式form_row片段上面定义,添加以下的呈现形式的模板:

    • 嫩枝
    • PHP
    1 2 3 4 5 6
    {# src / Acme / TaskBundle /资源/视图/ / new.html违约。树枝#}{%form_theme“AcmeTaskBundle:形式:fields.html形式。嫩枝' %}{%form_theme“AcmeTaskBundle:形式:fields.html形式。树枝“AcmeTaskBundle:形式:fields2.html。嫩枝' %}<形式>

    form_theme标签(嫩枝)“进口”定义的碎片在给定的模板,并使用它们在呈现表单。换句话说,当form_row在这个模板函数被调用后,它将使用form_row从自定义主题块(而不是默认的form_row附带Symfony的块)。ob娱乐下载

    自定义主题没有覆盖所有的块。在呈现一块不覆盖在您的自定义主题,主题引擎将回落到全球的主题(在包级别上定义)。

    如果他们会提供了一些自定义主题搜索顺序列出之前回落全球主题。

    定制表单的任何部分,你只需要覆盖适当的片段。知道哪些块或文件覆盖下一节的主题。

    2.1

    另一种理解语法form_theme介绍了在2.1。它接受任何有效的树枝表达式(最明显的区别是使用数组在使用多个主题)。

    1 2 3 4 5
    {# src / Acme / TaskBundle /资源/视图/ / new.html违约。树枝#}{%form_theme形式与“AcmeTaskBundle:形式:fields.html。嫩枝' %}{%form_theme与[' AcmeTaskBundle:形式:fields.html形式。嫩枝”、“AcmeTaskBundle:形式:fields2.html。嫩枝']%}

    更广泛的讨论,请参阅如何自定义形式呈现

    form_div_layout.html.twig),生活在树枝桥。在这个文件中,您可以看到每一块需要呈现形式和每一个默认字段类型。

    在PHP中,单个模板文件碎片。默认情况下它们位于资源/视图/形式目录框架的包(GitHub观)。

    每个片段名称遵循相同的基本模式分为两部分,由一个下划线字符(_)。几个例子:

    • form_row——使用form_row呈现大多数字段;
    • textarea_widget——使用form_widget呈现一个文本区域字段类型;
    • form_errors——使用form_errors为一个字段来呈现错误;

    每一个片段都遵循相同的基本模式:type_part。的类型部分对应的字段<新兴市场>类型(如被呈现。文本区域,复选框,日期等)而部分部分对应于<新兴市场>什么(如被呈现。标签,小部件,错误等等)。默认情况下,可能有4<新兴市场>部分可呈现的形式:

    标签 (如。了form_label)|显示字段的标签
    小部件 (如。form_widget)|显示字段的HTML表示
    错误 (如。form_errors)|显示字段的错误
    (如。form_row)|渲染领域的整个行(标签、小部件和错误)

    请注意

    实际上有3<新兴市场>部分- - - - - -- - - - - -- - - - - -- - - - - -- - - - - -- - - - - -,休息,enctype——但是你应该几乎从不需要担心覆盖它们。

    通过了解字段类型(例如文本区域),哪个部分你想定制(如。小部件),您可以构建片段的名称需要覆盖(如。textarea_widget)。

    form_theme辅助(嫩枝)“进口”自定义表单片段<新兴市场>只是这种形式。你也可以告诉Symfony导入表单定ob娱乐下载制你的整个项目。

    fields.html.twig模板创建的早些时候<新兴市场>所有模板,修改应用程序配置文件:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6
    # app / config / config.yml枝:形式:资源:- - - - - -“AcmeTaskBundle:形式:fields.html.twig”#……

    任何一块内fields.html.twig模板现在在全球范围内用于定义形式输出。

    在树枝,还可以定制一个表单内块正确的模板定制需要的地方:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    {%扩展“::base.html。嫩枝' %}{#进口“_self”为形式的主题#}{%form_theme形式_self %}{#让表单片段定制#}{%form_row %}{#自定义字段行输出#}{%endblockform_row %}{%内容%}{#……#}{{form_row (form.task)}}{%endblock%}

    {% form_theme形式_self %}标记允许自定义表单模块直接在模板将使用这些定制。使用这个方法快速使形式输出定制,只需要在一个模板。

    谨慎

    {% form_theme形式_self %}功能将<新兴市场>只有如果你的模板扩展另一个工作。如果你的模板不,你必须点form_theme到一个单独的模板。

    跨站点请求伪造——是一个恶意用户的方法试图让你合法用户在不知情的情况下提交数据,他们不打算提交。幸运的是,可以阻止CSRF攻击使用CSRF令牌在你的形式。

    好消息是,默认情况欧宝平台是合法的吗下,Symfony嵌入和验证CSRF令牌自动为你。ob娱乐下载这意味着您可以利用CSRF保护什么事情都不做。事实上,每个表单在本章利用CSRF保护!

    CSRF保护是通过添加一个表单隐藏字段——调用_token默认情况下,包含一个值,只有你和你的用户知道。这可以确保用户——而不是其他实体——提交给数据。ob娱乐下载Symfony自动验证这个令牌的存在和准确性。

    _token字段是一个隐藏字段,如果包括会自动呈现form_rest ()函数模板,它确保所有un-rendered字段输出。

    CSRF令牌可以定制form-by-form基础上。例如:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
    使用ob娱乐下载\组件\OptionsResolver\OptionsResolverInterface;TaskType扩展AbstractType{/ /……公共函数setDefaultOptions(OptionsResolverInterface美元解析器){美元解析器- >setDefaults (数组(“data_class”= >“Acme实体\ TaskBundle \ \任务”,“csrf_protection”= >真正的,“csrf_field_name”= >“_token”,/ /一个唯一键来帮助生成令牌的秘密“意图”= >“task_item”));}/ /……}

    禁用CSRF保护,设置csrf_protection选择错误的。也可以在您的项目在全球范围内的定制。有关更多信息,请参见形式配置参考部分。

    请注意

    意图选项是可选的但是,极大地增强了安全生成的令牌使它不同形式。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
    / /确保你进口上述请求的名称空间使用ob娱乐下载\组件\HttpFoundation\请求;/ /……公共函数contactAction(请求美元请求){美元defaultData=数组(“消息”= >这里输入您的消息的);美元形式=美元- >createFormBuilder (美元defaultData)- >add (“名字”,“文本”)- >add (“电子邮件”,“电子邮件”)- >add (“消息”,“文本区域”)- >getForm ();如果(美元请求- >isMethod (“职位”)){美元形式- >bind (美元请求);/ /数据数组与“名称”、“电子邮件”,“信息”键美元数据=美元形式- >getData ();}/ /……呈现形式}

    默认情况下,一种形式实际上假设您希望使用数组的数据,而不是一个对象。确切地说,有两种方法可以改变这一行为和领带表单对象而不是:

    1. 通过一个对象在创建表单(第一个参数createFormBuilder或第二个参数createForm);
    2. 声明data_class选择表单。

    如果你<新兴市场>不做这两种,那么将返回一个数组的数据形式。在这个例子中,defaultData美元不是一个对象(和没有data_class选项设置),$形式- > getData ()最终返回一个数组。

    提示

    您还可以访问后值(在本例中“名字”)直接通过请求对象,如下所示:

    1
    美元- >get (“请求”)- >请求- >get (“名字”);

    建议,然而,在大多数情况下使用getData()方法是一个更好的选择,因为它返回数据(通常是一个对象)在转换之后的形式框架。

    $ - > isValid形式(),对象是验证通过阅读的约束应用于该类。如果表单绑定到一个对象(即你用data_class选择表单或传递一个对象),这是几乎总是你想要使用的方法。看到验证为更多的细节。

    但是如果你不绑定到一个对象,而不是检索一个简单的数组你提交的资料,如何约束添加到表单的数据吗?

    答案是自己设置的约束,并附上个人领域。整体的方法是更多的覆盖验证章,但是这里有一个简单的例子:

    2.1

    约束选项,它接受一个单一的约束或一组约束(2.1之前,选择是validation_constraint,只有接受一个约束)是Symfony 2.1新。ob娱乐下载

    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    使用ob娱乐下载\组件\验证器\约束\长度;使用ob娱乐下载\组件\验证器\约束\NotBlank;美元构建器- >add (“firstName”,“文本”,数组(“约束”= >长度(数组(“最小值”= >3))))- >add (“姓”,“文本”,数组(“约束”= >数组(NotBlank (),长度(数组(“最小值”= >3)))));

    提示

    如果您使用的是验证组,需要引用
    默认的集团在创建表单时,或一组正确的小组
    你添加的约束。

    1
    NotBlank (数组(“组织”= >数组(“创建”,“更新”))

    任务)HTML表单,以便用户可以修改该数据。一种形式的第二个目标是把用户提交的数据并重新应用到对象。

    还有更多学习的强大的世界形式,比如如何处理文件上传与原则或如何创建一个形式,一个动态的表单可以添加(例如一个todo列表,您可以继续添加更多的领域通过Javascript之前提交)。看到这些主题的食谱。另外,一定要依靠字段类型参考文档欧宝官网下载app,其中包括如何使用的例子,每个字段类型及其选择。

    如何处理文件上传与教义
  • 文件字段引用
  • 创建自定义字段类型
  • 如何自定义形式呈现
  • 如何使用表单动态修改表单事件吗
  • 如何使用数据变形金刚吗
  • 这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
    < /article>
    引导您的项目在几分钟内”>< /a>
          <p class=引导您的项目在几分钟内

    测量和提高Symfony代码性能ob娱乐下载”>< /a>
          <p class=测量和提高Symfony代码性能ob娱乐下载

    代码消耗服务器资源。黑焰告诉你”>< /a>
          <p class=代码消耗服务器资源。黑焰告诉你