Select dependientes con ajax.

194 views
Skip to first unread message

Pablo Braulio

unread,
Jan 27, 2013, 12:09:33 PM1/27/13
to Lista de symfony
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(), &quot;array&quot; 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.

Gabriel Toledo

unread,
Jan 29, 2013, 7:01:24 AM1/29/13
to symfo...@googlegroups.com
Pablo: yo probaria cambiar esta parte


 ->add('room', 'choice', array(
                'label'=>'Salas',
                'required'=>false,
                'choices'=>$this->rooms,
                'empty_value'=>'Selecciona...'
            ))

por esta:


->add('room', 'choice', array(
                'label'=>'Salas',
                'required'=>false,
                'choices'=>array("opcion 1","opcion 2"),
                'empty_value'=>'Selecciona...'
            ))


Esto es solamente para ver como se comporta si no falla es que tiene que ver la variable $this->rooms como esta llegando...

si hace el mismo error, avisá y vemos si se ocurre otra idea.

Suerte





--
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es






--
Ing. Gabriel Toledo - Cel: 261 - 15 460 9360
Mendoza - Argentina

Pablo Braulio

unread,
Jan 29, 2013, 7:05:05 AM1/29/13
to Lista de symfony
Gracias ya está solucionado.

Es la primera vez que hacía un formulario con Ajax y no había caído en
el detalle de que una acción debe devolver el html para formar el
select.
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.


El día 29 de enero de 2013 13:01, Gabriel Toledo
<gabrielan...@gmail.com> escribió:
> ---
> Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de
> Grupos de Google.
> Para anular la suscripción a este grupo y dejar de recibir sus correos
> electrónicos, envía un correo electrónico a
> symfony-es+...@googlegroups.com.
> Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
>
>
Reply all
Reply to author
Forward
0 new messages