3 certificados Zend sobre 5 a nivel nacional trabajarán en Dokeos Latino

Noviembre 2, 2009

php5_zce_logo_newAcabo de confirmar que 3 desarrolladores, ingenieros PHP certificados por Zend, trabajarán en Dokeos a partir de la próxima semana. Es para mi un placer y un honor de tener un conjunto de mentes tan brillantes reunidas en una sola empresa. Solo existen 5 ingenieros Zend en Perú.

Sin aprovechar para descansar, estaremos preparando, este mes, el programa de curso para preparación a la certificación Zend, para el cual Gary Rojas, el cuarto y último certificado en PHP5, ha acceptado desde ya de combinar esfuerzos con nosotros.

Con este cuadret fantástico, estaremos brindandoles el mejor curso “all times” de PHP que pudió ser organizado a fines de prepararles en la certificación de Zend aquí en Lima.

Más sobre esto más tarde… Si están interesados, por favor dejen nos un comentario.


Instalar y desinstalar una tabla para tu módulo en drupal

Agosto 3, 2009

Dentro de la carpeta de tu módulo debes incluir un archivo con el nombre de tu módulo con extension .install (e.j. mimodulo.install).

En este archivo se va definir la estructura representativa para uno o más tablas con sus llaves relacionadas  e índices.  Esto es definido por hook_schema() (el prefijo hook debe ser reemplazado por el nombre de tu módulo en este caso mimodulo_schema() ).

<?php
function mimodulo_schema() {

$schema['stats_user_file'] = array(
‘description’ => ‘The base table for cies stats.’,
‘fields’ => array(
‘id’ => array(
‘description’ => ‘identifier for stats.’,
‘type’ => ‘int’,
‘not null’ => TRUE,
‘default’ => 0),
‘tid’ => array(
‘description’ => ‘identifier for a term.’,
‘type’ => ‘int’,
‘not null’ => TRUE,
‘default’ => 0),
‘uid’ => array(
‘description’ => ‘identifier for user.’,
‘type’ => ‘int’,
‘unsigned’ => TRUE,
‘not null’ => TRUE,
‘default’ => 0),
‘fid’ => array(
‘description’ => ‘identifier for file.’,
‘type’ => ‘int’,
‘not null’ => TRUE,
‘default’ => 0),
‘timestamp’ => array(
‘description’ => ‘timestamp UNIX’,
‘type’ => ‘int’,
‘not null’ => TRUE,
‘default’ => 0)
)
‘indexes’ => array(
‘tabla1_changed’        => array(‘changed’),
‘tabla1_created’        => array(‘created’),
),
‘unique keys’ => array(
‘id_tid’ => array(‘id’, ‘tid’),
‘uid’     => array(‘uid’)
),
‘primary key’ => array(‘id’)
);
return $schema;
}
?>

En http://drupal.org/node/146843 se puede ver la estructura de definición de un esquema con más detalles, tipo de datos y referencias.

Solo faltaría agregar hook_install() y hook_uninstall() para instalar y desinstalar respectivamente la tabla definida anteriormente

<?php

function mimodulo_schema() {
/* Definicion de la estructura de la tabla */
}

function mimodulo_install() {
// Crea mi tabla
drupal_install_schema(‘mimodulo’);
}

function mimodulo_uninstall() {
// Borra mi tabla
drupal_uninstall_schema(‘mimodulo’);
}

?>


Implementación de un carrusel de imágenes con Drupal 6

Julio 21, 2009

Hola en esta ocasión voy a explicar como se implementó un efecto carrusel de imágenes y/o videos para un proyecto en Drupal, lo que se hizo es utilizar el plugin de jquery llamado jscrollable.min.js el cual me da una apariencia de carrusel (elegante), para ello se debe de instalar previamente Drupal, de forma correcta.

Cuando me refiero de forma correcta es saber ubicar donde se van a agregar temas, módulos, files, etc; para ordenarnos desde un principio, luego instalar los módulos necesarios para nuestro site.

Para poder implementar es prerrequisito tener instalado los módulos jquery_update, jquery_plugin para extender los plugins jquery que trae por defecto Drupal, además el CCK y el image upload para la gestión de subida de archivos, y si uno quiere un módulo para miniaturizar imágenes recomiendo Image Api  + Image Cache, y por supuesto pero no necesario un módulo personalizado.

Para más detalle visita este línk donde podrás descargar un ejemplo.


Implementación de un listado de categorías con Drupal 6 usando Taxonomy

Julio 20, 2009

Hola ahora vengo a compartir con ustedes una experiencia que tuve con Drupal para un determinado proyecto, pues bien si no saben que es Drupal en líneas generales le puedo decir que es un CMS + Framework de desarrollo de webs estaticas y dinamicas, para mas información aquí.

Bueno comienzo …. para poder realizar este desarrollo voy a utilizar el modulo Taxonomy del core de Drupal, ayudándome de un módulo personalizado llamado projecto, lo primero que voy hacer es crear vocabularios en la interfaz del administrador de la plataforma previamente instalada.

vocabularios

Ahora comenzamos a crear los términos a los cuales vamos a enlazar a nuestros vocabularios, con los respectivos parentescos.

terminos

Seguidamente nos dirijimos  a nuestro modulo creado y usamos los hooks, para mas informacion aquí; usamos el hook_menu()para crearnos un menu y hook_block para posicionar nuestro listado en un bloque.

Nos creamos una función que se encargará de dibujar (con los estilos que quieras) el listado de cursos, productos, etc.

Y finalmente creamos otra función que imprime el array u objeto (depende), así:

function cies_show_categories() {
// The categories listed
$tree_category = cies_build_categories(); //función que contiene el listado de categorias
$data = ”;
if (!empty($tree_category)) {
foreach ($tree_category as $value) { // lo recorrp
$data .= $value;
}
}
return $data;
}

Espero haber ayudado, gracias y les dejo el link para que puedan acceder a mi presentación.


Opinión sobre PHP 5.3, lo bueno y lo malo

Julio 19, 2009

La reciente salida de PHP 5.3.0, a pesar de generar una gran cantidad de comentarios negativos sobre el hecho de que rompe muchas herramientas, es un paso mayor hacia PHP 6.0.0. Las quejas provienen generalmente del hecho de que unas mejoras en el soporte del código orientado objeto implican ser más estrictos sobre la forma en que deben ser usados los objetos o las clases dentro de una aplicación (por ejemplo no deja más instanciar una clase que sea abstracta “de facto”).

Entre las cosas buenas más resaltantes de esta nueva versión, contamos con la inclusión en la base del lenguaje de las extensiones intl (facilitadora de muchos temas de internacionalización), fileinfo (que permite de determinar, de manera confiable, el tipo de un archivo, lo que permite a su vez de filtrar mejor peligros al acceptar ficheros externos). También vemos la inclusión ahí de “closures” (construcción del lenguaje conocida de los desarrolladores JavaScript), de espacios de nombre (parece que mucha gente estuvieron esperando esto, y de verdad podría servir en Dokeos para, por ejemplo, separar mejor los ficheros de idiomas).

También suele mencionar que varias fuentes reportan (buscar “benchmark PHP 5.3″) que esta versión tiene una eficiencia superior.

Cualquier sea el asunto en favor o en contra de PHP 5.3.0, no hay mucha preocupación que tener de inmediato. Dokeos 1.8.6 está siendo probado por Issac  aquí (muy probablemente la versión 1.8.6.1 propondrá soporte completo de esta versión), pero de toda forma las empresas que proponen alojamiento de aplicaciones PHP necesitarán unos meses para pasar a esta nueva versión.


Libreria XAJAX en PHP

Mayo 9, 2009

Xajax es una biblioteca código abierto de PHP capaz de generar aplicaciones Web con tecnología AJAX.
Xajax utiliza una forma de trabajo de funciones, designando qué funciones o métodos de código PHP se convierten en funciones AJAX
Puede descargarlo Aqui

Ejemplo 1 : Xajax y funciones PHP

<?php
//Incluir con PHP el archivo donde está la clase xajax
require (‘xajax/xajax_core/xajax.inc.php’);

//Instanciamos el objeto de la clase xajax
$xajax = new xajax();

//Escribimos una función en PHP, que luego llamaremos con por medio de ajax
function cambia_texto($mensaje){

//instanciamos el objeto para generar la respuesta con ajax
$respuesta = new xajaxResponse();
//escribimos en la capa con id=”mensajeDiv” el texto de $mensaje
$respuesta->assign(“mensajeDiv”,”innerHTML”,$mensaje);
//tenemos que devolver la instanciación del objeto xajaxResponse
return $respuesta;
}
//asociamos la función creada anteriormente al objeto xajax
$xajax->registerFunction(“cambia_texto”);
//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequest();
?>

<html>
<head>
<!– En el <head> indicamos al objeto xajax se encargue de generar el javascript necesario –>
<?php $xajax->printJavascript(“xajax/”); ?>
</head>
<body>
<!– Se llama a la funcion javascript generada por xajax con el prefijo ‘xajax_’ seguida del nombre de la funcion creada con php –>
<input type=”button” onclick=”xajax_cambia_texto(‘Hola Ajax’);” value=”Pulsa” />
<div id=”mensajeDiv”></div>
</body>
</html>

Ejemplo 2: Xajax y objetos

<?php
//Incluir con PHP el archivo donde está la clase xajax
require_once(“xajax/xajax_core/xajax.inc.php”);
//Creamos la clase cuyo metodo utilizara el xajaxResponse
class alumno{
private $mensaje=”Ajax”;
public function hola(){
//instanciamos el objeto para generar la respuesta con ajax
$objResponse = new xajaxResponse();
//En este caso el metodo lanzara un alert js con el texto “Ajax”
$objResponse->alert(‘Hola ‘.$this->$mensaje);
//Devolvemos el objeto xajaxResponse
return $objResponse;
}
}
$alumno = new alumno()
//Instanciamos el objeto de la clase xajax
$xajax = new xajax();
//asociamos el metodo del objeto $alumno al objeto xajax con un array(“nombreEnJS”,$objeto,”metodo”)
$xajax->registerFunction(array(“miFuncion”, $alumno,”hola”));
//El objeto xajax tiene que procesar cualquier petición
$xajax->processRequest();
?>

<?php $xajax->printJavascript(“xajax/”) ?>
<input type=”submit” value=“Llamar” onclick=”xajax_miFuncion(); return false;”>

METODOS DE LA CLASE XAJAX

$xajax = new xajax();
$xajax->setFlag(“debug”, true);
$xajax->setFlag(“decodeUTF8Input”, true);
$xajax->setFlag(“characterEncoding”,’ISO-8859-1′);
$xajax->registerFunction(“miFuncion”);
$xajax->processRequest();

METODOS DE LA CLASE AJAXRESPONSE

$objResponse = new xajaxResponse();
$objResponse->redirect(“http://www.google.com”);
$objResponse->alert(“Mostramos un alert.”);
$objResponse->confirmCommands(2, “Mensaje que pregunta?”);
$objResponse->call(“funcionJS”, “arg 1″, “arg N” );
$objResponse->includeScript(archivo.js);
$objResponse->assign(“etiqDiv”, “innerHTML”, “dato”);
$objResponse->assign(“etiqueta3”, “style.width”, “25%”)
$objResponse->remove(“etiqDiv”);

Ejemplo 3 : Formularios Xajax

<?php
require_once(“xajax/xajax_core/xajax.inc.php”);
function testForm($formData){
$objResponse = new xajaxResponse();
$objResponse->assign(“submittedDiv”, “innerHTML”, nl2br(print_r($formData, true)));
return $objResponse;
}
$xajax = new xajax(); $xajax->registerFunction(“testForm”);
$xajax->processRequest();
?>

<form id=”testForm1″ onsubmit=”return false;”>
<input type=”text” name=”textInput” value=”text” />
<input type=”text” name=”textInput2″ value=”text” />
<select id=”select” name=”select”>
<option value=”1″>One</option> <option value=”2″>Two</option>

<option value=”3″>Three</option>

<option value=”4″>Four</option>
</select>
<input type=”submit” value=“submit por xajax” onclick=”xajax_testForm(xajax.getFormValues(‘testForm1′)); return false;” />
</form>
<div id=”submittedDiv”></div>

Ejemplo 4 : Llamar una funcion javascript desde codigo php

<?php
require(“xajax/xajax_core/xajax.inc.php”);
function callScript() {
$response = new xajaxResponse();
$value2 = “elemento 2″;
$response->call(“myJSFunction”, “argumento 1″, 9432.12,
array(“myKey” => “elemento 1″, “key2″ =>$value2));
return $response;
}
$xajax = new xajax();

$xajax->registerFunction(“callScript”);

$xajax->processRequest();
?>

<?php $xajax->printJavascript(“xajax/”) ?>
<script type=”text/javascript”>
function myJSFunction(Argtext, ArgNum, ArrayArg) {
var newString = Argtext + ” y ” + (+ ArgNum + 100) + “\n”;
newString += ArrayArg["myKey"] + ” | ” + ArrayArg.key2;
alert(newString);
}
</script>
<input type=”button” value=”Click Me” onclick=”xajax_callScript()” />

CAMBIOS EN LA VERSION 0.5 XAJAX

$xajax->registerFunction(‘funcion’);
X
$xajax->register(XAJAX_FUNCTION, ‘funcion’);
$xajax->processRequests();
X
$xajax->processRequest();
Publica todos los métodos públicos de un objeto:
$xajax->register( XAJAX_CALLABLE_OBJECT, $objeto);


Regexpal – Editor de expresiones regulares en línea

Mayo 7, 2009

Acabo de encontrar una interesante herramienta para poder editar expresiones regulares en línea se llama RegexPal.

regex
Podemos ver en línea el resultado de nuestra expresión regular, asi como una información sobre los caracteres especiales que podemos utilizar.


Traducciones con parámetros

Abril 16, 2009
Akelos

Akelos

i18n

i18n

La i18n (internationalization) de Akelos (framework PHP) nos permite incluir parámetros en la invocación. A continuación compartimos un ejemplo con ustedes:

.

Trabajaremos con el controlador product

Y el método greeting

archivo app/controller/product_controller.php
function greeting() {

}

.

En la vista (archivo app/views/product/greeting.tpl):
translate( 'Hello %user_name. Justice %question_mark', array('%user_name' => 'Osho', '%question_mark' => '?') );
?>

Aquí debemos prestar atención a los parámetros que se indican con el prefijo de porcentaje (‘%’). Y como segundo parámetro del método translate tenemos el arreglo con llaves y valores para los parámetros.

.

En los archivos de traducción se puede ser flexibles con la presencia y posición de las variables al interior de las expresiones.

Ej:

archivo app/locales/product/en.php
$dictionary['Hello %user_name. Justice %question_mark']='Hello %user_name. Justice %question_mark';

archivo app/locales/product/es.php
$dictionary['Hello %user_name. Justice %question_mark']='%user_name e. Justicia chu.';

Obtendríamos como resultado:
- Hello Joseph. Justice?
- Joseph e. Justicia chu.

De esta forma podemos ubicar las palabras en el lugar correspondiente de acuerdo a las reglas de cada lenguaje. Incluso prescindir de elementos como ciertos signos de puntuación que sólo son válidos en determinados idiomas.

También podemos reutilizar expresiones ya traducidas, así evitamos las variaciones en la traducción de frases muy similares. La clave es identificar patrones en las expresiones, cuando en la práctica escribimos repetidas veces lo mismo.

- Ha fallado el comando DELETE.
- Command EXECUTE has failed.

Y podemos dar por cerrada una etapa de traducción antes de terminar el proceso de desarrollo de la lógica de una solución.

- Le quedan 2 tareas por revisar.
- 1 task to do.


Detecta fallas de seguridad usando Wapiti

Abril 11, 2009

Aunque no haya una manera automática que asegure una detección de todas las fallas de seguridad de un aplicativo web, existen herramientas que permiten analizar una herramienta y reportar una capa base de fallas.

Una de estas herramientas, en GPLv2, se llama Wapiti. Descargalo y instala python, python-utidylib, tidy y python-ctypes. Crea una carpeta /tmp/out/ para poner los resultados (cuidado, Wapiti probará de vaciar la carpeta antés de iniciar su reporte).

Descomprima el archivo, entra en la carpeta y ejecuta algo como esto:

python src/wapiti.py http://mi.dokeos.mio/ -f html -o /tmp/out/

y te generará un reporte HTML en /tmp/index.html que podrás analizar tranquilamente, y que te describe que tipo de fallas ha probado.

En el caso de sitios web con authentificación, se usa un cookie, a través del comando más extendido:

python src/wapiti.py http://mi.dokeos.mio/ -f html -o /tmp/out/ -c /tmp/cookie.txt -a admin%admin -x http://mi.dokeos.mio/index.php?logout=logout&uid=1

(donde admin%admin es el login/pass del usuario y el último url es un url que el Wapiti debe excluir (para no disconectarse de su sesión).

Esto, junto con el libro “Essential PHP Security”, permite de cubrir una parte muy importante de las fallas de seguridad.


Certificación Zend PHP

Abril 5, 2009

En nombre de Dokeos los invito a informarse acerca de una excelente oportunidad para prepararse para obtener la certificación Zend PHP.

Certificación Zend PHP

Curso Avanzado de preparación para la Certificación Zend Certified PHP Engineer. Dictado por Yannick Warnier, ingeniero PHP5 certificado por Zend y desarrollador principal del software libre Dokeos. Incluye simulacros de examen. Se tomarán pruebas psicológicas y técnicas de entrada.

Datos Principales

Información:
- Inicio: 27 de mayo
- Horario: Lunes y Miércoles de 6:00 a 10:00pm
- Examen calificatorio: 25 de mayo – 6:00pm

Requisitos:
- Haber tomado como mínimo un curso de PHP.
- Ser desarrollador de Aplicaciones Web con PHP.
- Pasar el test en línea

Duración:
- 10 semanas / 80 horas

Precio:
- S/.2000
Oferta de 70% de descuento para este primer curso si te registras antes del 10 de Abril a tan sólo S/.600. ¡No te pierdas esta oportunidad!

Lugar:
- Oficina Dokeos Latinoamérica
- Direccón: Pasaje Los Pinos 190, of. 901 – Miraflores
- Referencia: Esquina con la cuadra 2 de la Av. Benavides.

Para más información escribe al correo info.latino@dokeos.com

Instrucciones para el test en línea

paso 1: Inscribirse en Campus Dokeos
paso 2: “Language: Spanish”
paso 3: Registrarse
paso 4: Suscribirse en el curso Curso PHP para certificación Zend
paso 5: en “Buscar Cursos” poner “Zend”, click en “Buscar”,
paso 6: aparece “Curso PHP para certificación Zend”, click en “Inscribirme”
paso 7: Resolver el examen de entrada
paso 8: Hacer click en la opción “Ejercicios”
paso 9: Hacer click en la opción: “Examen de entrada al curso”