jueves, 19 de enero de 2017

Habilitando Docker Remote API en Ubuntu 14


Para poder habilitar Docker Remote API seguir los siguientes pasos:
  • Editar el archivo
/etc/init/docker.conf
  • Actualizar la variable DOCKER_OPTS con:
DOCKER_OPTS='-H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock'
  • Reiniciar el servicio de Docker
service docker restart
  • Para testear que funciona bien, puedes listar las imagenes de docker en formato Json
curl -X GET http://localhost:4243/images/json
  • Finalmente se puede habilitar en el PhpStorm, quedaría de la siguiente forma:
PhpStorm enable Docker



martes, 2 de junio de 2015

Entornos de desarrollo profesionales con Vagrant

Les comparto un muy explicativo video para instalar y configurar múltiples entornos de desarrollo con Vagrant, Puphpet y VirtualBox.



Espero les sea útil, saludos...

viernes, 28 de noviembre de 2014

Escribir los Drupal logs para rsyslog en lugar de a dBlog


El módulo Syslog registra los eventos mediante el envío de mensajes a la facilidad de registro del sistema operativo de su servidor web. Syslog es una herramienta de registro administrativo del sistema operativo que proporciona información valiosa para su uso en la administración de sistemas y auditoría de seguridad. Más apropiado para sitios medianos y grandes, Syslog ofrece herramientas de filtrado que permiten que los mensajes se enrutan por tipo y gravedad.

Por defecto una instalación de drupal registra los errores usando el módulo watchdog por BD, pero por performance esto no es bueno se tiene que desactivar y hacer uso del módulo syslog que viene en el core de drupal.

Para hacer esto les comparto los siguientes encales:

martes, 14 de octubre de 2014

Herramientas para ocultar bloques en equipos moviles


Existen diversas herramientas, entre las que más útiles que encontré fueron estas:

Este módulo se integra con Context y la librería PHP Mobile Detect.
Agrega una pestaña en la creación/edición de un context para seleccionar si será visible en un movil device/desktop.
Requiere de BrowscapMobile Detect 
Ofrece un version mejorada de la funcion get_browser() de PHP
Añade una opción para ocultar o mostrar bloques en los dispositivos móviles

Una forma sencilla de ocultar bloques para equipos moviles sería:
  1. Abrir la congiguracion de blqoues: Structure > Blocks > Configure
  2. En la configuración de visibilidad seleccionar "Pages on which this PHP code returns TRUE (experts only)"
  3. Finalmente dentro de la caja de texto agregar el siguiente código:
if($mobile_agent['ismobiledevice'] == "false"){ //si no es un equipo movil mostrar el bloque.
return true;
}



martes, 30 de septiembre de 2014

Usando funciones de Drupal desde archivos php externos


El siguiente script funciona para Drupal 6 y Drupal 7.

Asumiento que tenemos la siguiente estructura:

ROOT
- sites
- - all
- includes
- demo
- - test.php

test.php
define('DRUPAL_ROOT', getcwd().'/..');
chdir(DRUPAL_ROOT);
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
$node = node_load(1164799);
echo '<pre>', print_r($node,1),'</pre>';

Detalles:

getcwd(): Obtiene la ruta actual del archivo. eg: /var/www/project01/demo

define('DRUPAL_ROOT', getcwd().'/..');
definimos una constante DRUPAL_ROOT, eg: /var/www/project01

chdir(DRUPAL_ROOT);
cambia el directorio actual, eg: /var/www/project01/demo
a eg: /var/www/project01

drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
Cargamos todo drupal.

Ahora ya se puede usar todas las funciones de drupal, como ejemplo muestro la carga de un nodo usando la funcion node_load().


Espero les haya servido este pequeño script que me resultó muy útil en algún momento.
Hasta otra oportunidad.



viernes, 25 de abril de 2014

Web Developer - Drupal Expert and others CMS: Yii Framework, Widget CJuiDatePicker poder ejecuta...

Web Developer - Drupal Expert and others CMS: Yii Framework, Widget CJuiDatePicker poder ejecuta...: Vengo trabajando en Yii Framework , es muy bueno y fácil de aprender. Hace unos días me encontré con un pequeño inconveniente usando el W...

Yii Framework, Widget CJuiDatePicker poder ejecutar código JS al hacer una acción


Vengo trabajando en Yii Framework, es muy bueno y fácil de aprender.

Hace unos días me encontré con un pequeño inconveniente usando el Widget CJuiDatePicker, estaba usando 2 calendarios para mi búsqueda por fechas, el problema fue cuando quize usar una función onSelect o Onclose.

Les muestro mi código inicial:

 $this->widget('zii.widgets.jui.CJuiDatePicker', array(
     'name'=>'from_date', // the name of the field
     'value'=>$model->issued_date,  // pre-fill the value
     // additional javascript options for the date picker plugin
     'options'=>array(
            'dateFormat'=>'yy-mm-dd',
            'buttonImage'=>Yii::app()->baseUrl.'/images/icons.date.png',
            'buttomImageOnly'=>true,
            'buttonText'=>'Date From',
            'showAnim'=>'fold',
            'showOn'=>'button',
            'showButtonPanel'=>false,
            'debug'=>true,
            'onClose'  => 'function( selectedDate ) {
                  $( "#to_date" ).datepicker( "option", "minDate", selectedDate );
                }',
    ),
     'htmlOptions'=>array(
       'style'=>'height:20px;'
     ),
     ));

No funcionaba como quería por que escapaba mi funcion JS onClose:
'onClose'  = 'function( selectedDate ) {
    $( \"#to_date\" ).datepicker(\ "option\", \"minDate\", selectedDate );
  }',

Para solucionar esto sólo bastaba con anteponer js a mi function para que quede así:
 $this->widget('zii.widgets.jui.CJuiDatePicker', array(
     'name'=>'from_date', // the name of the field
     'value'=>$model->issued_date,  // pre-fill the value
     // additional javascript options for the date picker plugin
     'options'=>array(
            'dateFormat'=>'yy-mm-dd',
            'buttonImage'=>Yii::app()->baseUrl.'/images/icons.date.png',
            'buttomImageOnly'=>true,
            'buttonText'=>'Date From',
            'showAnim'=>'fold',
            'showOn'=>'button',
            'showButtonPanel'=>false,
            'debug'=>true,
            'onClose'  => 'js:function( selectedDate ) {
                  $( "#to_date" ).datepicker( "option", "minDate", selectedDate );
                }',
    ),
     'htmlOptions'=>array(
       'style'=>'height:20px;'
     ),
     ));

Por lo demás funciona de maravilla, esto lo usé para una búsqueda dentro de un rango de fechas que me valide entre la fecha inicial y la final( ver documentación).

Espero les ayude en algo, saludos.

miércoles, 2 de abril de 2014

Descarga de videos de Youtube


Les comparto un pequeño pero efectivo tutorial para que puedan descargar videos de youtube, no necesita instalar ningún programa ni plugin.

Descarga de videos de youtube

Espero les haya servido, hasta otra oportunidad.

martes, 4 de marzo de 2014

Motor de Plantillas en PHP


Existen diversos motores de plantillas entre los más usados tenemos:


Tenemos algunas comparaciones entre estos motores:


El más usado y fácil de instalar es Smarty, pero Twig esta cobrando mucha fuerza y esta siendo usado en varios CMS, por tanto también es una gran opción.

viernes, 13 de diciembre de 2013

Trabajando con el Módulo Webform Add More en Drupal 7


Para inicar este post, se debe tener en cuenta las siguientes consideraciones:
  • Trabajar en un sitio en Drupal 7
  • Contar con un formulario usando el módulo Webform 
Ahora si podemos continuar, primero ¿que de interesante tiene este módulo?, pues permite seleccionar  a un conjunto de campos (fieldsets) para que inicialmente estén escondidos y de forma progresiva se vayen mostrado cuando se de click en un botón Añadir más. 

Da la apariencia de los field collection de añadir más campos de forma dinámica, debido a que aún no hay esta funcionalidad.

Sabiendo esto continuamos con la siguiente secuencia de pasos:
- Descargar e instalar el módulo Webform Add More
- Para nuestro mi caso cuento con la siguiente estructura de campos en mi formulario:


- Clonaré el fielset (Animal Care Teams) dando click al enlace Clone y dando check a la opción Add More Fieldset, obtenemos lo siguiente.


- Hacer el paso anterior y clonar una vez más
- Luego tendremos la siguiente estructura en el back-end:


- Finalmente en el front-end dando un poco de estilos con CSS tendremos:



Ahondando un poco más allá

Hasta ahora sólo se explicó un caso simple, que pasa si se agrega un fieldset más llamado Shelters, se sigue todos los pasos descritos anteriormente, pero como el módulo trabaja haciendo referencia a un fieldset se tiene que anidar cada fieldset (Animal Care Teams y Shelters)  dentro de otro, quedando de la siguiente forma:



Pero se presenta un problema... hay un bug en el módulo cuando se tiene fieldsets anidados, y si se prueba agregando y removiendo varias veces te darás con la sorpresa que duplica algunos botones e incluso no los muestra cuando debería.

Pero no se preocupe para corregirlo es necesario hacer los siguientes cambios en el archivo webform_addmore.js:

diff B .../sites/all/modules/webform_addmore/js/webform_addmore.js .../webform_addmore/js/webform_addmore.js
26c26
<           var parent_fieldset = $(this).closest('fieldset');
---
>           var parent_fieldset = $(this).parents('fieldset');
38,41c38
<           //Corrects duplicate Delete buttons
<           if (next.find(".del-btn").attr("class") == undefined) {
<             $(next).append(delBtn);
<           }
---
>           $(next).append(delBtn);
52,53c49
<           var parent_fieldset = $(this).closest('fieldset');
<           if (parent_fieldset.length==0) { return false;}
---
>           var parent_fieldset = $(this).parent();
63c59
<            
---
>
76,81c72,74
<           //Corrects duplicate AddMore buttons
<           if (cont.find(".add-more").attr("class") == undefined) {
<             $(cont).append(addBtn);
<           } else if (cont.find(".add-more").not(':visible').attr("class") != undefined) {
<             cont.find(".add-more").show();
<           }
---
>
>           $(cont).append(addBtn);
>           addBtn.show();
96c89
<         });
---
>         })


y que finalmente quede de la siguiente forma:




Espero les haya servido de algo, saludos y hasta la próxima.