Capy
Drupal, Ubuntu, jQuery, CSS
Drupal, Ubuntu, jQuery, CSS
Aug 31st
Suena a boludez:
if( objetoso == undefined ){
return "objetoso no está definido.";
}
Pero lo anterior no te va a funcionar porque al querer comparar un objeto que está indefinido, el navegador va a arrojarte un error :S
La forma correcta de hacer esta comprobación entonces es:
if( typeof(objetoso) === "undefined" ){
return "objetoso no está definido.";
}
Y ya nos evitamos que se rompa todo por culpa de un objeto indefinido…
Bye.
Aug 31st
Otro de esos TIP que nos vienen sorprendente mente bien
.
Si estas haciendo debug sobre una plantilla y necesitas saber cuales son las variables de las que dispones sobre la misma, te habras dado con el problema de que no se pueden ver. Osea, las variables existen, y si las mandas a imprimir con un echo() seguro que ahi está, pero hasta que no lo haces no podes saber siquiera que existe.
Bueno basta de intro, vamos a un ejemplo rapido y claro:
Si pones esta función en la plantilla que querés investigar, vas a poder ver un array ($variablesDisponibles para este ejemplo) de los nombres de todas las variables de las que dispone (y de sus contenidos también):
Chau!
Aug 24th
Como me quedaron lindos se los comparto para que los usen si les hace falta.
CSS:
.comentario {
background-color: #336699;
width: 600px;
padding: 20px;
float:left;
color:#fff;
}
.contenedor{
float:left;
}
.comentario.der {
float:left;
}
.comentario.izq {
float:right;
}
.comentario.top {
float:none;
}
.comentario.bot {
float:none;
}
.bocado-izq {
border-bottom:20px solid transparent;
border-right:25px solid #336699;
border-top:20px solid transparent;
height:0;
width:0;
float:left;
}
.bocado-der {
border-bottom:20px solid transparent;
border-left:25px solid #336699;
border-top:20px solid transparent;
height:0;
width:0;
float:right;
}
.bocado-top {
border-bottom:25px solid #336699;
border-left:20px solid transparent;
border-right:20px solid transparent;
height:0;
width:0;
}
.bocado-top_mid {
border-bottom:25px solid #336699;
border-left:20px solid transparent;
border-right:20px solid transparent;
height:0;
width:0;
margin: 0 auto;
}
.bocado-bot {
border-left:20px solid transparent;
border-top:25px solid #336699;
border-right:20px solid transparent;
height:0;
width:0;
float:right;
}
.bocado-bot_mid {
border-left:20px solid transparent;
border-top:25px solid #336699;
border-right:20px solid transparent;
height:0;
width:0;
margin:0 auto;
}
.clear{
clear:both;
}
HTML:
<div> <div>Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.</div> <div></div> </div> <div></div> <br /> <div> <div>Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.</div> <div></div> </div> <div></div> <br /> <div> <div></div> <div>Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.</div> </div> <div></div> <br /> <div> <div></div> <div>Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.</div> </div> <div></div> <br /> <div> <div>Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.</div> <div></div> </div> <div></div> <br /> <div> <div>Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.Lorem ipsum dolor sit amet, nulla viverra diam faucibus dictum. Nulla facilisi. Donec sit amet dolor at sapien accumsan consectetuer.</div> <div></div> </div>
Aug 8th
El problema mas común a la hora de querer hacer que un formulario se repita mas de una vez en una misma pagina, es que cada uno de los formularios que se vayan creando van a ser solamente una fiel copia del anterior. Dicho de otra forma, estamos usando un solo formulario pero copiandolo en varios lados de la pagina.
Tuve este problema hace ya mas de un año pero no me olvido lo JODIDA-MENTE DIFÍCIL que me fue encontrar una solución, hasta que me di con esta pagina. Cuestión, que me salvó la vida (exagerado yo?). Por supuesto que les recomiendo que lean el articulo original, pero mas les recomiendo que lean mi interpretación de los hechos que esta mas buena
.
Para este ejemplo primero vamos a crear una url donde poder poner nuestras múltiples instancias:
/**
* Implementacion del hook_menu()
* Solo esta implementada una URL para poder hacer este ejemplo.
*/
function form_multi_instancias_menu(){
$items['form-multiples-instancias'] = array(
'title' => t('Formulario multi instanciado'),
'page callback' => 'form_multiples_instancias',
'type' => MENU_NORMAL_ITEM,
'access callback' => TRUE,
);
return $items;
}
Y la respectiva función:
/**
* En este callback de la url queremos crear varias instancias
* del mismo formulario.
*/
function form_multiples_instancias() {
$salida = 'Si le hechas una mirada al codigo fuente vas a poder ver que el "form_id" de cada formulario es distinto, asi como el "form_build_id".
';
//en este ejemplo simplemente usamos un contador para crear los
//formularios, pero podriamos estar procesando nodos tranquilamente.
for($i = 0; $i < 5; $i ++) {
/*
* Noten que estoy armando dinamicamente el
* drupal_get_form(). Lo siguiente equivaldria a hacer:
* $salida .= drupal_get_form ( "form_ejemplo_0" , 0);
* $salida .= drupal_get_form ( "form_ejemplo_1" , 1);
* $salida .= drupal_get_form ( "form_ejemplo_2" , 2);
* etc...
*/
$salida .= drupal_get_form ( "form_ejemplo_" . $i , $i);
}
return $salida;
}
Si van leyendo los comentarios del código se va a ir entendiendo. Definamos el formulario que queremos instanciar:
//Este es un FAPI comun de toda la vida
function form_ejemplo( $form_state, $i ){
$form['un_campo_de_texto'] = array(
'#type' => 'textfield',
'#title' => t('Un campo de texto de ejemplo'),
'#default_value' => $i,
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => "enviame",
);
$form['#validate'] = array("form_ejemplo_validate");
$form['#submit'] = array("form_ejemplo_submit");
return $form;
}
function form_ejemplo_validate( $form_state, $form ){
drupal_set_message("He validado.");
}
function form_ejemplo_submit( $form_state, $form ){
drupal_set_message (
t ( 'Y el formulario enviado fue el Nº @form_number.',
array (
'@form_number' => $form_state ["un_campo_de_texto"] ["#value"] )
)
);
}
//Este es el fin del FAPI comun de toda la vida
Bueno bueno bueno… hasta acá, si ejecutas el script lo que pasaría es que te saldrían tantos warning como formularios se invoquen. Y eso es debido a que no tenemos ningún formulario definido que se llame form_ejemplo_0, ni form_ejemplo_1, etc.
¿Soluciones?: Crear de la función form_ejemplo_0() para delante jajaja. No enserio, la solución es implementar el hook_forms(), que básicamente va a entender que se esta invocando un formulario inexistente y va a redireccionarlo a la definición ÚNICA que tenemos: form_ejemplo().
/**
* Acá es donde se va a hacer la magia:
* Resulta que por cada formulario que se invoca, el
* hook_forms() es capaz de actuar como si de un hook_form_alter()
* se tratara pero lo hace antes que se termine de armar
* el array FAPI mas basico que crea Drupal.
* O sea que intercede antes de que se le genere a cada
* formulario sus #form_build_id, lo que nos permite
* sobreescribir ciertos aspectos como ser la funcion
* que alimentará el futuro formulario.
*/
function form_multi_instancias_forms($form_id, $args) {
$forms = array();
//para no cambiarle el callback a todos los formularios
//que se creen hacemos un pequeño if. caso contrario
//tendriamos un problema GORDO.
if (strpos($form_id, 'form_ejemplo_') === 0) {
//hemos dado con una de las variantes del formulario que
//estamos instanciando, solamente tenemos que apuntar
//su callback al formulario que hemos definido.
$forms[$form_id] = array('callback' => 'form_ejemplo');
}
return $forms;
}
Bueno. ya está. este código así, funciona. Les dejo un mini-modulo con lo anterior para que lo vean funcionar. Instalenlo y miren en la URL “/form-multiples-instancias”
Aug 8th
Un problema con el que me suelo dar de tanto en tanto son las codificaciones de caracteres. En especial la de acentos, la ñ y el signo de pregunta de apertura (¿).
El problema mas común que me encontré en mis primeros tiempos como desarrollador de módulos de Drupal fue que de tanto en tanto abría un modulo, y este tenia los caracteres especiales hechos pedazos, mal codificados.
Probé con todo tipo de yerbas raras. Desde usar funciones de todo tipo de encoding de PHP hasta cambiar la collation de la DB…
Pero la solución estaba tan al alcance de la mano que me llegue a sentir un autentico boludo cuando me cayeron las fichas: ¡La codificación de los archivos!. Si señor/a, no me había fijado en la codificación de los archivos (*.module, *.php, *.install, *.inc, etc).
Lo único que hay que hacer para que todo funcione como la seda son unas pocas cosas:
Que el archivo esté codificado en UTF-8. Podés saber que codificación tiene abriéndolo con Notepad++ y yendo al menú “Formato” como se ve en la imagen:
Y si ven que no está seteado en “UTF-8 sin BOM” o “UTF-8”, pueden convertirlo a cualquiera de estos formatos en el mismo menú:
(Para nosotros usar “UTF-8 sin BOM” o “UTF-8” nos es indistinto
)
En el caso de los IDE deben saber que Netbeans y Zend Studio de serie vienen configurados para crear y tratar a los archivos bajo UTF-8, mientras que Eclipse NO.
Entonces, si usas Eclipse solo tenes que tocar un detalle en la configuración general para despreocuparte de este asunto:
Vayan al menú “Window -> preferences” y en el menú de preferencias deben ir a “General -> Workspace”. Cambien la codificación que haya puesta por la de UTF-8 como se ve en la imagen.

Otra cosa mas. Si trabajan con GIT sepan que tampoco codifica los archivos en UTF-8, y se soluciona yendo a sus opciones y cambiándolo.
Con lo anterior podes olvidarte de tener problemas de codificación De hecho podes dejar de usar entidades HTML y demases, y solo con usar t(“áéíóúñ”) que no vas a tener mas problemas.
Lo ultimo que quiero comentar es que si trabajan con mas gente sobre estos módulos, asegurate que todos tengan bien configurado su IDE o editor para evitar que los codifique mal (con solo abrir un archivo UTF-8 con un editor que no esté en ese formato es muy posible que al editarle una letra y guardarlo lo haga pedazos!).
Aug 3rd
Suele hacer falta poder ver los errores de PHP en Drupal de vez en cuando.
Abrí el archivo index.php de Drupal y poné lo siguiente justo por encima de “require_once ‘./includes/bootstrap.inc’;“:
//Reportar errores PHP error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); //Fin reportar errores PHP
Jul 22nd
Resumiendo la situación:
Tengo un par de content types que en realidad no son accesibles públicamente y no me interesa que se creen alias para ellos.
Puede que por mera intuición mucha gente haya solucionado este problema, pero como acostumbro matar moscas con bazucas no se me ocurrió antes…
Es simple:
andá a la administración de Pathauto:
www.ejemplo.com/admin/build/path/pathauto
Desplega “Opciones de rutas de nodos”
Borra el patrón predefinido global (el primer campo de la lista)
pone alias a los content type que te interese y el resto dejaos en blanco.
Listo!
Deshabilitar Pathauto en determinados content types
Resumiendo la situación:
Tengo un par de content types que en realidad no son accesibles públicamente y no me interesa que se creen alias para ellos.
Puede que por mera intuición mucha gente haya solucionado este problema, pero como acostumbro matar moscas con bazucas no se me ocurrió antes…
Es simple:
andá a la administración de Pathauto:
www.ejemplo.com/admin/build/path/pathauto
Desplega “Opciones de rutas de nodos”
Borra el patrón predefinido global (el primer campo de la lista)
pone alias a los content type que te interese y el resto dejaos en blanco.
Listo!
Jul 15th
sudo gedit /etc/network/interfaces
auto eth0 iface eth0 inet dhcp
sudo /etc/init.d/networking restart
Jul 7th
mysql -uUSUARIO -pCLAVE capy_db < /home/capy/Descargas/dump.sql
-uUSUARIO: nombre del usuario mysql con privilegios sobre la BD
-pCLAVE: clave del usuario
<: indicamos que vamos a lanzar el siguiente SQL sobre la BD
/home/capy/Descargas/dump.sql: Ruta hasta donde tenemos guardado el dump.
Jul 5th
Me pasó que me cloné de un repo y como no tenía los permisos adecuados fui con sudo y le metí un 777 a todo el repositorio. Que boludo que fui. Por no leer un poco antes de hacer esa perrada, me di con que a la hora de comitear todos los archivos presentaban cambios, puntualmente todos decían:
old mode 100644 new mode 100755
Solucionando el problema:
primero reviertan la situación cambiándole nuevamente los permisos a todos los archivos con:
sudo chmod 644 -R ./mi-proyecto/
En el paso anterior estoy asumiendo que los permisos originales eran 644 para todos lo archivos del proyecto.
Lo segundo es hacer las cosas bien. Para ello basta con cambiar el owner y grupo al directorio:
sudo chown nobody:nogroup mi-proyecto
y listo. Ahora cualquier usuario tiene privilegios sobre este proyecto por lo que no hace falta cambiarle permisos