Witam
Chciałbym w swoim formularzu mieć możliwość dodania nowej kategorii. Z możliwością wyboru kategorii nadrzędnej. A dokładniej użytkownik w pieszym <select></select> wybiera kategorię główną. Na podstawie tej kategorii pobieram Ajaxem dzieci tej kategorii. Jeżeli są dzieci to AJAX tworzy poniżej kolejnego selecta w którym wybieramy dziecko.
Doszedłem do momentu w którym wysyłam dane AJAXem, a Controller zwraca mi tablice obiektów z dziećmi danej kategorii. I to działa poprawnie
I jak teraz stworzyć nowego selecta z w którym do wyboru będzie lista dzieci zwróconych AJAXem ?
CategoryController.php
<?php
namespace Test\AdminBundle\Controller;
use Test\AdminBundle\Entity\Category as Category;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request as Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
class CategoryController extends Controller
{
public function newAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$categoryRepository = $em->getRepository('TestAdminBundle:Category');
$root = $categoryRepository->findOneBy(array('left'=>1
));
$children = $categoryRepository->getChildren($root);
$form = $this->CreateFormBuilder()
->setAction('')
->add('id', 'entity', array( 'class' => 'TestAdminBundle:Category',
'property' =>'name',
'choices' => $children
))
->add('name','text')
->getForm();
$form->handleRequest($request);
if($form->isValid()){
$data = $form->getData();
$newCategory = new Category();
$newCategory->setName($data['name']);
$em = $this->getDoctrine()->getManager();
$categoryRepository = $em->getRepository('TestAdminBundle:Category');
$root = $categoryRepository->findOneBy(array('id'=>$data['id']));
$categoryRepository->addChild($root, $newCategory);
}
return $this->render('TestAdminBundle:Category:new.html.twig',
'form' => $form->createView(),
)
);
}
public function listAction()
{
return $this->render('TestAdminBundle:Category:list.html.twig');
}
public function getChildrenAction()
{
$request = Request::createFromGlobals();
$serializer = new Serializer
(array(new GetSetMethodNormalizer
()), array('json' => new JsonEncoder()));
$em = $this->getDoctrine()->getManager();
$categoryRepository = $em->getRepository('TestAdminBundle:Category');
$root = $categoryRepository->findOneBy(array('id'=>$request->request->get('id')));
$children = $categoryRepository->getChildren($root);
$data = $serializer->serialize($children, 'json');
$response = new JsonResponse();
$response->setData($data);
return $response;
}
}
new.html.twig
{% extends 'TestAdminBundle::base.html.twig' %}
{% block body %}
<li><i class="fa fa-home"></i><a href="{{ path('Admin') }}">Home
</a></li> <li class="active">Nowa kategoria
</li> <div class="top-content">
<ul class="list-inline mini-stat"> <span class="stat-value stat-color-orange"><i class="fa fa-plus-circle"></i> 81,450
</span> <span id="mini-bar-chart1" class="mini-bar-chart"></span> <span class="stat-value stat-color-blue"><i class="fa fa-plus-circle"></i> 150,743
</span> <span id="mini-bar-chart2" class="mini-bar-chart"></span> <span class="stat-value stat-color-seagreen"><i class="fa fa-plus-circle"></i> 43,748
</span> <span id="mini-bar-chart3" class="mini-bar-chart"></span> <!-- main -->
<div class="main-header"> <em>dodaj nową kategorię ogłoszeń
</em> <div class="main-content"> <!-- BASIC VALIDATION -->
<div class="widget-header"> <h3>Podstawowe informacje o kategorii
</h3> <div class="widget-content">
{{ form_start(form, {'attr':{ 'id':'basic-form', novalidate:'novalidate' }}) }}
{{ form_label(form.id, 'Wybierz kategorię nadrzędną') }}
{{ form_widget(
form.id,
{ 'attr': {'name':'id', 'class':'form-control id'} }
) }}
$('.id').change(function(){
var id = $('.id').val();
$.ajax({
type: "POST",
url: "{{ path('AjaxAdminCategoryGetChildren') }}",
dataType: 'json',
data: {
id: id
},
success : function(response) {
//co zrobic tu aby w HTML pojawił sie nowy select, tak abym mógl
//go obsluzyc w CategoryController
}
})
})
{{ form_label(form.name, 'Nazwa') }}
{{ form_widget(
form.name,
{'attr':{'name':'name', 'class':'form-control', 'id':'text-input', 'placeholder':'Wpisz nazwę kategorii'}}
) }}
<button type="submit" class="btn btn-primary">Zapisz
</button> {{ form_end(form) }}
<!-- END BASIC VALIDATION -->
{% endblock %}