Hola.
Estoy tratando de hacer un formulario con selects dependientes. He
seguido el siguiente link.
http://sf2.showmethecode.es/app.php/ejemplo/selects-dependientes/location/valencia/edit
Tengo un formulario de busqueda, que he creado sin que dependa de
ninguna entity. Es un formulario estático.
Lo que pretendo es que al seleccionar en el select de juegos, se
actualize el select (hijo) de salas.
Os pongo el código y el error que me da.
En la vista.
<script>
$(function(){
$("#complaint_filter_form_gameId").change(function(){
var data = {
game_id: $(this).val()
};
$.ajax({
type: 'POST',
url: '{{ path('complaint') }}',
data: data,
success: function(data) {
$('#complaint_filter_form_room').html(data);
}
});
});
});
</script>
<form action="{{ path('complaint') }}" method="post" novalidate="true">
{{ form_widget(filterForm) }}
<input type="submit" value="Buscar">
</form>
En el routing.
complaint_select_rooms:
pattern: /selects
defaults: { _controller: "AdminBundle:Complaint:roomList"}
En el controlador.
##Accion a la que llamamos para pasar el parametro y obtener los datos
para el select.
public function roomListAction()
{
$em= $this->getDoctrine()->getEntityManager();
$game_id= $this->getRequest()->request->get('game_id');
if ($game_id) {
$roomList=
$em->getRepository('GenericBundle:Sala')->findBy(array('juego'=>$game_id));
$rooms= array();
foreach ($roomList as $room) {
$rooms[$room->getId()]= $room->getNombre();
}
return new Response($rooms);
} else {
return new Response(array());
}
}
##Acción que carga toda la vista.
public function indexAction()
{
$paginator= $this->get('ideup.simple_paginator');
$paginator->setItemsPerPage(15);
$paginator->setMaxPagerItems(4);
$em = $this->getDoctrine()->getEntityManager();
$filterForm= $this->createForm(new
ComplaintFilterType($this->roomListAction()));
$request= $this->getRequest();
if ($request->getMethod()== 'POST') {
$filterForm->bindRequest($request);
if ($filterForm->isValid()) {
$filterValues=
$this->getValuesFilterForm($filterForm->getData());
$entities=
$paginator->paginate($em->getRepository('AdminBundle:Complaint')->getQueryFilter($filterValues))->getResult();
$entities= $this->getRoomName($em, $entities);
}
} else {
$entities= $em->createQuery('select c from
AdminBundle:Complaint c order by c.date desc');
$entities= $paginator->paginate($entities)->getResult();
$entities= $this->getRoomName($em, $entities);
}
return array(
'entities' => $entities,
'filterForm'=>$filterForm->createView(),
);
}
El form.
?php
/**
* Created by JetBrains PhpStorm.
* User: pablo
* Date: 21/01/13
* Time: 9:40
* To change this template use File | Settings | File Templates.
*/
namespace Mj\AdminBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilder;
use Mj\GenericBundle\Entity\SalaRepository;
/**
* Formulario de filtro de busqueda de denuncias.
*/
class ComplaintFilterType extends AbstractType
{
private $rooms;
public function __construct($roomList)
{
$this->rooms= $roomList;
}
/**
* Formulario
*
* @param \Symfony\Component\Form\FormBuilder $builder
* @param array $options
*/
public function buildForm(FormBuilder $builder, array $options)
{
$builder->add('userIdDenounced', 'text',
array('label'=>'Usuario denunciado', 'required'=>false))
->add('userIdComplainants', 'text',
array('label'=>'Denunciante', 'required'=>false))
->add('gameId', 'entity', array(
'label'=>'Juego',
'required'=>false,
'empty_value'=>'Selecciona...',
'class'=>'GenericBundle:Juego',
))
->add('room', 'choice', array(
'label'=>'Salas',
'required'=>false,
'choices'=>$this->rooms,
'empty_value'=>'Selecciona...'
))
->add('complaintChat', 'checkbox',
array('label'=>'Denuncia de chat', 'required'=>false))
->add('complaintWangle', 'checkbox',
array('label'=>'Denuncia de trampas', 'required'=>false))
->add('fromDate', 'date', array(
'label'=>'Desde',
'required'=>false,
'widget'=>'single_text',
'format'=>'dd-MM-yyyy HH:m:s'))
->add('toDate', 'date', array(
'label'=>'Hasta',
'required'=>false,
'widget'=>'single_text',
'format'=>'dd-MM-yyyy HH:m:s'));
}
/**
* @return string
*/
public function getName()
{
return 'complaint_filter_form';
}
}
Cuando selecciono un juego, se actualiza el select de salas pero se
queda vacío. Eso es porque no le llega el dato de game_id.
Con firebug, veo lo siguiente.
El parametro lo pasa bien.
game_id 8
La url también.
http://domain/app_dev.php/admin/complaint/selects/
Pero la respuesta.
The Response content must be a string or object implementing
__toString(), "array" given. (500 Internal Server Error)
¿Alguien sabe que puede estar fallando?.
Saludos cordiales.
Pablo.
Si lo reenvías, ten la precaución de borrar los datos de procedencia que
encabezarían tu reenvío – empezando por mi dirección de correo
electrónico - . Coloca siempre las direcciones de tus contactos en el
campo <CCO> para que viajen discretas, no en el campo <Para> ni en
el<CC>. De esa forma nadie que lo reciba tendrá constancia de las señas
de los demás destinatarios a los que también se remite. Todo ello a fin
de evitar que nadie se aproveche de todas las direcciones que se van
acumulando al pasar de buzón a buzón para el lanzamiento de correo
basura y otras indeseadas lindezas. Aparte claro está de garantizar la
privacidad.