<?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>Documentación archivos - KumbiaPHP Framework PHP en español</title>
	<atom:link href="https://kumbiaphp.com/blog/category/documentacion/feed/" rel="self" type="application/rss+xml" />
	<link>https://kumbiaphp.com/blog/category/documentacion/</link>
	<description>Web &#38; app MVC PHP framework</description>
	<lastBuildDate>Mon, 13 Apr 2026 23:04:51 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://kumbiaphp.com/blog/wp-content/uploads/2016/01/250-150x150.png</url>
	<title>Documentación archivos - KumbiaPHP Framework PHP en español</title>
	<link>https://kumbiaphp.com/blog/category/documentacion/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">123854898</site>	<item>
		<title>Novedades del Manual de KumbiaPHP — noviembre 2025</title>
		<link>https://kumbiaphp.com/blog/2025/11/03/novedades-del-manual-de-kumbiaphp-noviembre-2025/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=novedades-del-manual-de-kumbiaphp-noviembre-2025</link>
					<comments>https://kumbiaphp.com/blog/2025/11/03/novedades-del-manual-de-kumbiaphp-noviembre-2025/#respond</comments>
		
		<dc:creator><![CDATA[HenryStivens]]></dc:creator>
		<pubDate>Mon, 03 Nov 2025 12:25:00 +0000</pubDate>
				<category><![CDATA[Documentación]]></category>
		<category><![CDATA[MVC framework]]></category>
		<guid isPermaLink="false">https://kumbiaphp.com/blog/?p=2961</guid>

					<description><![CDATA[<p>Ya están publicados nuevos contenidos y mejoras en la documentación: guías de instalación en Apache y Nginx (en inglés),&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2025/11/03/novedades-del-manual-de-kumbiaphp-noviembre-2025/">Novedades del Manual de KumbiaPHP — noviembre 2025</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ya están publicados nuevos contenidos y mejoras en la documentación: guías de instalación en <strong>Apache y Nginx (en inglés)</strong>, una <strong>guía “Primera App”</strong> en español totalmente revisada, <strong>instrucciones para instalar con Composer</strong> y una <strong>sección de Controladores</strong> clarificada y con imágenes nuevas. Todo esto alineado con <strong>KumbiaPHP 1.2 optimizado para PHP 8</strong>. Consulta el repo del manual para ver los cambios completos. (<a href="https://github.com/KumbiaPHP/Documentation">GitHub</a>)</p>



<h2 class="wp-block-heading">1) Nuevas guías: instalación en Apache y Nginx (en inglés)</h2>



<p class="wp-block-paragraph">Publicamos instrucciones claras para servir aplicaciones KumbiaPHP detrás de <strong>Apache</strong> (VirtualHosts) y <strong>Nginx</strong> (server blocks), destacando los puntos clave: usar <em>public/</em> como <em>document root</em> y habilitar las reglas de reescritura para el <em>front controller</em>. Estas guías facilitan el despliegue en entornos modernos sin dependencias innecesarias. <a href="https://github.com/KumbiaPHP/Documentation/tree/master/en" target="_blank" rel="noreferrer noopener">GitHub</a></p>



<figure class="wp-block-image size-full is-style-default"><a href="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-virtual-host-example.jpg"><img fetchpriority="high" decoding="async" width="749" height="342" src="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-virtual-host-example.jpg" alt="Apache apuntando a public/ con URLs limpias." class="wp-image-2963" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-virtual-host-example.jpg 749w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-virtual-host-example-300x137.jpg 300w" sizes="(max-width: 749px) 100vw, 749px" /></a></figure>



<span id="more-2961"></span>



<figure class="wp-block-image size-full"><a href="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-nginx-example.jpg"><img decoding="async" width="769" height="494" src="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-nginx-example.jpg" alt="Nginx + PHP-FPM con public/ como raíz del sitio." class="wp-image-2964" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-nginx-example.jpg 769w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-nginx-example-300x193.jpg 300w" sizes="(max-width: 769px) 100vw, 769px" /></a></figure>



<p class="wp-block-paragraph"><strong>Qué encontrarás:</strong></p>



<ul class="wp-block-list">
<li>Estructura mínima y <em>document root</em> correcto (public/).</li>



<li>Directrices de reescritura para URLs limpias (<em>pretty URLs</em>).</li>



<li>Notas rápidas para PHP-FPM (Nginx) y módulos en Apache.</li>
</ul>



<h2 class="wp-block-heading">2) “Primera App” — más clara y didáctica</h2>



<p class="wp-block-paragraph">La guía <strong>Primera App</strong> fue reescrita con foco en personas que inician con MVC:</p>



<p class="wp-block-paragraph"><strong>a.</strong> Se <strong>aclaró la arquitectura MVC y el manejo de URLs</strong>, explicando cómo el <em>front controller</em> enruta /<em>controlador/acción/param</em> hacia tu lógica.<br><strong>b.</strong> <strong>Se actualizaron los ejemplos de controladores y vistas</strong>, con código más legible y ordenado.</p>



<figure class="wp-block-image size-full"><a href="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/successful-installation.jpg"><img decoding="async" width="960" height="540" src="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/successful-installation.jpg" alt="Primera ejecución y render de vista básica." class="wp-image-2966" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/successful-installation.jpg 960w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/successful-installation-300x169.jpg 300w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/successful-installation-768x432.jpg 768w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/successful-installation-940x529.jpg 940w" sizes="(max-width: 960px) 100vw, 960px" /></a></figure>



<p class="wp-block-paragraph"><strong>c.</strong> <strong>Se mejoraron los títulos y subtítulos</strong> para escanear mejor el contenido.<br><strong>d.</strong> <strong>Se reemplazaron capturas de pantalla</strong>, haciendo más evidente cada paso (crear controlador, renderizar vista, pasar variables).</p>



<h2 class="wp-block-heading">3) Instalación con Composer (nuevo apartado)</h2>



<p class="wp-block-paragraph">Ahora el manual incluye un flujo directo para iniciar proyectos con <strong>Composer</strong>:</p>



<p class="wp-block-paragraph"><strong>Requisitos mínimos:</strong> PHP 8.x recomendado.<br><strong>Pasos típicos:</strong></p>



<p class="wp-block-paragraph"><strong>1) Crear un nuevo proyecto base de KumbiaPHP</strong><br>composer create-project kumbia/framework myapp<br><strong>2) Entrar al proyecto</strong><br>cd myapp/default/app<br><strong>3) Iniciar servidor de desarrollo de PHP apuntando a public/</strong><br>./bin/phpserver</p>



<figure class="wp-block-image size-full"><a href="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-composer-example.jpg"><img loading="lazy" decoding="async" width="769" height="494" src="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-composer-example.jpg" alt="Proyecto KumbiaPHP generado con Composer en segundos.”" class="wp-image-2967" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-composer-example.jpg 769w, https://kumbiaphp.com/blog/wp-content/uploads/2025/11/kumbiaphp-composer-example-300x193.jpg 300w" sizes="auto, (max-width: 769px) 100vw, 769px" /></a></figure>



<p class="wp-block-paragraph">El paquete <strong>framework</strong> es el esqueleto básico para comenzar: genera la estructura y te deja listo para desarrollar. Si eres nuevo en Composer, la sección <a href="https://github.com/KumbiaPHP/Documentation/blob/master/es/to-install.md#instalaci%C3%B3n-con-composer">Instalación con Composer</a> te guiarán sobre cómo funciona <code class="" data-line="">composer.json</code> y los comandos principales.</p>



<h2 class="wp-block-heading">4) Controladores: contenido revisado + nuevas imágenes</h2>



<p class="wp-block-paragraph">La sección de <strong>Controladores</strong> se reordenó para mejorar la lectura y cubrir escenarios reales:</p>



<ul class="wp-block-list">
<li><strong>Validación de parámetros:</strong> número de parámetros, pasar valores a la vista, convenciones de nombrado, acciones y filtros.</li>



<li><strong>Controladores dinámicos:</strong> cuándo conviene y cómo mantenerlos legibles.</li>
</ul>



<h2 class="wp-block-heading">Enlaces rápidos</h2>



<ul class="wp-block-list">
<li><strong>Manual (repo):</strong> documentación central y carpetas es/ y en/. (<a href="https://github.com/KumbiaPHP/Documentation">GitHub</a>)</li>



<li><strong>Paquete framework en Packagist:</strong> referencias y enlaces al manual. (<a href="https://packagist.org/packages/kumbia/framework?utm_source=chatgpt.com">Packagist</a>)</li>
</ul>



<h2 class="wp-block-heading">Gracias a la comunidad <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f64c.png" alt="🙌" class="wp-smiley" style="height: 1em; max-height: 1em;" /></h2>



<p class="wp-block-paragraph">Estas mejoras nacen de <em>pull requests</em> recientes y la colaboración constante de la comunidad. Si quieres proponer cambios, abre un PR en el repo del manual o únete al Slack para coordinar traducciones/imágenes adicionales. ¡Seguimos puliendo el contenido para que empezar con <strong>KumbiaPHP 1.2 (PHP 8)</strong> sea cada vez más fácil!</p>



