Errores comunes al subir web o aplicación php a producción

Read More

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.

Va especialmente dedicado a nuestros colegas que alguna vez han llegado al chat grupal con la frase:

Es que no funciona en producción

La primera pregunta que debemos resolver es:

¿Por qué no funciona?

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.

  1. ¿El servidor apache está ejecutándose?
  2. ¿El mod rewrite está activo?
  3. ¿El mod rewrite está configurado para nuestra ruta en el servidor?
  4. ¿PHP está instalado y configurado?
  5. ¿El servidor de bases de datos está activo?
  6. ¿La cuenta en el servidor de bases de datos es la que corresponde en la configuración de nuestra aplicación?
  7. ¿Hemos trasladado todos los cambios desde el servidor de bases de datos de desarrollo hacia el servidor de producción?
  8. ¿Nuestra aplicación tiene los permisos bien configurados?
  9. ¿Hemos copiado completamente la aplicación desde el servidor de desarrollo (incluidos todos los archivos .htaccess)?
  10. ¿Hemos configurado correctamente la constante PUBLIC_PATH?
  11. ¿Podemos usar PATH_INFO o necesitamos cambiar la estrategia de generación de URL?
  12. Si estamos completamente a ciegas, ¿hemos activado la visualización de errores?

NOTA: Si es la primera vez 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.

Continuemos entonces con el checklist:

Continue reading “Errores comunes al subir web o aplicación php a producción”

ScaffoldController: Modificando vistas

Hasta aquí hemos invertido tiempo en revisar el uso básico del ScaffoldController con KumbiaPHP creando nuestros CRUDs de forma rápida, modificando el estilo de las vistas (al añadir un nuevo conjunto de vistas que cargan mediante la variable de controlador $scaffold), y reemplazando comportamientos particulares para modificar el conjunto de datos (al reescribir el método index).

Nueva meta u objetivo usando ScaffoldController

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: No te repitas.

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).

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.

Por eso es que existe una clasificación de carpetas: para controladores, modelos, vistas, ayudantes (helpers), librerías particulares, y librerías externas (vendors).

Si necesita comprender más los conceptos básicos de nuestro framework puede ver Kumbia Essentials.

Manos a la obra

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).

Ahora iremos un poco más lejos

  1. Modificaremos la vista particular de la acción index.
  2. Sobrescribiremos nuestro controlador para modificar el comportamiento al guardar y actualizar los registros.

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 crear para que el formulario aparezca limpio para agregar nuevamente, en vez de viajar a index una vez enviado el formulario.

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.

Continue reading “ScaffoldController: Modificando vistas”

ScaffoldController: Modificando comportamientos y contenidos

Read More
Vista index con categoría relacionada como texto

La entrega anterior hablamos acerca del uso de la técnica de Scaffolding para CRUD con KumbiaPHP usando la clase ScaffoldController. Espero que muchos se hayan sorprendido gratamente con la funcionalidad que ciertamente ahorra mucho trabajo rutinario, ya que es altamente flexible.

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.

Manos a la obra con ScaffoldController

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.

Lista de categorías

Como se ve en la lista, las categorías relacionadas sólo se ven con su identificador.
Por lo tanto, vamos a modificar la fuente de datos que pasamos a la vista Index para que ésta pueda presentar los contenidos respectivos.

En el modelo

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:

Archivo: models/categorias.php

<?php

class Categorias extends ActiveRecord 
{

    function getCategorias($page = 1) 
    {
        return $this->paginate(
            'columns: categorias.id, categorias.nombre, cat.nombre as categorias_id, categorias.creada_at, categorias.actualizada_in', 
            'join: left outer join categorias cat on categorias.categorias_id = cat.id',
            "page: $page", 'order: categorias.id desc');
    }

}

En el controlador

El segundo cambio lo haremos desde el controlador, para cargar los cambios que hemos hecho en el modelo. Lo que reemplazaremos (porque es una sobre escritura de index en ScaffoldController) será la función index tal como se muestra a continuación.

Archivo: controllers/categorias_controller.php

<?php
class CategoriasController extends ScaffoldController
{
    public $model = 'Categorias';

    public function index($page=1)
    {
        $this->data = (new Categorias)->getCategorias($page);
    }
 
}

Continue reading “ScaffoldController: Modificando comportamientos y contenidos”

Preguntas resueltas en Slack 2

Read More

En estas semanas las dudas que hemos resuelto han sido bastante específicas y la mayoría no eran aptas para ser incluidas en este artículo, por ello he tardado más en reunir el material suficiente para realizar un nuevo post.

A pesar de lo anterior, el texto está listo y ha quedado bastante jugoso, así que no los haré esperar más y los dejaré con el compendio de  preguntas resueltas:

¿Cómo hacer un confirm alert? Pregunta ycaicedo

Este ejemplo es con javascript usando el helper Html::link() o Html::linkAction() que permite mostrar primero un diálogo de confirmación al usuario, aunque es fácil de saltar, por ejemplo si el usuario desactiva javascript en el navegador:

<?= Html::linkAction("borrar/$item->id", 'Borrar', 'onclick="return confirm(\'¿Está seguro?\')"') ?>

¿KumbiaPHP soporta CamelCase en el nombre de tablas? Pregunta abriceno

Con el atributo $source de la clase ActiveRecord se le puede indicar a que tabla consultar, pero el desarrollador debe acordarse de hacer el cambio.Ejemplo:


<?php

class MateriaPrima extends ActiveRecord {

