質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Symfony

Symfony はPHPで記述されたWebアプリケーションフレームワークです。よく利用するコーディングをテンプレーティングするなど、Webアプリケーション開発の効率化を目的として設計されています。

Q&A

解決済

2回答

8088閲覧

【Symfony3】 フォームクラスへChoiceType(チェックボックス)用の選択肢の配列をコントローラから渡したい

yetis

総合スコア26

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Symfony

Symfony はPHPで記述されたWebアプリケーションフレームワークです。よく利用するコーディングをテンプレーティングするなど、Webアプリケーション開発の効率化を目的として設計されています。

0グッド

0クリップ

投稿2016/10/01 13:04

編集2016/10/01 13:20

バージョン

Symfony 3.1.1

###前提・実現したいこと

フォームタイプをクラス化し、そこでチェックボックスを生成して出力しようと思います。
(例:src/OrderBundle/Form/PlacesType のような、AbstractTypeを継承しているクラスです。)

チェックボックスで使用する選択肢はDBから引っ張ってきた値をコントローラから渡して利用したいのですが、
PlacesTypeクラスに動的に選択肢の配列を渡す方法がわかりませんでした。

###該当のソースコード

例:何箇所かの場所を選択させるチェックボックスを出力するフォーム

Type
src/OrderBundle/Form/PlacesType.php

<?php namespace OrderBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\OptionsResolver\OptionsResolverInterface; class PlacesType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { //★この場所の情報はコントローラー側から動的に渡したい $places = array( '新宿オフィス' => 1, '渋谷オフィス' => 2, '四谷オフィス' => 3, ); $builder ->add('place', ChoiceType::class, array( 'choices' => $places, 'expanded' => true, 'multiple' => true, 'label' => '場所', ) ) ->add('submit', SubmitType::class, [ 'label' => '送信', ]) ->getForm(); } public function getName() { return 'place'; } }

Controller
src/OrderBundle/Controller/OrderController.php

・・・ use OrderBundle\Entity\Places; use OrderBundle\Form\PlacesType; ・・・ public function orderPlaceAction(Request $request) { $place = new Places(); $form = $this->createForm( PlacesType::class, $place); return $this->render('OrderBundle:Order:order-place.html.twig', array('form' => $form->createView(),) );

###試したこと

Controller内にてcreateFormBuider()を利用してフォームを生成する、in-placeなやり方は問題なく実装できました。


実際に表題のやり方ができるのか、できるとしたら具体的にどのように書けるのか、
参考にすべきURLや箇所など、ご教示頂けますと大変助かります。
(Symfony 2系でもなにかヒントになる物がありましたら、知りたいと考えています)

宜しくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

以下の方法でSymfony3にて動作しました !

Type
src/OrderBundle/Form/PlacesType.php

php

1<?php 2namespace OrderBundle\Form; 3 4use Symfony\Component\Form\AbstractType; 5use Symfony\Component\Form\FormBuilderInterface; 6use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 7use Symfony\Component\Form\Extension\Core\Type\SubmitType; 8 9//★OptionsResolverInterface → OptionsResolverに。 10use Symfony\Component\OptionsResolver\OptionsResolver; 11 12class PlacesType extends AbstractType 13{ 14 public function buildForm(FormBuilderInterface $builder, array $options) 15 { 16 $builder 17 ->add('place', ChoiceType::class, array( 18 'choices' => $options['places_array'], //★$optionsから取得 19 'expanded' => true, 20 'multiple' => true, 21 'label' => '場所', 22 ) 23 ) 24 ->add('submit', SubmitType::class, [ 25 'label' => '送信', 26 ]) 27 ->getForm(); 28 29 } 30 31 public function getName() 32 { 33 return 'place'; 34 } 35 36 //★オプションのコンフィグレーション 37 public function configureOptions(OptionsResolver $resolver) 38 { 39 $resolver->setDefaults(array( 40 'places_array' => null, 41 )); 42 } 43} 44

Controller
src/OrderBundle/Controller/OrderController.php

php

1<?php 2 ・・・ 3 use OrderBundle\Entity\Places; 4 use OrderBundle\Form\PlacesType; 5 ・・・ 6 7 public function orderPlaceAction(Request $request) 8 { 9 //DBから取得したとして・・・ 10 $places_array = array( 11 '新宿オフィス(controllerからoptionで)' => 4, 12 '渋谷オフィス(controllerからoptionで)' => 5, 13 '四谷オフィス(controllerからoptionで)' => 6, 14 ); 15 16 $place = new Places(); 17 18 //★第三引数で配列で指定 19 $form = $this->createForm(PlacesType::class, $place, array( 20 'places_array' => $places_array, 21 )); 22 23 return $this->render('OrderBundle:Order:order-place.html.twig', 24 array('form' => $form->createView(),) 25 );

参考になったリンク
http://stackoverflow.com/questions/36905490/how-to-pass-parameter-to-formtype-constructor-from-controller

http://qiita.com/issei-m/items/ebad31ce83b0be0cb54a

投稿2016/10/02 04:51

yetis

総合スコア26

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Symfony2系の話かつ質問者の要件からは
ずれてしまいますがDBから引き出した値で動的なFormを作るやり方でこういうやり方があるようです。

リンク内容

現在環境がなく試せてないので恐縮ですが、恐らく__constructで指定してやれば

php

1class PlacesType extends AbstractType 2{ 3 4 private $places; 5 6 public function __construct($places) 7 { 8 $this->places = $places; 9 } 10 11 public function buildForm(FormBuilderInterface $builder, array $options) 12 { 13 $builder 14 ->add('place', ChoiceType::class, array( 15 'choices' => $places, 16 'expanded' => true, 17 'multiple' => true, 18 'label' => '場所', 19 ) 20 ) 21 ->add('submit', SubmitType::class, [ 22 'label' => '送信', 23 ]) 24 ->getForm(); 25... 26

Controller

php

1 $form = $this->createForm( new PlacesType($place));

これでいけそうな気がします。
3系はformtypeの指定の仕方が変わっている様なのでそこを変えないとダメっぽいですが
ご参考程度になれば

投稿2016/10/01 23:55

編集2016/10/02 00:10
onakanishi

総合スコア36

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yetis

2016/10/02 04:57

お時間ありがとうございました。3系で仕様が変更になってたため全く同様のやり方はできませんでしたが、コンストラクタで渡すという部分から、昨日は見つけられなかったstackoverflowを探しあてることができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問