如何从数据库重复行的表单元素

时间:2015-06-09 16:38:13

标签: php symfony symfony-forms symfony-2.6

我有一个表单可以按照我的预期工作(下面的代码),我可以通过Doctrine从数据库填充一行。

但是,我很难看到如何重复这个表单的元素来编辑一个表单中的所有行(例如20个);希望在单个页面上更新单个表单中所有行的所有字段。

例如:

name[0]
description[0]
url[0]
name[1]
description[1]
url[1]
name[2]
description[2]
url[2]

我看到了收藏品的使用建议,但它们似乎不适合重复我能理解的所有形式。

形式:     

namespace Acme\Bundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class ContactType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'name',
                'text',
                array(
                    'label' => 'Company Name'
                )
            )
            ->add(
                'description',
                'text',
                array(
                    'label' => 'Company Description'
                )
            )
            ->add(
                'url',
                'text',
                array(
                    'label' => 'Company URL'
                )
            )
            ->add(
                'Update Companies',
                'submit'
            );
    }


    public function getName()
    {
        return 'ContactType';
    }
}

实体:

<?php

namespace Acme\Bundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * Contacts
 *
 * @ORM\Table(options={"engine":"MyISAM", "collate":"utf8_general_ci", "charset":"utf8"})
 * @ORM\Entity
 */
class Contacts
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

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

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

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

    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set name
     *
     * @param string $name
     * @return Contacts
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * Get name
     *
     * @return string 
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * Set description
     *
     * @param string $description
     * @return Contacts
     */
    public function setDescription($description)
    {
        $this->description = $description;

        return $this;
    }

    /**
     * Get description
     *
     * @return string 
     */
    public function getDescription()
    {
        return $this->description;
    }

    /**
     * Set url
     *
     * @param string $url
     * @return Contacts
     */
    public function setUrl($url)
    {
        $this->url = $url;

        return $this;
    }

    /**
     * Get url
     *
     * @return string 
     */
    public function getUrl()
    {
        return $this->url;
    }
}

1 个答案:

答案 0 :(得分:1)

我认为collection符合您的需求。

创建一个包含一个字段的表单类,即ContactType的集合:

class MyFormClassType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'myField',
                'collection',
                array(
                    'type' => new ContactType ()
                )
            );
    } 

    public function getName()
    {
        return 'my_class';
    }
}

使用此功能,您可以使用相同的格式添加collection Contact

Read More, from the doc