2016-08-17 9 views
1

でカスタムリポジトリメソッドを使用しますデフォルト値を返します。これはメソッドです:のSymfony 3.1は、私は実体を持っている形

public function getUserSettings($user_id) 
{ 

    $user_preferences = $this->findOneBy(array('id' => $user_id)); 

    if($user_preferences){ 
     return array(
      'user_preferences' => array(
          'background_color' => $user_preferences->getBackgroundColor(), 
          'text_color' => $user_preferences->getTextColor() 
      ) 
     ); 
    }else{ 
     return array(
      'user_preferences' => array(
          'background_color' => '#000000', 
          'text_color' => '#FFFFFF' 
      ) 
     ); 
    } 
} 

私はuserSettingsTypeを持っている:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('background_color', TextType::class) 
     ->add('text_color', TextType::class) 
    ; 
} 
public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => 'AppBundle\Entity\UserSettings', 
    )); 
} 

とコントローラ:

public function usersettingsAction(Request $request) 
{ 
    $user = $this->get('security.token_storage')->getToken()->getUser(); 

    $data = $request->request->all(); 
    $user_settings = new UserSettings(); 
    $form = $this->createForm(UserSettingsType::class, $user_settings); 
    $form->handleRequest($request); 

    if ($form->isSubmitted() && $form->isValid()) { 

     $em = $this->getDoctrine()->getManager(); 
     $em->persist($user_settings); 
     $em->flush(); 
    } 

    return $this->render('user/user_settings.html.twig', $user_settings); 
} 

質問です:どのように私は(リポジトリメソッドのgetUserSettingsを使用することができます)に初めてフォームフィールドをロードするか?

私が見つけた投稿/回答/チュートリアル/クックブックは、この状況を解決するために役立たなかった。

答えて

1

サービスは、教義のリポジトリにアクセスするためのサービスコンテナを注入し、その後(formEvents程度docに見て)自分のフォームタイプでPRE_SET_DATAフォームイベントを使用するとあなたのUserSettingsTypeを定義することができます:あなたのフォームを宣言

1-サービスコンテナ

form.type.user_setting: 
     class: YourProject\YourBundle\Form\Type\UserSettingsType 
     arguments: 
      - '@service_container' 
     tags: 
      - { name: form.type, alias: user_setting_type } 

2-注入サービスなど種類は、その後、あなたのコントローラでそれを呼び出す:

$form = $this->createForm($this->get('form.type.user_setting'), $user_settings); 

3 - 最後に、あなたのUserSettingsTypeにする教義とPRE_SET_DATAイベントにアクセスするための容器を使用し、「水和物、フォームが最初にフィールドにロードされる」:

<?php 

class UserSettingsType extends AbstractType 
{ 
    protected $container; 

    public function __construct($container) 
    { 
     $this->container = $container; 
    } 

    //an example to access to your repository 
    public funtion myFunction($userId) 
    { 
     return $this->container 
       ->get('doctrine') 
       ->getRepository('yourRepository') 
       ->getUserSettings($userId); 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
     ->addEventListener(
      FormEvents::PRE_SET_DATA, 
      function(FormEvent $event) { 
       $form = $event->getForm(); 

       //get userSettingId if you need it 
       $userSetting = $event->getData(); 
       $userSettingId = $userSetting->getId(); 

       //you can call 'myFunction' here for example to do want you want 

       $form 
       ->add('background_color', TextType::class) 
       ->add('text_color', TextType::class) 
       ; 
     }); 
    } 
} 
+0

これが唯一の方法ですか?私は私が持っているそれぞれのフォームのためのサービスを定義するのが好きではありません。コントローラーだけで仕事をする方法はありますか? – Carlos

+0

いいえ、コントローラでフォームを構築しても同じことができると思いますが、上記で説明した方法は最もクリーンな方法です。ロジックを簡単に分離できます。 – DOZ

0

おかげDOZ。

あなたはこの書き込みを意味:コントローラで

$user = $this->get('security.token_storage')->getToken()->getUser(); 
    $em = $this->getDoctrine()->getManager(); 
    $user_settings_temp = $em->getRepository('AppBundle:UserSettings')->getUserSettings($user->getId()); 

    $user_settings = new UserSettings(); 
    $user_settings->setUser($user->getId()); 
    $user_settings->setBackgroundColor($user_settings_temp['background_color']); 
    $user_settings->setTextColor($user_settings_temp['text_color']); 
    $user_settings->setFontSize($user_settings_temp['font_size']); 
    $user_settings->setMenuEmbedded($user_settings_temp['menu_embedded']); 
    $user_settings->setMenuSide($user_settings_temp['menu_side']); 
    $user_settings->setShowImages($user_settings_temp['show_images']); 

    // Create the form object 
    $form = $this->createForm(UserSettingsType::class, $user_settings); 

を。

私はそれほど「エレガント」ではないことに同意しますが、私は物事を維持することがより明確です。

関連する問題