<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ajax archivos - KumbiaPHP Framework PHP en español</title>
	<atom:link href="https://kumbiaphp.com/blog/tag/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>https://kumbiaphp.com/blog/tag/ajax/</link>
	<description>Web &#38; app MVC PHP framework</description>
	<lastBuildDate>Fri, 22 Dec 2017 10:36:14 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://kumbiaphp.com/blog/wp-content/uploads/2016/01/250-150x150.png</url>
	<title>ajax archivos - KumbiaPHP Framework PHP en español</title>
	<link>https://kumbiaphp.com/blog/tag/ajax/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">123854898</site>	<item>
		<title>Select anidado o select dependientes</title>
		<link>https://kumbiaphp.com/blog/2017/11/17/select-anidado-o-select-dependientes/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=select-anidado-o-select-dependientes</link>
					<comments>https://kumbiaphp.com/blog/2017/11/17/select-anidado-o-select-dependientes/#comments</comments>
		
		<dc:creator><![CDATA[HenryStivens]]></dc:creator>
		<pubDate>Fri, 17 Nov 2017 00:58:20 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales y screencast]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[select]]></category>
		<guid isPermaLink="false">https://www.kumbiaphp.com/blog/?p=1621</guid>

					<description><![CDATA[<p>Con este tutorial vamos a aprender como implementar select anidado o select dependientes usando KumbiaPHP y jquery. Es una&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/11/17/select-anidado-o-select-dependientes/">Select anidado o select dependientes</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Con este tutorial vamos a aprender como implementar select anidado o select dependientes usando <strong>KumbiaPHP</strong> y jquery. Es una <a href="http://es.wikipedia.org/wiki/Lista_(inform%C3%A1tica)#Listas_simples_enlazadas">lista simple enlazada</a> con tres niveles: Regiones, comunas y ciudades.</p>
<h2>Implementando el select anidado</h2>
<p>Primero que todo cargamos la librería jquery añadiendo en nuestro template activo la siguiente línea:</p>
<pre><code class="language-php">
&lt;?= Tag::js(&#039;jquery/jquery.min&#039;); ?&gt;
</code></pre>
<h2>La base de datos</h2>
<pre><code class="language-sql">
CREATE TABLE `ciudad` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `comuna_id` int(4) NOT NULL,
  `nombre` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_ciudad__comuna` (`comuna_id`),
  CONSTRAINT `FK_ciudad__comuna` FOREIGN KEY (`comuna_id`) REFERENCES `comuna` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `ciudad` VALUES (1,1,&#039;Primera Ciudad&#039;),(2,2,&#039;Primera Ciudad&#039;),(3,2,&#039;Segunda Ciudad&#039;),(4,3,&#039;Primera Ciudad&#039;),(5,3,&#039;Segunda Ciudad&#039;),(6,3,&#039;Tercera Ciudad&#039;);

CREATE TABLE `comuna` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `region_id` int(4) NOT NULL,
  `nombre` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `FK_comuna__region` (`region_id`),
  CONSTRAINT `FK_comuna__region` FOREIGN KEY (`region_id`) REFERENCES `region` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `comuna` VALUES (1,1,&#039;Primera Comuna&#039;),(2,1,&#039;Segunda Comuna&#039;),(3,2,&#039;Primera Comuna&#039;),(4,3,&#039;Primera Comuna&#039;);

CREATE TABLE `region` (
  `id` int(4) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

INSERT INTO `region` VALUES (1,&#039;Primera Region&#039;),(2,&#039;Segunda Region&#039;),(3,&#039;Tercera Region&#039;);
</code></pre>
<p><span id="more-1621"></span></p>
<h2>Los modelos</h2>
<p>Vamos a tener tres modelos que se encargaran de la consulta de los datos, heredando como no de la clase ActiveRecord:</p>
<p>Archivo: <em>app/models/region.php</em></p>
<pre><code class="language-php">
&lt;?php
class Region extends ActiveRecord
{
    /**
     * Lista todas las regiones
     * @return array
     */
    public function all()
    {
        return $this-&gt;find(&#039;order: nombre&#039;);
    }
}
</code></pre>
<p>Archivo: <em>app/models/comuna.php</em></p>
<pre><code class="language-php">
&lt;?php
class Comuna extends ActiveRecord
{

    /**
     * Lista todas las comunas de una región
     * 
     * @param int $region_id
     * @return array
     */
    public function allByRegion(int $region_id)//validación int de PHP7
    {
        return $this-&gt;find(&quot;region_id = $region_id&quot;, &#039;order: nombre&#039;);
    }
}
</code></pre>
<p>Archivo: <em>app/models/ciudad.php</em></p>
<pre><code class="language-php">
&lt;?php
class Ciudad extends ActiveRecord
{

    /**
     * Lista todas las ciudades de una comuna
     * 
     * @param int $region_id
     * @return array
     */
    public function allByComuna(int $comuna_id)//validación int de PHP7
    {
        return $this-&gt;find(&quot;comuna_id = $comuna_id&quot;, &#039;order: nombre&#039;);
    }
}
</code></pre>
<h2>El controlador</h2>
<p>Usaremos de ejemplo el controlador <em>UserController</em> aunque no implementaremos la funcionalidad de creación de un usuario para enforcarnos en el select anidado. Tendrá dos funciones auxiliares que nos cargarán los respectivos selects sin template, <em>getComunas()</em> y <em>getCiudades()</em>.</p>
<p>Archivo: <em>app/controllers/user_controller.php</em></p>
<pre><code class="language-php">
&lt;?php
/**
 * Controlador para las acciones y vistas con el usuario
 */
class UserController extends AppController
{

    public function index()
    {
        
    }

    public function create()
    {
        //se verifica si se ha enviado via POST los datos
        if (Input::hasPost(&#039;user&#039;)) {
            //
        }
    }

    public function getComunas()
    {
        //No es necesario el template
        View::template(null);
        //Carga la variable $region_id en la vista
        $this-&gt;region_id = Input::post(&#039;region_id&#039;);
    }

    public function getCiudades()
    {
        //No es necesario el template
        View::template(null);
        //Carga la variable $comuna_id en la vista
        $this-&gt;comuna_id = Input::post(&#039;comuna_id&#039;);
    }
}
</code></pre>
<h2>Las vistas</h2>
<p>La primera vista es la de crear un usuario, la cual contendrá los tres selects, aunque en principio solo mostrará el primero y unas capas vacias, ya que los siguientes dependen de qué se seleccione y serán cargados mediante ajax:</p>
<p>Archivo: <em>app/views/user/create.phtml</em></p>
<pre><code class="language-php">&lt;h1&gt;Crear usuario&lt;/h1&gt;
&lt;?= Html::linkAction(&#039;&#039;, &#039;Listar usuarios&#039;, &#039;class=&quot;button&quot;&#039;) ?&gt;
&lt;?php View::content() ?&gt;
&lt;?= Form::open() ?&gt;
  &lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;six columns&quot;&gt;
      &lt;label for=&quot;user_region_id&quot;&gt;Región&lt;/label&gt;
      &lt;?= Form::dbSelect(&#039;user.region_id&#039;, &#039;nombre&#039;, array(&#039;region&#039;, &#039;all&#039;), &#039;- Seleccione -&#039;); ?&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;six columns&quot;&gt;
      &lt;label for=&quot;user_comuna_id&quot;&gt;Comuna&lt;/label&gt;
      &lt;div id=&#039;div_comunas&#039;&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&quot;row&quot;&gt;
    &lt;div class=&quot;six columns&quot;&gt;
      &lt;label for=&quot;user_ciudad_id&quot;&gt;Ciudad&lt;/label&gt;
      &lt;div id=&#039;div_ciudades&#039;&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;input class=&quot;button-primary&quot; value=&quot;Enviar&quot; type=&quot;submit&quot;&gt;
&lt;?= Form::close() ?&gt;

&lt;script type=&#039;text/javascript&#039;&gt;
  $(document).on(&#039;change&#039;, &quot;#user_region_id&quot;, function () {
    var region_id = $(&#039;#user_region_id&#039;).val();
     $.ajax({
       type: &quot;POST&quot;,
       url: &quot;&lt;?php echo PUBLIC_PATH . &#039;user/getComunas/&#039;; ?&gt;&quot;,
       data: &quot;region_id=&quot; + region_id,
       success: function (html) {
         $(&quot;#div_comunas&quot;).html(html);
       }
    });
  });
&lt;/script&gt;</code></pre>
<p>La vista anterior con javascript añade un listener para que cuando el valor del select que contiene las regiones cambie, haga un llamado mediante ajax para obtener el listado de comunas por región y este resultado lo carga en la capa <em>div_comunas</em>.</p>
<p>La siguiente vista cargará el select usando el helper <em>Form::dbSelect()</em> usando el método <em>allByRegion()</em> del modelo <em>Comuna</em> y pasándole como parámetro <em>$region_id</em>.<br />
 Archivo: <em>app/views/user/getComunas.phtml</em></p>
<pre><code class="language-php">
&lt;?= Form::dbSelect(&quot;user.comuna_id&quot;, &#039;nombre&#039;, array(&#039;comuna&#039;, &#039;allByRegion&#039;, $region_id), &#039;- Seleccione -&#039;); ?&gt;

&lt;script type=&#039;text/javascript&#039;&gt;
  $(document).on(&#039;change&#039;, &quot;#user_comuna_id&quot;, function () {
    var comuna_id = $(&#039;#user_comuna_id&#039;).val();
      $.ajax({
        type: &quot;POST&quot;,
        url: &quot;&lt;?php echo PUBLIC_PATH . &#039;user/getCiudades/&#039;; ?&gt;&quot;,
        data: &quot;comuna_id=&quot; + comuna_id,
          success: function (html) {
            $(&quot;#div_ciudades&quot;).html(html);
          }
       });
 });
&lt;/script&gt;</code></pre>
<p>La vista anterior con javascript añade un listener para que cuando el valor del select que contiene las comunas cambie, haga un llamado mediante ajax para obtener el listado de ciudades por comuna y este resultado lo carga en la capa <em>div_ciudades</em>.</p>
<p>La siguiente vista es similar a <em>getComunas.phtml,</em> lo que hace es cargar todas las ciudades que pertenezcan a una comunidad usando el helper <em>Form::dbSelect()</em> pasandole como parámetros el nombre del modelo <em>ciudad, </em>el método <em>allByComuna()</em> y el parámetro de consulta <em>$comuna_id.</em></p>
<p>Archivo: <em>app/views/user/getCiudades.phtml</em></p>
<pre><code class="language-php">&lt;?= Form::dbSelect(&quot;user.ciudad_id&quot;, &#039;nombre&#039;, array(&#039;ciudad&#039;, &#039;allByComuna&#039;, $comuna_id), &#039;- Seleccione -&#039;); ?&gt; </code></pre>
<h2>Ejecutando el ejemplo</h2>
<p>Cuando cargamos la url <em>/user/create </em>veremos algo como lo siguiente, en primera instacia solo va mostrar las regiones:</p>
<figure><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-10.png"><img fetchpriority="high" decoding="async" class="wp-image-1632 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-10-e1510503449909.png" alt="Muestra el primer select anidado" width="996" height="503" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-10-e1510503449909.png 996w, https://kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-10-e1510503449909-300x152.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-10-e1510503449909-768x388.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-10-e1510503449909-940x475.png 940w" sizes="(max-width: 996px) 100vw, 996px" /></a><figcaption>Muestra el primer select anidado</figcaption></figure>
<p>Lo siguientes dos select se mostraran comforme se vaya seleccionando una región y posteriormente una comuna.</p>
<figure><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-27.png"><img decoding="async" class="wp-image-1630 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-27-e1510503503511.png" alt="Select anidado" width="996" height="568" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-27-e1510503503511.png 996w, https://kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-27-e1510503503511-300x171.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-27-e1510503503511-768x438.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2017/11/Screenshot-from-2017-11-06-16-08-27-e1510503503511-940x536.png 940w" sizes="(max-width: 996px) 100vw, 996px" /></a><figcaption>Lista enlazada simple de tres niveles</figcaption></figure>
<h2>Descargar código completo</h2>
<p>Como siempre, el código completo está disponible para todos en el siguiente repositorio en Github listo para usar con Docker: <a href="https://github.com/henrystivens/dependent-select">https://github.com/henrystivens/dependent-select</a></p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/11/17/select-anidado-o-select-dependientes/">Select anidado o select dependientes</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://kumbiaphp.com/blog/2017/11/17/select-anidado-o-select-dependientes/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1621</post-id>	</item>
	</channel>
</rss>
