<div class="con editor-preview-side" id="result">
<p>对于Web开发者来说,处理HTML表单是最常见的任务(也是挑战)之一。Symfony2集成了Form组件以使得表单处理更为容易。在本章中,你将从头开始构建一个复杂的表单,并且学会表单库中大部分的重要功能。</p>
<p>Symfony2表单组件是一个独立库,它可以在Symfony2项目之外使用。更多详情参见Github中的<a href="https://github.com/symfony/Form">Symfony2表单组件</a>。</p>
<h2>创建一个简单的表单</h2>
<p>假设你正在构建一个商店应用程序,它需要显示产品。因为你的用户需要编辑和创建产品,你将需要构建一个表单。但在你开始之前,让我们关注一下Product类,该类代表和保存单个产品的数据:</p>
<pre class="blockcode"></pre>
<ol><li>// src/Acme/StoreBundle/Entity/Product.php </li><li>namespace Acme\StoreBundle\Entity; </li><li> </li><li>class Product </li><li>{ </li><li> public $name; </li><li> </li><li> protected $price; </li><li> </li><li> public function getPrice() </li><li> { </li><li> return $this->price; </li><li> } </li><li> </li><li> public function setPrice($price) </li><li> { </li><li> $this->price = $price; </li><li> } </li><li>} </li></ol>
<p>注:如果你要编写这个例子,那么请确保创建和启动AcmeStoreBundle。运行下列命令并按照屏幕的指示进行:</p>
<pre class="blockcode"></pre>
<ol><li>php app/console init:bundle Acme/StoreBundle src/ </li></ol>
<p>这种类通常被称为“简单PHP对象”(POPO),因为到目前为止它并没有与Symfony2或其它任何库相关。它是个非常简单的,要直接为你应用程序解决问题的标准PHP对象(如它在你的应用程序里代表产品)。当然在本章最后,你将可以提供数据到Product实例(通过表单),验证它的数据,并将其持久化到数据库。</p>
<p>截止到现在,你并没有做任何与“表单”相关的操作,你只是简单地创建了一个PHP类,该类将帮助你解决你应用程序中的问题。本章表单构建的目标是允许你的用户与Product对象的数据交互。</p>
<h3>构建表单</h3>
<p>现在你已经创建了一个Product类,下一步就是创建并渲染实际的HTML表单。在Symfony2中,可以通过构建Form对象,然后在模板中渲染来实现。这一切都可以通过一个内部的控制器来实现:</p>
<pre class="blockcode"></pre>
<ol><li>// src/Acme/StoreBundle/Controller/DefaultController.php </li><li>namespace Acme\StoreBundle\Controller; </li><li> </li><li>use Symfony\Bundle\FrameworkBundle\Controller\Controller; </li><li>use Acme\StoreBundle\Entity\Product; </li><li> </li><li>class DefaultController extends Controller </li><li>{ </li><li> public function indexAction() </li><li> { </li><li> // create a product and give it some dummy data for this example </li><li> $product = new Product(); </li><li> $product->name = 'Test product'; </li><li> $product->setPrice('50.00'); </li><li> </li><li> $form = $this->createFormBuilder($product) </li><li> ->add('name', 'text') </li><li> ->add('price', 'money', array('currency' => 'USD')) </li><li> ->getForm(); </li><li> </li><li> return $this->render('AcmeStoreBundle:Default:index.html.twig', array( </li><li> 'form' => $form->createView(), </li><li> )); </li><li> } </li><li>} </li></ol>
<p>稍后,当你为Product对象添加验证时,你将学会配置表单项更简便的方法。该方法将在后面表单项类型猜测一节说明。</p>
<p>在Symfony2中构建一个表单是简便的,因为Form对象是通过“表单构造器”来构造的。表单构造器是一个对象,你可以与之交互用来帮助你容易地创建表单对象。</p>
<p>在本例中,你已经为你表单添加了两个表单项,name和price,它们与Porduct类的name和price属性相对应。表单项name是文本类型,意味着用户可以提交简单本文到该项。price是money类型,这是个一特殊的文本类型,可以用区域货币格式显示并提交。Symfony2附带了许多内建类型,我们稍后讨论(参见内建表单项类型)</p>
<p>现在表单已经创建了,下一步就是去渲染它。这一点可以很容易做到。只需要通过发送特殊的表单“视图”对象到你的模板(参见上面控制器中的$from->createView()方法),并使用一些表单帮手函数:</p>
<pre class="blockcode"></pre>
<ol><li>{# src/Acme/StoreBundle/Resources/views/Default/index.html.twig #} </li><li> </li><li><form action="{<!-- -->{ path('store_product') }}" method="post" {<!-- -->{ form_enctype(form) }}> </li><li> {<!-- -->{ form_widget(form) }} </li><li> </li><li> <input type="submit" /> |
|