Uso de la función l() para crear links en Drupal 6

Hace ya tiempo que no pongo ningún artículo sobre desarrollo con Drupal, a continuación explico los usos más comunes de la función l() para generar links de forma segura y sencilla.

Creando links en Drupal 6: la función l()

La función l() permite generar links en el código y es una práctica recomendada para el desarrollo con Drupal, pasando los enlaces a través de esta función nos aseguramos de que las rutas se generan bien y nos ahorramos problemas de seguridad (ya que se filtra el texto) y también con los alias, ya que es consciente del alias que tiene cada contenido y se genera correctamente, por ejemplo si tenemos un enlace al primer nodo node/1 y tiene un alias como contenido/primer-articulo, si cambiamos el alias, un link construido con l() no será necesario modificarlo.

Sintaxis

l($text, $path, $options = array());

  • $text - El texto que se mostrará en el enlace, es recomendable pasarlo a través de una función t() si trabajamos con traducciones y sitios multilenguaje.
  • $path - Ruta a la que accede el link.
  • $options - Array de opciones que nos va a permitir alterar el comportamiento del enlace, permitir HTML, añadir clases CSS...

Por ejemplo, un link a un contenido fijo, el formulario de contacto:

print l('Contacta', 'contact');
?>

Otro ejemplo, un link a un nodo, pasado por traducción.

print l(t('Enlace al contenido'), 'node/4');
?>

Si queremos enlazar la home, debemos usar la cadena <front>.

print l(t('Home'), '');
?>

Jugando con las opciones: Añadiendo clases css.

Pasando atributos al array $options se pueden añadir comportamientos a los enlaces, por ejemplo, añadirle CSS o un título.

print l(t('Home'), '',
array('attributes' =>
array(
'class' => 'frontpage-link',
'title' => t('Home'),
)
)
);
?>

Jugando con las opciones: Links internos.

El elemento fragment de las opciones de l() permite hacer links a anchors por su nombre.

print l(t('Link a anchor'), '', array('fragment' => 'nombre-del-anchor', 'external' => TRUE));
?>

Jugando con las opciones: Links a imágenes.

Podemos hacer links a imágenes o a otros elementos HTML, para eso deberemos especificar el valor html a TRUE en el array de las $options, ejemplo:

$attributes = array('attributes' => array('title' => t('Título del enlace')), 'html' => TRUE);
$link = l(''.t('Texto para el alt').'', 'ruta/del/link', $attributes);
print $link;
?>

Bonus:

Para crear urls con parámetros (? e =) debemos utilizar $query en el array de $options, por ejemplo para generar un link del tipo /user/login?destination=node/add/session podemos hacer algo así:

print l(t('User login'), 'user/login', array('html' => true, 'query' => 'destination=node/add/session');
?>

También podemos hacer links con l() cuando intentamos enlazar un anchor que no está en nuestra página actual, de nuevo con $fragment:

print l(t('Enlace anchor'), 'node/150', array('fragment' => 'ancla1'));
?>

Gracias a sipuedo por estos dos ejemplos extra :)

Si necesitáis información extra, en el API de Drupal, podéis encontrar la referencia completa a la función l()

Comentarios

Genial ;)

Una "cosilla" que creo que es importante(por lo menos para mi) y es el tema de la codificacion de los caracteres sobre todo '?' y '='.
Por ejemplo si el link fuera "/user/login?destination=node/add/session" ;) el resultado seria /user/login%3Fdestination%3Dnode/add/session por lo que daria error.
La solucion se encuentra en el $options->query :P y seria mas o menos asi:
print l( $text, 'user/login', array('html' => true, 'query' => 'destination=node/add/session') );

Serviría tambíen para meter un link con una ancla html del tipo node/150#ancla1 node/150#ancla2 ?

En $options con fragment
print l( $text, 'node/150', array('fragment' => 'ancla1') );

<p>
Muchas gracias por los ejemplos Javier :D</p>

