Drupal 7 “500 – Internal server error” [SOLVED]

When you want to install a new Drupal 7 in a shared server or some web hosts, specially those concerned with security settings, there is a good chance that all you get is a “500 internal server error”. This is usually due to the .htaccess file included with the installation, and more precisely to these lines:

# Follow symbolic links in this directory.
Options +FollowSymLinks

Some web hosts tighten up security settings and now forbid +FollowSymLinks option in .htaccess. This causes an 500 error when accesing the site.

The fix is quite simple. Just replace +FollowSymLinks with +SymLinksIfOwnerMatch. So edit the lines above to this:

# Follow symbolic links in this directory.
# comment this one...
# Options +FollowSymLinks
# add this new line...
Options +SymLinksIfOwnerMatch

The issue should be fixed.

Please note that there is not just one .htacess file in your Drupal 7 site. There is one in / and usually there are other .htaccess files that must be modified too, for instance in sites/default/files. You must change that one too or every image that you upload to your Drupal 7 site won’t be rendered…

Discussion about this topic available here: http://drupal.org/node/1269780

Drupal 7: Display search box in page.tpl.php or other template files [SOLVED]

Let’s assume you want to display a search box in your Drupal 7 theme. You can do it several ways: rendering the search form, rendering a block which contains it, using template.php or page.tpl.php.

Thirty-second intro to Drupal theming

If you are new to Drupal, let me explain how the themes work.

Each theme is a directory (under sites/all/themes/yourthemename) with at least three files:

* The first one, the .info file, called yourthemename.info, describes the theme (regions, path to stylesheet, javascript files, blablabla).

* The second one, which contains the logic (php code) is called template.php, and

* the third one is the html markup file (ideally, with just some php print’s) called page.tpl.php.

The concept is quite simple: you generate some variables in template.php and print them in page.tpl.php.

Now that we understand the basics, you will find this examples quite self-explaining:

The dirty way: display Drupal form in page.tpl.php

First way to show a search box in your Drupal theme works as expected, but it is not the way you are supposed to implement it.

This adds the logic to show a search form directly in your View file (page.tpl.php).

This practice should be avoided, as there must not be any logic inside .tpl.php files… Anyway, Drupal allows it, so:

Edit page.tpl.php (in your theme folder, in /sites/default/MYTHEME) and add these two lines, which will render a block containing a search form:

// this is page.tpl.php
// insert a search_form here...
$block = module_invoke('search','block_view','form');
//  'search' is the module invoking the block. 
//  'block_view' is the operation we want to call, that is, we want to view the block, and 
//  'form' is the machine name of the block you want to print.
// You can get this information by hovering over the edit link on the block overview page at admin/structure/block
// Edit links will be in the form
//       /admin/structure/block/manage/MODULENAME/BLOCK_MACHINENAME/configure
// now we print the block...
print render($block);

You can read more about module_invoke and render function in drupal documentation.

The right way: show a search block in your Drupal 7 theme

We can set a variable containing a search block in template.php:

// this is template.php, where the logic goes...
// replace MYTHEME with your theme name (like the theme folder containing the theme)
function MYTHEME_preprocess_page(&$variables)
    $block = module_invoke('search','block_view','search');
    $rendered_block = render($block);
    $variables['mysearchblock'] = $rendered_block;

And then print that variable in your page.tpl.php file:

// this is page.tpl.php, where the presentation (view) is generated:
   // ... custom html stuff ...
   // print our rendered search block...
   print $mysearchblock;

The right way: display Drupal 7 search form in theme

Instead of rendering the block, we will be rendering the form (not a block, but the full search form instead):

Let’s put the logic where it should be, in template.php:

// this is template.php, where the logic goes...
// replace MYTHEME with your theme name 
function MYTHEME_preprocess_page(&$variables)
    $search_box = drupal_render(drupal_get_form('search_form'));
    $variables['my_search_box'] = $search_box; 

And then, in our page.tpl.php, just print that $my_search_box variable we just set earlier…

// this is page.tpl.php
print $my_search_box

If done like so, it will work and render the search form, but it will spit out something like
Strict warning: Only variables should be passed by reference in

This has to be with variables being passed as reference, and not creating an instance for those first. Read this for further information.

