Combos dependientes

1,353 views
Skip to first unread message

era

unread,
Aug 2, 2011, 9:40:02 AM8/2/11
to cakep...@googlegroups.com
Algún ejemplo de combos dependientes que funcione correctamente?

era


$pyd3r

unread,
Aug 2, 2011, 5:24:09 PM8/2/11
to CakePHP en Español
explícate mejor que quieres hacer y Por qué lo necesitas

Luis Leiva

unread,
Aug 2, 2011, 5:26:40 PM8/2/11
to cakep...@googlegroups.com
Necesitas usar javascript, ajax y DOM para q funcione, CakePHP no
tiene nada q ver con combos dependientes.

Enviado desde mi iPhone

> --
> Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
> Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
> Para anular tu suscripción a este grupo, envía un correo electrónico a cakephp-esp...@googlegroups.com
> Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/cakephp-esp?hl=es.
>

Jamil Enriquez Deceano

unread,
Aug 2, 2011, 7:09:23 PM8/2/11
to cakep...@googlegroups.com
Si buscas en los hilos de la lista encontraras como lo reolvimos muchos,
ese tema ya se trato en la lista, tirate un chapuzon en ella xD.
Saludos

Sulema Rocha

unread,
Aug 2, 2011, 8:26:58 PM8/2/11
to cakep...@googlegroups.com
Hola, aqui te dejo un ejemplito, en la parte superior se declara Ñ
<?php
    echo $javascript->link('prototype.js');
    echo $javascript->link('scriptaculous.js?load=effects');
 ?>
Y el primer select es category, donde le envio una lista de categorias
<?php echo $this->Form->input('category', array('options'=>$categories));
          $opt = array( "update" => "select_subcategorias", "url" => "/items/load_subcategoria", "frequency" => "1");
            echo $ajax->observeField("ItemCategory",$opt); ?>

<?php
                    echo $ajax->div("select_subcategorias");
                    echo $this->Form->input('category_id', array('label'=>'Sub-Categorias', 'options'=>$subcategorias));
                    echo $ajax->divEnd("select_subcategorias");
   ?>

y en el controlador tengo un metodo que es llamado load_categoria y este devuelve una lista de subcategorias.

Espero que te sirva,
Saludos!!!!

era

unread,
Aug 3, 2011, 7:29:15 AM8/3/11
to cakep...@googlegroups.com
El clásico ejemplo: Combo Pais que filtre Combo Provincia... He encontrado varios ejemplos pero ninguno me ha funcionado...

era

unread,
Aug 3, 2011, 7:29:32 AM8/3/11
to cakep...@googlegroups.com
Ok, gracias.

era

unread,
Aug 3, 2011, 7:30:04 AM8/3/11
to cakep...@googlegroups.com
Si, he encontrado muchos ejemplos pero ninguno me ha funcionado en mi ambiente de desarrollo... sigo con la búsqueda...

era

unread,
Aug 3, 2011, 7:55:31 AM8/3/11
to cakep...@googlegroups.com
Estoy probando el código. Me bajé los *.js requeridos, donde los ubico? en la carpeta helpers? El combo Pais se muestra ok, pero al cambiar de opción no se cargan las provincias... Es como que no llama al método que carga las provincias... Te paso el código:

view:

<?php
    echo $javascript->link('prototype.js');
    echo $javascript->link('scriptaculous.js?load=effects');
 ?>

<div class="left">
  
        <h2>Buscar Propiedades<br /><br />           
    
     <?php
     echo $form->create('Propiedad',array('action'=>'search'));
echo $this->Form->input('pais_id', array('options'=>$paises));
        $opt = array( "update" => "select_provincias", "url" => "/propiedades/load_provincias", "frequency" => "1");
        echo $ajax->observeField("PaisProvincia",$opt); 

        echo $ajax->div("select_provincias");
        echo $this->Form->input('provincia_id', array('label'=>'Provincias', 'options'=>$provincias));
        echo $ajax->divEnd("select_provincias");
  
echo $form->input('ciudad_id', array('size' => '1'));
echo $form->input('tipo_id', array('size' => '1'));
echo $form->input('zona_id', array('size' => '1'));
echo $form->input('ambientes', array('size' => '1'));
echo $form->submit('Buscar');
?>

Controller:


<?php
App::import('Model', 'Pais');
App::import('Model', 'Provincia');