Primero, gracias por tu aporte, pero yo tengo una duda, yo kiero meter unos links en la eskina superior izkierda de la pagina pero que tenga imagenes en lugar de texto, similar como se hace con el primary_links:
link1 link2 link3
hasta ahora el codigo que tengo es este:
**************************************
$attributes = array( 'class' => 'test' );
$current_lang = i18n_get_lang();
$link1 = NULL;
$link2 = NULL;
$link3 = NULL;
if ($current_lang == "es") {
$link1 = l('Uno', 'node/10', $attributes);
$link1 = l('Dos', 'node/11', $attributes);
$link1 = l('Tres', 'node/12', $attributes);
} else {
$link1 = l('One', 'node/13', $attributes);
$link1 = l('Two', 'node/14', $attributes);
$link1 = l('Three', 'node/15', $attributes);
}
print $link1;
print $link2;
print $link3;
**************************************
esto me funciona pero yo me preguntaba si no hay alguna manera de que no tenga que hacer la comparacion con el if, sino que simplemente ponga una llamada a la funcion l() y ke este genere el link cuando se selecciona el lenguaje correspondiente, uso los modulos locale y content translation para la traduccion, ya le busque, pero este fue la unica solucion ke se me ocurrio, no se si tu podrias ayudarme. Te lo agradeceria mucho.
P.D. Esta chida tu pagina. Saludos desde Mexico.

Genial articulo, pero hay algo que quizas alguie me pueda ayudar, necesito anexar al link un tag span quedaria así:

<ul><li><a href="#"><span>Link</span></a></li></ul>

Alguien sabria como hacerlo? Ya he intentado de mil maneras pero no puedo y es que soy muy novato :P Gracias por todo.

Genial :D

vuelvo a poner el html q debe generar

>>>> <span><a h ref="">Link</span></a> <<<<

<p>
marco, si pones el html, ponlo entre etiquetas code, o etiquetas pre, si no, el navegador te lo va a interpretar y convertir</p>

que tal, pues tengo una duda sobre como hacer un link, donde se tiene alias, y es multi-idioma, ejemplo, un link de "contactanos", se tienen ya que
español:
- ruta: node/1
- alias. "contactanos"
engles:
- ruta: node/2
- alias "contact us"
frances:
- ruta: node/3
- alias: "Nous contacter"

he hecho algunos intentos,
print l(t("contact us"),'node/2',
array('attributes' => array('width'=> '228', 'height'=>'33'),
'html' => 'true',
'language' => $language,
)
);

Una pregunta yo cree un modulo y ese modulo lo active y lo coloque como un bloque y tiene un enlace a una pagina php que yo hice mi duda es que como hago para que esa pagina de php me habra dentro del contenido de drupal y no afuera de drupal...osea que me trate ese enlace como un nodo cuando creamos una pagina basica por el asistente de drupal...
mi url es esta:
$url='sites/all/modules/galeriaimagenes/galeria_enlace.php';
$link = l( t("Galeria imagenes"), "$url");
yo quiero que galeria_enlace.php drupal lo vea como un nodo y lo abra del contenido de drupal..

la drupalada del solsticio de verano se caracterizará, como todas las demás, por el buen rollo, por las ideas drupaleras de calidad que siempre mantenemos y por grandes dosis de cerveza<a href="http://www.your-mortgage-calculator.com">.</a>

Estimado
Y como se haria un link a un tema de entre los que estan activos?

Por favor me podrias apoyar utilice el codigo para imagenes
<?php
$attributes = array('attributes' => array('title' => t('Título del enlace')), 'html' => TRUE);
$link = l('<img src=" /sites/default/files/tupa-sanjuan_0.jpg'. $image_path .'" alt="15'.t('Texto para el alt').'">', 'ruta/del/link', $attributes);
print $link;
?>
y me muestra pero sale un error: Undefined variable: image_path en eval() (línea 3 de /home/munisanjuan/public_html/modules/php/php.module(80) : eval()'d code).

Añadir nuevo comentario