簡體   English   中英

在symfony 2中根據用戶ID將選項加載到下拉列表中

[英]Load options into drop down on a form based on user's id in symfony 2

我有一個問題要問,請給我一些想法,我將盡力解釋一下。 我有一個系統,用戶可以將壁虎添加到數據庫中,添加壁虎后,它將用戶ID保存到名為user_id的列中-這很完美,並為我現在想要實現的目標做好了准備。

我有一個系統,用戶可以為該壁虎添加重量條目,問題是,現在它僅加載數據庫中的每個壁虎,而不是特定於該用戶的壁虎。

這是我的Weight.php實體的一部分:

/**
 * @ORM\ManyToOne(targetEntity="Gecko", inversedBy="weights")
 * @ORM\JoinColumn(name="gecko_id", referencedColumnName="id")
 */
private $geckoId;

鏈接到Gecko.php這一部分:

/**
 * @ORM\OneToMany(targetEntity="Weight", mappedBy="geckoId", cascade={"persist", "remove"})
*/
private $weights;

這是Gecko.php實體內的用戶部分,它鏈接當前用戶的ID以保存到數據庫:

/**
 * @ORM\ManyToOne(targetEntity="Breedr\UserBundle\Entity\User", inversedBy="geckos")
 * @ORM\JoinColumn(name="user_id", referencedColumnName="id")
 */
protected $user;

以及User.php實體中的鏈接部分:

/**
 * @ORM\OneToMany(targetEntity="Breedr\GeckoBundle\Entity\Gecko", mappedBy="user", cascade={"persist", "remove"})
 */
protected $geckos;

現在,這是我的Weight實體FormWeightType.php ):

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('weighedDate')
        ->add('weight')
        ->add('geckoId')
    ;
}

根據上面的部分,您會得到一個下拉列表,如下所示: 重量輸入表

因此,我現在試圖實現的是僅顯示與當前用戶ID鏈接的壁虎。 實現此目標的最佳方法是什么?

提前致謝 :)

安迪

編輯:

這是我的WeightType文件:

<?php

namespace Breedr\GeckoBundle\Form;

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

class WeightType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('weighedDate')
            ->add('weight')
            ->add('geckoId')
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Breedr\GeckoBundle\Entity\Weight'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'breedr_geckobundle_weight';
    }
}

編輯2:這是我的創建表單片段:

private function createCreateForm(Weight $entity)
    {
        $form = $this->createForm(new WeightType(), $entity, array(
            'action' => $this->generateUrl('weight_create'),
            'method' => 'POST',
        ));

        $form->add('submit', 'submit', array('label' => 'Create'));

        return $form;
    }

您必須使用實體字段類型 + query_build選項。 因此,您可以構建一個自定義查詢以過濾結果,例如:

<?php 
namespace AppBundle\Form\Type;

use Doctrine\ORM\EntityRepository;
// ...

$builder->add('users', 'entity', array(
    'class' => 'AcmeHelloBundle:User',
    'query_builder' => function (EntityRepository $er) {
        return $er->createQueryBuilder('u')
            ->orderBy('u.username', 'ASC');
    },
));

在您的特定情況下,您的表單類型可能看起來像這樣:

<?php 
# maybe you need to fix some namespaces...

use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;

class WeightType extends AbstractType
{

     /** @var int */
    protected $currentUserId;

    /**
     * param int $currentUserId It can be passed from controller 
     * when creating form instance
     */
    public function __construct($currentUserId)
    {
        $this->currentUserId = $currentUserId;
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $id = $this->currentUserId;

        $builder->add('users', 'entity', array(
            'class' => 'GeckoBundle:Gecko',
            'query_builder' => function (EntityRepository $er) use ($id) {
                return $er->createQueryBuilder('g')
                    ->where('user_id = ?')                  
                    ->setParameter(0, $id);
            },
        ));
    }    
}

在控制器上...

<?php 
//...

public function add()
{
   $currentUserId = $this->getUser()->getId(); # may be it...
   $form = $this->createForm(new WeigthType($currentUserId));
}

暫無
暫無

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

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