2016-09-26 14 views
1

私が手作業で自分のコードの大部分をやっていたとき、投稿時に投稿として配列として扱うdiv要素の可変数からなるフォームがありました。しかし私は私の人生の間、Symfonyで何か似たようなことをする方法を見つけ出すことができません。そして、私は本当に不満を募らせ始めています。ここでは(私自身の簡単なテンプレートエンジン付き)のオブジェクトのテンプレートクラスの私の元の実装です:symfonyフォームでオブジェクトの配列を作成してレンダリングする方法

<div class="img_transfer"> 
    <img class="toggle" src="{{src}}"> 
    <input class="title" type="text" name="title[{{i}}]" placeholder="Title"><br> 
    Upload to Sta.sh: 
    <input type="radio" name="stash[{{i}}]" value="0" checked="checked"> No 
    <input type="radio" name="stash[{{i}}]" value="1"> Yes<br> 
    Showcase: 
    <input type="radio" name="showcase[{{i}}]" value="0" checked="checked"> No 
    <input type="radio" name="showcase[{{i}}]" value="1"> Yes<br> 
    <input class="save" type="hidden" name="save[{{i}}]" value="0"> 
    <input type="hidden" name="old_path[{{i}}]" value="{{old_path}}"> 
</div> 

{{i}}はループ反復のプレースホルダだったが、これはうまく働いていたが、ここで私がしてきた方法ですsymfonyのでそれをやろうとしている。

$img_tmp = glob('img_tmp/*.*'); 
$data = array(); 
foreach ($img_tmp as $src) { 
    //$inter = end(); 
    $parts = explode('/', $src); 
    $file = end($parts); 
    //$name = explode($inter)[0]; 
    $name = explode('.', $file)[0]; 
    $data[$name] = new Art(); 
} 

$builder = $this->createFormBuilder($data); 
foreach ($data as $key => $value) { 
    //$builder->add($key, (new ArtType())->setSrc($key)); 
    $builder->add($key, ArtType::class, array('img_src' => $key)); 
} 

$form = $builder->getForm(); 

return $this->render('img_transfer.html.twig', array('form' => $form->createView())); 

これは主に、オブジェクトの形を持っている方のためのSO上の別の提案に基づいて、それは私が建設されるフォームにカスタムオプションを送信させませんあるとされますこれは私が手で簡単に実装したことをするための最終的な障壁となるかもしれません。私は提案を全面的に歓迎し、これを行うためのよりハックインな方法を好むだろうし、また、これを行う簡単な方法を見落としているのか、それとも私が知覚するように恐ろしく直感的でないのかを知りたいそうである。私は時間があるときにこれを編集してより良い質問になるように再構成します。

編集:フォーマットと次の追加情報:アプリケーションのこの特定の部分は、「ウェブ/ img_tmp」ディレクトリにダンプされ、任意の名前と拡張子の画像を撮影し、「ウェブにそれらを移動することになっている /img "ディレクトリに移動し、PHPのuniqid()で名前を変更してデータベースに入力します。 "/ img_tmp/"のフィールドごとにグループ化されたセットを生成するものが必要なので、DBに永続化する前にそれぞれの属性を設定できます。一度に複数のオブジェクトを提出する方法について私がまだ見つけているすべてのリソースは、不完全であったり悲惨なことに過度に複雑化しています。

答えて

1

私は、推奨されていないコード、つまりのカスタムタイプのメソッドを探していましたが、これは明らかにSymfony 3.0で削除されました。参考のため、ここではあなたが彼らにフォームパスカスタムオプションで複数のオブジェクトを提出することができる方法の完全なコードは次のとおりです。

コントローラーコード

public function someAction() 
{ 
    $vals = array('customVal1', 'customVal2', 'customVal3'); 
    foreach ($vals as $v) { 
     $data[$v] = new YourObject(); 
    } 

    $builder = $this->createFormBuilder($data); 
    //I put this here so I don't have to scroll all the way to the bottom to submit; 
    //this will render it at the top by default (at least on mine) 
    $builder->add('submit', SubmitType::class, array('label' => 'Submit')); 

    foreach ($vals as $v) { 
     $builder->add($v, YourObjectType::class, array(
      'custom_val' => $v 
     )); 
    } 

    $form = $builder->getForm(); 

    return $this->render('the_page.html.twig', array('form' => $form->createView())); 
} 

カスタムフォームテンプレート

{% block yourobject_widget %} 
    <div> 
     <img src="{{ custom_val }}"> //This is set by the call to setAttribute() in YourObjectType 
     {% for child in form %} 
      {{ form_row(child) }} 
     {% endfor %} 
    </div> 
{% endblock %} 

アプリが/config/config.yml

twig: 
    debug:   "%kernel.debug%" 
    strict_variables: "%kernel.debug%" 
    form_themes: 
     - 'form/fields.html.twig' 

最後にYourObjectType

namespace AppBundle\Form\Type; 

use Symfony\Component\Form\AbstractType; 

use Symfony\Component\Form\Extension\Core\Type\TextType; 
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; 
use Symfony\Component\Form\Extension\Core\Type\CollectionType; 
use Symfony\Component\Form\Extension\Core\Type\HiddenType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 

use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormInterface; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class YourObjectType extends AbstractType 
{ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     parent::configureOptions($resolver); 

     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\YourObject', 
      'custom_val' => '' //This is important. You have to set defaults for 
           //options for Symfony to allow you to pass them 
     )); 
    } 

    public function buildView(FormView $view, FormInterface $form, array $options) 
    { 
     $view->vars['custom_val'] = $options['custom_val']; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('some_text_field', TextType::class) 
      ->add('some_choice_field', ChoiceType::class, array(
       'choices' => array('Yes' => true, 'No' => false), 
       'expanded' => true 
      )) 
      ->add('some_hidden_field', HiddenType::class, array('mapped' => false)) 
      ->setAttribute('custom_val', $options['custom_val']); 
    } 
} 
関連する問題