【问题标题】:Symfony 3 - Builder form - Filter Select by Select?Symfony 3 - 构建器表单 - 按选择过滤选择?
【发布时间】:2017-08-14 23:57:18
【问题描述】:

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


  • 动作:使用“类别”实体过滤另一个 单一形式的实体“子类别”。一个精度 “类别”实体通过多对多关系链接到 “子类别”实体。

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


我必须使用 Ajax,通过 Form Builder 或 Twig 过滤器。我找不到一个干净简单的方法,所以我请求你的帮助。

【问题讨论】:

  • 嗨@Morgan,欢迎来到SO!请阅读有关如何提问here 的指南。为了回答你的问题 - 它需要用英文写:)
  • 完成了。对不起
  • 不用担心。你有一些代码可以给我们看吗?你都尝试了些什么?我要做的是自定义Sub Category 字段的呈现并将Select2 附加到它。还有一些捆绑包可以帮助您在表单中更快地使用 select2 字段。

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


【解决方案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 %}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多