Cuando sacaron la actualización de Woocommerce a la versión 2.0, oí muchas críticas y quejas, y he decidido que lo mejor es que explique qué ocurrió. Como bien nos explican en este artículo en inglés, el problema fue no respetar la compatibilidad hacia atrás (sus razones tenían, pero fue algo doloroso para la comunidad de usuarios), unido a que los usuarios de WordPress están muy mal acostumbrados (porque todo suele ir bien, claro), e instalan las actualizaciones sin testear previamente en una plataforma aparte. Y ahí llegó el problema: muchos carritos y tiendas dejaron de vender.

Así que, como moraleja: antes de actualizar una plataforma en producción, instalen las actualizaciones en una plataforma aparte, que sea exactamente igual a la de producción, testeen, y cuando estén seguros de que todo funciona, hagan una copia de seguridad de la plataforma y la BD antes de actualizar. Mas vale tardar 6 horas en actualizar, que 6 días en echar a andar de nuevo una plataforma.

Más
Scheduled task failed: Forum mailings and maintenance jobs (mod_forum\task\cron_task), DESCRIPCION ERROR DEVUELTO

Cuando en un Moodle tengamos foros y aparentemente no salgan sus correos a los usuarios, podemos chequear su funcionamiento abriendo una conexión por terminal y ejecutando el siguiente comando:

/usr/bin/php /var/www/dominio.com/web/moodle/admin/tool/task/cli/schedule_task.php --execute=\\mod_forum\\task\\cron_task

Al ejecutarlo, si está todo correcto y no hay nada en cola, saldrá algo así:

/usr/bin/php /var/www/dominio.com/web/moodle/admin/tool/task/cli/schedule_task.php --execute=\\mod_forum\\task\\cron_task
Execute scheduled task: Correos del foro y trabajos de mantenimiento (mod_forum\task\cron_task)
Starting digest processing...
Cleaned old digest records
... used 5 dbqueries
... used 0.1097948551178 seconds
Scheduled task complete: Correos del foro y trabajos de mantenimiento (mod_forum\task\cron_task)

Y si por el contrario, hay alguna petición en cola, saldrá así:

/usr/bin/php /var/www/dominio.com/web/moodle/admin/tool/task/cli/schedule_task.php --execute=\\mod_forum\\task\\cron_task
Execute scheduled task: Correos del foro y trabajos de mantenimiento (mod_forum\task\cron_task)
Processing user 8
Processing user 4
Sending post 149: Re: nuevo tema de discusión
1 users were sent post 149, 'Re: nuevo tema de discusión'
Starting digest processing...
Cleaned old digest records
... used 37 dbqueries
... used 1.0255489349365 seconds
Scheduled task complete: Correos del foro y trabajos de mantenimiento (mod_forum\task\cron_task)

Si hay algún problema, el mensaje sería el siguiente:

Scheduled task failed: Forum mailings and maintenance jobs (mod_forum\task\cron_task), DESCRIPCION ERROR

Según el error devuelto, tendremos que arreglar permisos, o corregir la ruta de PHP etc.

Más

Cuando en Magento estamos trabajando con listados de productos en categorías y activamos el atributo «isAnchor» en la categoría para que salga el buscador por atributos, el list.phtml que muestra el listado no es el que tiene la plantilla en
plantilla-que-estamos-usando/template/catalog/product/list.phtml,
sino el que se encuentra en la carpeta
base/template/catalin_seo/catalog/list.phtml.

Entonces, para personalizar esta plantilla, copiaremos el contenido de catalin_seo a la carpeta de nuestra plantilla, y modificaremos ese archivo.

Más

En este artículo veremos qué componentes tiene Docker.

  • El motor de Docker, compuesto por el cliente y el servidor Docker.
  • Las imágenes de Docker
  • Los registros
  • Los contenedores

El motor de Docker

Básicamente, Docker es una aplicación cliente-servidor, y pueden trabajar ambos en la misma máquina, o en distintos servidores. Además, también existe una API REST para comunicarse con la parte servidor de Docker, aparte de la aplicación cliente, con lo que no tendremos problema alguno para trabajar con Docker.

Imágenes

Las imágenes de Docker es el código fuente de nuestros contenedores, es una colección ordenada de comandos y parámetros para ejecutarlos en el momento de arrancar el contenedor, para, por ejemplo, abrir con puerto, o ejecutar un comando.

