<?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>Nelson Rojas, autor en KumbiaPHP Framework PHP en español</title>
	<atom:link href="https://kumbiaphp.com/blog/author/nelson-rojas/feed/" rel="self" type="application/rss+xml" />
	<link>https://kumbiaphp.com/blog/author/nelson-rojas/</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>Nelson Rojas, autor en KumbiaPHP Framework PHP en español</title>
	<link>https://kumbiaphp.com/blog/author/nelson-rojas/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">123854898</site>	<item>
		<title>Mejora en la configuración de errores en KumbiaPHP: Nueva funcionalidad Exception para entornos de producción</title>
		<link>https://kumbiaphp.com/blog/2024/09/30/mejora-en-la-configuracion-de-errores-en-kumbiaphp-nueva-funcionalidad-de-exception-para-entornos-de-produccion/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mejora-en-la-configuracion-de-errores-en-kumbiaphp-nueva-funcionalidad-de-exception-para-entornos-de-produccion</link>
					<comments>https://kumbiaphp.com/blog/2024/09/30/mejora-en-la-configuracion-de-errores-en-kumbiaphp-nueva-funcionalidad-de-exception-para-entornos-de-produccion/#comments</comments>
		
		<dc:creator><![CDATA[Nelson Rojas]]></dc:creator>
		<pubDate>Mon, 30 Sep 2024 13:33:59 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[buenas prácticas]]></category>
		<category><![CDATA[noticias]]></category>
		<guid isPermaLink="false">https://kumbiaphp.com/blog/?p=2851</guid>

					<description><![CDATA[<p>La entrada <a href="https://kumbiaphp.com/blog/2024/09/30/mejora-en-la-configuracion-de-errores-en-kumbiaphp-nueva-funcionalidad-de-exception-para-entornos-de-produccion/">Mejora en la configuración de errores en KumbiaPHP: Nueva funcionalidad Exception para entornos de 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>Es común que al desplegar aplicaciones, los desarrolladores olviden cambiar el flag PRODUCTION a <strong>true</strong>, lo que puede dejar expuesta información sensible a los usuarios finales. En este artículo, abordaremos la nueva funcionalidad implementada en KumbiaPHP para mitigar este riesgo, proporcionando una capa adicional de seguridad a través de la configuración <strong>Exception</strong>.</p>



<p><span id="more-2851"></span></p>



<h2>El problema de dejar PRODUCTION en false:</h2>



<p>De manera predeterminada, KumbiaPHP expone la información detallada de cualquier tipo de excepción, a modo de permitirle al desarrollador revisar y entender dónde debe realizar mejoras. El problema es que si se olvida de cambiar el flag de PRODUCCION y lo deja en su valor inicial (false) cuando los usuarios finales realicen alguna operación indebida, o exista algún fallo no previsto en el servidor, por ejemplo con el acceso a la base de datos o al sistema de archivo, Kumbia no tendrá contexto de que se trata de una aplicación en producción y expondrá todos los detalles.</p>



<h2>La nueva configuración Exception: </h2>



<p>La nueva funcionalidad, de forma definitiva, <strong>evita exponer</strong> información de excepciones, lo cual es un alivio tanto para los desarrolladores como para los clientes. Para permitir la visualización de excepciones se ha agregado un nuevo archivo llamado <strong>exception.php</strong>. En su contenido se pueden definir las direcciones IP que tendrán permiso para recibir los detalles entregados por KumbiaPHP tanto en desarrollo como en entorno productivo.</p>
<p><a href="https://kumbiaphp.com/blog/wp-content/uploads/2024/09/Screen-Shot-2024-09-26-at-10.14.54.png"><img fetchpriority="high" decoding="async" class="alignnone wp-image-2853 size-full" src="https://kumbiaphp.com/blog/wp-content/uploads/2024/09/Screen-Shot-2024-09-26-at-10.14.54.png" alt="" width="616" height="194" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2024/09/Screen-Shot-2024-09-26-at-10.14.54.png 616w, https://kumbiaphp.com/blog/wp-content/uploads/2024/09/Screen-Shot-2024-09-26-at-10.14.54-300x94.png 300w" sizes="(max-width: 616px) 100vw, 616px" /></a></p>



<h2>Ventajas de la nueva funcionalidad</h2>



<p>Dentro de las ventajas que se obtienen con esta nueva mejora podemos mencionar las siguientes:</p>
<ul>
<li>Seguridad: evita la exposición accidental de información sensible.</li>
<li><strong>Control</strong>: permite que sólo los desarrolladores o administradores puedan acceder a los detalles de los errores.</li>
<li>Fácil configuración: los usuarios solo necesitan añadir las IPs de confianza.</li>
</ul>
<h2>Cómo implementar la nueva funcionalidad:</h2>



<p>Para implementar la nueva funcionalida necesitamos seguir los siguientes pasos:</p>
<ol>
<li>Configurar las direcciones IP en el archivo <strong>exception.php</strong>.</li>
<li>Comprobar que los errores solo son visibles desde las IPs configuradas.</li>
</ol>
<h2>Caché:</h2>
<p>Desde esta nueva funcionalidad, el flag PRODUCTION asignado con el valor <strong>true</strong>, sólo será reponsable de habilitar el uso de la caché para el sitio web.</p>
<h2>Recordatorio:</h2>
<p>Nunca está demás dejar un recordatorio extra: aunque estés en modo desarrollo, si no se incluyen las direcciones IP dentro del archivo <strong>exception.php</strong> verán únicamente el error clásico, sin todos los detalles. Por lo tanto, <strong>no se olviden</strong> de agregar su propia dirección dentro de la nueva configuración.</p>
<h2>Conclusión:</h2>



<p>La nueva configuración de <strong>Exception</strong> en KumbiaPHP es un gran paso hacia la seguridad en entornos de producción, permitiendo que sólo quienes están autorizados puedan ver los detalles de los errores. Este tipo de mejoras no sólo protegen nuestras aplicaciones, sino que también promueven buenas prácticas en el desarrollo. De todos modos, el equipo está trabajando en <strong>agregar funcionalidades</strong> para esta nueva característica, así que no te pierdas las próximas mejoras que publicaremos también en nuestro blog.</p>
<p>Mucho ánimo a todos en nuestra comunidad, y como siempre les decimos&#8230; ¡larga vida a KumbiaPHP!</p>
<p>¡Un abrazo!</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2024/09/30/mejora-en-la-configuracion-de-errores-en-kumbiaphp-nueva-funcionalidad-de-exception-para-entornos-de-produccion/">Mejora en la configuración de errores en KumbiaPHP: Nueva funcionalidad Exception para entornos de 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/2024/09/30/mejora-en-la-configuracion-de-errores-en-kumbiaphp-nueva-funcionalidad-de-exception-para-entornos-de-produccion/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2851</post-id>	</item>
		<item>
		<title>Cómo crear modelos de forma correcta</title>
		<link>https://kumbiaphp.com/blog/2022/09/10/crear-modelos-de-forma-correcta/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=crear-modelos-de-forma-correcta</link>
					<comments>https://kumbiaphp.com/blog/2022/09/10/crear-modelos-de-forma-correcta/#comments</comments>
		
		<dc:creator><![CDATA[Nelson Rojas]]></dc:creator>
		<pubDate>Sat, 10 Sep 2022 17:34:02 +0000</pubDate>
				<category><![CDATA[Tutoriales y screencast]]></category>
		<guid isPermaLink="false">https://kumbiaphp.com/blog/?p=2676</guid>

					<description><![CDATA[<p>La entrada <a href="https://kumbiaphp.com/blog/2022/09/10/crear-modelos-de-forma-correcta/">Cómo crear modelos de forma correcta</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Bienvenidos a este post que trata sobre el cómo crear modelos de forma correcta para aplicaciones que utilizan el patrón de diseño MVC: Modelo, Vista, Controlador.</p>
<p>Una parte importante del trabajo dentro de un Framework MVC es el buen uso de los Modelos. </p>
<p>El modelo es <strong>responsable de mantener el estado de la aplicación</strong>. A veces este estado es transitorio, y dura sólo un par de interacciones con el usuario. Otras veces el estado es permanente y se almacena fuera de la aplicación, a menudo en una base de datos.</p>
<p>Un modelo es algo más que datos; impone todas las reglas de negocio que se aplican a esos datos. Por ejemplo, si un descuento no debe aplicarse a los pedidos de menos de de 20 euros, el modelo aplicará la restricción. Esto tiene sentido; al poner la implementación de estas reglas de negocio en el modelo, nos aseguramos de que nada más en la aplicación puede hacer que nuestros datos <strong>no sean válidos</strong>. El modelo actúa como tanto un <strong>guardián</strong> como un <strong>almacén de datos</strong>.</p>
<p><span id="more-2676"></span></p>
<p>Otra definición para el modelo es la <a href="https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" target="_blank" rel="noopener">siguiente</a>: es el componente central del patrón (MVC). Es la estructura de datos dinámica de la aplicación, independiente de la interfaz de usuario. Gestiona directamente los datos, la lógica y las reglas de la aplicación.</p>
<p>En muchos casos, especialmente cuando uno comienza a trabajar en MVC, se cree que los modelos son <strong>únicamente</strong> para la gestión de la persistencia y la consulta de los datos de una base de datos (o de un repositorio)</p>
<h2>Fundamentos</h2>
<p>Antes de ahondar en los ejemplos y en los errores clásicos, nos gustaría mostrarte una imagen que puede ser de ayuda respecto de la forma en la que deberíamos construir nuestras aplicaciones usando el patrón descrito por <strong>Trygve Reenskaug</strong> (MVC)</p>
<p> </p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><a href="https://kumbiaphp.com/blog/wp-content/uploads/2022/06/UrtaH.png"><img decoding="async" width="596" height="232" src="https://kumbiaphp.com/blog/wp-content/uploads/2022/06/UrtaH.png" alt="comparación entre mala y buena implementación de modelos en mvc" class="wp-image-2678" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2022/06/UrtaH.png 596w, https://kumbiaphp.com/blog/wp-content/uploads/2022/06/UrtaH-300x117.png 300w" sizes="(max-width: 596px) 100vw, 596px" /></a></figure>
</div>


<p>La imagen, que es gentileza del Framework CakePHP, nos indica que una aplicación mal diseñada (Bad cake) tiene mucho código en los controladores y poco en las vistas y modelos. En la práctica, los controladores deberían servirnos principalmente para gestionar el Routing (las urls), interactuar con los modelos y despachar las vistas. En contraposición, una buena implementación (Good cake), debería contener más código en los modelos y menos en las vistas y controladores.</p>
<p>Volvamos un poco a lo que se mencionaba sobre el problema de los recién iniciados en MVC. Si bien es común que un modelo gestione datos de una base de datos, también sirve para gestionar «cosas» que no tienen relación con ello. Un ejemplo puede ser un modelo para un carro de compras. Es completamente factible llevar a cabo esta tarea sin persistencia en el DBMS (Database Management System). Bastaría con hacerlo con el objeto de sesión. Por otro lado, un modelo también podría encargarse de los pagos electrónicos, y luego apoyarse de otro que persista datos. Un modelo podría estar dedicado a la realización de cálculos específicos, otro del envío de notificaciones (SMS, Whatsapp, e-mail, etc), otro de la ejecución de tareas por shell dentro del servidor, y así sucesivamente.</p>
<p><strong>¿Qué es lo más común?</strong></p>
<p>Que las personas definan un modelo heredando de la clase del ORM (Object Relational Mapping) y, por ejemplo, en el caso de las notificaciones o el carro de compras, bastaría con que se utilizara una clase simple.</p>
<p>Vale, que aún no hay ejemplos porque nos quedan algunos <strong>fundamentos</strong> que debemos considerar.</p>
<h3>DRY</h3>
<p>Para muchos desconocido por sus siglas, pero viene del inglés <strong>Don&#8217;t Repeat Yourself</strong>. En buen castellano sería «No te repitas». ¿Qué significa esto? Significa que debemos gestionar cada «trozo de código» a su labor respectiva, en un único lugar. ¿Y qué tiene de malo copiar y pegar código? Cuando uno tiene mucho código repetido se rompe el principio DRY.</p>
<p>La repetición puede ser principalmente por desconocimiento de las herramientas que provee el Framework, o la clase de la que uno hereda. Por lo tanto, <strong>haz tu tarea de estudiante</strong>: <em>revisa los métodos, la documentación y luego ponte manos a la obra para que <strong>no repitas cosas</strong> que ya están implementadas</em> (lo que comúnmente llamamos reinventar la rueda)</p>
<p>Una vez que no tengas ruedas repetidas, verás que realizar <strong>modificaciones</strong> será una tarea sencilla, evitando así la <strong>fragilidad</strong> del código.</p>
<h3>OOP</h3>
<p>En términos de Orientación a Objetos, muchas veces no tenemos tan clara la diferencia entre el uso de la herencia, métodos estáticos y métodos dinámicos. Este tipo de temas los veremos en los ejemplos.</p>
<h3>El ORM</h3>
<p>Debemos familiarizarnos con la librería que gestiona la persistencia y las consultas al motor de bases de datos, en especial sus métodos, propiedades y los <strong>callbacks</strong>. En esto último quisiera detenerme un momento. Los callbacks son la analogía a lo que en un motor de base de datos se conoce como <strong>triggers</strong> (disparadores). Existen diferentes tipos de triggers, pero en generar se clasifican en los que se ejecutan <strong>antes</strong> de una acción y los que lo hacen <strong>después</strong> (before y after respectivamente)</p>
<p>El nuevo <a href="https://github.com/KumbiaPHP/ActiveRecord" target="_blank" rel="noopener"><strong>LiteRecord</strong></a> implementa callbacks para las acciones de creación (_beforeCreate, _afterCreate), para actualización (_beforeUpdate, _afterUpdate) y para guardar (_beforeSave, _afterSave)</p>
<p>En palabras simples, si el modelo encuentra un método _beforeAlgo, ejecutará dicha función antes de que se ejecute el método «Algo» (asumiendo que «Algo» puede ser Create, Save, Update). Por otro lado un _afterAlgo, se ejecutará luego que la función «Algo» haya finalizado.</p>
<p>Estos temas también los iremos tratando con casos cotidianos. Puedes checar su documentación en este <a href="https://github.com/KumbiaPHP/ActiveRecord/blob/master/LiteRecord.php" target="_blank" rel="noopener">enlace</a>.</p>
<h3>Traits </h3>
<p>Desde la versión de PHP 5.4 se implementan los <a href="https://www.php.net/manual/es/language.oop5.traits.php" target="_blank" rel="noopener">Traits</a> (rasgos, características) Es una buena estrategia para continuar con el principio DRY. De pronto tienes propiedades o métodos que son compartidos entre diferentes clases. Puedes extraer esos métodos en un trait y luego indicar que la clase implementa dichos «rasgos». Así tendrás un único lugar para ellos y finalmente, si hay menos código «innecesario o repetitivo», habrá menos errores y será más fácil de hacer mantención/corrección del mismo.</p>
<p> </p>
<p> </p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2022/09/10/crear-modelos-de-forma-correcta/">Cómo crear modelos de forma correcta</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/2022/09/10/crear-modelos-de-forma-correcta/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2676</post-id>	</item>
		<item>
		<title>Servidor PHP desde la consola Linux de Windows</title>
		<link>https://kumbiaphp.com/blog/2020/03/04/servidor-php-desde-la-consola-linux-de-windows/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=servidor-php-desde-la-consola-linux-de-windows</link>
					<comments>https://kumbiaphp.com/blog/2020/03/04/servidor-php-desde-la-consola-linux-de-windows/#comments</comments>
		
		<dc:creator><![CDATA[Nelson Rojas]]></dc:creator>
		<pubDate>Wed, 04 Mar 2020 10:50:11 +0000</pubDate>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales y screencast]]></category>
		<category><![CDATA[servidor php]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[wsl]]></category>
		<guid isPermaLink="false">https://www.kumbiaphp.com/blog/?p=2276</guid>

					<description><![CDATA[<p>Crear usuario y contraseña de la consola de linux Servidor PHP local</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2020/03/04/servidor-php-desde-la-consola-linux-de-windows/">Servidor PHP desde la consola Linux de Windows</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 esta ocasión vamos a hablar de la característica de <strong><em>Windows 10</em> que nos permite contar con nuestro servidor PHP desde la consola Linux</strong>, y cómo hacer uso de <em>KumbiaPHP</em> con los requerimientos mínimos para dicha consola.&nbsp;</p>
<p>Tendremos un <strong>servidor local de PHP</strong> perfecto para desarrollo, <strong>sin usar WAMP o XAMPP server</strong>.</p>
<p>Antes de comenzar, te dejamos un enlace donde se explican las implicancias del <em>WSL</em> (Windows Subsystem for Linux) <a href="https://es.wikipedia.org/wiki/Windows_Subsystem_for_Linux" target="_blank" rel="noopener noreferrer">https://es.wikipedia.org/wiki/Windows_Subsystem_for_Linux</a></p>
<p>Vamos con los requisitos. Lo primero que necesitamos es habilitar la caracterísca de <em>Subsistema Linux desde Windows</em>.<span id="more-2276"></span></p>
<h2>Instalar WSL en Windows 10</h2>
<p>Para ello hacemos clic en inicio y escribimos <code class="" data-line="">&lt;em&gt;Características de Windows&lt;/em&gt;</code> (en mi caso se verá diferente porque llevo una versión de <em>Windows</em> en inglés)</p>
<p>&nbsp;</p>



<figure class="wp-block-image size-large"><img decoding="async" width="835" height="677" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/00.png" alt="" class="wp-image-2277" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/00.png 835w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/00-300x243.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/00-768x623.png 768w" sizes="(max-width: 835px) 100vw, 835px" /></figure>



<p>Luego buscaremos al final de la lista el <em>Subsistema Linux para Windows</em> (ver imagen siguiente)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="416" height="369" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/02.png" alt="" class="wp-image-2278" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/02.png 416w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/02-300x266.png 300w" sizes="auto, (max-width: 416px) 100vw, 416px" /></figure>



<p>Lo seleccionamos haciendo clic en la casilla de la izquierda, y finalizamos picando en el botón OK para que los cambios sean aplicados.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="656" height="482" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/03.png" alt="" class="wp-image-2279" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/03.png 656w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/03-300x220.png 300w" sizes="auto, (max-width: 656px) 100vw, 656px" /></figure>



<p>Tendremos que reiniciar para que la configuración se vea actualizada.</p>
<h2>Seleccionar la distribución de Linux en la Tienda de Microsoft</h2>
<p>Una vez hecho eso, iniciaremos a la aplicación <em>Tienda de Microsoft</em> (<em>Microsoft Store</em>) y usando su buscador, escribiremos la palabra <em>linux</em>.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="804" height="633" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/05.png" alt="" class="wp-image-2280" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/05.png 804w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/05-300x236.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/05-768x605.png 768w" sizes="auto, (max-width: 804px) 100vw, 804px" /></figure>



<p>La lista de opciones es variada pues se cuenta con <strong><em>Ubuntu</em>, <em>Kali</em>, <em>Debian</em>, <em>OpenSuse</em>, entre otros</strong>. Para cuestiones de demostración he seleccionado la opción Debian (aunque en otra máquina lo he probado con <em>Ubuntu</em> 18.04).</p>
<p>Bastará con seleccionar la opción de vuestro gusto, y luego presionar el botón Obtener (Get en mi caso)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="807" height="640" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/06.png" alt="" class="wp-image-2281" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/06.png 807w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/06-300x238.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/06-768x609.png 768w" sizes="auto, (max-width: 807px) 100vw, 807px" /></figure>



<p>Puede que el instalador te pregunte, si quieres mantener sincronizadas tus máquinas de acuerdo a tu cuenta. En mi caso, prefiero que sólo sea instalado en esta máquina, sin importar la sincronización posterior (para ello te requerirá iniciar sesión con una cuenta de <em>Windows Live</em> &#8211; <em>Hotmail</em>, <em>Outlook</em> u otra)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="510" height="176" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/07.png" alt="" class="wp-image-2282" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/07.png 510w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/07-300x104.png 300w" sizes="auto, (max-width: 510px) 100vw, 510px" /></figure>



<p>En este diálogo he seleccionado «No, gracias». Luego de la respuesta, ha comenzado el proceso de instalación.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="802" height="633" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/09.png" alt="" class="wp-image-2283" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/09.png 802w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/09-300x237.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/09-768x606.png 768w" sizes="auto, (max-width: 802px) 100vw, 802px" /></figure>





<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="802" height="631" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/10.png" alt="" class="wp-image-2284" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/10.png 802w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/10-300x236.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/10-768x604.png 768w" sizes="auto, (max-width: 802px) 100vw, 802px" /></figure>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="979" height="514" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/11.png" alt="" class="wp-image-2285" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/11.png 979w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/11-300x158.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/11-768x403.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/11-940x494.png 940w" sizes="auto, (max-width: 979px) 100vw, 979px" /></figure>



<h2 class="wp-block-heading">Crear usuario y contraseña de la consola de linux</h2>



<p>Cuando la configuración de la <em>consola linux</em> haya finalizado, nos pedirá crear un usuario con nombre y contraseña.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="890" height="272" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/13.png" alt="" class="wp-image-2286" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/13.png 890w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/13-300x92.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/13-768x235.png 768w" sizes="auto, (max-width: 890px) 100vw, 890px" /></figure>



<p>Noten que el nombre de usuario de la consola, <strong>no tiene por qué coincidir con el nombre de usuario de la máquina de <em>Windows</em></strong>. Una vez creado el usuario habremos finalizado la instalación de la <em>consola de Linux</em>!</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="826" height="333" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/14.png" alt="" class="wp-image-2287" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/14.png 826w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/14-300x121.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/14-768x310.png 768w" sizes="auto, (max-width: 826px) 100vw, 826px" /></figure>



<p>Entonces ya tenemos nuestra estación Linux completamente funcional.&nbsp;</p>
<h2>Actualizar paquetes de Linux</h2>
<p>En los derivados de <em>Debian</em> (como <em>Ubuntu</em> y <em>Kali</em>) les recomiendo comenzar ejecutando el comando:</p>
<pre class="  language-bash"><code class="" data-line="">&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; update</code></pre>
<p>Con ello cargarás los repositorios de paquetes que podrás usar posteriormente.</p>
<h2>Instalar PHP y MariaDB (MySql) en la consola Linux de Windows</h2>
<p>Para usar <em>Debian</em> y derivados, con los requerimientos mínimos de desarrollo kumbiero necesitamos hacer la siguiente instalación</p>
<pre class="  language-bash"><code class="" data-line="">&lt;span class=&quot;token function&quot;&gt;sudo&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;apt-get&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; php php-cli php-mysql mariadb-server php-mbstring &lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; unzip</code></pre>
<h2>Instalar KumbiaPHP framework</h2>
<p>Una vez que hemos finalizado la instalación, podemos hacer una prueba descargando la versión de <em>KumbiaPHP</em> desde la <a href="http://www.kumbiaphp.com" target="_blank" rel="noopener noreferrer">página principal del proyecto</a></p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="312" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/03/31-1024x312.png" alt="" class="wp-image-2358" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/03/31-1024x312.png 1024w, https://kumbiaphp.com/blog/wp-content/uploads/2020/03/31-300x91.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/03/31-768x234.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2020/03/31-940x286.png 940w, https://kumbiaphp.com/blog/wp-content/uploads/2020/03/31.png 1363w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p>Lo hacemos desde el icono de descarga para el formato tar. Hacemos clic con el botón secundario (normalmente el derecho) y copiamos el link desde el botón Copiar enlace (Copy link)</p>
<p>Luego desde la consola escribimos wget y pegamos lo que tenemos en el portapaleles. Deberíamos lograr una línea de ejecución como la siguiente:</p>
<pre class="  language-bash"><code class="" data-line="">&lt;span class=&quot;token function&quot;&gt;wget&lt;/span&gt; https://github.com/KumbiaPHP/KumbiaPHP/archive/v1.0.0.tar.gz</code></pre>
<p>&nbsp;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="982" height="437" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/03/33.png" alt="" class="wp-image-2362" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/03/33.png 982w, https://kumbiaphp.com/blog/wp-content/uploads/2020/03/33-300x134.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/03/33-768x342.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2020/03/33-940x418.png 940w" sizes="auto, (max-width: 982px) 100vw, 982px" /></figure>



<p>Descomprimimos la descarga:</p>
<pre class="  language-bash"><code class="" data-line="">&lt;span class=&quot;token function&quot;&gt;tar&lt;/span&gt; xvfz v1.0.0.tar.gz</code></pre>
<p>Y renombramos la carpeta resultante con un nombre que tenga relación con el trabajo que llevaremos a cabo (usando el comando <code class="" data-line="">mv</code>)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="579" height="171" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/03/35.png" alt="" class="wp-image-2361" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/03/35.png 579w, https://kumbiaphp.com/blog/wp-content/uploads/2020/03/35-300x89.png 300w" sizes="auto, (max-width: 579px) 100vw, 579px" /></figure>



<p>Finalizamos la prueba de instalación entrando en la carpeta que hemos creado hasta llegar a <code class="" data-line="">&lt;strong&gt;default/app&lt;/strong&gt;</code></p>
<p>&nbsp;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="455" height="89" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/22.png" alt="" class="wp-image-2291" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/22.png 455w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/22-300x59.png 300w" sizes="auto, (max-width: 455px) 100vw, 455px" /></figure>



<h2 class="wp-block-heading">Servidor PHP local</h2>



<p>Sin instalar Apache o Nginx,&nbsp; escribiendo el comando:</p>
<pre class=" language-bash"><code class="" data-line="">bin/phpserver</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="957" height="642" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/23.png" alt="" class="wp-image-2292" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/23.png 957w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/23-300x201.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/23-768x515.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/23-940x631.png 940w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/23-440x294.png 440w" sizes="auto, (max-width: 957px) 100vw, 957px" /></figure>



<p><em>Windows</em> nos preguntará, si acaso queremos permitir conexiones desde redes internas o desde fuera de la red. Para efectos de prueba he seleccionado ambas opciones y he presionado el botón «Permitir acceso» (Allow access)</p>
<p>Entonces, nuestra aplicación recién instalada de KumbiaPHP estará disponible desde la dirección http://0.0.0.0:8001. En caso que no resulte también puedes invocarla usando la url de http://localhost:8001, o usando http://127.0.0.1:8001, o incluso la dirección ip interna de tu máquina como por ejemplo http://192.168.1.101:8001. Esta última opción nos servirá para hacer pruebas desde otros dispositivos conectados a la misma red (por ejemplo desde un tablet, o un móvil)</p>
<p>&nbsp;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="474" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/25-1024x474.png" alt="" class="wp-image-2293" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/25-1024x474.png 1024w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/25-300x139.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/25-768x355.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/25-940x435.png 940w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/25.png 1366w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h2>Permisos de la base de datos (Mysql, MariaDB, Postresql, otros)</h2>
<p>Un dato final, es si usamos MySQL o MariaDB o Postgresql, Windows nos preguntará si queremos dar acceso a dichos servicios, tal como ha hecho cuando hemos lanzado <code class="" data-line="">&lt;strong&gt;bin/phpserver&lt;/strong&gt;</code>. En dicho caso sólo les recomiendo habilitar el uso en el equipo y la red local. No para el exterior. Aunque esta es una decisión que debe tomar cada uno.</p>
<p><strong>¿Y qué hemos ganado con lanzar KumbiaPHP con el comando bin/phpserver?</strong></p>
<p>Pues la ventana en la que lo hemos lanzado, se ha convertido en una ventana de log de utilización, por la que veremos cada una de las acciones que realice el framework mientras estamos trabajando con él</p>
<p>Y lo más importante, también <strong>veremos los errores al instante, para depurar más rápidamente nuestas aplicaciones</strong>.</p>
<p>&nbsp;</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="632" height="273" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/27.png" alt="" class="wp-image-2295" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/27.png 632w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/27-300x130.png 300w" sizes="auto, (max-width: 632px) 100vw, 632px" /></figure>



<p>Y hasta aquí nuestra publicación :-)</p>
<p>Esperamos que les sea de utilidad y que con ello tengan nuevas opciones de disfrutar programando con el <a href="https://www.kumbiaphp.com/blog/about/">framework más rápido</a> del oeste!</p>
<p>Saludos a todos nuestros colegas kumbieros!</p>
<p><strong>Post data: si eres nuevo por aquí te recomendamos ver algunos de nuestros posts para los recién llegados:</strong></p>
<p>KumbiaPHP essentials</p>
<p><a href="https://www.kumbiaphp.com/blog/2016/05/26/kumbiaphp-essentials/"><img loading="lazy" decoding="async" class="alignnone size-medium" src="https://i.vimeocdn.com/video/572670979.jpg?mw=800&amp;mh=449" alt="KumbiaPHP introducción" width="799" height="449" /></a></p>
<p>Scaffolding con KumbiaPHP</p>
<p><a href="https://www.kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/"><img loading="lazy" decoding="async" class="alignnone wp-image-2300 size-large" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2020/02/scaffolding-1024x576.jpg" alt="Scaffolding con KumbiaPHP" width="940" height="529" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2020/02/scaffolding-1024x576.jpg 1024w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/scaffolding-300x169.jpg 300w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/scaffolding-768x432.jpg 768w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/scaffolding-940x529.jpg 940w, https://kumbiaphp.com/blog/wp-content/uploads/2020/02/scaffolding.jpg 1058w" sizes="auto, (max-width: 940px) 100vw, 940px" /></a></p>
<p>Dicho esto,</p>
<p>Larga vida a KumbiaPHP!</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2020/03/04/servidor-php-desde-la-consola-linux-de-windows/">Servidor PHP desde la consola Linux de Windows</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/2020/03/04/servidor-php-desde-la-consola-linux-de-windows/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2276</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>Scaffolding para CRUD (ABM) sencillos (y no tanto) &#8211; primera parte</title>
		<link>https://kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte</link>
					<comments>https://kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/#comments</comments>
		
		<dc:creator><![CDATA[Nelson Rojas]]></dc:creator>
		<pubDate>Mon, 03 Apr 2017 10:39:38 +0000</pubDate>
				<category><![CDATA[ActiveRecord]]></category>
		<category><![CDATA[PHP]]></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=1288</guid>

					<description><![CDATA[<p>¿Qué es Scaffolding? Cuando comenzó el fenómeno de los frameworks de desarrollo web, una de sus banderas de lucha&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/">Scaffolding para CRUD (ABM) sencillos (y no tanto) &#8211; primera parte</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<h2>¿Qué es Scaffolding?</h2>
<p>Cuando comenzó el fenómeno de los frameworks de desarrollo web, una de sus banderas de lucha estuvo de la mano de los scaffoldings (andamios).</p>
<p>Un scaffold es en sí una técnica que proveen muchos frameworks, con la que podrás tener un gestor de datos para una tabla particular escribiendo una cantidad mínima de código (en KumbiaPHP bastan 7 líneas de código – excluyendo 2 líneas de encabezado php – ).</p>
<p>En mis primeros años de kumbiero comencé creando un controlador para las acciones clásicas de CRUD (Create, Read, Update y Delete), un modelo para apuntar la tabla de la base de datos y al menos 3 archivos de vista (index, agregar y editar).</p>
<p>Para hacer el CRUD de otra tabla copiaba el controlador inicial en el nuevo, luego editaba todo lo que correspondía, y lo mismo hacía para el modelo y las vistas.</p>
<p>Como verán es un trabajo arduo, pero no es tanto trabajo… a menos que tengas más de 10 tablas.</p>
<p>Si pueden hacer el ejercicio de mirar el bosque desde lejos, casi todos los CRUDs creados tienen las mismas acciones, y usan las mismas vistas (con sus leves diferencias).</p>
<h2>La iluminación</h2>
<p>Fue entonces que un día de IRC (el chat que usábamos antes), los colegas del core de KumbiaPHP me presentaron a ScaffoldController.</p>
<p>Es un amigo silencioso, puesto que está alojado en default/app/libs, pero además es un amigo confiable, pues hereda de AdminController (eso quiere decir que si damos cierta habilidad de autenticación al AdminController, los controllers que hagamos usando ScaffoldController también estarán asegurados).</p>
<h2>Configuración inicial</h2>
<p>Si este es un proyecto que ha iniciado desde cero, deberá configurar el acceso a la base de datos antes de continuar.</p>
<p>Para eso usaremos el archivo <em>default/app/config/database.ini</em>. En él se definen los entornos de datos que usará nuestra aplicación, los que normalmente son: development (desarrollo) y production (producción)</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/database-setting.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1890 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/database-setting.png" alt="Archivo databases.ini de KumbiaPHP" width="585" height="339" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/04/database-setting.png 585w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/database-setting-300x174.png 300w" sizes="auto, (max-width: 585px) 100vw, 585px" /></a></p>
<p>Los parámetros de configuración que debemos revisar son:</p>
<ul>
<li><strong>host</strong>: Nombre de red o dirección ip del equipo en el cual está instalada la base de datos.</li>
<li><strong>username</strong>: usuario de la base de datos.</li>
<li><strong>password</strong>: contraseña del usuario de la base de datos.</li>
<li><strong>name</strong>: nombre de la base de datos.</li>
<li><strong>type</strong>: el tipo de base de datos que usará el proyecto, como mysql, pgsql, oracle.</li>
</ul>
<p>Para indicarle al proyecto que debe usar uno u otro entorno de base de datos, será necesario modificar el archivo de configuración <em>default/app/config/config.php</em>. De forma predeterminada la configuración del entorno de base de datos es &#8216;default&#8217;, pero lo dejaremos inicialmente como &#8216;development&#8217;.</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/datbase-default.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1891 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/04/datbase-default.png" alt="Archivo config.php de KumbiaPHP" width="473" height="419" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/04/datbase-default.png 473w, https://kumbiaphp.com/blog/wp-content/uploads/2017/04/datbase-default-300x266.png 300w" sizes="auto, (max-width: 473px) 100vw, 473px" /></a></p>
<p>Lista la configuración, sigamos con la acción.</p>
<h2>De la teoría a la acción</h2>
<p>Bueno, mucho texto y poca acción (o como versa el dicho “mucho ruido y pocas nueces”).</p>
<p>En nuestro primer ejemplo usaremos la clásica tabla de categorías, con la siguiente estructura:</p>
<pre class="  language-sql"><code class="" data-line="">
&lt;span class=&quot;token keyword&quot;&gt;CREATE&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;TABLE&lt;/span&gt; categorias &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
 id &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
 nombre &lt;span class=&quot;token keyword&quot;&gt;varchar&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;200&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;NOT&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;NULL&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;UNIQUE&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
 categorias_id &lt;span class=&quot;token keyword&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;11&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;
 creada_at &lt;span class=&quot;token keyword&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
 actualizada_in &lt;span class=&quot;token keyword&quot;&gt;timestamp&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
 &lt;span class=&quot;token keyword&quot;&gt;PRIMARY&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;KEY&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;id&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>Ahora crearemos un modelo llamado Categorias.</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 punctuation&quot;&gt;}&lt;/span&gt;</code></pre>
<p>Y finalmente <strong>(sí, finalmente)</strong> añadiremos el controlador CategoriasController.</p>
<p>Archivo: <em>controllers/categoria_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 punctuation&quot;&gt;}&lt;/span&gt;</code></pre>
<p><span id="more-1288"></span></p>
<h2>¡Y hemos terminado!</h2>
<p>Así de sencillo ya tenemos nuestro primer CRUD sin dolor.</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_05_35.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1322 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_05_35.png" alt="" width="877" height="571" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_05_35.png 877w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_05_35-300x195.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_05_35-768x500.png 768w" sizes="auto, (max-width: 877px) 100vw, 877px" /></a></p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_12_14.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1321 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_12_14.png" alt="" width="880" height="583" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_12_14.png 880w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_12_14-300x199.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/VirtualBox_ubuntu_31_03_2017_11_12_14-768x509.png 768w" sizes="auto, (max-width: 880px) 100vw, 880px" /></a></p>
<p>Tendremos inicialmente las acciones para index, agregar, editar, ver y eliminar, y sólo hemos escrito 7 líneas.</p>
<h2>Personalizando las vistas</h2>
<p>Y ahora, ¿quién podrá defendernos de la hoja de estilo predeterminada? ¡Excelente pregunta!</p>
<p>Bueno, los muchachos del core ya tuvieron eso previsto para nosotros. Resulta que puedes crear tus propias vistas para usarlas con tus controladores de Scaffold. Basta copiar el contenido de <em>app/views/_shared/scaffold/kumbia</em> en una nueva versión de vistas para tus controladores.</p>
<p><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/skeleton.png"><img loading="lazy" decoding="async" class="alignnone wp-image-1306 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/skeleton.png" alt="" width="668" height="235" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/03/skeleton.png 668w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/skeleton-300x106.png 300w" sizes="auto, (max-width: 668px) 100vw, 668px" /></a></p>
<p>Supongamos que nos piden usar <a href="http://getskeleton.com/" target="_blank" rel="noopener noreferrer">skeleton</a>. Por lo tanto ahora tendremos una carpeta llamada <em>app/views/_shared/scaffolds/skeleton</em>, con los mismos tres archivos de vistas: crear, index, ver.</p>
<p>Y ¿cómo le decimos a nuestros controladores que usen nuestro nuevo conjunto de vistas?<br />
<strong>Sencillo:</strong></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 variable&quot;&gt;$scaffold&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&#039;skeleton&#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;</code></pre>
<h2>El resultado final</h2>
<p>Si miramos el resultado tendremos algo como lo que se ve en las siguientes imágenes:</p>
<p><figure id="attachment_1307" aria-describedby="caption-attachment-1307" style="width: 914px" class="wp-caption alignnone"><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/index-sk.png"><img loading="lazy" decoding="async" class="wp-image-1307 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/index-sk-e1490969789984.png" alt="Vista usando skeleton" width="914" height="392" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/03/index-sk-e1490969789984.png 914w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/index-sk-e1490969789984-300x129.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/index-sk-e1490969789984-768x329.png 768w" sizes="auto, (max-width: 914px) 100vw, 914px" /></a><figcaption id="caption-attachment-1307" class="wp-caption-text">Vista usando skeleton</figcaption></figure></p>
<p><figure id="attachment_1308" aria-describedby="caption-attachment-1308" style="width: 910px" class="wp-caption alignnone"><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/editar-1.png"><img loading="lazy" decoding="async" class="wp-image-1308 size-full" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/03/editar-1-e1490970004190.png" alt="Formulario usando skeleton" width="910" height="336" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/03/editar-1-e1490970004190.png 910w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/editar-1-e1490970004190-300x111.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/03/editar-1-e1490970004190-768x284.png 768w" sizes="auto, (max-width: 910px) 100vw, 910px" /></a><figcaption id="caption-attachment-1308" class="wp-caption-text">Formulario usando skeleton</figcaption></figure></p>
<p>Así de fácil logramos crear nuestro primer CRUD con 8 líneas de código y con nuestro css preferido (o requerido).</p>
<p>Si quieres ver lo que sigue, mira en los enlaces que están a continuación:</p>
<p><strong>Parte 2:</strong> <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><strong>Parte 3:</strong>  <a href="https://www.kumbiaphp.com/blog/2017/05/16/scaffoldcontroller-modificando-vistas/">ScaffoldController: Modificando vistas</a></p>
<h2>Descarga el ejemplo completo</h2>
<p>Pueden descargar el código del proyecto desde el siguiente repositorio de <a href="https://github.com/nelsonrojas/Scaffold-KumbiaPHP" target="_blank" rel="noopener noreferrer">Github</a></p>
<p>Si buscan el script de la tabla de categorías pueden encontrarlo dentro de <em><a href="https://github.com/nelsonrojas/Scaffold-KumbiaPHP/tree/master/default/app/config/sql" target="_blank" rel="noopener noreferrer">app/config/sql</a></em></p>
<p><strong>¡Larga vida a KumbiaPHP!</strong></p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/">Scaffolding para CRUD (ABM) sencillos (y no tanto) &#8211; primera parte</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/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1288</post-id>	</item>
		<item>
		<title>Programar código PHP ¿IDE o editor de Texto?</title>
		<link>https://kumbiaphp.com/blog/2017/01/27/programar-codigo-php-ide-o-editor-de-texto/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=programar-codigo-php-ide-o-editor-de-texto</link>
					<comments>https://kumbiaphp.com/blog/2017/01/27/programar-codigo-php-ide-o-editor-de-texto/#comments</comments>
		
		<dc:creator><![CDATA[Nelson Rojas]]></dc:creator>
		<pubDate>Fri, 27 Jan 2017 09:44:14 +0000</pubDate>
				<category><![CDATA[Comunidad]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriales y screencast]]></category>
		<category><![CDATA[Editor php]]></category>
		<category><![CDATA[IDE php]]></category>
		<guid isPermaLink="false">http://www.kumbiaphp.com/blog/?p=1053</guid>

					<description><![CDATA[<p>Bienvenido 2017, feliz enero para todos, y los mayores éxitos para nuestros colegas Kumbieros! En esta ocasión vamos a&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/01/27/programar-codigo-php-ide-o-editor-de-texto/">Programar código PHP ¿IDE o editor de Texto?</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Bienvenido 2017, feliz enero para todos, y los mayores éxitos para nuestros colegas Kumbieros!</p>
<p>En esta ocasión vamos a hablar de un tema  bastante sencillo, y que tiene que ver con ayudar un poco a la decisión qué herramienta es la más efectiva, eficiente y se acomoda más a las necesidades del desarrollador.</p>
<p>Todos sabemos lo rápido que resultan las aplicaciones hechas con KumbiaPHP, pero cuando empiezas cuesta un poco sacarle el provecho necesario a las horas de trabajo, y te pierdes en búsquedas de documentación, paseos por los foros, consultas en el grupo de google, etc.</p>
<h2>¿Hay algún tipo de secreto o algo que nos pueda ser de utilidad?</h2>
<p>En este sentido tenemos dos opciones: la primera es usar un IDE para PHP, o usar un editor de texto sobrecargado (con extensiones)</p>
<h2>Bueno, ¿qué IDE y editor de texto puedes usar?</h2>
<p>Por el lado de los IDE están los gratuitos como Netbeans, Eclipse, Aptana. También los hay de pago como PHP Storm, Zend Studio, Komodo IDE.<br />
 En la vereda de los editores de texto, la lista comienza con Komodo Edit, Atom, Visual Studio Code, Notepad++, Brackets, Sublime Text, Vim, Gedit, TextMate, Text Wranger, etc.</p>
<h2>¿Y entonces, cómo me decido por uno u otro?</h2>
<p>El mayor beneficio de un IDE es que con el sólo hecho de cargar tu proyecto tendrás acceso a autocompletado de código;  ayuda con clases, métodos, propiedades; herramientas como formateadores, snippets (trozos de código); resaltado de errores y ayuda para corregirlos. Ahora, no todo es beneficio con un IDE pues tendrás que sacrificar algo – como dice la ley del intercambio equivalente – tendrás que ceder en memoria RAM y procesador. Los IDE normalmente están basados en Java, y, por lo tanto no corren en código nativo (la mayoría)</p>
<h2>¿Y los editores de texto?</h2>
<p>Un editor de texto tiene la particularidad de ser en extremo liviano en cuanto a memoria RAM, pero sólo es eso, un editor de texto. Tendrás que agregar extensiones especiales para darles algo de funcionalidad extra y mejorar así tu tiempo de desarrollo y tu curva de aprendizaje.Recuerdo bien que alguna vez usé Atom, y haber creado “recortes de código php” para labores como crear CRUD, Controladores, Modelos, e incluso lanzar los Helpers de la clase Form con autocompletado. No es complejo construir tus propios recortes de código.</p>
<h2>Y entonces, ¿qué sigue en este post?</h2>
<p>Lo cierto es que vamos a crear entre todos diferentes post para ir mostrándoles cómo usar IDE o editores de texto recargados. Ya tenemos el de <a href="https://www.kumbiaphp.com/blog/2017/02/20/kumbiaphp-y-netbeans-ide-los-mejores-amigos/">NetBeans IDE.</a> Nuestro colega Raúl (@demonio69) seguirá con la serie con el uso de Komodo Edit. Y espero acompañarlo luego con Eclipse para la próxima entrega.</p>
<p>Para cerrar, así se ve Netbeans en acción y Komodo Edit configurado con las librerías del core de KumbiaPHP.</p>
<figure><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-netbeans.png"><img loading="lazy" decoding="async" class="wp-image-1082 size-medium" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-netbeans-300x184.png" width="300" height="184" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-netbeans-300x184.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-netbeans-768x470.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-netbeans-1024x627.png 1024w, https://kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-netbeans-940x576.png 940w, https://kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-netbeans.png 1130w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption>Netbeans en Acción</figcaption></figure>
<figure><a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-komodo-edit.png"><img loading="lazy" decoding="async" class="wp-image-1083 size-medium" src="https://www.kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-komodo-edit-300x225.png" width="300" height="225" srcset="https://kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-komodo-edit-300x225.png 300w, https://kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-komodo-edit-768x577.png 768w, https://kumbiaphp.com/blog/wp-content/uploads/2017/01/usando-paginate-kumbiaphp-komodo-edit.png 805w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption>Usando Komodo Edit con la clase Router</figcaption></figure>
<p>Serie de artículos:</p>
<p><a href="https://www.kumbiaphp.com/blog/2017/02/20/kumbiaphp-y-netbeans-ide-los-mejores-amigos/">NetBeans IDE</a></p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2017/01/27/programar-codigo-php-ide-o-editor-de-texto/">Programar código PHP ¿IDE o editor de Texto?</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/01/27/programar-codigo-php-ide-o-editor-de-texto/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1053</post-id>	</item>
		<item>
		<title>Vídeo KumbiaPHP Essentials</title>
		<link>https://kumbiaphp.com/blog/2016/05/26/kumbiaphp-essentials/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kumbiaphp-essentials</link>
					<comments>https://kumbiaphp.com/blog/2016/05/26/kumbiaphp-essentials/#respond</comments>
		
		<dc:creator><![CDATA[Nelson Rojas]]></dc:creator>
		<pubDate>Thu, 26 May 2016 16:58:05 +0000</pubDate>
				<category><![CDATA[Comunidad]]></category>
		<category><![CDATA[Tutoriales y screencast]]></category>
		<category><![CDATA[ejemplos]]></category>
		<category><![CDATA[videos]]></category>
		<guid isPermaLink="false">http://www.kumbiaphp.com/blog/?p=974</guid>

					<description><![CDATA[<p>Bienvenido/bienvenida a KumbiaPHP. Esta semana tenemos un vídeo dedicado a los conceptos básicos de KumbiaPHP. Los vídeos son parte&#8230;</p>
<p>La entrada <a href="https://kumbiaphp.com/blog/2016/05/26/kumbiaphp-essentials/">Vídeo KumbiaPHP Essentials</a> se publicó primero en <a href="https://kumbiaphp.com/blog">KumbiaPHP Framework PHP en español</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Bienvenido/bienvenida a KumbiaPHP.</p>
<p>Esta semana tenemos un vídeo dedicado a los conceptos básicos de KumbiaPHP. Los vídeos son parte de una serie para compartir conocimiento y algunas prácticas que tenemos los desarrolladores que usamos este fabuloso framework.</p>
<p><iframe loading="lazy" src="https://player.vimeo.com/video/168209025" width="940" height="529" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Pueden descargarse los slides aquí: <a href="https://www.kumbiaphp.com/blog/wp-content/uploads/2016/05/KumbiaPHP-Essentials-v2.pdf" target="_blank" rel="noopener noreferrer">KumbiaPHP Essentials</a></p>
<h2>Próximas semanas:</h2>
<ul>
<li style="list-style-type: none;">
<ul>
<li><a href="https://www.kumbiaphp.com/blog/2017/04/03/scaffolding-para-crud-abm-sencillos-y-no-tanto-primera-parte/">Scaffolding, CRUD fácil y en pocas líneas.</a></li>
<li>CRUD con KumbiaPHP (Create, Read, Update, Delete)</li>
<li>ActiveRecord Essentials</li>
<li>Templates (Bootstrap, Picnic, Foundation)</li>
<li>Autenticación</li>
<li>Uploads</li>
<li>Control de Acceso con ACL</li>
</ul>
</li>
</ul>
<p>La entrada <a href="https://kumbiaphp.com/blog/2016/05/26/kumbiaphp-essentials/">Vídeo KumbiaPHP Essentials</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/2016/05/26/kumbiaphp-essentials/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">974</post-id>	</item>
	</channel>
</rss>
