PRIMEROS PASOS HERRAMIENTAS ÚTILES PARA UN DESARROLLADOR

EDITOR DE CÓDIGO
Es necesario tener un editor de código. Ejemplos de editores de código: block de notas, wordpad, gedit, aptana, netbeans, eclipse, etc.

EL MÓDULO DEVEL
En realidad se trata de un conjunto de módulos para realizar varias tareas: • Devel o Bloques o Switch user, permite cambiar de usuario sin desloguearse y volver a loguearse. De tal manera que se pueda probar la funcionalidad que dependa de roles u otros aspectos de manera más fácil. Es necesario que el usuario tenga permiso switch users para poder ver este bloque. o El bloque Execute PHP. Es un bloque que tiene un área de texto, donde podemos poner código PHP y lo mostrará en la parte de mensajes de nuestro tema. Especialmente útil para pruebas rápidas. o Páginas o devel/cache/clear, permite borrar la cache de drupal. o devel/info, esta ruta nos de la información completa de phpinfo(), sin tener que crear un archivo especial para eso. o devel/reinstall, permite desinstalar y volver a instalar los módulos que seleccionemos, Tener cuidado porque la rutina de desinstalación puede borrar las tablas de los módulos. Es útil cuando se requiere ejecutar este proceso, tal vez para probar un módulo que estamos desarrollando, y necesitamos reinstalarlo de forma "limpia". o devel/menu/reset, permite reconstruir los menus. De tal manera que se apliquen los cambios que hemos realizado en los mismos. o devel/variable, nos muestra una interfaz con una lista de las variables del sistema y la opción de poder editarlas y cambiar
1

su valor. Puede ser muy útil cuando estamos desarrollando un módulo y queremos probar el efecto de cambiar el valor de una variable de configuración o alguna otra con la cual estamos interactuando. o devel/php, nos da una interfaz para ejecutar código php. Muy similar al bloque Execute PHP. El resultado se muestra en el área de mensajes. o devel/session, nos muestra el contenido de la variable $_SESSION o etc. • Generate Content o Este módulo nos permite generar rapidamente contenido de prueba. o Generación de contenido. Podemos seleccionar el tipo de nodo que deseamos crear . Llena información del título, cuerpo, y los campos creados. Además hace la prueba con múltiples usuarios. o Generación de usuarios o Generación de vocabularios y términos

ESTÁNDARES SEGURIDAD Y BUENAS PRÁCTICAS
A continuación se lista una serie de estándares de código y buenas prácticas para escribir código (tomado de los estándares de código de Drupal.org): IDENTACIÓN Y ESPACIOS EN BLANCO • • • Hay que usar una identación de dos espacios en blanco, sin tabs. Las líneas no deben contener espacios en blanco al final. Los archivos deben ser formateados con para terminar terminar las líneas con \n (finalización de línea de Unix), y no con \r\n (finalización de lineas de Windows). Todos los archivos de texto deben terminar con una simple nueva linea (\n)

OPERADORES
2

Todos los operadores binarios (operadores que están entre dos valores), como +, -, =, !=, ==, >, etc. deben tener un espacio antes y después del operador, para una mayor facilidad de lectura. Por ejemplo, una asignación debe ser formateada como $foo = $bar; en vez de $foo=$bar;. Los operadores unarios (operadores que operan con un solo valor), como ++, no deben tener espacio entre el operador y la variable o número sobre el cual operan. CASTING Poner un espacio entre el (tipo) y la variable sobre la que se va a realizar el cast: (int) $mynumber. ESTRUCTURAS DE CONTROL Incluye if, for, while, switch, etc. Acá un ejemplo de como debe hacerse: if (condition1 || condition2) { action1; } elseif (condition3 && condition4) { action2; } else { defaultaction; } Como observamos debe haber un espacio entre las palabras y los paréntesis, esto es para distinguirlo de las llamadas a funciones. Se recomienda usar siempre las llaves, incluso en las situaciones donde es opcional. Esto para aumentar la legibilidad del código y disminuir la posibilidad de errores lógicos si se agregan nuevas líneas. Para el switch: switch (condition) { case 1: action1;
3

break; case 2: action2; break; default: defaultaction; } Para el la estructura do-while: do { actions; } while ($condition); LLAMADA A FUNCIONES Las llamadas a funciones deben hacerse sin espacios entre el nombre y la apertura de los paréntesis, y el primer parámetro; debe haber espacios entre las comas y cada parámetro, y no espacios entre los parámetros, y no debe haber espacio entre el último parámetro el paréntesis que cierra y los punto y coma. Acá un ejemplo: $var = foo($bar, $baz, $quux); Como se muestra en las lineas de antes, debe haber un espacio en cada lado del signo igual usado para asignación. En caso de que tengamos varias asignaciones en un bloque se debe poner más espacios al lado izquierdo del signo de asignación para que los signos igual queden alineadas. $short = foo($bar); $long_variable = foo($baz); DECLARACIÓN DE FUNCIONES
4

function funstuff_system($field) { $system["description"] = t("This module inserts funny text into posts randomly."); return $system[$field]; } Los argumentos con valores por defecto van al final de la lista de argumentos. LLAMADAS A CONSTRUCCIÓN DE CLASES Cuando se llama a un constructor de clases sin argumentos, siempre incluir los paréntesis: $foo = new MyClassName(); This is to maintain consistency with constructors that have arguments: $foo = new MyClassName($arg1, $arg2); Note that if the class name is a variable, the variable will be evaluated first to get the class name, and then the constructor will be called. Use the same syntax: $bar = 'MyClassName'; $foo = new $bar(); $foo = new $bar($arg1, $arg2); ARRAYS Los arrays deben estar formateasod con un espacio separando cada elemento (después de la coma), y y espacios alrededor del operador de asociación =>, si es aplicable: $some_array = array('hello', 'world', 'foo' => 'bar'); Note que si se está declarando un array y tienen una longitud mayor de 80
5

caracteres, cada elemento debe ser colocado en su propia línea, y debe estar identado de acuerdo a su nivel: $form['title'] = array( '#type' => 'textfield', '#title' => t('Title'), '#size' => 60, '#maxlength' => 128, '#description' => t('The title of your node.'), ); Note la coma al final de los elementos del array. Esto es para ayudar a prevenir errores de parsing si se agregan nuevos elementos más adelante. COMILLAS Drupal no tiene un estandar fuerte sobre el uso de comillas simples vs. comillas dobles. Donde sea posible, por consistencia dentro de cada módulo, y con respecto al estilo personal de los desarrolladores. Las comillas simples son más rápidas porque no tienen que ejecutar una interpretación. Su uso es recomendable, excepto en dos casos: 1. Uso de variables inline, ejemplo "<h2>$header</h2>". 2. String traducidos donde se requiere usar comillas simples "He's a good person.".

CONCATENACIÓN DE STRINGS Espacio entre el punto de concatenación y las cadenas a concatenar, para aumentar la legibilidad. <?php $string $string $string $string = = = = 'Foo' . $bar; $bar . 'foo'; bar() . 'foo'; 'foo' . 'bar';
6

?> Cuando se concatenan variables simples se puede usar comillas dobles y poner la variable dentro. <?php $string = "Foo $bar"; ?> Cuando se usa operador de asignación y concatenación ('.='), usar un espacio a ambos lados del operador: <?php $string .= 'Foo'; $string .= $bar; $string .= baz(); ?> COMENTARIOS Usar los comentarios tipo Doxygen. PUNTO Y COMA Como el punto y coma es opcional, cuando se se está cerrando el bloque de PHP, esto podría llevar a omitirlas al final. El estándar de drupal es que siempre debe ponerse el punto y coma al final: <?php print $tax; ?> -- YES <?php print $tax ?> -- NO EXAMPLE URL Usar "example.com" para todas las URLs de prueba. FUNCIONES Y VARIABLES Funciones y variables deben ser nombradas en minúscula, y las palabras deben ser separadas por guiones bajos. Funciones deben además tener el nombre del
7

gropo/modulo como prefijo, para prevenir colisión de nombres entre módulos. VARIABLES PERSISTENTES Variables persistentes (aquellas que son definidas por Drupal usando las funciones variable_get()/variable_set()) deben ser nombradas todo en minusculas, y las palabras deben ser sepradas con un guión bajo. Además deben usar un prefijo de nombre grupo/modulo para evitar colisiones entre módulos. CONSTANTE Las constantes deben ser siempre con letras mayúsculas. Esto incluye el uso de las constantes predefinidas de PHP como TRUE, FALSE y NULL. Las constantes definidas por los módulos también deben estar precedidas por un el nombre del módulo en mayúscula. VARIABLES GLOBALES Si tu necesitas definir variables globales, los nombres deben comenzar on un guion bajo seguido del nombre del modulo/thema y seguido de otro guion bajo. CLASES Las clases deben usar la convención "CamelCase". Ejemplo: <?php abstract class DatabaseConnection extends PDO { ?> Los métodos de clase y las propiedades deben ser "lowerCamelCase": <?php public $lastStatement; ?> Evitar el uso de metodos de clase o propiedades privadas. User protected. De esta manera otra clase puede extender tu clase y modificarla. Los métodos Protected y propiedades no deben usar guion bajo como prefijo. NOMBRES DE ARCHIVOS

8

Todos los archivos de documentación deben tener la extensión ".txt" para que puedan ser vistos en archivos Windows de manera más sencilla. Además, los nombres de archivos deben ser en mayúsculas (README.txt en vez de readme.txt), pero la extensión misma en en minúscula (ejemplo txt en vez de TXT). Ejemplos: README.txt, INSTALL.txt, TODO.txt, CHANGELOG.txt etc.

EL SISTEMA MODULAR DE DRUPAL MODULOS Un módulo es un conjunto de archivos que agregan funcionalidad (extensibilidad) a Drupal. El núcleo de Drupal en sí dispone por sí mismo de varios módulos que son usados siempre y sirven de base al buen funcionamiento y las tareas usuales de Drupal. Es como una pieza "enchufable" al "núcleo" (core) de Drupal. Es decir, la instalación de Drupal, puede funcionar sin la gran mayoría de módulos (salvo que sea módulo del core) e instalarse posteriormente un módulo para hacer determinada tarea. También podría desinstalarse los módulos que no se necesiten y de esta manera ahorrar consumo de memoria. Además, un módulo podría agregarse a varios sitios web que requieran la misma funcionalidad. Son como piezas con las cuales se puede construir una solución adaptada a una necesidad concreta. Podríamos clasificar los módulos como: • • • • Módulos Módulos Módulos Módulos del Core obligatorios del Core opcionales Contribuidos Personalizados

Si es que necesitas hacer algo que no viene en el núcleo de Drupal y no encuentras dentro de los módulos existentes uno que te permita hacerlo, probablemente sea tiempo de crear un módulo personalizado. Ahora si deseas que otras personas puedan usar tu módulo y lo subes a drupal.org se
9

transformaría en un módulo contribuido. (Figura mostrando como un módulo es un componente enganchable) COMO CREAR UN MÓDULO En esta sección explicaremos los pasos necesarios para la creación de un módulo. Se hará los ejemplos de nombre asumiendo que el módulo se llama "inventario", por lo cual deberá reemplazar este nombre por el nombre del módulo que esté creando. 1. Crear una carpeta que contenga todos los archivos del módulo. Usualmente esta carpeta tendrá el nombre del módulo y será colocada en /sites/all/modules de la instalación de Drupal. Es decir, crearíamos la carpeta /sites/all/modules/inventario (donde inventario es el nombre de nuestro módulo). 2. En esta carpeta creamos el archivo inventario.info que contendrá la información de nuestro módulo para que sea identificado por Drupal. 3. También creamos dentro de la carpeta el archivo inventario.module que contendrá el código php de nuestra aplicación.

ARCHIVO inventario.info Este archivo contiene información sobre el módulo para Drupal. Sin este archivo el módulo no aparecerá en la lista de módulos. Este archivo tiene un formato de lista de pares llave-valor. Es decir, una serie de llaves (claves) que son seguidas de un signo igual y el valor que tiene dicha llave. Los pares obligatorios son: name, descripcion y core. El resto es opcional Una observación especial para para la version. En caso el módulo se suba a drupal.org, el sitio de drupal crea automáticamente una versión y la coloca en el archivo cada vez que se suba y se cree un tarball. En caso el módulo no vaya a ser compartido mediante el sitio de drupal, se puede colocar un número de versión de acuerdo al criterio que creamos conveniente. Entonces tendríamos un archivo con el siguiente formato aproximado:
10

; $Id$ name = Nombre del Módulo description = Una descripción de lo que hace el módulo version = 0.1 core = 6.x Donde: name, es el nombre del módulo. El nombre debe comenzar en mayúscula. Sin es más de una palabra solo la primera es en mayúscula y las demás en minúscula. description, una descripción corta (hasta 255 caracteres) de que es lo que hace el módulo version, indica cual es el número de versión de nuestro módulo core, es la versión de drupal en la cual puede funcionar el módulo

En el archivo inventario.info agrega el siguiente texto ; $Id$ name = Inventario description = Permite llevar un Inventario de los productos de un comercio electrónico version = 0.1 core = 6.x NOTA IMPORTANTE .- Para que se muestre el módulo tambien es necesario el archivo .module Una vez que pongamos la carpeta de nuestro módulo en la ubicación de la instalación de Drupal (el lugar más apropiado para poner nuestra carpeta es /sites/all/modules/) podremos ver el efecto del archivo inventario.info si vamos al menú Modules (en negro en la figura):
11

Que nos mostrará la lista de los módulos instalados y por instalar. Acá aparecerá nuestro módulo con la siguiente de la siguiente manera:

12

Donde podemos ver que aparece la información que hemos colocado en inventario.info. Las otras opciones no obligatorias para colocar en este archivo son las siguientes: dependencies, es un array con la lista de módulos que son requeridos por nuestro módulo para funcionar. Si estos módulos sobre los cuales nuestro módulo es dependiente no están presentes nuestro módulo no puede ser activado con un check para ser instalado. Si están presentes pero no instalados el administrador recibe una lista de los módulos que necesita activar para poder instalar este módulo (TODO: captura de pantalla). Para escribir las dependencias colocaremos el nombre del módulo, sin la palabra module, en minúscula. Los espacios en blanco no están permitidos. Como ejemplo tenemos: dependencies[] = taxonomy dependencies[] = comment package, Es una forma de decirle a Drupal que nuestro módulo es parte de un grupo (paquete) de módulos, ya sea que estes vienen juntos, o porque extiende un paquete ya existente. Al momento de mostrarse aparecerá en un recuadro dentro de ese paquete. Si no colocamos esta opción, nuestro módulo aparecerá en el grupo Others. php, Desde la versión 6 de drupal el módulo puede indicar cual es la versión mínima de php que requiere.

13

ARCHIVO inventario.module Este archivo almacenará el código php de nuestro módulo y las funciones que vayamos a utilizar. Es el corazón de nuestro módulo y el que se relacionará con Drupal. Muchas de estas funciones son implementaciones de hooks de drupal. ¿QUÉ ES UN hook? Drupal permite la comunicación de un módulo con núcleo a través de ciertas funciones pre-definidas, llamadas hooks. Un hook, lleva el nombre del módulo y la función unida por un guión bajo. Por ejemplo (siempre suponiendo que nuestro módulo se llame inventario) en nuestro archivo inventario.module podemos crear las siguientes funciones: • • • • inventario_perm() inventario_block($op = 'list', $delta = 0) inventario_admin() etc.

En la documentación, suele aparecer la palabra de hook en el lugar del nombre del módulo (por ello se les conoce como hooks). Por ejemplo, los hooks anteriores aparecerán como: • • • hook_perm() hook_block($op = 'list', $delta = 0) hook_admin()

Y ya sabemos que para utilizar estas funciones debemos reemplazar la palabra hook por el nombre de nuestro módulo. Además, es importante resaltar que cada hook puede tener algunos parámetros que recibe, en algunos casos opcionales. CREANDO PERMISOS PARA EL MÓDULO Con el hook_perm, un módulo puede indicar los nombres de los permisos que existen para ser asignados a los diferentes roles. Este hook no nos dice que
14

acceso da cada permiso, sino que solo nos da una lista de los permisos disponibles. Más adelante veremos el hook_access, donde se definen los accesos. El nombre del permiso no puede ser igual a ningún otro permiso de alguno de los otros módulos instalados, porque sino en la lista de permisos aparecerńa varios iguales (o el sistema podría comportarse de modo inesperado utilizando un permiso que no le corresponde). Para evitar estas colisiones se recomienda poner el nombre el módulo dentro del permiso. Más exactamente se recomienda colocar un verbo que describa la acción a realizar seguido del nombre del módulo. Ejemplos de nombres de permiso: • • • • administrar inventario registrar inventario borrar inventario etc.

Usted podra asignar los permisos a los usuarios en Administer->User management->Permissions Ejemplos <?php /** * Permisos válidos para este módulo * @return array Un array con todos los permisos válidos para este módulo */ function inventario_perm() { return array('registrar inventario'); } ?> Y si tienes varios permisos, solo se agrega más elementos al array: <?php
15

function inventario_perm() { return array('administrar inventario', 'registrar inventario', 'borrar inventario'); } ?>

REVISANDO SI UN USUARIO TIENE UN PERMISO Si queremos revisar si un usuario tiene un determinado permiso, podemos usar la función user_access($string, $account = NULL, $reset = FALSE); En donde: $string es el nombre del permiso sobre el cual queremos averiguar si el usuario tiene privilegios $account es la cuenta de usuario para la que queremos saber si se tiene los privilegios. Este parámetro es opcional y si no es proporcionado se toma el usuario actual (actualmente logueado). $reset, este parámetro indica si se va a resetear o no el cache de los permisos de usuario. De colocar TRUE, se recalcularán los permisos del usuario. Es necesario cuando se necesita los valores modificados cada vez, como cuando se agregan roles de forma dinámica. Esta función devuelve un boolean, que es TRUE si el usuario tiene el privilegio correspondiente. Hay que recordar que el usuario con id = 1 (el primer usuario que se creo) es un super-usuario con todos los privilegios, por lo cual usar está función con el mismo siempre nos devolverá TRUE, BLOQUES, REGIONES Y CREACION DE BLOQUES A TRAVÉS DE UN MÓDULO
16

Los bloques permiten la presentación de pequeños elementos de la página, que pueden moverse entre regiones. Las regiones son las áreas dentro de un tema en donde pueden colocarse uno o varios bloques. Drupal nos permite crear bloques en un módulo, utilizando para ello el hook_block. Gracias a este hook, definimos cuantos bloques tendremos, las opciones de configuración del mismo y como va a ser su presentación. La definición de este hook es la siguiente: hook_block($op = 'list', $delta = 0, $edit = array()) Como vemos recibe 3 parámetros. El primero de ellos $op es para ver el tipo de operación que vamos a ejecutar. Las opciones son: • • • • • • • • list configure save view Mediante la primera opción definimos la lista de bloques que va a tener nuestro módulo. Mediante el segundo de ellos definimos las configuraciones que vamos a poder hacer a cada uno de los módulos. Mediante el tercero podemos grabar las configuraciones definidas en configure. Mediante el cuarto definimos la parte visual de cada uno de los bloques que tengamos definidos.

17

El segundo parámetro es de tipo integer, y nos proporciona el índice de la lista de bloques (definidos cuando en list de $op) sobre el cual se está trabajando en ese momento. Y el tercero de ellos, funciona cuando $op es igual a save, y nos proporciona la lista de datos enviados por el form de configuración (que hemos colocado en la opción configure de $op).

18

Sign up to vote on this title
UsefulNot useful