簡體   English   中英

Symfony2表單收集字段未顯示

[英]Symfony2 form collection field not showing up

我會解釋我要做什么。

我有以下實體,經銷商品牌和類型。

1經銷商可以關聯許多品牌,並且每個關聯也將關聯一種類型,這就是為什么中間表具有manyToMany關系。

我想創建一個表格,將代理商添加到我們的系統中,這樣做時,他們可以選擇關聯的品牌(很少的品牌,因此我們希望將其顯示為復選框)和類型,但是嘗試使用直到現在,品牌還是很棘手。

品牌實體

/**
 * Brand
 *
 * @ORM\Table()
 * @ORM\Entity
 */

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

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

/**
 * @ORM\ManyToMany(targetEntity="TypeBrand")
 * @ORM\JoinTable(name="brand_type",
 *      joinColumns={@ORM\JoinColumn(name="brand_id", referencedColumnName="id")},
 *      inverseJoinColumns={@ORM\JoinColumn(name="type_id", referencedColumnName="id")}
 *      )
 */
private $type;

/**
 * @ORM\OneToMany(targetEntity="DealerBrand", mappedBy="brand")
*/
private $dealerBrand;

public function __construct()
{
    $this->type = new ArrayCollection();
    $this->dealerBrand = new ArrayCollection();
}

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

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

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

    return $this;
}

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

public function addType(TypeBrand $type)
{
    $this->type[] = $type;
}

public function getType()
{
    return $this->type;
}

public function addDealerBrand($dealerBrand)
{
    $this->dealerBrand[] = $dealerBrand;
}

public function getDealerBrand()
{
    return $this->dealerBrand;
}

}

經銷商實體

/**
* Dealer
*
* @ORM\Table("dealer")
* @ORM\Entity(repositoryClass="Project\DealersBundle\Entity\Repository\DealerRepository")
* @Gedmo\Loggable
*/
class Dealer
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 *
 * @ORM\Column(name="name", type="string", length=255, unique=true)
 * @Assert\NotBlank()
 * @Assert\Length(min = "10")
 */
private $name;

/**
 * @ORM\OneToMany(targetEntity="DealerBrand", mappedBy="dealer")
 *
*/
private $dealerBrand;

public function __construct()
{
    $this->dealerBrand = new ArrayCollection();
}

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

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

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

    return $this;
}

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

public function addDealerBrand($dealerBrand)
{
    $this->dealerBrand[] = $dealerBrand;
}

public function getDealerBrand()
{
    return $this->dealerBrand;
}
}

經銷商品牌實體

/**
* DealerBrand
*
* @ORM\Table("dealer_brand")
* @ORM\Entity
*/
class DealerBrand
{
/**
 * @var integer
 *
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Dealer", inversedBy="dealerBrand")
 */
private $dealer;

/**
 * @var integer
 *
 * @ORM\Id
 * @ORM\ManyToOne(targetEntity="Brand", inversedBy="dealerBrand")
 */
private $brand;

/**
 * Set dealer
 *
 * @param integer $dealer
 * @return DealerBrand
 */
public function setDealer($dealer)
{
    $this->dealer = $dealer;

    return $this;
}

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

/**
 * Set brand
 *
 * @param integer $brand
 * @return DealerBrand
 */
public function setBrand($brand)
{
    $this->brand = $brand;

    return $this;
}

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

現在這是我的表單

DealerBrandType

class DealerBrandType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('brand', 'entity', array(
                'class'     => 'Project\DealersBundle\Entity\Brand',
                'property'  => 'name',
                'multiple'  => true,
                'expanded'  => true,
            ));
}

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

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

}

DealerType

    class DealerType extends AbstractType
    {
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name')
            ->add('dealerBrand', 'collection', array(
                    'type'          => new DealerBrandType(),
                    'allow_add'     => true,
                    'allow_delete'  => true,
                ))
            ->add('Save', 'submit');
    }

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

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

And this is my controller

public function addAction()
{
        $dealer = new Dealer();

        $form = $this->createForm(new DealerType(), $dealer);

        $form->handleRequest($this->getRequest());

        if ($form->isValid()) {

            $this->getDoctrine()->getManager()->persist($dealer);
            $this->getDoctrine()->getManager()->flush();

            return $this->redirect($this->generateUrl('dealers_list'));
        }

        return $this->render(
            'ProjectDealersBundle:Dealers:AddDealer.html.twig',
            array(
                'form' => $form->createView()
            )
        );
    }

如果這不是正確的方法,請告訴我,如果您看到不良代碼,也請告訴我,這樣我可以改善

*編輯*

這是我需要的結果

http://tinypic.com/r/24pkzdc/8

您可以在此處看到品牌,等等..這樣的想法是,在保存經銷商時,您還保存了與品牌的關聯

*結束編輯*

謝謝!

我不確定這是否是最好的答案,但是您可以通過在表單中​​進行自定義查詢來實現:

        ->add('contact', 'entity', array(
            'class'         => 'AcmeBundle:Entity'
            'query_builder' => function ( \acme\bundle\Entity\entityRepository $c){

                $qb = $c->createQueryBuilder('a');

                return  $qb->orderBy('a.nom', 'ASC')
                            ->join('a.categories', 'c')
                            ->where( $qb->expr()->in ( 'c.id', ':listCategories') )
                                ->setParameter( 'listCategories', array (
                                    7, 
                                ));
            },
            'attr'          => array( 'class' => 'other')                
        ))
    ;
}

通過使用“實體”字段類型,我可以使用選項“ query_builder”注入自定義查詢(有關更多信息,請參見: http ://symfony.com/doc/current/reference/forms/types/entity.html)

然后,在內部聲明一個匿名函數( http://php.net/manual/en/functions.anonymous.php ),以使用createQueryBuilder創建自定義查詢。

使用createQueryBuilder,您可以創建自定義查詢(在這里,我幾乎像您一樣具有多對多關系,我只想通過過濾數組(set參數)獲得其中的一些關系。

這是自定義查詢的文檔: http : //symfony.com/doc/current/book/doctrine.html

查詢結果(如果不為null)將顯示在您的表單中

/ **替代答案** /

如果要在您的選擇中顯示帶有樹的經銷商和品牌,則必須:

1)進行查詢以返回您的經銷商和品牌的對象容器

2)創建一個具有一定深度的數組,該選擇將顯示為樹:

這是一個例子來說明:

    ->add('contact', 'entity', array(
        'class'         => 'AcmeBundle:Entity'
        'query_builder' => function ( \acme\bundle\Entity\entityRepository $c){

            $dealers = $c->yourFunctionThatReturnesDealers('d');

            $dealersGroupedByBrands = array();
    foreach ( $dealers as $dealer) {
                    foreach ($dealers->getBrands() as $brand) {
            $dealersGroupedByBrands[$brand->getName()][] = $dealer;
        }

            return  $dealersGroupedByBrands;
        },
        'attr'          => array( 'class' => 'other')                
    ))
;

    }

很酷,不是嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM