Symfony 3 - 构建器表单 - 按选择过滤器选择?

时间:2017-03-22 17:38:54

标签: forms symfony select many-to-many symfony-2.3

我需要有关Symfony 3的表单管理方面的帮助。

  • 操作:使用“类别”实体过滤其他实体 实体“子类别”以单一形式出现。一个精度 “类别”实体通过ManyToMany关系链接到 “子类别”实体。

  • 查看:当我在第一个选择我选择的类别时 选择,第二个选择只向我提出子类别 这一个。

我必须使用表单构建器或Twig过滤器的Ajax。我找不到干净简单的方法,所以我请求你的帮助。

1 个答案:

答案 0 :(得分: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 %}