So, let’s fix it.

In template.php:

// this is template.php
function MYTHEME_preprocess_page(&$variables){
  // para poder usar una caja de búsqueda en los templates .tpl.php de Drupal 7...	
  $form = drupal_get_form('search_form');
  $cajabusqueda = drupal_render($form);
  $variables['cajabusqueda'] = $cajabusqueda;   

Drupal 7: Pathauto url pattern page is empty [SOLVED]

If you install Pathauto 7.x-1.2 in the last Drupal stable version (7.21) and try to define some new url patterns for your content type’s (under ?q=admin/config/search/path/patterns or Administration > Search and metadata > Url aliases > Pattern tab) it is likely that an empty “ugly” page shows up…

This was driving me nuts but I finally found how to make it work.

Drupal 7.21
Token 7.x-1.5
Pathauto 7.x-1.2
Admin theme: Seven

The fix
It seems that Seven theme is responsible for this. This theme has some issues with js/jQuery and won’t show (out of the box) the Pathauto pattern’s.

To fix it, just go to Appearance, scroll down to the bottom of the page and select “Bartik” or “Garland” instead of “Seven“.

Now save, and reload ?q=admin/config/search/path/patterns. The pattern tab info should be nicely displayed now.

If it works, you can try to activate Seven theme for admin again. In my case, it worked.

*** UPDATE 20130427***
If the steps above won’t fix the issue, then edit your php.ini field and try to increase memory_limit to a higher value. For instance, in my case I changed from:

memory_limit = 32M


memory_limit = 64M

After updating php.ini do not forget to restart your web server!

Further information: http://drupal.org/node/1267966

Drupal not showing contact form menu item [solved]

Drupal is not showing the contact form menu item?

Then you should check:

  1. Whether the menu item is enabled (admin/build/menu/): enable it, if it is disabled
  2. Whether the menu item is showing when the user is logged in: if you do the above, it will
  3. Allow annonymous user (not logged) to ‘access site-wide contact form’ (admin/user/permissions/)

Drupal: Override node.tpl.php using Zen theme [solved]

If you are familiar to drupal zen theme then you will know how to create zen subtheme’s. But, what if you want to override the drupal’s default node.tpl.php?

First of all, you should install the theme developer module and then check what file you must replace. In this example we will override the /sites/all/themes/zen/modules/node.tpl.php with my custom code for theming a CCK node (content type=’product’). So, follow these steps (the subtheme name is called ‘mysubtheme’)

  1. Copy sites/all/themes/zen/modules/node.tpl.php to sites/all/themes/mysubtheme/modules/node.tpl.php
  2. Copy sites/all/themes/zen/modules/node.tpl.php to sites/all/themes/mysubtheme/modules/node-product.tpl.php

Please note that you have to also copy node.tpl.php to your mysubtheme subtheme modules folder. If the node.tpl.php file from zen is not copied into the sub-theme then the content type variants i.e. node-[content-type].tpl.php are not seen. Once the node.tpl.php is copied to the sub theme then all is good 🙂 (took me a while to figure this out!)

Translate “Contact form” module Drupal [SOLVED]

The crappy way

Delete the “additional information” text in admin/build/contact/settings

The easy way

Just download tContact module, and add these lines to your settings.php file.

$conf['i18n_variables'][] = 'contact_form_information';
$conf['i18n_variables'][] = 'contactforms_information';

The hard way

After hours of research, I’ve finally come up with a default core solution that I’d like to share with everyone on how to translate the Contact form module that comes with Drupal in Drupal 6.x.

Basic Instructions:

Make sure your Contact form module is enabled first, of course.

Go to drupal\modules\contact and open the file contact.pages.inc.
Go to line 41.

Replace the code…

$form[‘contact_information’] = array(‘#value’ => filter_xss_admin(variable_get(‘contact_form_information’, t(‘You can leave a message using the contact form below.’))));


$form[‘contact_information’] = array(‘#value’ => t(filter_xss_admin(variable_get(‘contact_form_information’, ‘You can leave a message using the contact form below.’))));

Once replaced, save the page.
Next, install the module String Overrides.
Once installed, go to the String Overrides main page on your Drupal site under admin/settings/stringoverrides and click on the preferred language you would like to translate your contact form text to.
Make sure you originally replace “Contact” with the appropriate translation for “Contact” under your preferred language, and also for the text “You can leave a message using the contact form below.” Keep in mind that if you have changed that text, then you should translate the text that you changed it to instead.

After all this has been done, you’ll have a sweet translated contact form.

Refer to this link and this other for further details.

Drupal: customize language switcher block

If you are runnning a drupal multilingual site, you might be using i18n with language icons modules.

I’ve received some mails asking how to customize the aspect of the multilang switcher block. Easy!

Log in as admin and navigate to /admin/settings/language/icons
There you will be able to
1) customize the Icon placement (before link (after link) means that the language icon will be placed before (after) the language text, or just replace link which means no text will be displayed, just the language icon ).
2) customize the path to the language icons (default is sites/default/modules/languageicons/flags/*.png
3) customize the size of language icons (default is 16×12)

But you can also customize the way in which those icons are shown. For instance, you can change from vertical list to horizontal list by editing your CSS file and

.block-locale-0 li{
	list-style-image: none;

In my drupal, the language icons are showing in the sidebar, so for displaying an horizontal list, I set:

.sidebar ul li{
/*border-top:1px solid #979ea8;*/
list-style-type: none;
list-style-image: none;
/* para que los language icons salgan en horizontal */

For not showing the block’s title (inside an h2):

.sidebar h2{

Drupal theming: know if you are in homepage [solved]

It is very useful for drupal html designers to know if you are actually in the frontpage (home page) or not. I already explained how to know if you are on joomla homepage and knowing where you are (joomla).

Let’s see how this is done in drupal

For instance, if you want some code to appear ONLY on the front page use:

if ($is_front){
  //code that will only be showing on the homepage

if you want the table to appear on all frontpage-like pages (for e.g. the page that you get when you click on a taxonomy term), the use:

  //do stuff on all frontpage-like pages

Drupal para tontos (II): urls amigables con pathauto, theming de Views, etc

Ayer os conté cómo crear content types complejos con el módulo noderefURL. Como ejemplo creamos fichas de personas con datos propios y galería de fotos relacionada. Nuestro ejemplo es muy mejorable, veamos por qué:

1. Mejorar la URL: si visitamos el nodo de ejemplo que creamos en el anterior post, veremos que la URL es similar a:
www.tusitio.com/node/14. Esta URL es poco descriptiva. Para mejorarla usaremos los módulos Token, Path (instalado por defecto en Drupal 6) y Pathauto

2. Crear una categoría de menú para mostrar un listado de fichas: hemos creado una ficha y la hemos visto. Pero… ¿cómo veremos un listado de todas las fichas? ¿Cómo se ordenará esta visualización? ¿y si queremos tener una visualización “especial” del listado de fichas? Para ello usaremos el módulo Views

3. Crear “subcategorías” de fichas basándonos, por ejemplo, en el género. ¿Cómo añadir esta información a las fichas? Para ello usaremos el Módulo Taxonomy (ya instalado en Drupal 6). Si deseas puedes consultar este estupendo manual de taxonomy para drupal.

Configurando pathauto y URL’s automáticas

Vamos a empezar instalando y activando todos los módulos enumerados anteriormente. A continuación vamos a ir a /admin/build/path/pathauto y desplegaremos los Node path settings. En esta sección, en Patter for all Ficha paths ponemos fichas/[titler-raw].

pathauto drupal node path settings

Para que nuestro nodo de ejemplo tenga una URL de este tipo deberemos editarlo, desplegar las ULR path settings y marcar Automatic alias. La URL del nodo será ahora del tipo /ficha/miguel-martín.

pathauto drupal tilde

Si os fijáis, esta URL contiene una tilde. Como deseo eliminar las tildes de las URL’s, vuelvo a las opciones de pathauto y marco, en General Settings la opción Reduce strings to letters and numbers from ASCII-96.

Si deseo que funcionen tanto /ficha/miguel-martín como /ficha/miguel-martin deberé marcar, además, en las Update action de General Settings, la opción Create a new alias. Leave the existing alias functioning.

pathauto configuration drupal

Si ya tenía muchos nodos creados sin asignar url’s, puedo marcar la opción Bulk generate aliases for nodes that are not aliased y se generarán de forma automática estas URL’s. ¿No es genial?

Creando un listado de “Fichas” usando Views

Ahora vamos a jugar con el módulo Views para que al insertar la url /ficha nos liste todos los nodos de este tipo. Veamos cómo (si queréis leerlo en inglés, podéis hacerlo en este excelente tutorial).

Empezamos yendo al menú de Views (/admin/build/views) y pulsamos Add. Nos solicita varios datos (ver siguiente imagen):

drupal views add new view

Pulsamos Next.

Lo próximo que vamos a hacer es añadir campos (Add Fields) sobre qué deseamos mostrar. En mi caso marco:
* Content-foto (field_foto) [OJO! Cuando lo añadas, la última opción es “FORMAT” y debe tener seleccionado Image para que la imagen se muestre como tal ]
* Node: Link
* Node: Path
* Node: Title

Y pulso “add”.

Ahora tengo que añadir un FILTRO (Filter) para que esta vista sólo me muestre los nodos que me interesann.
* Filtro por Node Type == ‘ficha’. (elegimos en el filtro la opción Node: Type)

taxonomy filter drupal

A continuación hay que crear un Display para esta vista. Puede ser tanto una página, como un bloque, como un feed. En mi caso crearé una página (Page), pero perfectamente podría ser un bloque. Los matices entre página, bloque, feed, etc, los podéis leer en el manual del módulo Views.

Bien, pulsamos en Add Display. Veremos que en la parte inferior aparece la opción de darle un Path. Pulsamos sobre None y en el campo que aparece la URL, insertamos la palabra ‘ficha’. Se han marcado los pasos en la siguiente imagen (click para ampliarla):

drupal views add display page

Además, si nos fijamos, aparece la consulta (query) mysql que genera esta vista. En mi caso la consulta es:

SELECT node.nid AS nid,
   node_data_field_foto.field_foto_fid AS node_data_field_foto_field_foto_fid,
   node_data_field_foto.field_foto_list AS node_data_field_foto_field_foto_list,
   node_data_field_foto.field_foto_data AS node_data_field_foto_field_foto_data,
   node_data_field_foto.delta AS node_data_field_foto_delta,
   node.type AS node_type,
   node.vid AS node_vid,
   node.title AS node_title
 FROM drup_node node 
 LEFT JOIN drup_content_field_foto node_data_field_foto ON node.vid = node_data_field_foto.vid
 WHERE node.type in ('ficha')

También aparece una previsualización (preview) de cómo se ve el resultado de la ficha:
drupal views page display preview

Dando estilo a los Page Display’s creados con Views usando el módulo Theme Developer

Ya hemos creado nuestra nueva vista. Veamos qué aspecto tiene:

drupal preview

Si os fijáis, en la parte inferior derecha aparece una ventanita negra (Drupal Themer Information), que forma parte del paquete Theme Developer. Este paquete resulta de mucha utilidad cuando estamos creando temas. Nos dice qué fichero está produciendo esa salida (en este caso, es el views-view-fields.tpl.php).

A continuación vamos a personalizar ese fichero. Deseamos personalizarlo SOLO para esta vista, y no para las demás. Por tanto deberemos crear un NUEVO fichero para darle el estilo que deseemos a nuestro listado de fichas. Sin embargo, aun nos queda una duda: ¿cómo nombrar a ese nuevo fichero?

Entre los nombres propuestos por Drupal en esta View para las Row style output elijo views-view-fields–listafichas–page-1.tpl.php y pulso Rescan Template Files. Aparecerá en negrita el nuevo fichero usado para formatear la vista:

drupal views module template scan

Para empezar es bueno que se muestren los valores de los fields “en bruto” (el vector) y asi a partir de ahí ir jugando. Para ello, prueba el siguiente código (presta atención a las últimas líneas):

// $Id: views-view-fields.tpl.php,v 1.6 2008/09/24 22:48:21 merlinofchaos Exp $
 * @file views-view-fields.tpl.php
 * Default simple view template to all the fields as a row.
 * - $view: The view in use.
 * - $fields: an array of $field objects. Each one contains:
 *   - $field->content: The output of the field.
 *   - $field->raw: The raw data for the field, if it exists. This is NOT output safe.
 *   - $field->class: The safe class id to use.
 *   - $field->handler: The Views field handler object controlling this field. Do not use
 *     var_export to dump this object, as it can't handle the recursion.
 *   - $field->inline: Whether or not the field should be inline.
 *   - $field->inline_html: either div or span based on the above flag.
 *   - $field->separator: an optional separator that may appear before a field.
 * - $row: The raw result object from the query, with all data it fetched.
 * @ingroup views_templates
<?php foreach ($fields as $id => $field): ?>
  <?php if (!empty($field->separator)): ?>
    <?php print $field->separator; ?>
  <?php endif; ?>
  <<?php print $field->inline_html;?> class="views-field-<?php print $field->class; ?>">
    <?php if ($field->label): ?>
      <label class="views-label-<?php print $field->class; ?>">
        <?php print $field->label; ?>:
    <?php endif; ?>
      // $field->element_type is either SPAN or DIV depending upon whether or not
      // the field is a 'block' element type or 'inline' element type.
      <<?php print $field->element_type; ?> class="field-content"><?php print $field->content; ?></<?php print $field->element_type; ?>>
  </<?php print $field->inline_html;?>>
<?php endforeach; ?>
//print print_r(array_keys(get_defined_vars()), 1);
//print print_r(array_keys($fields))
// O si tienes instalado el módulo developer, usa la función dpm o  dprint_r:
echo "<br />".dpm($fields);."<br />";

Esta función dsm nos crea una caja amarilla con la información de las variables (fields) que podemos usar:

drupal views module dsm function

Por ejemplo podemos acceder a la variable field_foto_fid, que es la que contiene la “imagen de perfil” de la ficha con:

print "<pre>".print_r($fields['field_foto_fid']->content)."


¡A partir de este punto las posibilidades son ilimitadas!

En vez de escribir un rollo enorme, podéis ver este completo screencast sobre theming con views.

Drupal para tontos: crear un nuevo Content Type COMPUESTO para galería fotográfica

Hoy os voy a explicar cómo crear nuevos Content Types complejos. ¿Para qué sirve esto? Imagina que quieres hacer “fichas” de usuarios, que contengan, por ejemplo:
– Fotografía de perfil
– URL de su página web
– Texto
– Galería de fotos asociada

Queremos llegar a algo parecido a:
drupal custom content type complex nodereference style css

Imagina, además, que la galería se actualiza muy a menudo, pero no el resto de campos. O que quieres dar al usuario la opción de modificar las fotos de su galería, pero no el resto de campos. O quieres que un usuario tenga la opción de tener varias galerías, y ya tienes un Content Type galería que te gustaría seguir usando. O muchísimos otros casos donde queremos gestionar por separado unos datos del nodo de otros.

Una opción muy interesante para solventar este problema es crear Content Types complejos (con datos propios al nodo y “punteros” que “apuntan” a nodos de otro tipo).

Módulos necesarios

Para realizar los pasos que vienen a continuación es necesario tener instalados los siguientes módulos en Drupal. El orden en que los pongo es el orden en que los instalé yo (si no tienes ni idea, aqui puedes ver cómo instalar un módulo drupal):

Una vez instalados todos los módulos deberemos activarlos (/admin/build/modules).

Proceso de configuración

Ya tenemos instalados, activados y en funcionamiento nuestros módulos. Ahora hay que crear el nuevo Content Type (/admin/content/types/). En mi caso, hay dos tipos de nodos que intervienen:
1) Nodo “ficha”, que contendrá como propios los campos: url, cuerpo, foto y como puntero (node reference) la galería de fotos en cuestión.
drupal custom content type

2) Nodo tipo “gallery” (contiene la galería de fotos en sí misma). Este Content Type se crea de forma automática al instalar Gallery Assist.

A la hora de crear el nodo “ficha”, los Custom Fields quedan asi (click para ampliar la imagen):
custom content type fields drupal

En Manage Fields vemos el campo url (Type: text, Name: field_url), el campo foto (Type: File, Name: field_foto) y el campo galleria_fotos (Type: Node reference, Name: field_noderefgalleryassist).

Cuando creé este último campo, tuve que elegir el widget usado durante la creación del nodo. Hay varias opciones para este campo. Yo marco ‘select list’. A continuación una pequeña explicación (en inglés) sobre qué diferencias hay entre cada opción:

Select list
if you don’t have too many nodes to choose from, this can be a great choice; the user can see all of her choices at once and make a decision on which node to reference;
Check boxes/radio buttons
if you need to refer to multiple nodes at once, checkboxes can help; and/or if the list of possibilities is even smaller than needed for a select list (5 to 9 at most), then radio buttons may be your choice;
this widget works very similar to a freetagging taxonomy selector or the Authored by: field at the bottom of a node form; you start typing, and Drupal will display a list of node titles that match the text you entered; you often only need to type a few letters to find exactly what you need, however, this requires the user to have some idea of what she is looking for; you also have the option to choose whether to search inside the node’s titles, or only at the beginning;

También deberé seleccionar el “tipo de contenidos que pueden ser referenciados” (Content types that can be referenced) y elijo “gallery”. El menú que nos permite realizar esta selección es similar a:

En Display Fields del tipo de nodo “ficha” (admin/content/node-type/ficha/display), prestemos especial atención al Field galleria_fotos, en especial al parámetro Full node, que debe tener seleccionado Teaser. Esto hace que nuestra galería G1 se muestre completa en la “Ficha” F1 con la que guarda relación. Más información sobre esto en el manual de theming complex data drupal.

drupal complex data

Creando nodos de ejemplo de tipo “ficha” y “gallery”

A continuación vamos a crear un nuevo nodo “Ficha” con una “gallery” asociada. Para ello primero creo la “gallery”, subo las fotos y guardo el nodo. Después creo una nueva “Ficha”, relleno los campos y selecciono de la lista de opciones la galería que deso enlazar a esta “ficha”.

Al final tendréis algo asi:
drupal custom types

Dándole estilo

Si habéis seguido los consejos hasta este punto, y no teneis customizada la plantilla de mostrar nodos, veréis algo asi:

Sí, sale, pero no como queremos. Por ello voy a crear dos plantillas personalizadas (custom templates) para mostrar los contenidos como yo deseo, una para la “ficha” y otra para la “gallery”.

* Plantilla para la galería: en /themes/garland/node-gallery_assist.tpl.php con el siguiente contenido:

// $Id: node.tpl.php,v 1.5 2007/10/11 09:51:29 goba Exp $
  <div class="content clear-block">
    <?php print $content ?>

* Plantilla para la ficha: en /themes/garland/node-ficha.tpl.php con el siguiente contenido:

// $Id: node-ficha.tpl.php,v 1.0 2010/07/05 08:39:36 miguelm Exp $
<?php if ($page == 0) { ?><h2 class="title"><a href="<?php print $node_url?>"><?php print $title?></a></h2><?php }; ?>
<div id="maincontainer" style="margin-left: 50px;">
  <br />
  <!-- para poner algo en la zona superior 
  <div id="topsection">
    <div class="innertube"><h1>CSS Liquid Layout #2.1- (Fixed-Fluid)</h1></div>
  <div id="contentwrapper" style="float: left; width: 100%;">
    <div id="contentcolumn" style="margin-left: 200px; >
      <div class="innertube" style="margin:10px">
      <?php /* para mostrar el cuerpo del nodo */ echo $node->content['body']['#value']; ?>
  <div id="leftcolumn" style="float: left; width: 200px; margin-left: -100%; font-size:">
    <div class="innertube">
      <?php /* para mostrar la imagen del campo field_foto */echo theme('imagefield_image', $node->field_foto[0], "", "", array('width' =>  '200'), $getsize = FALSE); ?>
      <br />
      <?php /* para mostrar la URL */ echo l(t('Visita la web de '.$title), $node->field_url[0]['safe'], array('class' => 'active'));?>
<?php echo $node->field_noderefgalleryassist[0]['view']; ?>

Ahora, si recargamos el nodo de la Ficha, veremos que queda como nosotros queríamos:
drupal custom content type complex nodereference style css

Espero que os haya sido útil 😉