class PropiedadesController extends AppController {

var $name = 'Propiedades'; 
var $helpers = array('Html', 'Javascript', 'Ajax');  
function search() {
$this->layout = 'default';

// SE OBTIENEN LOS PAISES
$pais = new Pais; 
$paises = $pais->find('list');
$this->set('paises', $paises);
// SE OBTIENEN LAS PROVINCIAS
//$provincia = new Provincia; 
//$provincias = $provincia->find('list');
$provincias = null;
$this->set('provincias', $provincias); 
             
}
function load_provincias() {
echo 'adasdasdsad';
$this->layout = 'default';
// SE OBTIENEN LAS PROVINCIAS
$provincia = new Provincia; 
$provincias = $provincia->find('list');
$this->set('provincias', $provincias);
return $provincias; 
             
}
}
?>

Pau Dominguez

unread,
Aug 3, 2011, 11:12:57 AM8/3/11
to cakep...@googlegroups.com
Hola era.
Yo no he usado nunca el helper ajax de Cake, te adjunto un pequeño ejemplo de cómo lo haría yo.

===================================================
Controller del modelo XXX que genera el formulario donde tienes los combos:
====================================================
Function mi_form()
{
    $this->layout = 'default';
    //genera un página con el formulario y si es un add o edit toda la lógica correspondiente.
    ... obtener a lista de países y guardarla en $paises
    $this->set('paises', $paises); //Pasar los datos de paises a la vista
// Combo de provincias vacio
   $this->set('provincias',null);   
}

//Esta función carga la lista de provincias del país seleccionado
function busca_provincia($pais = null){
    $this->layout = 'Ajax'; //esto es un layout vacio

    ... Obtener las lista de provincias del $pais y guardarlo en $provincias

    $this->set('provincias',$provincias);   
}