Registros

Las imágenes que se crean, se guardan en registros, y existen dos tipos: públicos y privados, como podeis ver en la misma web de Docker.

Contenedores

Es el proceso o conjunto de procesos que se lanzan desde una imagen. Un contenedor puede ser creado, inicializado, parado, vuelto a ejecutar y destruido, a diferencia del resto de componentes de Docker.

containersLos contenedores reciben este nombre porque recuerdan a los contenedores que se utilizan en el transporte (todos hemos visto los contenedores de transporte marítimo, ¿verdad?). Así, podemos hacer un contenedor con una base de datos, una web, o cualquier otro servicio que pensemos, y podemos llevarlo de un sitio (servidor) a otro, sin problemas. De esta manera, el desarrollador enviará su imagen al departamento de testeo, o de puesta en producción desde su máquina local, sin que se pierda nada por el camino, a la par que todos los actores implicados en un desarrollo se aseguran de tener el mismo entorno en cada momento.

Más

Si tenemos un WordPress y estamos trabajando con JQuery, puede que no se ejecute debido al siguiente error:

TypeError: $ is not a function WordPress

Para solucionar esto, simplemente envolveremos nuestro código JQuery con

jQuery (document).ready(function($){
        // Nuestro código JQuery irá aquí y se ejecutará sin problema
});

¿Por qué ocurre esto?. Sencillo, estamos ejecutando JQuery en modo «noConflicto»

jQuery.noConflict();

por lo que la notación $ no la reconoce, así que necesitamos envolver nuestra función de forma que pueda ejecutarse correctamente.

Más

A veces sucede que cuando se instala un plugin en MAgento, o lo desinstalamos, o actualizamos la plataforma de alguna forma, la parte del front se ve perfectamente y funciona todo, pero al intentar entrar en el backend, no podemos acceder al mismo.

Nos ponemos un poco nerviosos, porque aunque no es la pantalla de mantenimiento, no podemos acceder al backend de nuestro comercio electrónico. Si después de hacer lo que te recomiendan en foros y webs, que suele ser «borrar el contenido del directorio de var/cache de Magento», «borrar el contenido del directorio var/sessions de Magento» y ver que sigue igual, y después de poner el código correspondiente al modo desarrollador:

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
    Mage::setIsDeveloperMode(true);
}

error_reporting(E_ALL);
ini_set('display_errors', 1);

umask(0);

y comprobar que seguimos sin ver nada, ni en los archivos de log propios de Apache ni en los de var/log y var/reports de Magento, y tampoco has conseguido ver qué ocurre al desactivar la compilación, es que ha llegado el momento de utilizar este código, que devolverá qué clase es la que da el error, y por lo tanto, nos dará pistas de qué está ocurriendo (por ejemplo, que no se ha instalado / desintalado el plugin correctamente, o que la instalación ha encontrado algún problema a la hora de volcar todos los archivos de la actualización, y alguno no lo ha hecho, o se ha corrompido algún archivo, etc).

ini_set('error_reporting', E_ERROR);
register_shutdown_function("fatal_handler");
function fatal_handler() {
    $error = error_get_last();
    echo("<pre>");
    print_r($error);
}
Más

Empezamos una serie de artículos hoy en la que explicamos qué es un contenedor Docker, para qué sirve, cómo lo usaremos y por qué vamos a trabajar con él.

El contenedor Docker es una tecnología que nos permite empaquetar y desplegar las aplicaciones que desarrollemos de una forma eficaz, rápida, eficiente y segura. ¿Cómo lo hace posible? Vamos a verlo.
Las aplicaciones que desarrollamos normalmente necesitan bibliotecas y dependencias que no siempre nos llevamos de un servidor a otro. Docker empaqueta aplicación, dependencias y bibliotecas, para poder llevarnos todo de un servidor a otro. Gracias a Docker, ya no oiremos más «en mi local funciona» mientras vemos que en producción la aplicación no va.

Por otra parte, con contenedores de Docker utilizamos menos recursos porque no nos llevamos el sistema operativo completo, sólo lo necesario para la aplicación desarrollada, por lo que es más eficiente que una VM. Eso sí, debemos tener en cuenta que cada VM emula el hardware que necesita, cosa que no pueden hacer los contenedores Docker. Tenemos que tener en cuenta esta característica, ya que los contenedores sólo proporcionan un entorno de ejecución correcto para la aplicación. Por otra parte, como un contenedor no lleva todo el sistema operativo consigo, podemos tener varios contenedores en un mismo servidor, y además, ¡compartiendo todas mismo kernel!.