    //Tabla utilizada para realizar el mapeo
    protected $source = 'MateriaPrima';
}

¿Cómo le inserto una clase a un select generado con Form::dbSelect()? Pregunta jerson.fuentes

El helper Form::dbSelect() tiene los siguientes argumentos:

Form::dbSelect(campo_id, campoAMostrar,array(modelo,metodo),"Seleccione",atributos)

Ejemplo:


Form::dbSelect("lotes.lotes_categorias_id","nombrecategoria",null,"Seleccione",'class="form-control"');

Saben como después de actualizar un dato, redirigirme a la vista anterior

Para redireccionar en KumbiaPHP existe la clase Redirect

Ejemplo de uso de REdirect::to()
Ejemplo de uso de REdirect::to()

La redirección se puede hacer con Redirect::to() antecedido con un return para que sea lo último que ejecute.

Recomendaciones de joanhey

Mitos sobre el rendimiento de PHP

Busted! 10 Performance Myths you should avoid. Es una presentación muy recomendable de Thomas Lohner de SysEleven GmbH que en 2015 en una charla menciona los 10 mitos sobre mejorar el rendimiento que se deben evitar.

Lo más importante es usar bien las herramientas.

HTTPie un buen sustituto de Curl

HTTPie es una app que funciona en Linux, MacOs y Windows. Es muy útil como sustituto de Curl.

Nos permite fácilmente probar nuestros servidores, API RESTful y web services.

Preguntas resueltas en Slack 1

Read More

¡Hola Kumbieros!

Como algunos sabrán, va en aumento las personas que nos empiezan a contactar a través del chat de KumbiaPHP en Slack. Donde de manera voluntaria y altruista Kumbieros con más experiencia dedicando algo de su tiempo ayudan a novatos y no tan novatos a resolver sus dudas sobre el framework y otros menesteres propios del diseño e implementación de software. Si aun no has ingresado puedes pedir tu ingreso en esta dirección: http://slack.kumbiaphp.com/

Slack es muy bueno para dar soporte, pero con el transcurrir del tiempo los mensajes se van perdiendo y se escurre por el desagüe ese gran contenido que nos podría ayudar a todos. Por eso hemos decidido crear esta sección para mantener de manera permanente y pública esta valiosa información. Sin más introducción les dejo la siguiente colección de preguntas y respuestas:

¿Cómo hacer enlaces en KumbiaPHP que registre en donde estoy o mejor dicho el enlace activo?

Pregunta jerson.fuentes
Pregunta relacionada de josher1601

¿De alguna forma se puede obtener el controlador que estoy viendo y la acción?

En el controlador y la vista disponemos de variables para obtener está información:
$module_name;
$controller_name;
$action_name;

Ejemplo de uso en un controlador:


<?php
class AppController extends Controller
{
  final protected function initialize()
  {
    Flash::info("El módulo es $this->module_name"); //Si hay módulo retorna el nombre del módulo
    Flash::info("El controlador es $this->controller_name"); //Retorna el nombre del controlador
    Flash::info("La acción es $this->action_name");  //Retorna el nombre de la acción
  }

  final protected function finalize()
  {
  }
}

Ejemplo de uso en una vista:

Usted está en el controlador <?= $controller_name ?> y la acción <?= $action_name ?>

 

¿Para que funcione Flass::success() había que activar algo?

Pregunta marcelok. Pregunta relacionada de yecaicedo:

Acabé de realizar un CRUD sencillo pero cuando guarda no me muestra el Flash::valid()

Para mostrar los mensajes Flash y solo si hay redirección de URL (usando por ejemplo Redirect::to()) se debe poner antes de ninguna salida, la función session_start() con ponerlo en el controlador que lo necesita es suficiente.

¿Cuando realizo el save() hay algún método que retorne el last_insert_id? Pregunta xavi92

Si haces un save() el objeto ya tiene el valor en el campo id

Ejemplo:


<?php

//Si guarda correctamente
if($album->save()){
  $album->id; //Retorna el id con el cual ha sido guardado
}

¿En Skeleton puedo usar al 100% el ancho de la pantalla? Leí que el grid tiene un ancho de 960px Pregunta marcelok

Es igual para todos los frameworks css, los row siempre son fluidos, si no se usa container será del máximo siempre, si se usa container el máximo será 960 que se puede cambiar si se quiere. Hay que tener cuidado con usar el máximo de la pantalla ya que hay pantallas muy anchas y por usabilidad esto podría ser un fallo.

¿Me gustaría saber utilizar librerías propias? Hace tiempo utilicé la de Captchar… Pero si son algo mas complejas no tengo idea. Pregunta viclomu

La idea general es la siguiente. Van en la carpeta vendor si es para PSR0 y PSR4 lib, las que no lo son cada una tiene una forma, lo mejor es crear un fichero php en libs y poner la carpeta dentro de libs con la librería. Si la librería es un fichero solo en libs. Si es mas completa va en una carpeta y un fichero nombre_clase.php que tendrá que llamar a lo que necesite, algunas traen autoload otras has de llamar al fichero principal, hay que hacerle un puente en los casos necesarios ya que no hay una forma única.

Tip para usuarios de Atom:

Se puede lanzar fácilmente un servidor de PHP con el siguiente paquete: https://atom.io/packages/php-server recuerda lanzarlo desde la carpeta public como muestra la siguiente imagen:

Esto ha sido parte de todo lo que se aprende en Slack y los Kumbieros ¡Hasta la próxima!