=================================================
mi_form.ctp (Vista que genera el contenido del form)
=================================================
<? php echo $javascript->link('jquery.js');
          
 //La acción del form create puede ser add, edit o la que se te ocurra, es la que se ejecuta al pinchar en el botón  submit, pero el combo se genera mediante la llamada ajax desde javascript por tanto es irrelevante para esta funcionalidad concreta.

            echo $form->create('Propiedad',array('action'=>'XXX''));

            ... los campos del formulario ...
             echo $this->Form->input('pais_id', array('label'=>'País','onClick'=>'ajax_provincias('this.form)', 'options'=>$paises)); //combo de paises que al seleccionar uno llama a la función jquery que hace la llamada ajax

             echo '<div id='comboprovincias'>'; //Este es el div que se regenerá con Ajax, en la primera generación de la página $provincias es null
                                 echo $this->Form->input('provincia_id', array('label'=>'Provincia', 'options'=>$provicinas));                               
             echo '</div>';
             echo '<div id='ldr'></div>'; //esto es para mostrar un icono de carga, lo puedes omitir
           
            ... resto de campos y botones
             echo $form->end();
?>

===============================================================================
busca_provincia.ctp (Vista que genera el contenido para el div  comboprovincias)
================================================================================
<?php
    echo $this->Form->input('provincia_id', array('label'=>'Provincia', 'options'=>$provicinas));
?>

====================================================
 xxx.js Este fichero Javascript debe estar en webroot/js
====================================================
function ajax_provincias(datos)
{       
          $.ajax({
               type: "GET",
               url: "/XXX/busca_provincia/"+datos.elements["XXXPais_id"].value,   
               beforeSend: function() {
                   $('#ldr').html('<div class="rating-flash" id="cargando_div" style="position:relative;left:150px">Loading  <img src="/img/ajax-loader_mini.gif"></div>');
                   },
               success: function(msg){
                $('#ldr').html("");                               //borramos el gif animado del proceso de carga
                $('#comboprovincias').html(msg); //reemplaza el contenido del div comboprovincias con el html que genera busca_provincia.ctp
               }
             });
    }
};

No lo he probado pero debería funcionar. Puede pasar que si usas el componente security, al hacer el submit del formulario no muestre nada, esto es porque hemos modificado el formulario original y el hash que crea el form helper no coincide. Si te pasa pones otro post.
Por lo menos espero que entiendas la lógica de esta solución.
Suerte.
Pau.
--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para ver este debate en la Web, visita https://groups.google.com/d/msg/cakephp-esp/-/uvH1q6t70iEJ.

era

unread,
Aug 4, 2011, 3:59:59 PM8/4/11
to cakep...@googlegroups.com
Sule, me podrás dar una mano con este tema?

oyepez003

unread,
Aug 4, 2011, 5:50:52 PM8/4/11
to CakePHP en Español
Quizas jQuery4PHP te ayude en eso.

http://jquery4php.sourceforge.net/index.php?section=plugins&module=relatedSelects&method=basic

Esa funcionalidad de jQuery4PHP usa el plugin relatedselects de jquery
asi que si quires usar solo el plugin de jquery tambien te sirve...
claro jQuery4PHP te ayudaria en eso y algunas cosas mas que puedes ver
en su pagina.

Saludos cordiales.

era

unread,
Aug 5, 2011, 9:31:13 AM8/5/11
to cakep...@googlegroups.com
Ok. Gracias. El tema que me gustaría tener un ejemplo hecho en CakePHP y que funcione... 

era

unread,
Aug 5, 2011, 2:29:05 PM8/5/11
to cakep...@googlegroups.com
Sule, me podrás pasar tu email? Gracias!

era

unread,
Aug 18, 2011, 2:02:33 PM8/18/11
to cakep...@googlegroups.com
Logré hacerlo. Próximamente subiré un ejemplo completo. Saludos y gracias a todos

Pau Dominguez

unread,
Aug 18, 2011, 7:06:45 PM8/18/11
to cakep...@googlegroups.com
Felicidades.

On 18/08/2011 20:02, era wrote:
> Logr� hacerlo. Pr�ximamente subir� un ejemplo completo. Saludos y
> gracias a todos --
> Has recibido este mensaje porque est�s suscrito al grupo "CakePHP en
> Espa�ol" de Grupos de Google.


> Para ver este debate en la Web, visita

> https://groups.google.com/d/msg/cakephp-esp/-/nx0aB0SFIH8J.
> Para publicar una entrada en este grupo, env�a un correo electr�nico a
> cakep...@googlegroups.com.
> Para anular tu suscripci�n a este grupo, env�a un correo electr�nico a
> cakephp-esp...@googlegroups.com
> Para tener acceso a m�s opciones, visita el grupo en
> http://groups.google.com/group/cakephp-esp?hl=es.

Francisco Javier Peña Caballero

unread,
Jul 23, 2012, 4:26:42 AM7/23/12
to cakep...@googlegroups.com
El problema es que por la red hay muchos ejemplos de combos dependientes relacionados por una clave foránea que comunican dos o más tablas. Mi caso es simplemente actualizar un campo del formulario dependiendo del contenido elegido en el select de una input anterior. En mi caso, en el input tipo_id se cargan los 4 o 5 tipos de pedidos de la tabla Tipos. Y dependiendo del tipo que se seleccione (por ejemplo tipo2: de 2 a 6 comunidades)  en el input número_comunidades quiero que se muestre un select con los números del 2 al 6. Espero que se entienda el proceso.

echo $this->Form->input('tipo_id',array('label'=>'Tipo de Pedido'));
echo $this->Form->input('numero_comunidades', array('label' => 'Número de Comunidades a adaptar'));

Saludos.

El 19 de julio de 2012 03:31, Closs <rosibel...@gmail.com> escribió:
Hola Era podrias por favor subir tu ejemplo ya que tengo el mismo problema que tu tenias y soy nueva en cake


El jueves, 18 de agosto de 2011 12:02:33 UTC-6, era escribió:
Logré hacerlo. Próximamente subiré un ejemplo completo. Saludos y gracias a todos

--
Has recibido este mensaje porque estás suscrito al grupo "CakePHP en Español" de Grupos de Google.
Para ver este debate en la Web, visita https://groups.google.com/d/msg/cakephp-esp/-/oeKtkFeDUZQJ.

Para publicar una entrada en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a cakephp-esp...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/cakephp-esp?hl=es.



--
Francisco Javier Peña Caballero
Tlfno: 652966610

Frank Alexander Tapia Tapia

unread,
Aug 19, 2013, 12:08:16 PM8/19/13
to cakep...@googlegroups.com
q tal pau me puedes dar tu correo, he implementado tu codigo pero me recarga toda la pagina en el lugar del combo y no el combo en si

Carla Mannino

unread,
Mar 22, 2015, 8:37:19 AM3/22/15
to cakep...@googlegroups.com
Hola gente, se que este tema es viejo, pero estoy teniendo el mismo problema y no puedo encontrar la solución.
Necesito que se carguen las localidades según la provincia seleccionada. Cargue las dos tablas en la base de datos, y estos son los códigos que agregué:

LocalidadesController.php:

<?php
App::uses( 'AppController', 'Controller' );

class LocalidadesController extends AppController{
public function getByProvincia() {
$provincia_id = $this->request->data['Post']['provincia'];
$localidades  =  $this -> Localidad -> find ( 'list' ,  array ( 
'conditions'  =>  array ( 'Localidad.provincia_id'  =>  $provincia_id ) , 
'recursive'  =>  - 1 
) ) ; 
 
$this->set('localidades',$localidades);
$this->layout = 'ajax';
}  
}

Model/Localidad.php y Provincia.php (cargo los archivos)

view/localidades/get_by_provincia.ctp

<?php foreach ($localidades as $key => $value): ?>
<option value="<?php echo $key; ?>"><?php echo $value; ?></option>
<?php endforeach; ?>

index.ctp

<div class="leftInput">
                                <?php echo $this->Form->input('provincias', array(
                                    'label' => false,
                                    'options' => array($provincias),
                                    'empty' => '*Provincia',
                                    'id' => 'provincia'
                                )); ?>
                            </div>
                        <div class="rightInput">
 <?php echo $this->Form->input('localidades', array(
 'label' => false,
 'type' => 'select', 
 'empty' => '*Localidad',
 'id' => 'localidad'
 )); ?>
                            </div>

//AL FINAL DEL index.ctp

<?php
$this->Js->get('#provincia')->event('change', 
$this->Js->request(array(
'controller'=>'localidades',
'action'=>'getByProvincia'
), array(
'update'=>'#localidad',
'async' => true,
'method' => 'post',
'dataExpression'=>true,
'data'=> $this->Admin->serializeForm(array(
'isForm' => true,
'inline' => true
))
))
);
?>

No carga ni provincias ni localidades, necesito por favor una ayuda!!!

Mil gracias!

$pyd3r

unread,
Mar 24, 2015, 10:12:26 AM3/24/15
to cakep...@googlegroups.com
Te recomiendo que deje de usar las funcionalidades para agregar eventos de javascript de cakephp son bastante pobres y crea más problema para darle mantenimiento al archivo.
Ahora te voy a dar un ejemplo de como se puede hacer

#Controller
class ProvinciasController extends AppController{
public function add() {
if($this->request->is('ajax')):
$this->autorender = false;
$provincia_id = $this->request->data['provinciaId'];
$localidades  =  $this ->Provincia->Localidad->find ( 'list' ,  array ( 
'conditions'  =>  array ( 'Localidad.provincia_id'  =>  $provincia_id ) , 
'fields' => array('id', 'localidad')
) ) ; 
$html = "<option>Seleccione...</option>\n";
foreach ($localidades as $key => $value) {
$html.='<option value="'.$value['Localidad']['id'].'">'.$value['Localidad']['localidad']."</option>\n";
}
return $html 
elseif($this->request->is('post')):
#aqui pones tu logica para guardar los datos 
endif;
$provincias = $this->Provincia->find('list', array('fields'=>array('id', 'provincia')));
$this->set(compact('provincias'));
}  
}


#vista
<style>
.inputOculto{
display: none;
}
</style>
<div >
<h4>Agregar provincia</h4>
<?php 
echo $this->Form->create('Provincia');
echo $this->Form->input('provincia_id', array('div'=>array('class'=>'comboBox')));
echo $this->Form->input('localidad_id', array('div'=>array('div'=>array('class'=>'inputOculto'), 'id'=>'localidadId')));
echo $this->Form->button('Guardar', array('type'=>'submit','class'=>'btn waves-effect waves-light blue'));
echo $this->Form->end();
?>
</div>

<script>

var getLocalidades = function)(){
var id = $(this).val();
$.post('', {provinciaId:id}, function(data){
$('#localidadId').html(data);
$('.inputOculto').show();
});
}

$('.comboBox').on('change', getLocalidades)

</script>

Te agregue el script dentro de la vista pero debería estar en un archivo JS aparte. Si no funciona verifica con firebug o la consola de chrome que error esta ejecutando el ajax. 

Espero que este pueda ayudarte aclarar como hacer los combo dependientes

Carla Mannino

unread,
Mar 27, 2015, 11:35:26 AM3/27/15
to cakep...@googlegroups.com
Spyder, mucha gracias por responderme!! 
Sigue sin funcionar, parece que no conectara a la base de datos, no me devuelve ni siquiera las provincias, puse el código tal como me lo pasaste y nada.
Si pudieras ayudarme un poco más te agradezco muchisimo!!!
Podrás pasarme tu mail?
Gracias!
Carla.

Carla Mannino

 carla.mannino.
Antes de imprimir, piense en su responsabilidad con el MEDIO AMBIENTE.

--
Has recibido este mensaje porque estás suscrito a un tema del grupo "CakePHP en Español" de Grupos de Google.
Para anular la suscripción a este tema, visita https://groups.google.com/d/topic/cakephp-esp/2Sj3Z7ghipE/unsubscribe.
Para anular la suscripción a este grupo y a todos sus temas, envía un correo electrónico a cakephp-esp...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a cakep...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/cakephp-esp.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages