2

私は以下のようなテーブルを持っています:

items
-id (pk) AI
-user_id (fk) references users
-title
-description

認証されたユーザーを必要とするフォーム ページがあります。選択ボックスにユーザーに属する項目を入力したい (select * from items where user_id=loggedinUserId など)

私はドキュメントを見て、これを見つけました:

 $builder->add('items', 'entity', array(
    'class' => 'AcmeHelloBundle:Items',
    'query_builder' => function(EntityRepository $er) {
       return $er->createQueryBuilder('i')
        ->orderBy('i.title', 'ASC');
    },
));

私の質問は、認証されたユーザー ID を symfony 2.1 フォームでこのクエリに渡すにはどうすればよいですか?

4

2 に答える 2

3

@Pattが提供するソリューションは理想的なようですが、私の場合、このフォームは1回だけ、または1ページだけで使用されます。だから私は次のようにすることを好みました:

class ItemType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
       $user=$options['user'];
       $builder->add('itemOffered', 'entity', array(
                'class' => 'TestBundle:Items',
                'query_builder' => function(EntityRepository $er) use ($user) {
                    return $er->createQueryBuilder('i')
                              ->where('i.user =:user')
                              ->setParameter('user', $user);
                }
            ));
    }
}

コントローラー内:

$form = $this->createForm(new ItemType(), new Item(),array('user' => $this->getUser()));
于 2013-02-03T13:59:18.690 に答える
1

2つの可能性があります。

  • コンストラクターを介してパラメーターを注入します(コンストラクター注入) 。
  • フォームのオプションを介してパラメータを挿入します

この素晴らしいスレッドは、それを行うための興味深い方法を示しています(@khepinから)。ただし、@ Bernhard(最初のコメントを参照)が示唆しているように、その場合はもっと簡単な方法があります。


方法1-コンストラクターの挿入:サブスクライバーなどを作成するのが面倒な場合は、フォームコンストラクターにセキュリティコンテキストを直接挿入できます。

ItemType:

namespace Acme\HelloBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Symfony\Component\Security\Core\SecurityContextInterface;
use Symfony\Component\Security\Core\User\UserInterface;

classItemType extends AbstractType
{
    /**
     * @var string
     */
    private $class;

    /**
     * @var UserInterface
     */
    private $user;

    /**
     * @param string $class
     */
    public function __construct($class, SecurityContextInterface $securityContext)
    {
        $this->class = $class;
        $this->user = $securityContext->getRequest->getUser();
    }

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

                $username = $this->user->getUsername();    

                $builder->add('items', 'entity', array(
                    'class' => $this->class,
                    'multiple' => true,
                    'expanded' => true,
                    'query_builder' => function(EntityRepository $er) use ($username) {
                        $query = $er->createQueryBuilder('i')
                            ->select(array('i'))
                            ->leftJoin('i.users', 'u')
                            ->andWhere('u.username = :username')
                            ->setParameter('username', $usename)
                            ->orderBy('i.title', 'ASC');

                        return $query;

                    },
                )
            ));

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => $this->class,
        ));
    }

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

サービスとして宣言します。

<parameters>
    <parameter key="acme_hello.item.class">Acme\HelloBundle\Entity\Item</parameter>
</parameters>

<services>
    <service id="merk_notification.filter.form.type" class="Acme\HelloBundle\Form\Type\ItemType">
        <tag name="form.type" alias="acme_hello_item" />

        <argument>%acme_hello.item.class%</argument>
        <argument type="service" id="security.context" />
    </service>
</services>

フォームを作成するには、次の操作を実行できます。

    $formBuilder = $this->container->get('form.factory');
    $form = $formBuilder->createNamed('acme_hello_item', 'acme_hello_item');
于 2013-02-03T06:08:16.650 に答える