我需要有关Symfony 3的表单管理方面的帮助。
操作:使用“类别”实体过滤其他实体 实体“子类别”以单一形式出现。一个精度 “类别”实体通过ManyToMany关系链接到 “子类别”实体。
查看:当我在第一个选择我选择的类别时 选择,第二个选择只向我提出子类别 这一个。
我必须使用表单构建器或Twig过滤器的Ajax。我找不到干净简单的方法,所以我请求你的帮助。
答案 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 %}