Por lo tanto, los contenedores están aislados, aunque comparten sistema operativo, kernel, y si corresponden, los mismos binarios y bibliotecas.

Y aquí dejamos la primera píldora sobre contenedores Docker. En unos días, más.

Más

Logo-DockerEn desarrollo, estamos acostumbrados a que el despliegue de una aplicación en producción sea un dolor de muelas, y no nos gusta llegar al momento «paso a producción», por la de posibles errores de última hora que nos encontramos. ¿Cuántas veces nos hemos encontrado que el desarrollo realizado en un servidor y entorno determinado, no funciona en otro? ¿Cuántas veces hemos dicho la temida frase «en mi local (o servidor) funciona»?. Solucionar este tipo de problemas siempre ha sido un añadido en todo proyecto que nunca se sabe calcular, hasta ahora, ya que gracias a herramientas como Docker, podemos realizar despliegues de desarrollos independientemente del entorno en el que se despliegan. ¿Cómo logramos hacerlo? ¿Realmente interesa trabajar con una herramienta como Docker? Para explicarlo, vamos a publicar unas entradas, en las que iremos viendo qué es y para qué sirve, y cómo funciona Docker. ¡Esperamos que os gusten!

Más

A veces puede ocurrirte que tu cámara integrada de tu MacBook Pro no funcione, y el sistema te diga que no reconoce ninguna cámara en tu equipo. No te desesperes en ese caso, abre una ventana de Terminal y escribe

sudo killall VDCAssistant

Te pedirá tu contraseña de usuario administrador del equipo, se la escribes, y volverás a tener tu cámara disponible.

Más

Puede que al configurar vuestro servidor Ubuntu 14.04 os hayáis encontrado con un mensaje como este al reiniciar Apache.Error al reiniciar Apache

 

No dejéis que la línea final, «The Apache error log may have more information», os despiste. El log de error de Apache probablemente no tenga información útil sobre el «incidente», puesto que el servicio no está activo debido a este error. Si editamos el archivo (000-ispconfig.vhost) y la línea (17) indicada en el error sintáctico, nos encontraremos con algo parecido a esto (no tiene por qué ser igual):

 Options Indexes FollowSymLinks MultiViews +ExecCGI

Lo que nos viene a decir el error es que todos los elementos que siguen a «Options» deben llevar un signo +  -, o bien (la otra opción) es que ninguno lo lleve. Puede que comparéis esta línea con la de otras configuraciones y os llevéis la sorpresa de que no da problemas siendo exactamente igual.

Esto se debe a la versión de Apache que se esté utilizando. Esta sintaxis sería perfectamente válida en Apache 2.2.22, por ejemplo, pero daría este error a partir de la versión 2.4.

La solución es sencilla: Hacer lo que nos dicen: Si tenemos alguna opción con signo, entonces todas deben llevarlo. O bien, que ninguna lleve signo. No vamos a entrar en detalle sobre dónde colocar los + y los -, pues eso va más allá de nuestro objetivo en esta nota. Simplemente reseñar que con eliminar el signo + que precede a ExecCGI, el error desaparecería, pero si queremos dejar la configuración tal y como está, lo correcto sería quitar todas las opciones que no llevan signo, pues al no llevarlo es como si no estuvieran. De este modo, dicha línea quedaría como Options +ExecCGI.

Más

En Esencial Sistemas siempre estamos evaluando soluciones y desarrollos con el fin de darle a nuestros clientes la mejor opción del mercado acorde con sus necesidades. Y debido a ello, hemos empezado a colaborar con Facturascripts, ya que creemos que se trata de la mejor opción actualmente que existe en el mercado del open source para la gestión de facturación y contabilidad de una empresa, y está desarrollado con plantillas responsive, que permiten ver en cualquier dispositivo la información en cada momento. Os recomendamos que visitéis su DEMO para que salgáis de dudas, ya que es totalmente funcional.

Más

A veces, en Magento ocurre que generar un listado de productos en stock en el front es un dolor de muelas, así que aquí os dejo el código que tenéis que meter en el archivo .phtml para filtrar por stock y obtener aquellos productos que tengan stock mayor que 0 (o la cantidad que especifiquéis):

