将选项加载到基于Symfony 2中基于用户ID的表单的下拉列表中

安迪·福尔摩斯(Andy Holmes)

我有一个问题要问您,请给我一些我正在做的事情,我将尽力解释一下这个想法。我有一个系统,用户可以将壁虎添加到数据库中,当添加壁虎时,它将用户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));
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

基于登录用户加载表单下拉选项

基于下拉列表选项加载内容的PHP表单

基于下拉选项加载内容的PHP表单

如何将基于日期的用户特定信息加载到SQL中单独的日期列中

如何基于其他下拉列表选择将本地Json加载到Flutter DropDown?

Javascript从下拉列表中获取选项基于该值

HTML中的下拉列表,其中包含基于php行的选项

如何将数据从MySql数据库加载到列表(基于控制台的应用程序)中?

将数据加载到angularjs的下拉列表中

Dhtmlx将数据加载到下拉列表中

将数据加载到java中的下拉列表?

如何轻松地将基于XML的配置文件加载到Java类中?

如何将图像加载到PictureBox;基于存储在数据库中的图像位置

如何将基于自定义图像的数据集加载到Pytorch中以用于CNN?

JS中未使用context.drawImage()将图像加载到画布上-基于图块的游戏

SQL Server引擎如何基于聚簇索引将数据加载到内存中?

如何在Symfony2 / 3中基于用户角色自定义表单字段?

在jQuery的另一个下拉列表中基于所选选项显示隐藏的下拉列表

如何使用集合为用户表单中的下拉列表提供选项 - Excel VBA

引导程序选项卡:将NGL查看器加载到选项卡中

如何基于另一个下拉选择过滤下拉列表中的选项

在Laravel中基于父ID返回未定义的ajax下拉列表

jQuery中基于表单下拉选择的输入触发器

将csv文件加载到列表中

将数据帧加载到列表中

如何基于地图范围将GeoJSON数据动态加载到OpenLayers 3.5.0地图图层中?

是否存在基于UI的将CSV数据加载到Azure SQL数据库的方法?

Angular 8-如何将惰性模块加载到选项卡中

将标签内容加载到引导程序中的选择选项?