2017-03-22 39 views
0

我需要管理形式幫助上的Symfony 3.Symfony 3 - Builder窗體 - 過濾器選擇選擇?


  • 行動:使用「類別」實體在一個單一的形式來篩選另一個 實體「子類別」。精密 「類別」實體由多對多關係 的「子類別」實體相連。

  • 查看:當我選擇我選擇的第一 選擇類別,僅次於選擇提出我的 這其中的子類別。


我不得不使用Ajax,由窗體生成器或嫩枝過濾器。我找不到一個乾淨而簡單的方法,所以我呼籲你的幫助。

+0

你好@Morgan,歡迎來到SO!請閱讀關於如何提問的指南[這裏](https://stackoverflow.com/help/how-to-ask)。爲了回答你的問題 - 它需要用英文寫成:) – tftd

+0

完成了。對不起 –

+0

不用擔心。你有一些代碼可以告訴我們嗎?你試過什麼了?我會做的是自定義「子類別」字段的呈現並將「Select2」附加到它。還有一些可以幫助在表單中更快地使用'select2'字段的包。 – tftd

回答

1

它實際上不是太複雜,但您將需要一個AJAX請求。這部分不需要真實的表格,因爲您對已選擇的主類別不感興趣,但僅對子類別有興趣。你最想要的時候,如果在子類中已被選中但也有一堆一堆的可能性執行一些動作,所以我只給你一推前鋒:

// controller 

namespace AppBundle\Controller; 

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 

class DefaultController extends Controller 
{ 
    /** 
    * @Route("/", name="my_action") 
    */ 
    public function myAction() 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $categories = $em->getRepository('AppBundle:Category')->findAll(); 

     return $this->render('default/index.html.twig', array(
      'categories' => $categories, 
     )); 
    } 

    /** 
    * @Route("/subcategories", name="ajax_subcategories") 
    */ 
    public function ajaxSubCategoriesAction(Request $request) 
    { 
     $em = $this->getDoctrine()->getManager(); 

     $category = $em->getRepository('AppBundle:Category')->find($request->get('id')); 

     if(null === $category) 
     { 
      return new Response(''); 
     } 

     $options = ''; 

     foreach($category->getSubCategories() as $subCategory) 
     { 
      $options .= '<option value="'.$subCategory->getId().'">'.$subCategory->getName().'</option>'; 
     } 

     return new Response($options); 
    } 
} 

和模板:

{% extends 'base.html.twig' %} 

{% block body %} 
    <h1>My page</h1> 

    <select id="category"> 
     {% for category in categories %} 
      <option value="{{ category.id }}">{{ category.name }}</option> 
     {% endfor %} 
    </select> 

    <select id="subCategory"> 
     {% if categories|length %} 
      {% for subCategory in categories[0].subCategories %} 
       <option value="{{ subCategory.id }}">{{ subCategory.name }}</option> 
      {% endfor %} 
     {% endif %} 
    </select> 
{% endblock %} 

{% block javascripts %} 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> 
    <script> 
     $(function() { 
      $('#category').change(function() { 
       $.ajax({ 
        url: '{{ path('ajax_subcategories') }}', 
        method: 'get', 
        data: {"id":$(this).val()}, 
        success: function(data) { 
         $('#subCategory').html(data); 
         alert('SubCategory selected: ' + $('#subCategory').val()); 
         // Now do something else 
        } 
       }); 
      }); 
      $('#subCategory').change(function() { 
       alert('SubCategory selected: ' + $(this).val()); 
       // Now do something else 
      }); 
     }); 
    </script> 
{% endblock %} 
+0

好的,非常感謝你爲我工作。 –