PHP es el lenguaje de programación de mayor aceptación entre las aplicaciones web. La gran mayoría de los CMS orientados al mundo de la web están desarrollados sobre PHP.
Preparado para correr sobre un servidor web, aunque en mucha menor medida también se puede utilizar en entorno de terminal. Tiene una curva de aprendizaje muy baja, es muy permisivo con los errores, es interpretado, no compilado y orientado a objetos, entre otras cosas.
Aunque sea un lenguaje muy aceptado por los principiantes, es muy atacado por muchos experimientados en la programación. No obstante es uno de mis lenguajes preferidos. Y sobre todo, al desarrollar para la web, siendo prácticos, es una de las primeras y mejores soluciones balanceando entre el conjunto de lenguajes disponibles.
En una reunión en un café con unos colegas de trabajo estábamos hablando de CMSs, citando Magento, llegaron algunas preguntas como: ¿qué tiene Magento de especial? Pues una de las peculiaridades que le dan una gran potencia a Magento es la gestión de tareas programadas.
Magento nos obliga a disponer de un servidor en el que podamos configurar un programa, en este caso el cron de Magento, para que se ejecute cada x tiempo. Yo lo estoy instalando para que se ejecute a cada minuto. Este programa interno de Magento se llama cron igual que en Linux tenemos también el cron. Es el programador de tareas, no es el Crom de Conan el bárbaro que me comentaba un compañero de trabajo xDD
En las últimas versiones se ha pasado incluso el envío de emails transaccionales como tarea programada. Es decir, los emails transaccionales se envían a una cola de envío de emails y en la siguiente ejecución del cron se envían los que haya encolados. Estas tareas llevan un seguimiento, registro, etc.. A cada ejecución del cron de Magento le llamamos los desarrolladores heart beat en inglés, que significa el latir del corazón. Es decir, que Magento tiene un corazón, que late, y en cada latido puede que haga muchas cosas.. qué freak que suena esto, pero así es..
Hola de nuevo. Esta semana he seguido avanzando sobre todo esto de Magento. Creando unos trabajos de cron, después de haber probado las tareas cron a ejecutar mediante scripts externos a Magento. Me he encontrado con que las fechas no me funcionaban como yo esperaba dando malos resultados.
Probando probando, llegué a la conclusión de que tratando las fechas mediante cadenas de caracteres podía aplicarles las modificaciones que necesitaba.
La primera tarea que debemos abordar a la hora de comenzar a programar dentro de Magento es la creación de un módulo. Es muy práctico y sencillo atacar a los componentes de Magento desde simples scripts que importan el autocargador y así poder trabajar con los datos. Pero tarde o temprano necesitaremos integrarlo todo dentro de Magento y así quedará más limpio. Podremos modificar el comportamiento de Magento desde dentro, aumentando sus funcionalidades si es que lo necesitamos.
PHP 5.5 dejó de tener soporte en enero del 2016, las actualizaciones de seguridad acaban de dejarse en junio de 2016. Así que a partir de ahora julio del 2016 deberíamos mínimo de tener PHP 5.6 en cualquier servidor para mantenernos al día por lo menos en los parches de seguridad.
Todavía en Ubuntu 14.04 LTS tendrá soporte hasta el próximo 2019. Desde su lanzamiento en 2014, serán 5 años de Long Time Support (LTS). Los ciclos de vida de las librerías incluídas son otra cosa. Aunque se puede pensar que dado el fin del soporte de seguridad para PHP 5.5 se debería de traer ya de casa PHP 5.6 en Ubuntu 14.04. Pero sería forzar a los usuarios a migrar sus aplicaciones a la nueva versión y si hubiera alguna incompatibilidad sería forzar a compatilibilizarlo, algo que puede ser bastante complejo dependiendo de cada aplicación.
¡Hola de nuevo! Cada loco con su tema, así que yo sigo escudriñando cada día más las entrañas de Magento. Mientras voy compartiendo mis pequeños pinitos en el tema. Ahora traigo un pequeño HOWTO, un pequeño tutorial para recorrer los websites, stores y store views que tengamos en nuestro Magento.
Dentro de un Magento podemos tener varios sitios web, cada uno con su nombre de dominio. A su vez, dentro de cada website podemos tener varias tiendas, con su catálogo raíz de productos. Y a su vez también podemos tener dentro de cada tienda sus vistas de tienda, que normalmente se usan para traducir dichas tiendas.
Es decir, dentro de un mismo Magento, con un mismo panel de control, podemos tener varios dominios con distintos productos, distintas plantillas, distintas configuraciones, etcétera. Es algo que nunca había visto en ningún CMS y llevarlo hasta el extremo de que cada website, store o store view puede tener muchas de sus configuraciones independientes. Lo que quiero decir es que Magento es muy flexible lo mires por donde lo mires. Poder tener todos los productos, las ventas, centralizado en un mismo panel de control es muy práctico.
De gracias recibisteis, dad de gracia.. Compartir es vivir dicen otros.. Es habitual en el mundo del desarrollo del software que se compartan los conocimientos. Los pinitos personales de cada uno en el día a día. Esas cosas que tanto nos han costado alcanzar, tras búsquedas y búsquedas leyendo a compañeros del desarrollo y al final reuniendo toda la información acabas construyendo la solución que necesitas.
No os comparto código del trabajo, ya que seguro que no es tan interesante como este ejemplo general de aquí abajo. Para que construyas el script que necesitas 😉
Creo que nunca dejaré de aprender los entresijo de Magento. Ahora estoy recorriendo los pedidos para obtener informes. Esto está probado sobre un Magento 1.9, no debería de haber muchas diferencias con otras versiones.
Este estupendo CMS orientado a la venta online de productos hace las delicias de los vendedores, de igual modo de los maquetadores, y cómo no, también de los programadores.
Como analista programador llevaba ya un tiempo queriendo meterle mano a las entrañas de Magento. Así que poco a poco, he ido cogiendo los manuales para el usuario, luego el del diseñador, y ahora tengo entre manos el del programador. Ahora según van surgiendo las necesidades voy haciendo incursiones cada vez más a fondo en el código fuente de esta humongous web application.
La verdad es que lo estoy disfrutando porque Magento está desarrollado con una buena estructura y sobre un gran framework de desarrollo PHP, el Zend Framework. Incorporando técnicas de programación que le dan una gran flexibilidad sin añadir demasiada complejidad.
Este es otro pequeño how to para hacer una tarea rutinaria. Simplemente, como indica el título de la entrada, se hace lo que dice, en este caso mediante PHP. Esta tarea se puede programar en línea de comandos para ejecutarse todos los días. Es algo habitualmente necesario, y ya que PHP es un lenguaje de scripting muy sencillo y a la par potente, vamos a ver cómo hacer esto sin complejos sistemas intermedios.
Para este manual se usa Linux, y se ha probado sobre Ubuntu 14.
De todos las soluciones de tienda online que he conocido hasta la fecha, Magento es de lo más robusto y potente que he visto de código abierto. Estoy conociendo poco a poco los entresijos de Magento 1 en el trabajo, y es buen momento de ver las mejoras que trae Magento 2 y así cotejar.
Es un sistema de información dedicado a la venta robusto, flexible y muy personalizable. Alrededor de Magento se mueve todo un ecosistema de soluciones empresariales de la más alta gama. Todo esto es posible gracias a las características de Magento.
Para explicar todo lo que tiene Magento necesitamos mucho tiempo, terminaríamos antes buscando qué no tiene. Pero también encontrar qué no tiene va a ser difícil porque Magento es todo un referente mundial de las soluciones eCommerce existentes.
Un poco de historia
Nació como proyecto de código abierto en el 2007. Ya en el 2008 fue premiado como mejor nuevo proyecto de código abierto del año. En el año 2009 la empresa Varien lanzó la versión Enterprise con el modelo de negocio de suscripción anual. Ahora mismo es propiedad de Ebay, la cual es propietaria del 100% de la empresa.
Lanzaron también una versión Profesional, pero no debe de haber tenido mucho éxito esta segmentación porque ahora mismo sólo disponemos de la Community Edition y la Enterprise Edition.
Requisitos para la instalación
Se necesita de una buena máquina para correr Magento, por lo menos se recomiendan 2 Gigas de RAM y échale CPUs que cuantos
más mejor. Yo le he puesto una máquina virtual con Vagrant de 4 Gigas de RAM y 2 CPUs. Se ha dejado instalar después de preparar un poco el servidor sin demasiadas configuraciones.
Instalando
Haciendo unas pruebas jugueteando con Vagrant, me ha quedado un script bien sencillo. Ejecutando lo siguiente tenemos automatizada la instalación de todo lo necesario en un servidor Linux para poder instalar Magento 2. Dejo aquí el script para Ubuntu Server con todo en el mismo servidor, Apache y MySQL:
sudo sed -i «s/bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/» ${mysql_config_file}
# Permitir acceso como root desde cualquier host echo «GRANT ALL PRIVILEGES ON *.* TO ‘root’@’%’ IDENTIFIED BY ‘root’ WITH GRANT OPTION» | mysql -u root –password=root echo «GRANT PROXY ON »@» TO ‘root’@’%’ WITH GRANT OPTION» | mysql -u root –password=root
sudo service mysql restart
echo «CREATE DATABASE magento2» | mysql -u root –password=root
Hay quien preferiría Nginx porque en sus inicios ejecutaba en multiples hilos de ejecución las peticiones HTTP, es ligero y sencillo. Ha llovido mucho desde que Nginx era el servidor más rápido del mercado con creces, viendo las últimas estadísticas comparativas entre Apache2 y Nginx más o menos van a la par en la fecha en que les escribo. No es objetivo hacer una comparativa Nginx-Apache en esta entrada así que lo dejaremos para otro momento si cabe.
A partir de aquí ya tenemos el servidor web Apache configurado con PHP, y una base de datos MySQL con la base de datos magento2 ya creada que usaremos para instalar nuestro nuevo Magento. También tenemos instalado globalmente en el sistema Composer, que cuando recién descomprimamos el nuevo magento y vayamos a instalar nos va a pedir que instalemos todas las librerías de PHP.
Tras esto podemos ver conectándonos a la base de datos que partimos de las no pocas 308 tablas, para empezar. Esto nos da una idea de la magnitud del programa que tenemos entre manos ¿cierto?
Las tareas cron, cachés..
El cron del sistema es el programador de tareas. Cuando recién hemos hecho la instalación, el panel de control nos notificará que instalemos las tareas automáticas para que funcione Magento o que las lancemos manualmente.
Esto hace necesario que tengamos acceso como root, como administradores del sistema, para que podamos configurar estas tareas en el servidor. No podemos instalar Magento en cualquier alojamiento web. O mejor dicho, sí que podemos, pero el funcionamiento va a ser una castaña si no hacemos los ajustes necesarios.
Otro tema que hace necesario un host con acceso como root son las cachés. En un sistema web tenemos caché de base de datos, compilación a bytecodes de PHP, generación de páginas HTML a partir de vistas. Y el gran Varnish, otro elemento a instalar y configurar para sacar el máximo partido a las prestaciones de nuestro servidor, aunque no es imprescindible tenerlo (al contrario de lo que dicen muchos administradores de sistemas). Evitar Varnish si no es necesario, como escuché a un experto en Magento en el último Meet Magento en España, nos puede aliviar las configuraciones ya que a veces este proxy inverso se mete en medio necesitando de más y más configuraciones a medida que instalamos extensiones o personalizamos nuestro Magento.
El sistema de cifrado SSL
En el script de instalación se crea un certificado autofirmado y se guarda en /etc/ssl/. A fecha de hoy ya queda poco para poder crear nuestros propios certificados 100% funcionales, para el entorno de producción o desarrollo, tantos como queramos, con Letsencrypt, pero mientras este sistema nos servirá.
Es de buena costumbre poner el cifrado en la zona de administración (back-end) y en el front-end. Para ello tenemos que configurar las URL base seguras y no seguras poniéndole el https delante. Por defecto se cifrará toda la navegación desde el momento en que haya datos personales de los usuarios. En el back-end se cifrará en todo momento.
Si vas a instalarlo en producción asegúrate de que esté todo funcionando antes de activar SSL en todo el sitio. Tener SSL mejorará el posicionamiento del sitio en los buscadores, pero me ha pasado que una extensión te fastidie todo porque no funcione correctamente, así que más vale probar y probar antes de dejarlo activado definitivamente. Aquí dejo la información para el que le sirva 😉
Características principales
Las bondades de Magento son una larga lista de características así que de entre las principales tenemos:
Multi-sitio web (varios dominios), multi-almacén y multi-vista de almacén, todo con un mismo panel de administración.
Multi-idioma, con packs de idiomas disponibles para instalar como extensiones.
Gestión total del catálogo; categorías y productos.
Gestión muy potente de atributos de productos.
Filtrado de productos para mejorar la navegación basado en atributos y características muy avanzado.
Integración con pasarelas de pago para poder instalar como extensiones.
Registro detallado que nos informa del estado actual con todo lujo de detalles: últimas ventas, ingresos, productos más vendidos..
Gestión de datos de clientes, registro, modificación.
Gestión de los usuarios que acceden al panel de administración.
Herramientas de marketing como emails transaccionales configurables, reglas de precios de catálogo o de carrito, herramientas SEO integradas.
Gestión de promociones basadas en características de productos o de carritos de la compra. Se pueden utilizar atributos personalizados para las reglas de promociones.
Temas para instalar; sistemas de páginas estáticas, bloques y widgets para personalizar.
También tenemos inteligencia de negocio con muchos informes detallados listos para ver en tiempo real.
Un sistema de gestión de índices y caché.
Muchas extensiones para personalizar nuestro Magento en su marketplace.
Por supuesto, acceso para interconectar con otros sistemas mediante punto de entrada a una API.
Magento es enorme, parece el SAP de las soluciones eCommerce Open Source. Soy sincero, no conozco SAP en sus entrañas, pero ya sólo ver que tenemos 300 tablas para guardar los datos necesarios para funcionar me hice una idea. Entrar a detallar las características de cada zona de su panel de administración es una tarea interminable así que será mejor ir directamente a su funcionamiento, empaparse de su documentación, o ir buscando lo que necesites. Recomiendo dar una lectura rápida a las guías de usuario disponibles en su página oficial.
Terminando
Lo que destaca de esta solución eCommerce es su robustez y fiabilidad. Estoy viendo muchas mejoras en la versión 2 con respecto a la 1: aumento de velocidad, sistema totalmente cacheado, compatible con HHVM.. Destaca la integración de la herramienta de consola de Symfony. Tenemos disponible la integración con Odoo mediante la instalación de una extensión en Magento, se abre el acceso al Webservice, e instalando los módulos correspondientes en Odoo podremos sincronizar catálogo, stocks, clientes, pedidos, carros abandonados, etc.. esto último está disponible hasta para la versión 1.9, espero que pronto esté también para Magento 2 😉
Al instalar los códigos me sorprendió que me pidiera ejecutar un ‘composer install’ para comenzar a correr la aplicación. Composer es una herramienta que organiza las librerías PHP, algo que venía haciendo falta. Es una herramienta PHP muy nueva, que están usando frameworks de desarrollo de la talla de Symfony o Laravel. Esto me hace preveer que el código fuente de Magento 2 puede incorporar pronto muchas nuevas mejoras del mundo PHP. Estaremos atentos.
Si has estado probando soluciones como Virtuemart, WooCommerce o Prestashop. Esta solución de código libre es más que interesante. Habrá que valorar qué es lo que necesitas para tu caso, pero lo que si puedo asegurar es que Magento es una gran solución.
El único inconveniente que le veo es que, por lo menos aquí en Spain donde resido, hay muy pocos desarrolladores especializados en Magento. Así que toma el dato, si quieres asegurarte el trabajo, aprende a desarrollar para Magento y no te faltará el trabajo.
Sigo repasando las nuevas formas de programar que traen las últimas versiones de PHP. Así siguiendo un poco con la reutilización de código llego a los traits, que son una forma muy sencilla de tener funciones o variables en un sitio que luego puedo reutilizar fácilmente.
Desde PHP 5.4 que tenemos ésto disponible así que…
Venga, vamos con el ejemplo:
<?php
trait MiLibreria1 {
public function funcion1() {
echo 'Funcion1 ';
}
public function funcion2() {
echo 'Funcion2 ';
}
}
trait MiLibreria2 {
public function funcion3() {
echo 'Funcion3 ';
}
abstract public function funcion4();
public static $variable1 = 'variable1';
}
class MiTipoDeObjeto {
use MiLibreria1, MiLibreria2;
// debemos implementar ésta función porque es abstracta
public function funcion4(){
echo 'Function4 ';
}
}
$objeto = new MiTipoDeObjeto();
// funciones 'heredadas'
$objeto->funcion1();
$objeto->funcion2();
$objeto->funcion3();
$objeto->funcion4();
// variable estática 'heredada'
echo MiTipoDeObjeto::$variable1;
El código habla por sí sólo, es muy sencillo tener funciones o variables en un trait y luego usarlas dentro de una clase con la palabra reservada use. En éste caso tenemos dos librerías que se usan dentro de una clase.
También podemos hacer funciones y variables privadas, estáticas y abstractas como con las clases normales. De igual manera que las funciones abstractas de clases cuando se heredan a los objetos hijos, éstos deben implementarlas, con los traits ocurren lo mismo. De igual forma que las funciones, variables o métodos estáticos en las clases, también podemos usarlos con traits.
La principal diferencia es que podemos usar tantos traits como queramos en una clase.
Siguiendo con la serie de mini-tutoriales para empezar a programar con PHP, ahora vamos con las interfaces..
Vienen a ser el siguiente paso en la encapsulación de objetos. Primero teníamos las clases que representan objetos únicos, con los cuales podemos construir otros a partir de ellos utilizando la palabra ‘extends’. Luego podíamos declarar clases abstractas que tenían métodos abstractos que no se implementaban (programaban) en la clase padre, sino que se obligaba a que se implementaran en las clases hijas. Las clases hijas extendían de la clase abstracta padre de igual manera que antes.
Ahora tenemos las interfaces, que vienen a ser clases que simplemente nos dicen los métodos que hay que implementar en las clases hijas. Unas interfaces se pueden extender en otras, con lo que heredan las declaraciones de los métodos utilizando la palabra clave extends, pero siguen sin implementar los métodos porque siguen siendo interfaces. Pero cuando llegamos a una clase hija que va a implementar dichos métodos utilizaremos la palabra clave implements. Con un ejemplo se verá claro y rápido.
El ejemplo
<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');
// interfaz que obliga a implementar dos funciones
interface iVehiculo {
public function escribirMatricula();
public function coordenadas();
}
// clase que implementa la interfaz anterior
class vehiculo implements iVehiculo {
public $x=0;
public $y=0;
public $matricula;
public function coordenadas(){
return '(' . $this->x . ', ' . $this->y . ')';
}
public function escribirMatricula() {
return $this->matricula;
}
}
// moto de tipo vehiculo que hereada las variables y funciones anteriores
class moto extends vehiculo {
public $velocidadMaxima;
// funcion que devuelve los datos para escribirlos en la respuesta
public function __toString(){
$cadena = 'Esto es una moto con matrícula ' . $this->escribirMatricula()
. ', con velocidad máxima ' . $this->velocidadMaxima
. ' y coordenadas ' . $this->coordenadas() . '. <br>';
return $cadena;
}
}
// coche que hereda de vehiculo de igual manera que moto
class coche extends vehiculo {
public $tipo;
// igual que en moto, funcion que devuelve los datos para escribirlos en la respuesta
public function __toString(){
$cadena = 'Esto es un coche con matrícula ' . $this->escribirMatricula()
. ', de tipo ' . $this->tipo
. ' y coordenadas ' . $this->coordenadas() . '. <br>';
return $cadena;
}
}
$micoche = new coche();
$mimoto = new moto();
// tanto la moto como el coche tienen matrícula
// porque heredan la variable matrícula
$micoche->matricula = "ABC123";
// sólo es coche tiene tipo
$micoche->tipo = "utilitario";
$mimoto->matricula = "DEF123";
// sólo la moto tiene velocidad máxima
$mimoto->velocidadMaxima = 300;
echo '<html lang="es"><head><meta charset="utf-8"></head><body>';
echo $micoche;
echo $mimoto;
echo '</body></html>';
Si ejecutamos el script anterior debemos ver lo siguiente:
Esto es un coche con matrícula ABC123, de tipo utilitario y coordenadas (0, 0). Esto es una moto con matrícula DEF123, con velocidad máxima 300 y coordenadas (0, 0).
Resumiendo, las interfaces son una forma sencilla de obligar a programar de cierta manera las clases que implementan dicha interfaz. Un dato importante es que una clase puede extender sólo de otra, mientras que puede implementar varias interfaces. A fecha en que escribo no tenemos herencia múltiple en PHP, técnicamente las interfaces no nos dan herencia entre objetos, simplemente nos orientan sobre los métodos o funciones que debemos programar en las clases.
Otro fin de semana, ésta vez con festivos por la semana santa. Tengo algo de tiempo así que voy a continuar con los minitutoriales para aprender sobre éste apasionante lenguaje de programación que tanto se está usando en el desarrollo de páginas web.
Según las últimas estadísticas que he estado viendo, ronda el 80% de las páginas web que estan hechas con PHP. Aparte de otros lenguajes que se usan junto con PHP como JavaScript, o los lenguajes de marcado.
Siguiendo con la construcción de objetos a partir de otros vamos ahora con las clases abstract.
Empezando
En el tutorial anterior veíamos como extender clases creando clases hijas que heredaban las variables y métodos de la clase padre. No teniendo entonces que volver a programar el mismo código.
Una clase abstract es cualquier clase que tenga al menos un elemento abstracto. Éstos elementos abstractos no deben programarse en la clase padre y es obligatorio hacerlo en las clases hijas. Por ejemplo:
<?php
// clase base abstract class vehiculo {
public $matricula;
abstract public function escribirMatricula(); }
// clases que extienden la clase base class moto extends vehiculo {
public $velocidadMaxima;
public function escribirMatricula() { echo $this->matricula; }
}
class coche extends vehiculo {
public $tipo;
public function escribirMatricula() { echo $this->matricula; }
}
class camion extends vehiculo {
public $numeroRuedas;
public function escribirMatricula() { echo $this->matricula; }
}
// creamos 3 vehiculos $micoche = new coche(); $mimoto = new moto(); $micamion = new camion();
// tanto la moto como el coche y el camión tienen matrícula // porque heredan la variable matrícula $micoche->matricula = "ABC123"; $micoche->tipo = "utilitario"; $mimoto->matricula = "DEF123"; $mimoto->velocidadMaxima = 300; $micamion->matricula = "GHI123"; $micamion->numeroRuedas = 12;
No tiene más historia, las clases abstractas lo que hacen es declarar métodos abstractos que no se implementan, y nos obligan a implementarlos en las clases hijas.
Como vienen siendo costumbre de nuevo me remito a la documentación oficial:
..donde puede encontrar mucha más información sobre ésto y ejemplos mucho más elaborados. Espero que con mi mini-ejemplo haya ayudado, sino mensaje aquí abajo 😉