$productCollection = Mage::getModel('catalog/product')
     ->getCollection()
     ->addAttributeToSelect('*')
     ->joinField('qty',
                 'cataloginventory/stock_item',
                 'qty',
                 'product_id=entity_id')
     ->addAttributeToFilter('qty', array("gt" => 0));

foreach($productCollection as $product) { 
      if($product->getQty()>0)
        echo $product->getName() . " | " . $product->getQty() . " | " . $product->getSku() . "
"; }
Más

Esta minientrada servirá para ayudaros a resolver un problema como el que tuvimos recientemente con una instalación de un módulo en un Magento. A pesar de seguir las instrucciones al pie de la letra al instalar (volcar carpetas y archivos, limpiar cachés, desactivarlas, activarlas…), nos daba un error 500 al activarlo, así que dimos estos pasos para encontrar el error y solucionarlo fácilmente:

Primero nos metimos por ssh al servidor, y fuimos al directorio de logs del apache (distinto del log de Magento). Allí hicimos un tail -f al archivo de error, y nos devolvió el error:

PHP Fatal error:  Class ‘empresa_modulo_Model_Mysql4_Setup’ not found in includes/src/Mage_Core_Model_Resource_Setup.php on line 234

Como no podíamos tener la web con un error 500 mientras realizábamos la búsqueda, borramos el archivo XML que está en app/etc/modules que activa al módulo, y empezamos a investigar. Como las soluciones que proponían en Internet no nos surtían efecto, decidimos borrar los archivos antiguos (más de 4 horas) de sesiones de var/sessions/, activamos de nuevo el plugin, y todo funcionó a la primera.

Espero que os sirva de ayuda.

Más

Cuando realizamos una web, es conveniente no tener las imágenes en servidores de terceros, sino en nuestros propios servidores, o en un CDN. ¿Cómo descargamos las imágenes de otro servidor?

Podemos hacerlo de varias formas:

$url = "http://www.dominio.inicial/imagen.png";
$dir = "/var/www/directorio/fisico/en/nuestro/server/local/";

$archivoInicial = fopen($url, "r");
$archivoFinal   = fopen($dir . basename($url), "w");

while(!feof($url)) 
    fwrite($archivoFinal, fread($archivoInicial, 1), 1);

fclose($archivoFinal);
fclose($archivoInicial);

O:

$imagen = file_get_contents("http://www.dominio.es/imagen.png");
$save = file_put_contents('/var/www/directorio/servidor/destino/imagen.png',$imagen);

Y la más eficiente de todas, si tenemos que descargar muchas imágenes, es hacerlo con cURL:

$url = "http://www.dominio.com/imagen.png";
$dir = "/var/www/directorio/local/";
$archivoFinal = fopen($dir . basename($url), "w");

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Googlebot/2.1 (+http://www.google.com/bot.html)');
curl_setopt($ch, CURLOPT_FILE, $archivoFinal);

fclose($archivoFinal);
curl_close($ch);

 

Más

Cuando, después de una actualización vía código de los productos y/o sus categorías y atributos, necesitamos reindexar de nuevo las tablas implicadas en el proceso, podemos hacer:

$coleccion = Mage::getModel('index/process')->getCollection();
foreach ($coleccion as $indice) {
    $indice->reindexAll();
}

para reindexar todas las tablas, o bien, si sólo necesitamos reindexar un conjunto determinado de tablas, podemos hacer:

$proceso = Mage::getModel('index/indexer')->getProcessByCode('xxx');
$proceso->reindexAll();

/* donde xxx puede ser
catalog_product_attribute     Productos: Atributos
catalog_product_price         Productos: Precios
catalog_url                   Catalogo: reescritura de URLs 
catalog_product_flat          Productos: Flat Data
catalog_category_flat         Categorías: Flat Data
catalog_category_product      Categorías: Productos de una categoría
catalogsearch_fulltext        Catalogo: Indexación de búsquedas
cataloginventory_stock        Estado de Stock
tag_summary                   Productos: Etiquetas
targetrule                    Reglas 
*/

 

Más
Esta web utiliza cookies propias para su correcto funcionamiento. Puede consultar nuestra política de cookies, política de privacidad y aviso legal. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información    Configurar y más información
Privacidad