<p class="wp-block-paragraph"></p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2025/11/03/novedades-del-manual-de-kumbiaphp-noviembre-2025/">Novedades del Manual de KumbiaPHP — noviembre 2025</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/2025/11/03/novedades-del-manual-de-kumbiaphp-noviembre-2025/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2961</post-id>	</item>
		<item>
		<title>Optimizando la Renderización Condicional en Vistas de KumbiaPHP con return 1;</title>
		<link>https://kumbiaphp.com/blog/2024/10/14/optimizando-la-renderizacion-condicional-en-vistas-de-kumbiaphp-con-return-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=optimizando-la-renderizacion-condicional-en-vistas-de-kumbiaphp-con-return-1</link>
					<comments>https://kumbiaphp.com/blog/2024/10/14/optimizando-la-renderizacion-condicional-en-vistas-de-kumbiaphp-con-return-1/#comments</comments>
		
		<dc:creator><![CDATA[HenryStivens]]></dc:creator>
		<pubDate>Mon, 14 Oct 2024 16:52:23 +0000</pubDate>
				<category><![CDATA[Documentación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[vistas]]></category>
		<guid isPermaLink="false">https://kumbiaphp.com/blog/?p=2823</guid>

					<description><![CDATA[<p>Aprende a optimizar la renderización condicional en vistas de KumbiaPHP usando return 1; para escribir código más limpio y eficiente sin bloques if-else innecesarios.</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2024/10/14/optimizando-la-renderizacion-condicional-en-vistas-de-kumbiaphp-con-return-1/">Optimizando la Renderización Condicional en Vistas de KumbiaPHP con return 1;</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En el desarrollo web, especialmente al trabajar con motores de plantillas o frameworks MVC como <a href="https://kumbiaphp.com/blog/manuales-y-descargas/">KumbiaPHP</a>, es común <a href="https://github.com/KumbiaPHP/Documentation/blob/master/es/view.md">renderizar</a> condicionalmente partes de una vista basándose en la disponibilidad de datos. Tradicionalmente, los desarrolladores utilizan sentencias <em>if-else</em> para controlar el flujo de renderización de la vista. Sin embargo, el uso excesivo de bloques <em>if-else</em> puede desordenar tu código y dificultar su mantenimiento.</p>



<p class="wp-block-paragraph">En este artículo, exploraremos una forma más limpia y eficiente de gestionar la renderización condicional en KumbiaPHP con return 1;. También profundizaremos en por qué este enfoque es preferible sobre el uso estándar de <em>return;</em> o estructuras <em>if-else</em> anidadas.</p>



<span id="more-2823"></span>



<h2 class="wp-block-heading">El Enfoque Tradicional: Uso de <em>if-else</em></h2>



<p class="wp-block-paragraph">Considera un escenario donde quieres mostrar un mensaje si no hay datos para mostrar y renderizar el resto de la vista solo cuando los datos están disponibles. Un enfoque típico podría verse así:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">&lt;?php if (!$products): ?&gt;
    &lt;h2&gt;No hay productos disponibles&lt;/h2&gt;
&lt;?php else: ?&gt;
    &lt;h1&gt;Lista de Productos&lt;/h1&gt;
    &lt;ul&gt;
        &lt;?php foreach ($products as $product): ?&gt;
            &lt;li&gt;
                &lt;h3&gt;&lt;?= $product-&gt;nombre ?&gt;&lt;/h3&gt;
                &lt;img src=&quot;&lt;?= $product-&gt;imagen_url ?&gt;&quot; alt=&quot;&lt;?= $product-&gt;nombre ?&gt;&quot; /&gt;
                &lt;p&gt;&lt;strong&gt;Categoría:&lt;/strong&gt; &lt;?= $product-&gt;categoria ?&gt;&lt;/p&gt;
                &lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt; &lt;?= $product-&gt;descripcion ?&gt;&lt;/p&gt;
                &lt;p&gt;&lt;strong&gt;Precio:&lt;/strong&gt; $&lt;?= number_format($product-&gt;precio, 2) ?&gt;&lt;/p&gt;
                &lt;p&gt;&lt;strong&gt;Stock:&lt;/strong&gt; &lt;?= $product-&gt;stock ?&gt; unidades disponibles&lt;/p&gt;
                &lt;p&gt;&lt;strong&gt;SKU:&lt;/strong&gt; &lt;?= $product-&gt;sku ?&gt;&lt;/p&gt;
                &lt;a href=&quot;/productos/&lt;?= $product-&gt;id ?&gt;&quot; class=&quot;btn&quot;&gt;Ver Detalles&lt;/a&gt;
            &lt;/li&gt;
        &lt;?php endforeach ?&gt;
    &lt;/ul&gt;
&lt;?php endif; ?&gt;
</code></pre>



<p class="wp-block-paragraph">Aunque esto funciona, envolver todo el código de la vista dentro de un bloque <em>else</em> añade una indentación y complejidad innecesarias, especialmente en vistas más grandes.</p>



<h2 class="wp-block-heading">Renderización condicional en KumbiaPHP con return 1; Una Solución Más Limpia:</h2>



<p class="wp-block-paragraph">Para mejorar la legibilidad y mantener el código más limpio, podemos utilizar <em>return 1</em>; para salir de la vista de manera anticipada si no hay datos. Aquí está cómo se vería el código:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">&lt;?php if (!$products) {
    echo &quot;&lt;h2&gt;No hay productos disponibles&lt;/h2&gt;&quot;;
    //View::partial(&#039;sin-datos&#039;); // o enviamos un partial
    return 1;
}?&gt;

&lt;h1&gt;Lista de Productos&lt;/h1&gt;
&lt;ul&gt;
    &lt;?php foreach ($products as $product): ?&gt;
        &lt;li&gt;
            &lt;h3&gt;&lt;?= $product-&gt;nombre ?&gt;&lt;/h3&gt;
            &lt;img src=&quot;&lt;?= $product-&gt;imagen_url ?&gt;&quot; alt=&quot;&lt;?= $product-&gt;nombre ?&gt;&quot; /&gt;
            &lt;p&gt;&lt;strong&gt;Categoría:&lt;/strong&gt; &lt;?= $product-&gt;categoria ?&gt;&lt;/p&gt;
            &lt;p&gt;&lt;strong&gt;Descripción:&lt;/strong&gt; &lt;?= $product-&gt;descripcion ?&gt;&lt;/p&gt;
            &lt;p&gt;&lt;strong&gt;Precio:&lt;/strong&gt; $&lt;?= number_format($product-&gt;precio, 2) ?&gt;&lt;/p&gt;
            &lt;p&gt;&lt;strong&gt;Stock:&lt;/strong&gt; &lt;?= $product-&gt;stock ?&gt; unidades disponibles&lt;/p&gt;
            &lt;p&gt;&lt;strong&gt;SKU:&lt;/strong&gt; &lt;?= $product-&gt;sku ?&gt;&lt;/p&gt;
            &lt;p&gt;&lt;strong&gt;Fecha de Lanzamiento:&lt;/strong&gt; &lt;?= date(&#039;d/m/Y&#039;, strtotime($product-&gt;fecha_lanzamiento)) ?&gt;&lt;/p&gt;
            &lt;p&gt;&lt;strong&gt;Calificación:&lt;/strong&gt; &lt;?= $product-&gt;calificacion ?&gt; estrellas&lt;/p&gt;
            &lt;a href=&quot;/productos/&lt;?= $product-&gt;id ?&gt;&quot; class=&quot;btn&quot;&gt;Ver Detalles&lt;/a&gt;
        &lt;/li&gt;
    &lt;?php endforeach ?&gt;
&lt;/ul&gt;
</code></pre>



<p>En este ejemplo:</p>
<ul>
<li>Si <em>$products</em> está vacío o es <em>false</em>, se muestra el mensaje «No hay productos disponibles» y la ejecución de la vista se detiene gracias a <em>return 1;</em>.</li>
<li>Si <em>$products</em> tiene datos, el código continúa ejecutándose y se muestra la lista detallada de productos sin necesidad de un bloque <em>else</em>.</li>
<li>El código es más limpio y fácil de leer al eliminar la indentación adicional.</li>
</ul>



<h2 class="wp-block-heading">Aplicación en Templates y Partials</h2>



<p class="wp-block-paragraph">La misma técnica puede aplicarse en <strong>templates</strong> y <strong>partials</strong>. Esto es útil cuando necesitas condicionar la inclusión de ciertas secciones o elementos de la interfaz de usuario.</p>



<h3 class="wp-block-heading">Ejemplo en un Partial</h3>



<p class="wp-block-paragraph">En un partial que muestra comentarios de un artículo:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">&lt;?php
if (!$comments) {
    echo &quot;&lt;p&gt;No hay comentarios aún. ¡Sé el primero en comentar!&lt;/p&gt;&quot;;
    return 1;
}?&gt;

&lt;div class=&quot;comments&quot;&gt;
    &lt;h3&gt;&lt;?= count($comments) ?&gt; Comentarios&lt;/h3&gt;
    &lt;?php foreach ($comments as $comment): ?&gt;
        &lt;div class=&quot;comment&quot;&gt;
            &lt;p&gt;&lt;strong&gt;&lt;?= $comment-&gt;autor ?&gt;&lt;/strong&gt; dice:&lt;/p&gt;
            &lt;p&gt;&lt;?= $comment-&gt;contenido ?&gt;&lt;/p&gt;
            &lt;p&gt;&lt;em&gt;Publicado el &lt;?= date(&#039;d/m/Y H:i&#039;, strtotime($comment-&gt;fecha_publicacion)) ?&gt;&lt;/em&gt;&lt;/p&gt;
        &lt;/div&gt;
    &lt;?php endforeach ?&gt;
&lt;/div&gt;
</code></pre>



<h2 class="wp-block-heading">Entendiendo <em>View::render()</em> y <em>include</em></h2>



<p class="wp-block-paragraph">En KumbiaPHP, las vistas se renderizan usando el método <em>View::render()</em>, que internamente incluye el archivo de vista:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">// Carga la vista
if (!include self::getView()) {
    throw new KumbiaException(&#039;Vista &quot;&#039; . self::getPath() . &#039;&quot; no encontrada&#039;, &#039;no_view&#039;);
}</code></pre>



<p class="wp-block-paragraph">La sentencia <em>include</em> en PHP devuelve <em>false</em> si falla al cargar el archivo (debido a que el archivo no existe, falta de permisos, etc.). Si el archivo incluido ejecuta un <em>return;</em> sin un valor, devuelve <em>null</em>, lo que la validación del  <em>include</em> se interpreta como <em>false</em>. Esto lleva a que <em>View::render()</em> crea que el archivo de vista no pudo ser incluido y lanza una excepción.</p>



<h3 class="wp-block-heading">La Importancia de <em>return 1;</em></h3>



<p class="wp-block-paragraph">Al usar <em>return 1;</em>, la vista devuelve <em>1</em>, lo que <em>include</em> interpreta como una inclusión exitosa. Esto permite que el proceso de renderización continúe sin problemas sin desencadenar una excepción.</p>



<h2 class="wp-block-heading">Beneficios de Usar <em>return 1;</em></h2>



<ul class="wp-block-list">
<li><strong>Código Más Limpio</strong>: Al eliminar bloques <em>else</em> innecesarios, el código es más sencillo y legible.</li>



<li><strong>Facilidad de Mantenimiento</strong>: Menos indentaciones y anidaciones facilitan la comprensión y modificación del código en el futuro.</li>



<li><strong>Consistencia</strong>: Puedes aplicar esta técnica en vistas, templates y partials de manera uniforme.</li>



<li><strong>Mayor Claridad</strong>: Separar la lógica de control del contenido principal mejora la claridad y organización del código.</li>
</ul>



<h2 class="wp-block-heading">Conclusión</h2>



<p class="wp-block-paragraph">Usar <em>return 1;</em> en las vistas de KumbiaPHP es una forma simple pero efectiva de gestionar la renderización condicional sin complicar tu código con estructuras <em>if-else</em> innecesarias. Asegura que tus vistas se ejecuten sin problemas y que el proceso de renderización continúe sin excepciones.</p>



<p class="wp-block-paragraph">Al adoptar este enfoque, puedes escribir vistas más limpias y mantenibles en tus aplicaciones KumbiaPHP. Pruébalo en tu próximo proyecto y experimenta la diferencia que hace en tu base de código.</p>



<p class="wp-block-paragraph"><em>¡Feliz codificación con KumbiaPHP!</em></p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2024/10/14/optimizando-la-renderizacion-condicional-en-vistas-de-kumbiaphp-con-return-1/">Optimizando la Renderización Condicional en Vistas de KumbiaPHP con return 1;</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/2024/10/14/optimizando-la-renderizacion-condicional-en-vistas-de-kumbiaphp-con-return-1/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2823</post-id>	</item>
		<item>
		<title>Formularios a base de datos fácilmente con 1 línea de código</title>
		<link>https://kumbiaphp.com/blog/2019/05/27/formularios-a-base-de-datos-facilmente-1-linea-de-codigo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=formularios-a-base-de-datos-facilmente-1-linea-de-codigo</link>
					<comments>https://kumbiaphp.com/blog/2019/05/27/formularios-a-base-de-datos-facilmente-1-linea-de-codigo/#comments</comments>
		
		<dc:creator><![CDATA[HenryStivens]]></dc:creator>
		<pubDate>Mon, 27 May 2019 16:16:18 +0000</pubDate>
				<category><![CDATA[Documentación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[ejemplos]]></category>
		<guid isPermaLink="false">https://www.kumbiaphp.com/blog/?p=1641</guid>

					<description><![CDATA[<p>En KumbiaPHP existe una implementación que ahorra muchísimo trabajo a la hora de hacer formularios y la intención es&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2019/05/27/formularios-a-base-de-datos-facilmente-1-linea-de-codigo/">Formularios a base de datos fácilmente con 1 línea de código</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">En KumbiaPHP existe una implementación que ahorra muchísimo trabajo a la hora de hacer formularios y la intención es aprovechar al máximo las bondades que ofrece el framework. En este sentido tenemos la <strong>Autocarga de objeto</strong>, la cual, como su nombre indica asocia un campo de formulario a una tabla y campo de la base de datos.</p>



<h2 class="wp-block-heading">DDL y modelo para la tabla</h2>



<p class="wp-block-paragraph">Veamos la estructura de la tabla <em>user </em>que hemos visto en ejemplos anteriores:</p>



<pre class="wp-block-code language-sql"><code class="" data-line="">CREATE TABLE `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(255) NOT NULL,
 `age` int(11) NOT NULL DEFAULT &#039;0&#039;,
 `email` varchar(255) NOT NULL, 
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;</code></pre>



<p class="wp-block-paragraph">Y el modelo para este caso lo haremos heredar de la clase <a href="https://github.com/KumbiaPHP/Documentation/blob/master/es/active-record.md">ActiveRecord</a> y lo ubicamos en <em>default/app/models/user.php</em></p>



<pre class="wp-block-code language-php"><code class="" data-line="">&lt;?php

class User extends ActiveRecord
{
    
}</code></pre>



<h2 class="wp-block-heading">Implementación de la autocarga de objeto</h2>



<p class="wp-block-paragraph">KumbiaPHP implementa la&nbsp;<strong>Autocarga de objeto</strong> la cual, siguiendo una convención mínima <strong>modelo.campo</strong> donde para el ejemplo el modelo es <em>user</em>, es decir existe una tabla llamada <em>user</em> en la base de datos y <em>campo</em> serán cada una de las columnas de esa tabla (id, name, age, email).</p>



<p class="wp-block-paragraph">En concordancia con las columnas de la tabla <em>use</em>r se indica el comportamiento de la <em>Autocarga de objeto</em> para que el controller no tenga que recoger uno a uno los valores enviado por POST.</p>



<p class="wp-block-paragraph">Para este caso usaremos el helper <a href="https://github.com/KumbiaPHP/Documentation/blob/master/es/view.md#clase-form"><em>Form</em></a>:</p>



<p class="wp-block-paragraph">Archivo: <em>default/app/views/user/create.phtml</em></p>



<pre class="wp-block-code language-php"><code class="" data-line="">&lt;?php View::content() ?&gt;

&lt;?= Form::open() ?&gt;
&lt;?= Form::text(&#039;user.name&#039;) ?&gt; 
&lt;?= Form::email(&#039;user.email&#039;) ?&gt;
&lt;?= Form::number(&#039;user.age&#039;) ?&gt;
&lt;?= Form::submit(&#039;Guardar&#039;) ?&gt;
&lt;?= Form::close() ?&gt;</code></pre>



<p class="wp-block-paragraph">Automáticamente cuando esos valores vayan a la url /<em>user/create</em> KumbiaPHP interpreta que existe una tabla <em>user</em> con los campos <em>name, email</em> y<em> age.<br>
</em></p>



<span id="more-1641"></span>



<h2 class="wp-block-heading">Aplicando autocarga en el controlador</h2>



<p class="wp-block-paragraph">Ahora vemos el código que se utiliza en <em>controllers/user_controller.php</em> en su acción <em>create()</em>.</p>



<p class="wp-block-paragraph">Archivo: <em>default/app/controllers/user_controller.php</em></p>



<pre class="wp-block-code language-php"><code class="" data-line="">&lt;?php 
/**
 * Controlador para las acciones y vistas con el usuario 
 */ 
class UserController extends AppController
{ 

    public function index()
    {
        // Se debe implementar la función de listar
    }

    public function create()
    {
        //se verifica si se ha enviado via POST los datos
        if ( ! Input::hasPost(&#039;user&#039;)) {
            return;
        }
            
        //Intenta guardar el usuario
        if ((new User)-&gt;create(Input::post(&#039;user&#039;))) {
            //Mensaje de éxito 
            Flash::valid(&#039;Usuario creado&#039;);
            //Elimina los datos del POST, muestra limpio el formulario
            Input::delete();
            return;
        }
        //Mensaje de fallo 
        Flash::error(&#039;Falló al intentar crear el usuario&#039;);
    }
}</code></pre>



<p class="wp-block-paragraph">Si probamos el formulario y por alguna razón falla al guardar, automáticamente mostrará el formulario con los datos que se intentaron guardar, sin que debamos estar verificando si hay datos en el POST y si los hubiera indicarle al input el value, ya que el helper Form lo hace por nosotros.</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="922" height="825" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/12/fomurlario-con-autocarga-de-objeto.png" alt="" class="wp-image-2059" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2018/12/fomurlario-con-autocarga-de-objeto.png 922w, https://kumbiaphp.com/blog/wp-content/uploads/2018/12/fomurlario-con-autocarga-de-objeto-300x268.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2018/12/fomurlario-con-autocarga-de-objeto-768x687.png 768w" sizes="auto, (max-width: 922px) 100vw, 922px" /></figure>



<p class="wp-block-paragraph">Con esto se ahorra mucho trabajo y le sacamos el máximo provecho a KumbiaPHP Framework.</p>



<h2 class="wp-block-heading">Acceder a un campo del formulario enviado mediante POST</h2>



<p class="wp-block-paragraph">A veces nos consultan como se accede a un campo específico del formulario que viene en el POST en el controlador, y es muy sencillo veamos qué valor trae <em>Input::post(&#8216;user&#8217;):</em></p>



<pre class="wp-block-preformatted">array(3) {
  ['name']=&gt;
  string(8) "John Doe"
  ['email']=&gt;
  string(12) "jd@email.com"
  ['age]=&gt;
  int(30)
}
</pre>



<p class="wp-block-paragraph">Como pueden ver al hacer un <a href="http://php.net/manual/en/function.var-dump.php">var_dump()</a> de la variable nos muestra que es un simple arreglo por lo tanto la manera de acceder es la siguiente:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">$name = Input::post(&#039;user.name&#039;);
// or
$name = Input::post(&#039;user&#039;)[&#039;name&#039;];</code></pre>



<p class="wp-block-paragraph">Son casos especiales y lo mejor es que aprovechen al máximo la autocarga.</p>



<h2 class="wp-block-heading">Error común de novatos</h2>



<p class="wp-block-paragraph">Es común ver en quienes inician con KumbiaPHP cometer varios errores y uno de ellos es crear el objeto o registro campo por campo. Lo vemos mejor en el siguiente código de la función <em>create()</em> del controlador <em>UserController</em>:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">public function create()
{
    //se verifica si se ha enviado via POST los datos
    if (Input::hasPost(&#039;user&#039;)) {
        $data = Input::post(&#039;user&#039;);
        //Código incorrecto: Obtener del POST el valor de
        //cada input y asignarlo uno a uno al objeto.
        $user = new User();
        $user-&gt;name = $data[&#039;name&#039;];
        $user-&gt;email = $data[&#039;email&#039;];
        $user-&gt;age = $data[&#039;age&#039;];
        //Intenta guardar el usuario
        if ($user-&gt;create()) {
            //Mensaje de éxito
            Flash::valid(&#039;Usuario creado&#039;);
            //Elimina los datos del POST, muestra limpio el formulario
            Input::delete();
            return;
        }
        //Mensaje de fallo
        Flash::error(&#039;Falló al intentar crear el usuario&#039;);
    }
}</code></pre>



<p class="wp-block-paragraph">Funciona si, pero como pueden notar, se agregaron para este caso cinco líneas de código innecesarias. Ahora imaginen que no son tres campos en el formulario, si no que son diez, veinte o más campos por formulario. Ahora multipliquemos eso por el número de formularios de toda la aplicación.</p>



<p class="wp-block-paragraph">El código creado sería muy extenso y se convierte en difícil de leer y mantener.</p>



<p class="wp-block-paragraph">Espero que les sea de utilidad este artículo.</p>



<p class="wp-block-paragraph">PD: Agradecimientos a&nbsp;<span class="tadv-format-panel author"><a href="/blog/author/deivinson/">Deivinson Tejeda</a></span> por el borrador de este artículo.</p>


<p>La entrada <a href="https://kumbiaphp.com/blog/2019/05/27/formularios-a-base-de-datos-facilmente-1-linea-de-codigo/">Formularios a base de datos fácilmente con 1 línea de código</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/2019/05/27/formularios-a-base-de-datos-facilmente-1-linea-de-codigo/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1641</post-id>	</item>
		<item>
		<title>Errores comunes al subir web o aplicación php a producción</title>
		<link>https://kumbiaphp.com/blog/2018/11/05/errores-comunes-al-subir-web-o-aplicacion-php-a-produccion/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=errores-comunes-al-subir-web-o-aplicacion-php-a-produccion</link>
					<comments>https://kumbiaphp.com/blog/2018/11/05/errores-comunes-al-subir-web-o-aplicacion-php-a-produccion/#comments</comments>
		
		<dc:creator><![CDATA[Nelson Rojas]]></dc:creator>
		<pubDate>Mon, 05 Nov 2018 02:48:01 +0000</pubDate>
				<category><![CDATA[Documentación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales y screencast]]></category>
		<category><![CDATA[deployment]]></category>
		<category><![CDATA[producción]]></category>
		<category><![CDATA[servidor php]]></category>
		<guid isPermaLink="false">https://www.kumbiaphp.com/blog/?p=1972</guid>

					<description><![CDATA[<p>La labor de desarrollo de aplicaciones conlleva problemas que no logramos reconocer a primera vista. Este post tiene por&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2018/11/05/errores-comunes-al-subir-web-o-aplicacion-php-a-produccion/">Errores comunes al subir web o aplicación php a producción</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>La labor de desarrollo de aplicaciones conlleva problemas que no logramos reconocer a primera vista. Este post tiene por finalidad, ayudarnos a detectar los errores más comunes cuando hacemos el paso a producción (deployment) de nuestra aplicación hecha con KumbiaPHP.</p>
<p>Va especialmente dedicado a nuestros colegas que alguna vez han llegado al chat grupal con la frase:</p>
<blockquote><p>Es que no funciona en producción</p></blockquote>
<p>La primera pregunta que debemos resolver es:</p>
<h2>¿Por qué no funciona?</h2>
<p>A continuación presentamos una lista de los temas más comunes que deberíamos tener en cuenta para resolver la pregunta que impulsa este artículo.</p>
<p><span id="more-1972"></span></p>
<ol>
<li><a href="#apache-server">¿El servidor apache está ejecutándose?</a></li>
<li><a href="#mod-rewrite-activo">¿El mod rewrite está activo?</a></li>
<li><a href="#mod-rewrite-activo">¿El mod rewrite está configurado para nuestra ruta en el servidor?</a></li>
<li><a href="#php-instalado">¿PHP está instalado y configurado?</a></li>
<li><a href="#base-datos-activo">¿El servidor de bases de datos está activo?</a></li>
<li><a href="#base-datos-configuracion">¿La cuenta en el servidor de bases de datos es la que corresponde en la configuración de nuestra aplicación?</a></li>
<li><a href="#base-datos-produccion">¿Hemos trasladado todos los cambios desde el servidor de bases de datos de desarrollo hacia el servidor de producción?</a></li>
<li><a href="#permisos-app">¿Nuestra aplicación tiene los permisos bien configurados?</a></li>
<li><a href="#ficheros-ocultos">¿Hemos copiado completamente la aplicación desde el servidor de desarrollo (incluidos todos los archivos .htaccess)?</a></li>
<li><a href="#configurar-path">¿Hemos configurado correctamente la constante PUBLIC_PATH?</a></li>
<li><a href="#estrategia-url">¿Podemos usar PATH_INFO o necesitamos cambiar la estrategia de generación de URL?</a></li>
<li><a href="#activar-errores">Si estamos completamente a ciegas, ¿hemos activado la visualización de errores?</a></li>
<li><a href="#app-too-many-redirects">El sitio presenta un error ERR_TOO_MANY_REDIRECTS al cargarlo</a>.</li>
</ol>
<p><strong>NOTA: </strong> Si es <strong>la primera vez</strong> que haces un paso a producción (deployment) a un servidor dedicado o en un hosting compartido, te recomendamos leer los siguientes artículos que hemos alojado en nuestra wiki.</p>
<ul>
<li style="font-weight: 400;">Pasar a producción: <a href="http://wiki.kumbiaphp.com/Pasar_a_produccion">http://wiki.kumbiaphp.com/Pasar_a_produccion</a></li>
<li>Kumbia en servidor con CPanel: <a href="http://wiki.kumbiaphp.com/KumbiaPHP_en_servidor_con_CPanel">http://wiki.kumbiaphp.com/KumbiaPHP_en_servidor_con_CPanel</a></li>
</ul>
<p>Continuemos entonces con el checklist:</p>
<h2><a id="apache-server"></a>¿El servidor Apache está ejecutándose?</h2>
<p>Nuestra primera tarea será revisar que el servicio de Apache se encuentre activo y en el puerto necesario. Asumiendo que la tarea de despliegue (deployment) se realiza en un servidor linux, podemos revisar si el servicio está activo y si acaso el puerto está escuchando.</p>
<p>Revisemos el servicio web con los siguientes comandos:</p>
<pre>ps -fea | grep -i http
ps -fea | grep -i apache</pre>
<p>Si encontramos resultados, es decir, al menos 2 líneas se visualizan como salida a nuestro comando*, es que el servicio está activo.</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.44.28.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1979" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.44.28.png" alt="" width="848" height="252" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.44.28.png 848w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.44.28-300x89.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.44.28-768x228.png 768w" sizes="auto, (max-width: 848px) 100vw, 848px" /></a></p>
<p>*el comando <strong>ps</strong> es “<strong>p</strong>rocess <strong>s</strong>tatus” o estado del proceso. Las opciones -fea son para indicar que nos liste los procesos de nuestro usuario como del resto, así como algo de información relacionada con el proceso. Para realizar el filtro entre todos los procesos hemos usado un pipe | o tubería para enviar el resultado del comando ps al comando grep que buscará en la lista si acaso existe algo que contenga el texto “http”, o algo que contenga “apache”. Se usa con -i para que no discrimine entre mayúsculas y minúsculas o alguna combinación de ellas. Para más ayuda sobre estos comando les recomendamos usar el comando man ps o también pueden usar man grep.</p>
<p>NOTA: si usan el comando man (manual) para ps o para grep lo más seguro es que se encuentren con el editor vi. Para salir de él bastará con presionar Esc (escape), luego : (dos puntos) y luego q (la letra q para quit).</p>
<p>Revisemos ahora que el servicio está activo y escuchando peticiones.</p>
<p>Para eso nos bastará en primera instancia abrir un navegador y apuntarlo a la dirección de nuestro servidor. Si tenemos respuesta de la página de bienvenida del servicio (apache) ya tendremos este tema resuelto.</p>
<p>Ahora, si tenemos acceso por consola, podemos probar usando el comando</p>
<pre>netstat -av | grep http</pre>
<p>En mi caso, uso apache y su nombre de servicio es http. En otros Sistemas Operativos o paquetes de software que incluyen Apache, el servicio web puede encontrarse como apache o apache2.</p>
<p><a id="mod-rewrite-activo"></a><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.40.01-1.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1978" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.40.01-1.png" alt="" width="848" height="252" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.40.01-1.png 848w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.40.01-1-300x89.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.40.01-1-768x228.png 768w" sizes="auto, (max-width: 848px) 100vw, 848px" /></a></p>
<h2><a id="mod-rewrite-activo"></a>¿El mod rewrite está activado?</h2>
<p>Esta pregunta no es difícil de responder si usamos un pequeño archivo PHP al que llamaremos info.php. En él escribiremos &lt;?php phpinfo(); ?&gt; y luego lo abriremos desde el navegador (normalmente http://localhost/info.php)</p>
<p>Así aprovecharemos para revisar que PHP está activo y en la versión del mismo.</p>
<p>Una vez cargue la página de información de php buscaremos (en general con Ctrl + F o Cmd + F) la palabra rewrite. Deberíamos encontrarla en la sección apache2handlers, en la fila Loaded Modules.</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.51.29.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1982 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.51.29.png" alt="Información del php info" width="953" height="370" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.51.29.png 953w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.51.29-300x116.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.51.29-768x298.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-07.51.29-940x365.png 940w" sizes="auto, (max-width: 953px) 100vw, 953px" /></a></p>
<p>Como se aprecia en la imagen anterior también está activo mod_php7 :-)</p>
<p>En caso que no lo encontremos, o que el archivo info.php no nos dé información, bastará con hacer la activación desde la consola (en el caso de tener servidor con shell activa). Vamos a asumir que usamos un servidor con un sistema operativo derivado de debian (ubuntu o similar). Entonces escribiremos en la consola como root</p>
<pre>a2enmod rewrite</pre>
<p>Y luego reiniciamos el servicio de apache (también como root)</p>
<pre>service apache2 restart</pre>
<p>Con esto ya deberíamos tener activado el módulo de sobrescritura de url.</p>
<h2><a id="mod-rewrite-activo"></a>¿El mod rewrite está configurado para nuestra ruta en el servidor?</h2>
<p>Bueno, no basta con activar el mod rewrite, hay que configurarlo también.</p>
<pre><strong>Nota del autor:</strong> esto es lo que normalmente hago en mi configuración de apache. 
No sé si es lo más recomendado. Los comentarios son bienvenidos :)</pre>
<p>Para realizar este cambio iremos al archivo de configuración de apache (generalmente alojado en /etc/apache2/apache2.conf)</p>
<p>Lo editaremos y buscaremos una sección llamada Directory.</p>
<p>Buscaremos aquella cuya línea sea Directory /var/www y cambiaremos la opción AllowOverride None por AllowOverride All. Guardaremos la configuración y procederemos a reiniciar el servicio apache.</p>
<p>En las imágenes siguientes se ve el antes y el después de la configuración.</p>
<figure><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.04.50.png"><img loading="lazy" decoding="async" class="wp-image-1984 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.04.50.png" alt="antes de la configuración" width="593" height="190" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.04.50.png 593w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.04.50-300x96.png 300w" sizes="auto, (max-width: 593px) 100vw, 593px" /></a><figcaption>Antes de la configuración</figcaption></figure>
<figure><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.06.22.png"><img loading="lazy" decoding="async" class="size-full wp-image-1985" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.06.22.png" alt="luego de cambiar la configuración" width="593" height="140" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.06.22.png 593w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.06.22-300x71.png 300w" sizes="auto, (max-width: 593px) 100vw, 593px" /></a><figcaption>luego de cambiar la configuración</figcaption></figure>
<p>Con estos pasos el mod rewrite estará activo y configurado.</p>
<h2><a id="php-instalado"></a>¿PHP está instalado y configurado?</h2>
<p>Si hemos llevado a cabo los pasos anteriores para saber si el mod rewrite estaba activo, y lo hemos encontrado en el archivo info.php, entonces es que tenemos PHP bien instalado.</p>
<p>En caso que no hayamos logrado entonces deberemos instalar el módulo PHP en nuestro servidor.</p>
<p>Para hacer esta tarea usaremos nuevamente la consola (shell) para hacer la instalación.</p>
<p>La instalación varía un poco entre distribuciones de servidor, pero haremos la instalación pensando en algún derivado de debian (como si fuéramos root)</p>
<pre>apt-get install libapache2-mod-php php</pre>
<p>Una vez que la instalación haya finalizado necesitaremos reiniciar el servicio web (como root)</p>
<pre>service apache2 restart</pre>
<p>Si tenemos aún el archivo info.php, pues lo abriremos desde el navegador (normalmente http://localhost/info.php)</p>
<p>Si logramos ver el resultado de nuestro archivo, entonces ya tendremos claro que PHP está activo en nuestro servidor.</p>
<h2><a id="base-datos-activo"></a>¿El servidor de bases de datos está activo?</h2>
<p>Si usamos MySQL o MariaDB bastará con intentar hacer login con la cuenta que tenemos en la configuración de nuestra aplicación desde la consola.</p>
<pre>mysql nombredelabasededatos -u miusuario -p</pre>
<p>Digitamos la contraseña y presionamos enter para lograr acceso.</p>
<p>Si nos da un error como el que se ve en la imagen siguiente es porque el servicio no está activo.</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.11.50.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1986" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.11.50.png" alt="" width="887" height="154" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.11.50.png 887w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.11.50-300x52.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.11.50-768x133.png 768w" sizes="auto, (max-width: 887px) 100vw, 887px" /></a></p>
<p>Para activarlo deberemos ejecutar un comando como el que sigue desde la consola (como si fuéramos root):</p>
<pre>service mysqld start</pre>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.12.57.png"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-1988" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.12.57.png" alt="" width="887" height="250" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.12.57.png 887w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.12.57-300x85.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2018/11/Captura-de-pantalla-2018-11-01-a-las-08.12.57-768x216.png 768w" sizes="auto, (max-width: 887px) 100vw, 887px" /></a></p>
<p>Si ahora logramos acceso y todo va bien, es decir, logramos conectarnos al servidor mysql, sería bueno saber si tenemos acceso a la base de datos que usará la aplicación.</p>
<p>Para eso, estando en la consola interactiva de mysql, escribimos el comando <b>use mibasededatos;</b> (donde mibasededatos es el nombre de la base de datos que está configurado en el archivo database.ini) seguido de punto y coma. Y presionamos enter.</p>
<p>Nos debe aparecer un mensaje como “database changed”.</p>
<p>Seleccionamos alguna de las tablas del sistema (podemos listarlas usando el comando <strong>show tables;</strong>), y escribimos alguna instrucción y le ejecutamos, por ejemplo;</p>
<pre class="  language-sql"><code class="" data-line="">&lt;span class=&quot;token keyword&quot;&gt;SELECT&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;FROM&lt;/span&gt; tablaseleccionada&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;</code></pre>
<p>Si todo ha ido bien, ya podemos pasar al siguiente punto.</p>
<h2><a id="base-datos-configuracion"></a>¿La cuenta en el servidor de bases de datos es la que corresponde en la configuración de nuestra aplicación?</h2>
<p>Bueno, en el punto anterior ya hemos realizado esta prueba usando el comando:</p>
<pre>mysql nombrebasedatos -u usuario -p</pre>
<p>Si esto no resulta, será necesario crear un usuario de mysql con los permisos necesarios sobre la base de datos correcta. Para eso te recomendamos leer el siguiente artículo que ya explica muy bien cómo lograr esta labor.</p>
<p><a href="https://www.digitalocean.com/community/tutorials/crear-un-nuevo-usuario-y-otorgarle-permisos-en-mysql-es">https://www.digitalocean.com/community/tutorials/crear-un-nuevo-usuario-y-otorgarle-permisos-en-mysql-es</a></p>
<h2><a id="base-datos-produccion"></a>¿Hemos trasladado todos los cambios desde el servidor de bases de datos de desarrollo hacia el servidor de producción?</h2>
<p>A veces el error se produce porque tenemos tablas en el servidor de desarrollo que no hemos pasado al servidor de producción o porque alguna de las tablas de producción no tiene atributos (campos) nuevos que sí hemos estado usando en desarrollo. Hacer una revisión de las estructuras de las tablas será de gran ayuda si comparas cómo es el estado en ambos servidores.</p>
<h2><a id="permisos-app"></a>¿Nuestra aplicación tiene los permisos bien configurados?</h2>
<p>Si hemos leído los artículos de la wiki, y hemos comprobado que los permisos son los correctos, sólo nos quedará pasar al siguiente punto.</p>
<h2><a id="ficheros-ocultos"></a>¿Hemos copiado completamente la aplicación desde el servidor de desarrollo (incluidos todos los archivos ocultos)?</h2>
<p>Por obvia que parezca la pregunta, resulta que en ocasiones el cliente que usamos para copiar los archivos, omite los archivos ocultos que comienzan en punto (los dot files). En KumbiaPHP se usan varios archivos que comienzan en punto, y aunque todos se llaman igual, cada uno cumple una misión diferente dependiendo del lugar en el que esté alojado. Este archivo es el .htaccess.</p>
<p>Personalmente la forma que más me resulta para lidiar con este problema es comprimir el sitio, copiarlo comprimido al servidor de producción y luego descomprimirlo en él. Si esto no fuera posible (porque por ejemplo no tienes acceso a la shell o si el panel web de administración no provee de gestión de archivos), toma en cuenta que el cliente de ftp que uses lleve todo lo que necesitas al servidor de producción.</p>
<h2><a id="configurar-path"></a>¿Hemos configurado correctamente la constante PUBLIC_PATH?</h2>
<p>Aunque también es parte de lo que se habla en los artículos escritos y mencionados de la wiki, uno de nuestros colegas ha escrito un artículo interesante sobre este tema y el siguiente en el blog de KumbiaPHP <a href="https://www.kumbiaphp.com/blog/2018/07/31/no-input-file-specified-arreglar-el-error/">https://www.kumbiaphp.com/blog/2018/07/31/no-input-file-specified-arreglar-el-error/</a></p>
<h2><a id="estrategia-url"></a>¿Podemos usar PATH_INFO o necesitamos cambiar la estrategia de generación de URL?</h2>
<p>Al igual que el punto anterior, nuestra recomendación es leer el artículo que ya se mencionó en él.</p>
<h2><a id="activar-errores"></a>Si estamos completamente a ciegas, ¿hemos activado la visualización de errores?</h2>
<p>Si el servidor no nos da información alguna sobre el error, podemos aprovechar una configuración especial que está alojada dentro del archivo <strong><i>default/public/index.php</i></strong> para activar el registro de los errores y permitir visualizarlos directamente en el navegador web.</p>
<p>Para eso iremos archivo mencionado (<strong>default/public/index.php</strong>) y buscaremos la línea:</p>
<pre><code class="language-php" data-line="">//error_reporting(E_ALL ^ E_STRICT);ini_set(&#039;display_errors&#039;, &#039;On&#039;);</code></pre>
<p>Y le quitaremos los comentarios iniciales, es decir, los dos primeros caracteres iniciales <strong>//</strong></p>
<p>Adicionalmente debemos asegurarnos que KumbiaPHP no esté en modo producción, así que en el mismo archivo <strong><i>default/public/index.php </i></strong>verificamos que la constante PRODUCTION sea igual a false:</p>
<pre><code class="language-php" data-line="">const PRODUCTION = false;</code></pre>
<p>Esto hará que las excepciones que ocurran sean mostradas en pantalla evitando la redirección a la página de error 404, que es comportamiento por defecto de KumbiaPHP cuando está en producción.</p>
<p>Con eso ya tendremos alguna idea a partir de la presentación de los errores en pantalla.</p>
<p>Existe una forma extra de visualizar errores, pero para ello hay que tener acceso al servidor en modo consola (shell) y tener acceso al log de errores del servidor web (apache generalmente). Normalmente este archivo se aloja en <strong><i>/var/log/apache2/error.log</i></strong></p>
<p>Si se tiene acceso a él, usar el comando <strong><i>tail -f error.log</i></strong> será de gran utilidad pues cada vez que recargues tu navegador, los errores se verán reflejados en tu terminal. Los mensajes que recibas serán de gran utilidad al momento de buscar posibles soluciones, o para pedir apoyo a algún colega.</p>
<h2><a id="app-too-many-redirects"></a>El sitio presenta un error ERR_TOO_MANY_REDIRECTS al cargarlo</h2>
<p>Si a pesar de haber eliminado los archivos de la caché este error persiste es momento de revisar nuestra rutina de autenticación. En ocasiones la implementación de la gestión de la sesión del usuario nos puede causar algunos dolores de cabeza, y el consejo aquí es verificar la forma en la cual se lleva a cabo las redirecciones cuando un usuario no tiene los privilegios necesarios y requiere de autenticación. Hay diferentes formas de llevar a cabo la autenticación, pero siempre vale la pena consultar alguna forma que ya haya sido probada. Para tales efectos les recomendamos leer <a href="http://wiki.kumbiaphp.com/Beta2_Sistema_de_Login" target="_blank" rel="noopener noreferrer">http://wiki.kumbiaphp.com/Beta2_Sistema_de_Login</a> o también <a href="https://soyprogramador.liz.mx/implementando-logueo-en-kumbiaphp/" target="_blank" rel="noopener noreferrer">https://soyprogramador.liz.mx/implementando-logueo-en-kumbiaphp/</a> como elementos formativos. Te dejamos como tarea extra mirar código de otras personas. Puedes hacer una búsqueda en <a href="https://github.com/search?q=kumbiaphp" target="_blank" rel="noopener noreferrer">github</a> con la palabra clave kumbiaphp.</p>
<h2>Una recomendación final</h2>
<p><em>Si hemos pasado de PRODUCCION = true a false y viceversa, es necesario recordar eliminar el contenido de la carpeta de cache que genera KumbiaPHP cuando estamos en modo producción. Para ello iremos a la carpeta default/app/temp/cache y borraremos su contenido para evitar que no logremos visualizar los errores porque el framework está presentando los contenidos “cacheados” en vez de las vistas reales.</em></p>
<p>Con todo esto, te deseamos lo mejor y mucho ánimo cuando te encuentres con un problema, pues recuerda que resolverlos es parte de nuestro aprendizaje y nuestra labor como desarrolladores.</p>
<p>Un abrazo cordial,</p>
<p>El equipo de KumbiaPHP</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2018/11/05/errores-comunes-al-subir-web-o-aplicacion-php-a-produccion/">Errores comunes al subir web o aplicación php a producción</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/2018/11/05/errores-comunes-al-subir-web-o-aplicacion-php-a-produccion/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1972</post-id>	</item>
		<item>
		<title>ScaffoldController: Modificando vistas</title>
		<link>https://kumbiaphp.com/blog/2017/05/16/scaffoldcontroller-modificando-vistas/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scaffoldcontroller-modificando-vistas</link>
					<comments>https://kumbiaphp.com/blog/2017/05/16/scaffoldcontroller-modificando-vistas/#comments</comments>
		
		<dc:creator><![CDATA[Nelson Rojas]]></dc:creator>
		<pubDate>Tue, 16 May 2017 12:54:16 +0000</pubDate>
				<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[Documentación]]></category>
		<category><![CDATA[Scaffolding]]></category>
		<category><![CDATA[Tutoriales y screencast]]></category>
		<guid isPermaLink="false">https://www.kumbiaphp.com/blog/?p=1523</guid>

					<description><![CDATA[<p>Hasta aquí hemos invertido tiempo en revisar el uso básico del&#160;ScaffoldController con KumbiaPHP creando nuestros CRUDs de forma rápida,&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/05/16/scaffoldcontroller-modificando-vistas/">ScaffoldController: Modificando vistas</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Hasta aquí hemos invertido tiempo en revisar el <a href="https://www.kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/">uso básico del&nbsp;ScaffoldController</a> con <a href="https://www.kumbiaphp.com/blog/" target="_blank" rel="noopener noreferrer">KumbiaPHP</a> creando nuestros CRUDs de forma rápida, <a href="https://www.kumbiaphp.com/blog/2017/04/12/scaffolding-con-kumbiaphp-modificando-comportamientos-y-contenidos-segun-nuestra-necesidad/">modificando el estilo de las vistas</a> (al añadir un nuevo conjunto de vistas que cargan mediante la variable de controlador <em>$scaffold</em>), y reemplazando comportamientos particulares para modificar el conjunto de datos (al reescribir el método <em>index</em>).</p>



<h2 class="wp-block-heading">Nueva meta u objetivo usando ScaffoldController</h2>



<p class="wp-block-paragraph">Este post tiene por objetivo hacer un resumen de lo que ya hemos visto en las entregas anteriores, y sacar aún más partido al uso de scaffolding con nuestro framework, de tal manera que puedas aplicar los conceptos que se describen en otras situaciones y así buscar mantener el principio DRY: <a href="https://es.wikipedia.org/wiki/No_te_repitas" target="_blank" rel="noopener noreferrer">No te repitas</a>.</p>



<p class="wp-block-paragraph">En sí, el uso de Scaffolding es una declaración clara del principio DRY, pues lo usamos para no tener que copiar y pegar comportamientos que son inherentes a diferentes situaciones: como crear, actualizar, eliminar y listar registros de una tabla (a modo de ejemplo, podríamos crear controladores scaffolding o heredables para otras tareas que no sean siempre la gestión de datos en tablas).</p>



<p class="wp-block-paragraph">A modo de añadir más fuerza al principio, los frameworks de desarrollo web se han creado basándose primariamente en dicha idea: escribir lo necesario, evitando repetir comportamientos, y por ende se disminuye el número de líneas de código, el nivel de errores y, por ende, el tiempo de desarrollo y mantenimiento de los sistemas o aplicaciones creados con ellos.</p>



<p class="wp-block-paragraph">Por eso es que existe una clasificación de carpetas: para controladores, modelos, vistas, ayudantes (helpers), librerías particulares, y librerías externas (vendors).</p>



<p class="wp-block-paragraph">Si necesita comprender más los conceptos básicos de nuestro framework puede ver <a href="https://www.kumbiaphp.com/blog/2016/05/26/kumbiaphp-essentials/">Kumbia Essentials</a>.</p>



<h2 class="wp-block-heading">Manos a la obra</h2>



<p class="wp-block-paragraph">Como ya se mencionó, un scaffolding es una estrategia para no repetir código que se usa en labores comunes. Hasta aquí lo hemos usado para tener un CRUD de la tabla que representa las categorías, y también nos ha permitido sobrescribir la forma en que hacemos la presentación de la acción index (listar los registros de la tabla).</p>



<p class="wp-block-paragraph">Ahora iremos un poco más lejos</p>



<ol class="wp-block-list">
<li>Modificaremos la vista particular de la acción index.</li>



<li>Sobrescribiremos nuestro controlador para modificar el comportamiento al guardar y actualizar los registros.</li>
</ol>



<p class="wp-block-paragraph">El cliente nos pide modificar la visualización de la lista de categorías para quitar de ella los atributos de fecha y renombrar el atributo nombre y categorías por Nombre Categoría y Categoría Padre. También nos solicita modificar el comportamiento de la acción <em>crear</em> para que el formulario aparezca limpio para agregar nuevamente, en vez de viajar a index una vez enviado el formulario.</p>



<p class="wp-block-paragraph">De igual forma debe hacerse para que la acción editar recargue el formulario modificado en vez de viajar a index. Iremos de lo fácil a lo menos fácil.</p>



<span id="more-1523"></span>



<h3 class="wp-block-heading">Modificaremos el comportamiento de crear, y editar en nuestro controlador.</h3>



<p class="wp-block-paragraph">Podemos mirar el método <strong>crear</strong> desde ScaffoldController (<em>app/libs/scaffold_controller.php</em>) y mejorarlo para nuestro controlador de categorias (<em>app/controllers/categorias_controller.php</em>)</p>



<p class="wp-block-paragraph">Una propuesta podría ser como la que se presenta a continuación:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">public function crear()
{
    if ( Input::hasPost(&#039;Categorias&#039;) ) {
        $categoria = new Categorias(Input::post(&#039;Categorias&#039;));
        
        //comprobar si se puede realizar la creacion del elemento
        if ( !$categoria-&gt;save() ) {
            Flash::error(&#039;Falló Operación&#039;);
            //hacer persistente el objeto con los datos enviados
            $this-&gt;Categorias = $categoria;
            Input::delete(&#039;Categorias&#039;);
        }
    }
    $this-&gt;Categorias = new Categorias;
}</code></pre>



<p class="wp-block-paragraph">Esta propuesta elimina la redirección a index, y limpiar el contenido de <em>Input::post(&#8216;modelo&#8217;)</em> para que el formulario permanezca en blanco y así nos permita agregar un nuevo elemento de forma inmediata.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Repetiremos el procedimiento en el método <strong>editar</strong>. Iremos al controlador ScaffoldController, y desde él mejoraremos el método <strong>editar</strong>, pegándolo bajo el&nbsp;método <strong>crear</strong>&nbsp;del controlador de categorías. La propuesta para editar debería ser algo como la siguiente figura:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">public function editar($id)
{
    View::select(&#039;crear&#039;); //usamos la misma vista que crear

    if ( Input::hasPost(&#039;Categorias&#039;) ) {
        $categoria = new Categorias;          
        //comprobar si se puede realizar la actualización del elemento
        if ( !$categoria-&gt;update(Input::post(&#039;Categorias&#039;)) ) {
            Flash::error(&#039;Falló Operación&#039;);
            //hacer persistente el objeto con los datos del formulario
            $this-&gt;Categorias = $categoria;

            Input::delete(&#039;Categorias&#039;);
        }
    }
    //aplicar autocarga del objeto para comenzar/continuar la edición
    $this-&gt;Categorias = (new Categorias)-&gt;find((int)$id);
}</code></pre>



<h3 class="wp-block-heading">Modificando vistas</h3>



<p class="wp-block-paragraph">Modificaremos la vista index estándar. Para ello crearemos una nueva vista index dentro de <em>app/views/categorias</em>. El archivo debe ser llamado como index.phtml.</p>



<p class="wp-block-paragraph">La estructura de archivos del proyecto debería verse así:</p>



<figure class="wp-block-image"><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/nueva-vista-index.png"><img loading="lazy" decoding="async" width="196" height="395" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/nueva-vista-index.png" alt="ScaffoldController: Listado de directorios y archivos para la nueva vista index del controlador de categorías" class="wp-image-1534" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/04/nueva-vista-index.png 196w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/nueva-vista-index-149x300.png 149w" sizes="auto, (max-width: 196px) 100vw, 196px" /></a></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Copiaremos el contenido de la vista index del scaffolding, la que está en <em>app/views/_shared/scaffolds/kumbia/index.phtml</em></p>



<p class="wp-block-paragraph">Quitaremos los atributos de fecha y renombraremos las columnas de nombre y de categoría padre. La vista nos debería quedar más o menos así:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">&lt;div id=&quot;scaffold&quot;&gt;
&lt;?php View::content()?&gt;
&lt;h1&gt;&lt;?= ucwords(&quot;$model&quot;), &quot;: &lt;span&gt;$action_name&lt;/span&gt;&quot; ?&gt;&lt;/h1&gt;
&lt;div class=&quot;actions&quot;&gt;
    &lt;?= Html::linkAction(&quot;crear/&quot;, &#039;Crear registro&#039;, &#039;class=&quot;btn btn-primary&quot;&#039;)?&gt;
&lt;/div&gt;

&lt;?php if (isset($data-&gt;items) &amp;&amp; (count($data-&gt;items) &gt; 0)) : ?&gt;
&lt;table class=&quot;t&quot;&gt;
    &lt;thead&gt;&lt;tr&gt;
    &lt;th&gt;Id&lt;/id&gt;
    &lt;th&gt;Nombre&lt;/id&gt;
    &lt;th&gt;Categoria Padre&lt;/id&gt;
    &lt;th&gt;Acciones&lt;/th&gt;
    &lt;/tr&gt;&lt;/thead&gt;
    &lt;tbody&gt;
    &lt;?php foreach ($data-&gt;items as $item) : ?&gt;
        &lt;tr&gt;
            &lt;td&gt;&lt;?= h($item-&gt;id)?&gt;&lt;/td&gt;
            &lt;td&gt;&lt;?= h($item-&gt;nombre)?&gt;&lt;/td&gt;
            &lt;td&gt;&lt;?= h($item-&gt;categorias_id)?&gt;&lt;/td&gt;
            &lt;td&gt;&lt;?= Html::linkAction(&quot;ver/$item-&gt;id&quot;, &#039;Ver&#039;)?&gt; |
            &lt;?= Html::linkAction(&quot;editar/$item-&gt;id&quot;, &#039;Editar&#039;)?&gt; |
            &lt;?= Html::linkAction(&quot;borrar/$item-&gt;id&quot;, &#039;Borrar&#039;, &#039;onclick=&quot;return confirm(\&#039;¿Está seguro?\&#039;)&quot;&#039;) ?&gt;
            &lt;/td&gt;
        &lt;/tr&gt;
    &lt;?php endforeach?&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;?php View::partial(&#039;paginators/digg&#039;, false, array(&#039;page&#039; =&gt; $data ,&#039;url&#039; =&gt; Router::get(&#039;controller_path&#039;).&#039;/index&#039;)) ?&gt;
&lt;?php else : // Si no hay items?&gt;
&lt;h2&gt;No hay ningún registro&lt;/h2&gt;
&lt;?php endif ?&gt;
&lt;/div&gt;</code></pre>



<p class="wp-block-paragraph">Al ejecutar el acceso a la vista deberíamos lograr algo similar a la siguiente figura:</p>



<figure class="wp-block-image"><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-1.png"><img loading="lazy" decoding="async" width="727" height="493" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-1.png" alt="ScaffoldController: Vista de navegador para el reemplazo de la vista index en el controlador de categorías" class="wp-image-1536" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-1.png 727w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-1-300x203.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-1-650x440.png 650w" sizes="auto, (max-width: 727px) 100vw, 727px" /></a></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Pero nuestro cliente necesita que la categoría padre quede expresada con el nombre, no con su código de referencia.</p>



<p class="wp-block-paragraph">Entonces, lo que haremos finalmente es modificar el método index y el modelo que enlaza la tabla categorías de la siguiente forma, comenzando por el modelo (<em>app/models/categorias.php</em>):</p>



<pre class="wp-block-code language-php"><code class="" data-line="">&lt;?php
class Categorias extends ActiveRecord
{      
    function getCategorias($page = 1)
    {
        return $this-&gt;paginate(
            &#039;columns: categorias.id, categorias.nombre, cat.nombre as categorias_id&#039;,
            &#039;join: left outer join categorias cat on categorias.categorias_id = cat.id&#039;,
            &quot;page: $page&quot;, &#039;order: categorias.id desc&#039;);
    }
}</code></pre>



<p class="wp-block-paragraph">Modificamos la consulta para dotar a la paginación de la referencia al nombre de la categoría padre usando los parámetros columns y join.</p>



<p class="wp-block-paragraph">En nuestro controlador de categorías modificaremos el método index para que pueda usar esta nueva paginación, quedando el resultado como se ve a continuación:</p>



<pre class="wp-block-code language-php"><code class="" data-line="">&lt;?php
class CategoriasController extends ScaffoldController
{
    public $model = &#039;Categorias&#039;;
    public $scaffold = &#039;skeleton&#039;;   

    public function index($page=1)
    {
        $this-&gt;data = (new Categorias)-&gt;getCategorias($page);
    }</code></pre>



<p class="wp-block-paragraph">Finalmente el resultado de la vista index se verá como lo presenta la siguiente figura:</p>



<figure class="wp-block-image"><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-2.png"><img loading="lazy" decoding="async" width="726" height="486" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-2.png" alt="ScaffoldController: Vista del método index con Categoría padre como nombre" class="wp-image-1539" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-2.png 726w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-2-300x201.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/nuevo-index-fase-2-440x294.png 440w" sizes="auto, (max-width: 726px) 100vw, 726px" /></a></figure>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Hasta aquí llega la publicación dedicada al tema del scaffolding, pero antes de terminar haremos un resumen hasta aquí.</p>



<h3 class="wp-block-heading">Resumen</h3>



<p class="wp-block-paragraph">En este episodio hemos modificado el comportamiento del método crear sobrescribiendo el método base del controlador Scaffold, también hemos modificado el comportamiento para editar, y para index.</p>



<p class="wp-block-paragraph">Hemos agregado una vista personalizada para la acción index, y aún así seguimos usando ScaffoldController.</p>



<p class="wp-block-paragraph">Sólo nos restará por tarea crear nuestro propio Scaffold para poder mantener el principio DRY usando los comportamientos sin redirección para el método crear y editar.</p>



<p class="wp-block-paragraph">Si te perdiste los otros post de esta serie, puedes leerlos en los siguientes enlaces:</p>



<p class="wp-block-paragraph"><a href="https://www.kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/">Scaffolding para CRUD (ABM) sencillos (y no tanto) – primera parteparte 1</a></p>



<p class="wp-block-paragraph"><a href="https://www.kumbiaphp.com/blog/2017/04/12/scaffolding-con-kumbiaphp-modificando-comportamientos-y-contenidos-segun-nuestra-necesidad/">ScaffoldController: Modificando comportamientos y contenidos</a></p>



<p class="wp-block-paragraph">Un abrazo cordial a nuestros colegas y a los que han de venir,</p>



<p class="wp-block-paragraph"><a href="https://twitter.com/nelsonrojas" target="_blank" rel="noopener noreferrer">@nelsonrojas</a></p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/05/16/scaffoldcontroller-modificando-vistas/">ScaffoldController: Modificando vistas</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/05/16/scaffoldcontroller-modificando-vistas/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1523</post-id>	</item>
		<item>
		<title>ScaffoldController: Modificando comportamientos y contenidos</title>
		<link>https://kumbiaphp.com/blog/2017/04/12/scaffolding-con-kumbiaphp-modificando-comportamientos-y-contenidos-segun-nuestra-necesidad/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scaffolding-con-kumbiaphp-modificando-comportamientos-y-contenidos-segun-nuestra-necesidad</link>
					<comments>https://kumbiaphp.com/blog/2017/04/12/scaffolding-con-kumbiaphp-modificando-comportamientos-y-contenidos-segun-nuestra-necesidad/#comments</comments>
		
		<dc:creator><![CDATA[Nelson Rojas]]></dc:creator>
		<pubDate>Wed, 12 Apr 2017 13:28:01 +0000</pubDate>
				<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[Documentación]]></category>
		<category><![CDATA[Tutoriales y screencast]]></category>
		<category><![CDATA[crud]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[scaffold]]></category>
		<guid isPermaLink="false">https://www.kumbiaphp.com/blog/?p=1344</guid>

					<description><![CDATA[<p>La entrega anterior hablamos acerca del uso de la técnica de Scaffolding para CRUD con KumbiaPHP usando la clase&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/04/12/scaffolding-con-kumbiaphp-modificando-comportamientos-y-contenidos-segun-nuestra-necesidad/">ScaffoldController: Modificando comportamientos y contenidos</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>La entrega anterior hablamos acerca del uso de la técnica de<a href="https://www.kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/"> Scaffolding para CRUD con KumbiaPHP</a> usando la clase <strong>ScaffoldController</strong>. Espero que muchos se hayan sorprendido gratamente con la funcionalidad que ciertamente ahorra mucho trabajo rutinario, ya que es altamente flexible.</p>
<p>Para que se entusiasmen, dentro de las posibilidades  tenemos: reescribir métodos y modificar comportamientos en controladores, modificar los archivos de vista, e incluso puedes crear tus propios scaffoldings. Pero bueno, vamos paso a paso.</p>
<h2>Manos a la obra con ScaffoldController</h2>
<p>Vamos a trabajar en base a supuestos. Supongamos que queremos mostrar el nombre de la categoría padre para aquellas categorías que estén anidadas.</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/index-sin-cambios-1.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1351 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/index-sin-cambios-1.png" alt="Lista de categorías" width="958" height="405" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/04/index-sin-cambios-1.png 958w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/index-sin-cambios-1-300x127.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/index-sin-cambios-1-768x325.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/index-sin-cambios-1-940x397.png 940w" sizes="auto, (max-width: 958px) 100vw, 958px" /></a></p>
<p>Como se ve en la lista, las categorías relacionadas sólo se ven con su identificador.<br />
Por lo tanto, vamos a modificar <strong>la fuente de datos</strong> que pasamos a la vista <strong>Index</strong> para que ésta pueda presentar los contenidos respectivos.</p>
<h2>En el modelo</h2>
<p>Lo que vamos a hacer es crear un método que cumpla con lo que queremos lograr: mostrar el contenido de la tabla de categorías incluyendo el nombre de la categoría padre en aquellas categorías que heredan de otra. De este modo tendremos una modificación como la siguiente:</p>
<p>Archivo: <em>models/categorias.php</em></p>
<pre class=" language-php"><code class="" data-line="">&lt;span class=&quot;token delimiter&quot;&gt;&lt;?php&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Categorias&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ActiveRecord&lt;/span&gt; 
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;getCategorias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$page&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; 
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;paginate&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&#039;columns: categorias.id, categorias.nombre, cat.nombre as categorias_id, categorias.creada_at, categorias.actualizada_in&#039;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; 
            &lt;span class=&quot;token string&quot;&gt;&#039;join: left outer join categorias cat on categorias.categorias_id = cat.id&#039;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token string&quot;&gt;&quot;page: $page&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#039;order: categorias.id desc&#039;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;</code></pre>
<h2>En el controlador</h2>
<p>El segundo cambio lo haremos desde el controlador, para cargar los cambios que hemos hecho en el modelo. Lo que <strong>reemplazaremos</strong> (porque es una sobre escritura de index en ScaffoldController) será la función <strong>index</strong> tal como se muestra a continuación.</p>
<p>Archivo: controllers<em>/categorias_controller.php</em></p>
<pre class=" language-php"><code class="" data-line="">&lt;span class=&quot;token delimiter&quot;&gt;&lt;?php&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;CategoriasController&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;ScaffoldController&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$model&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#039;Categorias&#039;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;token keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$page&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token variable&quot;&gt;$this&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token property&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;token class-name&quot;&gt;Categorias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;getCategorias&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token variable&quot;&gt;$page&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
 
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;</code></pre>
<p><span id="more-1344"></span></p>
<h2>Ahora se ve así</h2>
<p>Con esto lograremos que el listado cumpla que el requerimiento solicitado.</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/index-con-cambios-1.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1352 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/index-con-cambios-1.png" alt="Lista modificada de las categorías" width="967" height="400" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/04/index-con-cambios-1.png 967w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/index-con-cambios-1-300x124.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/index-con-cambios-1-768x318.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/index-con-cambios-1-940x389.png 940w" sizes="auto, (max-width: 967px) 100vw, 967px" /></a></p>
<h2>¿Por qué funciona?</h2>
<p>Como puede verse, con cambios mínimos hemos logrado adecuar la presentación de la vista <strong>index</strong> sin actualizar su archivo. Lo que hemos hecho principalmente es un reemplazo dentro de la metadata de ActiveRecord. Scaffolding espera contar con todos los atributos de la tabla de categorías (id, nombre, categorias_id, creada_at, actualizada_in). Nosotros hemos modificado la salida cambiando categorias_id por nombre desde categorias (nombre as categorias_id). Así hemos logrado que el pintador de la vista index haga su tarea sin enterarse del reemplazo que hemos hecho a nivel de modelo.</p>
<p>Bueno, eso es todo por esta semana. En la siguiente entrega veremos cómo modificar una vista particular para hacerla parecer según nuestros requerimientos. (<a href="https://www.kumbiaphp.com/blog/2017/05/16/scaffoldcontroller-modificando-vistas/">ver parte 3</a>)</p>
<h2>Últimas recomendaciones</h2>
<p>Recuerden que pueden revisar el código desde: <a href="https://github.com/nelsonrojas/Scaffold-KumbiaPHP" target="_blank" rel="noopener noreferrer">https://github.com/nelsonrojas/Scaffold-KumbiaPHP</a></p>
<p>No olvides visitarnos en <a href="http://slack.kumbiaphp.com/" target="_blank" rel="noopener noreferrer">http://slack.kumbiaphp.com/</a> para contarnos cómo te va usando <a href="https://www.kumbiaphp.com" target="_blank" rel="noopener noreferrer">KumbiaPHP</a>. Si necesitas apoyo procuraremos estar atentos. Además, si te gusta lo que escribimos compártelo ya mismo con tus amigos y colegas.</p>
<p>Saludos y larga vida a KumbiaPHP!</p>
<p>Con cariño desde Talca, Chile: <a href="https://twitter.com/nelsonrojas" target="_blank" rel="noopener noreferrer">@nelsonrojas</a></p>
<p>Ps: Si te perdiste lo que escribimos la semana pasada, puedes leerlo aquí: <a href="https://www.kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/">https://www.kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/</a></p>
<p>Si quieres ver lo que sigue: <a href="https://www.kumbiaphp.com/blog/2017/05/16/scaffoldcontroller-modificando-vistas/">ScaffoldController: Modificando vistas</a></p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/04/12/scaffolding-con-kumbiaphp-modificando-comportamientos-y-contenidos-segun-nuestra-necesidad/">ScaffoldController: Modificando comportamientos y contenidos</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/04/12/scaffolding-con-kumbiaphp-modificando-comportamientos-y-contenidos-segun-nuestra-necesidad/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1344</post-id>	</item>
		<item>
		<title>Preguntas resueltas en Slack 2</title>
		<link>https://kumbiaphp.com/blog/2017/03/06/preguntas-resueltas-en-slack-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=preguntas-resueltas-en-slack-2</link>
					<comments>https://kumbiaphp.com/blog/2017/03/06/preguntas-resueltas-en-slack-2/#comments</comments>
		
		<dc:creator><![CDATA[HenryStivens]]></dc:creator>
		<pubDate>Mon, 06 Mar 2017 14:18:37 +0000</pubDate>
				<category><![CDATA[Comunidad]]></category>
		<category><![CDATA[Documentación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[preguntas]]></category>
		<guid isPermaLink="false">https://www.kumbiaphp.com/blog/?p=1229</guid>

					<description><![CDATA[<p>En estas semanas las dudas que hemos resuelto han sido bastante específicas y la mayoría no eran aptas para&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/03/06/preguntas-resueltas-en-slack-2/">Preguntas resueltas en Slack 2</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>En estas semanas las dudas que hemos resuelto han sido bastante específicas y la mayoría no eran aptas para ser incluidas en este artículo, por ello he tardado más en reunir el material suficiente para realizar un nuevo post.</p>
<p>A pesar de lo anterior, el texto está listo y ha quedado bastante jugoso, así que no los haré esperar más y los dejaré con el compendio de  preguntas resueltas:</p>
<h2>¿Cómo hacer un confirm alert? <em>Pregunta ycaicedo</em></h2>
<p>Este ejemplo es con javascript usando el helper Html::link() o Html::linkAction() que permite mostrar primero un diálogo de confirmación al usuario, aunque es fácil de saltar, por ejemplo si el usuario desactiva javascript en el navegador:</p>
<p><code class="language-php" data-line="">&lt;?= Html::linkAction(&quot;borrar/$item-&gt;id&quot;, &#039;Borrar&#039;, &#039;onclick=&quot;return confirm(\&#039;¿Está seguro?\&#039;)&quot;&#039;) ?&gt;</code></p>
<h2>¿KumbiaPHP soporta CamelCase en el nombre de tablas? <em>Pregunta abriceno</em></h2>
<p>Con el atributo <em>$source</em> de la clase <strong>ActiveRecord</strong> se le puede indicar a que tabla consultar, pero el desarrollador debe acordarse de hacer el cambio.Ejemplo:</p>
<pre><code class="language-php" data-line="">
&lt;?php

class MateriaPrima extends ActiveRecord {

    //Tabla utilizada para realizar el mapeo
    protected $source = &#039;MateriaPrima&#039;;
}
</code></pre>
<h2>¿Cómo le inserto una clase a un select generado con Form::dbSelect()? <em>Pregunta jerson.fuentes</em></h2>
<p>El helper <code class="" data-line="">Form::dbSelect()</code> tiene los siguientes argumentos:</p>
<p><code class="" data-line="">Form::dbSelect(campo_id, campoAMostrar,array(modelo,metodo),&quot;Seleccione&quot;,atributos)</code></p>
<p>Ejemplo:</p>
<pre><code class="language-php" data-line="">
Form::dbSelect(&quot;lotes.lotes_categorias_id&quot;,&quot;nombrecategoria&quot;,null,&quot;Seleccione&quot;,&#039;class=&quot;form-control&quot;&#039;);
</code></pre>
<h2>Saben como después de actualizar un dato, redirigirme a la vista anterior</h2>
<p>Para redireccionar en KumbiaPHP existe la clase <strong>Redirect</strong></p>
<figure><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/captura_de_pantalla_2017-02-20_a_las_14.49.48.png"><img loading="lazy" decoding="async" class="wp-image-1230" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/captura_de_pantalla_2017-02-20_a_las_14.49.48.png" alt="Ejemplo de uso de Redirect::to()" width="500" height="407" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/03/captura_de_pantalla_2017-02-20_a_las_14.49.48.png 782w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/captura_de_pantalla_2017-02-20_a_las_14.49.48-300x244.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/captura_de_pantalla_2017-02-20_a_las_14.49.48-768x626.png 768w" sizes="auto, (max-width: 500px) 100vw, 500px" /></a><figcaption>Ejemplo de uso de Redirect::to()</figcaption></figure>
<p>La redirección se puede hacer con <strong>Redirect::to()</strong> antecedido con un <em>return</em> para que sea lo último que ejecute.</p>
<h2>Recomendaciones de joanhey</h2>
<h2>Mitos sobre el rendimiento de PHP</h2>
<p><a href="https://thomaslohner.github.io/slides/Performance-Myths/#/">Busted! 10 Performance Myths you should avoid</a>. Es una presentación muy recomendable de Thomas Lohner de SysEleven GmbH que en 2015 en una charla menciona los 10 mitos sobre mejorar el rendimiento que se deben evitar.</p>
<p>Lo más importante es usar bien las herramientas.</p>
<h2>HTTPie un buen sustituto de Curl</h2>
<p><a href="https://httpie.org/">HTTPie</a> es una app que funciona en Linux, MacOs y Windows. Es muy útil como sustituto de Curl.</p>
<p>Nos permite fácilmente probar nuestros servidores, API RESTful y web services.</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/03/06/preguntas-resueltas-en-slack-2/">Preguntas resueltas en Slack 2</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/03/06/preguntas-resueltas-en-slack-2/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1229</post-id>	</item>
		<item>
		<title>Preguntas resueltas en Slack 1</title>
		<link>https://kumbiaphp.com/blog/2017/02/01/preguntas-resueltas-en-slack-1/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=preguntas-resueltas-en-slack-1</link>
					<comments>https://kumbiaphp.com/blog/2017/02/01/preguntas-resueltas-en-slack-1/#respond</comments>
		
		<dc:creator><![CDATA[HenryStivens]]></dc:creator>
		<pubDate>Wed, 01 Feb 2017 09:05:46 +0000</pubDate>
				<category><![CDATA[Comunidad]]></category>
		<category><![CDATA[Documentación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[preguntas]]></category>
		<guid isPermaLink="false">http://www.kumbiaphp.com/blog/?p=1117</guid>

					<description><![CDATA[<p>¡Hola Kumbieros! Como algunos sabrán, va en aumento las personas que nos empiezan a contactar a través del chat&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/02/01/preguntas-resueltas-en-slack-1/">Preguntas resueltas en Slack 1</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>¡Hola Kumbieros!</p>
<p>Como algunos sabrán, va en aumento las personas que nos empiezan a contactar a través del <a href="http://kumbiaphp.slack.com/">chat de KumbiaPHP</a> en Slack. Donde de manera voluntaria y altruista Kumbieros con más experiencia dedicando algo de su tiempo ayudan a novatos y no tan novatos a resolver sus dudas sobre el framework y otros menesteres propios del diseño e implementación de software. Si aun no has ingresado puedes pedir tu ingreso en esta dirección: <a href="http://slack.kumbiaphp.com/">http://slack.kumbiaphp.com/ </a></p>
<p>Slack es muy bueno para dar soporte, pero con el transcurrir del tiempo los mensajes se van perdiendo y se escurre por el desagüe ese gran contenido que nos podría ayudar a todos. Por eso hemos decidido crear esta sección para mantener de manera permanente y pública esta valiosa información. Sin más introducción les dejo la siguiente colección de preguntas y respuestas:</p>
<h2><a id="active-link"></a>¿Cómo hacer enlaces en KumbiaPHP que registre en donde estoy o mejor dicho el enlace activo?</h2>
<p>Pregunta jerson.fuentes<br />
Pregunta relacionada de josher1601</p>
<h2><a id="current-controller"></a>¿De alguna forma se puede obtener el controlador que estoy viendo y la acción?</h2>
<p>En el controlador y la vista disponemos de variables para obtener está información:<br />
<em>$module_name;</em><br />
<em> $controller_name;</em><br />
<em> $action_name;</em></p>
<p>Ejemplo de uso en un controlador:</p>
<pre><code class="language-php" data-line="">
&lt;?php
class AppController extends Controller
{
  final protected function initialize()
  {
    Flash::info(&quot;El módulo es $this-&gt;module_name&quot;); //Si hay módulo retorna el nombre del módulo
    Flash::info(&quot;El controlador es $this-&gt;controller_name&quot;); //Retorna el nombre del controlador
    Flash::info(&quot;La acción es $this-&gt;action_name&quot;);  //Retorna el nombre de la acción
  }

  final protected function finalize()
  {
  }
}
</code></pre>
<p>Ejemplo de uso en una vista:<br />
<code class="language-php" data-line=""><br />
Usted está en el controlador &lt;?= $controller_name ?&gt; y la acción &lt;?= $action_name ?&gt;<br />
</code></p>
<h2><a id="flash-messages"></a>¿Para que funcione Flass::success() había que activar algo?</h2>
<p><em>Pregunta marcelok. Pregunta relacionada de yecaicedo:</em></p>
<h2>Acabé de realizar un CRUD sencillo pero cuando guarda no me muestra el Flash::valid()</h2>
<p>Para mostrar los mensajes Flash y solo si hay redirección de URL (usando por ejemplo <em>Redirect::to()</em>) se debe poner antes de ninguna salida, la función <em>session_start()</em> con ponerlo en el controlador que lo necesita es suficiente.</p>
<h2><a id="last-insert-id"></a>¿Cuando realizo el save() hay algún método que retorne el last_insert_id? <em>Pregunta xavi92</em></h2>
<p>Si haces un <em>save() </em>el objeto ya tiene el valor en el campo id</p>
<p>Ejemplo:</p>
<pre><code class="language-php" data-line="">
&lt;?php

//Si guarda correctamente
if($album-&gt;save()){
  $album-&gt;id; //Retorna el id con el cual ha sido guardado
}
</code></pre>
<h2><a id="skeleton-css"></a>¿En Skeleton puedo usar al 100% el ancho de la pantalla? Leí que el grid tiene un ancho de 960px <em>Pregunta marcelok</em></h2>
<p>Es igual para todos los frameworks css, los row siempre son fluidos, si no se usa container será del máximo siempre, si se usa container el máximo será 960 que se puede cambiar si se quiere. Hay que tener cuidado con usar el máximo de la pantalla ya que hay pantallas muy anchas y por usabilidad esto podría ser un fallo.</p>
<h2><a id="libs"></a>¿Me gustaría saber utilizar librerías propias? Hace tiempo utilicé la de Captchar&#8230; Pero si son algo mas complejas no tengo idea. <em>Pregunta viclomu</em></h2>
<p>La idea general es la siguiente. Van en la carpeta vendor si es para PSR0 y PSR4 lib, las que no lo son cada una tiene una forma, lo mejor es crear un fichero php en libs y poner la carpeta dentro de libs con la librería. Si la librería es un fichero solo en libs. Si es mas completa va en una carpeta y un fichero nombre_clase.php que tendrá que llamar a lo que necesite, algunas traen autoload otras has de llamar al fichero principal, hay que hacerle un puente en los casos necesarios ya que no hay una forma única.</p>
<h2><a id="atom-tips"></a>Tip para usuarios de Atom:</h2>
<p>Se puede lanzar fácilmente un servidor de PHP con el siguiente paquete: <a href="https://atom.io/packages/php-server">https://atom.io/packages/php-server </a>recuerda lanzarlo desde la carpeta public como muestra la siguiente imagen:</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/01/687474703a2f2f692e696d6775722e636f6d2f466856746c39762e706e67.png"><img loading="lazy" decoding="async" class="size-medium wp-image-1120 aligncenter" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/01/687474703a2f2f692e696d6775722e636f6d2f466856746c39762e706e67-239x300.png" alt="" width="239" height="300" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/01/687474703a2f2f692e696d6775722e636f6d2f466856746c39762e706e67-239x300.png 239w, https://kumbiaphp.com/blog/wp-content/uploads/2017/01/687474703a2f2f692e696d6775722e636f6d2f466856746c39762e706e67.png 323w" sizes="auto, (max-width: 239px) 100vw, 239px" /></a></p>
<p>Esto ha sido parte de todo lo que se aprende en Slack y los Kumbieros ¡Hasta la próxima!</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/02/01/preguntas-resueltas-en-slack-1/">Preguntas resueltas en Slack 1</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/02/01/preguntas-resueltas-en-slack-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1117</post-id>	</item>
		<item>
		<title>Webs hechas con KumbiaPHP Framework</title>
		<link>https://kumbiaphp.com/blog/2010/04/05/webs-hechas-con-kumbiaphp-framework/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=webs-hechas-con-kumbiaphp-framework</link>
					<comments>https://kumbiaphp.com/blog/2010/04/05/webs-hechas-con-kumbiaphp-framework/#comments</comments>
		
		<dc:creator><![CDATA[Deivinson Tejeda]]></dc:creator>
		<pubDate>Mon, 05 Apr 2010 14:32:23 +0000</pubDate>
				<category><![CDATA[Documentación]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[PHP frameworks]]></category>
		<category><![CDATA[Webs con KumbiaPHP]]></category>
		<category><![CDATA[anuncios]]></category>
		<category><![CDATA[Comunidad]]></category>
		<category><![CDATA[kumbiaphp]]></category>
		<category><![CDATA[MVC framework]]></category>
		<category><![CDATA[noticias]]></category>
		<category><![CDATA[proyecto]]></category>
		<category><![CDATA[spirit]]></category>
		<category><![CDATA[Webs]]></category>
		<guid isPermaLink="false">http://www.kumbiaphp.com/blog/?p=417</guid>

					<description><![CDATA[<p>Dejaremos una pequeña lista de sitios webs, que han sido desarrolladas con KumbiaPHP en la versión 1.0 b1 acá Spirit. Esto&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2010/04/05/webs-hechas-con-kumbiaphp-framework/">Webs hechas con KumbiaPHP Framework</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Dejaremos una pequeña lista de sitios webs, que han sido desarrolladas con KumbiaPHP en la versión 1.0 b1 acá <a title="Etiquita versión Spirit" href="https://www.kumbiaphp.com/blog/tag/spirit/" target="_self">Spirit</a>.</p>
<p>Esto sirve como muestra de que es <strong>muy estable,</strong> a pesar de tener el calificativo de versión «Beta»,  para desarrollar aplicaciones.</p>
<p style="text-align: center;"><a href="http://www.empleate.com"><img loading="lazy" decoding="async" class="aligncenter" title="Empléate.com" src="https://www.kumbiaphp.com/blog/wp-content/uploads/empleate.png" alt="" width="490" height="220" /></a></p>
<p style="text-align: left;"><a title="Empléate.com" href="http://www.empleate.com" target="_blank" rel="noopener">Empléate.com</a> es una de las bolsa de empleo mas importante de la región latinoamericana. Han realizado su renovación del portal, con KumbiaPHP como herramienta de desarrollo, obteniendo resultados importantes. En el <a title="Estadísticas de Empléate.com" href="http://www.empleate.com/venezuela/sobre_empleate/quienes_somos/estadisticas" target="_blank" rel="noopener">Portal de Empléate.com</a> encontramos números muy interesantes.</p>
<blockquote>
<p style="text-align: left;">Presentes en toda Hispanoamérica, con énfasis en Colombia, México, Perú y Venezuela.<br />
 + 1,2 millones currículos en nuestra base de talentos.<br />
 +300 mil nuevos currículos ingresados cada año.<br />
 +70% de técnicos y profesionales.<br />
 +70 mil currículos enviados diariamente a las empresas reclutadoras.<br />
 +600 mil búsquedas automáticas («alertas») activas por parte de los usuarios.<br />
 +400 mil correos enviados a diario.<br />
 +80 mil empresas utilizan nuestros servicios.<br />
 +150 mil ofertas de empleo publicadas anualmente.<br />
 +12 millones de páginas vistas y +1 millón usuarios únicos cada mes en www.empleate.com.<br />
 +20 mil vacantes de empleo activas<br />
 La bolsa de trabajo más utilizada en Venezuela (50% de todas las ofertas publicadas por cualquier medio, sea impreso o digital).</p>
</blockquote>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="aligncenter" title="Fútbol Base Balear Torneo Escuela Copa Sa Pobla" src="https://www.kumbiaphp.com/blog/wp-content/uploads/copa-sa-pobla-torneo-escuela-de-futbol-base-balear.png" alt="Fútbol Base Balear Torneo Escuela Copa Sa Pobla" width="491" height="171" /></p>
<p>Torneo de Futbol Copa Sa Pobla es un torneo que se hace en semana santa es Sa Pobla, Mallorca de futbol base menores de 10, 12 y 14 años.</p>
<p><a href="http://www.chattagena.com/"><img loading="lazy" decoding="async" class="aligncenter" title="Chattagena - Apoyando el talento cartagenero" src="https://www.kumbiaphp.com/blog/wp-content/uploads/chattagena.png" alt="" width="490" height="176" /></a></p>
<p><a title="Chattagena - Apoyando el talento cartagenero" href="http://www.chattagena.com" target="_blank" rel="noopener">Chattagena</a> es una web de publicaciones de actualidad en musica, video, cine y a fines, en apoyo al talento cartagenero (Colombia).</p>
<p style="text-align: center;"><a href="http://www.catgenie.es/"><img loading="lazy" decoding="async" class="aligncenter" title="CatGenie - El único Arenero para Gatos Autolavable del Mundo" src="https://www.kumbiaphp.com/blog/wp-content/uploads/catgenie.png" alt="" width="490" height="285" /></a></p>
<p style="text-align: left;"><a title="CatGenie - El único Arenero para Gatos Autolavable del Mundo" href="http://www.catgenie.es/" target="_blank" rel="noopener">CatGenie</a> el <a title="Webs Hechas con KumbiaPHP Framework" href="http://wiki.kumbiaphp.com/Casos_de_%C3%89xitos_de_KumbiaPHP_Framework#CatGenie_-_El_.C3.BAnico_Arenero_para_Gatos_Autolavable_del_Mundo" target="_blank" rel="noopener">Autor nos comenta&#8230;</a></p>
<blockquote>
<p style="text-align: left;">CatGenie es un proyecto que vende un producto innovador y exclusivo para gatos (un arenero autolavable). CatGenie esta realizado en KumbiaPHP en la versión <a title="Etiquita versión Spirit" href="https://www.kumbiaphp.com/blog/tag/spirit/" target="_self">Spirit</a> de principio a fin, aprovechando la velocidad y demás características del framework que hacen que el desarrollo y el mantenimiento sea rápido y fácil.</p>
</blockquote>
<p style="text-align: left;">Esta lista es mas extensa, sólo hemos tomado algunas al azar.</p>
<p style="text-align: left;">Puedes enviarnos tu sitio web y/o publicarla en <a title="Webs Hechas con KumbiaPHP Framework" href="http://wiki.kumbiaphp.com/Webs_Con_KumbiaPHP_Framework" target="_blank" rel="noopener">Webs Hechas con KumbiaPHP</a>, asimismo invitamos a todos agregar sus <a title="Casos de Éxitos utilizando KumbiaPHP Framework" href="http://wiki.kumbiaphp.com/Casos_de_Éxitos_de_KumbiaPHP_Framework" target="_blank" rel="noopener">Casos de Exitos Utilizando KumbiaPHP</a>. No necesitas una aplicación grande ni pequeña, es sólo colocar un breve de resumen, de lo útil que te ha sido utilizar KumbiaPHP para tu desarrollo.</p>
<p style="text-align: left;"> </p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2010/04/05/webs-hechas-con-kumbiaphp-framework/">Webs hechas con KumbiaPHP Framework</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/2010/04/05/webs-hechas-con-kumbiaphp-framework/feed/</wfw:commentRss>
			<slash:comments>6</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">417</post-id>	</item>
		<item>
		<title>KumbiaPHP un framework con ñ</title>
		<link>https://kumbiaphp.com/blog/2009/12/12/kumbiaphp-un-framework-con-n/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kumbiaphp-un-framework-con-n</link>
					<comments>https://kumbiaphp.com/blog/2009/12/12/kumbiaphp-un-framework-con-n/#comments</comments>
		
		<dc:creator><![CDATA[Deivinson Tejeda]]></dc:creator>
		<pubDate>Sat, 12 Dec 2009 13:59:10 +0000</pubDate>
				<category><![CDATA[Comunidad]]></category>
		<category><![CDATA[Documentación]]></category>
		<category><![CDATA[Eventos]]></category>
		<category><![CDATA[PHP frameworks]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[kumbiaphp]]></category>
		<category><![CDATA[kumbieros]]></category>
		<category><![CDATA[proyecto]]></category>
		<category><![CDATA[spirit]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[venezuela]]></category>
		<guid isPermaLink="false">http://www.kumbiaphp.com/blog/?p=393</guid>

					<description><![CDATA[<p>Presentación que se dio en el 1er encuentro kumbieros Maracay-Venezuela y la misma da un acercamiento a los usuarios&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2009/12/12/kumbiaphp-un-framework-con-n/">KumbiaPHP un framework con ñ</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Presentación que se dio en el <a title="1er encuentro kumbieros Maracay-Venezuela" href="https://www.kumbiaphp.com/blog/2009/12/07/exitoso-1er-encuentro-de-kumbiaphp-maracay-venezuela/">1er encuentro kumbieros Maracay-Venezuela</a> y la misma da un acercamiento a los usuarios respecto a KumbiaPHP donde la intención es mostrar algunas de las bondades que ofrece el framework, ademas de recalcar que somos un framework con ñ.</p>
<p><iframe loading="lazy" style="border: 1px solid #CCC; border-width: 1px; margin-bottom: 5px; max-width: 100%;" src="https://www.slideshare.net/slideshow/embed_code/key/Jj36kRKuthJyMS" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" allowfullscreen="allowfullscreen"> </iframe></p>
<p><em>P.D. si no entienden algunas de las láminas pregunten por aquí :-D</em></p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2009/12/12/kumbiaphp-un-framework-con-n/">KumbiaPHP un framework con ñ</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/2009/12/12/kumbiaphp-un-framework-con-n/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">393</post-id>	</item>
	</channel>
</rss>
