0

在销售数字商品的遗留系统中......

产品按产品类别 (4) 进行组织。产品可能包括其他子产品。客户可以购买产品并成为产品实例的所有者。每个产品实例都有自己的配置。

问题:

客户应该能够取消他们的产品实例。因此,我想建立一个中央取消表格,如下所示:

形式

该表单包含客户的所有产品实例。产品按类别组织。每个产品实例都应该用一个简短的文本块来描述它的配置(属性+一些子实体属性)。在描述旁边应该有一个复选框。如果选中该框,则应取消产品实例。

实体字段类型(扩展,多个)似乎是一个不错的选择?但是如何在复选框旁边显示文本信息?

如何使用 symfony2 表单生成器实现这样的表单?

如果我可以访问自定义表单类型视图对象中的产品对象来构建输出,例如:

    <!-- how a product instance should be displayed -->
    <!-- description on the left -->
    <div class="left">
      {{ product.name }} {{ product.calcExpireDate() }}<br />
      {% for s in product.getSubentities() %} {{ s.name }}, {% endfor %}
    </div>
    <!-- checkbox on the right -->
    <div class="right">
      <input type="checkbox ..[] > <label>Cancel<label>
    </div>
4

2 回答 2

1

这是给你的解决方案:

实体和表单类型被最小化(没有 getter/setter)

假设您有两个实体 Category 和 Product 看起来与此类似:

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

    /**
     * @var string
     * @ORM\Column(name="name", type="string")
     */
    private $name;

    /**
     * @var \Doctrine\Common\Collections\ArrayCollection
     * @ORM\OneToMany(targetEntity="Product", mappedBy="category")
     */
    private $products;

    public function __toString()
    {
        return $this->name;
    }
}

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

    /**
     * @var string
     * @ORM\Column(name="name", type="string")
     */
    private $name;

    /**
     * @var string
     * @ORM\Column(name="description", type="text")
     */
    private $description;

    /**
     * @var Category
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="products")
     */
     private $category;

     /**
      * @var boolean
      */
     private $cancel;

     /**
      * @var boolean
      */
     private $asap;
}

现在,为产品取消创建元模型:

class Cancel
{
    /**
     * @var string
     */
    private $name;

    /**
     * @var \Doctrine\Common\Collections\ArrayCollection
     */
    private $products;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->products = new \Doctrine\Common\Collections\ArrayCollection();
    }
}

注意:这不是实体(表),而只是普通的 'ol PHP 对象。

为这些 Product 和 Category 生成 CRUD,并使用以下 buildForm 方法为 Cancel 模型创建 CancelType:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('name');
    $builder->add('products', 'collection', array('type' => new ProductType()));
}

创建将呈现我们的新 CancelType 的操作

public function cancelAction()
{
    $em = $this->getDoctrine()->getManager();
    $productsToCancel = $em->getRepository('AcmeDemoBundle:Product')->findAll();

    $cancel = new Cancel();
    foreach ($productsToCancel as $product) {
        $cancel->addProduct($product);
    }
    $form = $this->createForm(new CancelType(), $cancel);

    return $this->render('AcmeDemoBundle:Product:cancel.html.twig', array(
        'form' => $form->createView(),
    ));
}

并使用以下内容创建 cancel.html.twig:

<div>
    {{ form_widget(form.name) }}
</div>

{% for product in form.products %}
    <fieldset>
        <legend>{{ product.vars.value.category.name }}</legend>
        <table>
            <tr>
                <td>{{ product.vars.value.name }}</td>
                <td>
                    {{ form_widget(product.cancel) }} cancel
                    {{ form_widget(product.asap) }} asap
                </td>
            </tr>
            <tr>
                <td>
                    {{ product.vars.value.description }}
                </td>
            </tr>
        </table>
    </fieldset>
{% endfor %}

通过标准 Symfony2 表单验证,您将拥有您想要的一切以及优势。

最后一件事是在控制器中添加操作来处理表单提交:)

于 2013-06-25T19:55:34.467 回答
0

在这种情况下,您应该使用表单集合。symfony2 文档中的示例显示了如何做到这一点。

于 2013-06-24T21:55:23.373 回答