Canviar la icona d'un camp de tipus filefield

Si estàs treballant amb Drupal i necessites poder pujar documents associats al contingut, segur que estaràs utilitzant el mòdul filefield. Aquest ofereix un marc de treball per a permetre pujar documents, a més a més, d'oferir un conjunt de funcionalitats força interessants de forma predeterminada. Malgrat que pugui semblar que no té cap inconvenient, per mi sí que en té un de molt important: les icones predeterminades són força lletges.

Doncs bé, en aquesta petita entrada, mostraré com canviar aquestes icones fàcilment.Tot el que vaig trobar per la xarxa per modificar les icones de camps filefield passava per crear una funció que sobreescrivís la predeterminada del tema, i allí, fer tots els canvis amb unes cadenes de condicionals força complexes. Personalment, vaig pensar que això no podia ser així i que segur que la cosa era molt més senzilla. Doncs després de llegir una mica el codi del mòdul, vaig veure que així era.

Organització de les icones

Si es dóna un cop d'ull al fitxer filefield.module i al filefield.theme.inc del mòdul filefield es pot veure que les icones associades als fitxers s'organitzen amb conjunts tancats anomenats temes. El filefield, de forma predeterminada, du un tema anomenat "default" on estan les icones que volem substituir. Per cert, el nom del tema que s'utilitza actualment es troba a la variable filefield_icon_theme.

Una forma fàcil de canviar les icones seria substituir les actuals, però fent això, estaríem modificant els fitxers del mòdul i amb això perdríem la possibilitat de fer futures actualitzacions sense problemes. Hem de trobar una forma no intrusiva de modificar el conjunt d'icones per fer servir les que nosaltres vulguem.

Un hook per a definir el nostre tema

Per sort, dins del món Drupal, modificar coses de forma senzilla és molt fàcil amb l'ús de hooks i funcions de sobreescriptura. En aquest cas, si mirem al fitxer filefield.module, podem trobar un hook força interessant, hook_filefield_icon_sets(), on la seva implementació per defecte és:

/**
 * Implementation of hook_filefield_icon_sets().
 *
 * Define a list of icon sets and directories that contain the icons.
 */
function filefield_filefield_icon_sets() {
  return array(
    'default' => drupal_get_path('module', 'filefield') . '/icons',
  );
}

Oh! És precisament el que necessitem, no? En aquesta funció es defineixen els temes mitjançant una clau i com a valor, se li dóna el camí cap al conjunt d'icones. Fantàstic!

Quines icones hi ha a dins del tema?

Si voleu saber quines icones heu de fer al vostre tema, podeu mirar les del tema predeterminat al directori icons/ del mòdul filefield, o bé, podeu mirar la funció _filefield_icon_path del fitxer filefield.theme.inc. Tingueu en compte que el format de la imatge de la icona ha de ser PNG.

Posem-ho tot en comú

Primer de tot, hem de crear un nou mòdul que anomenarem icontheme. Crearem el directori icontheme dins de sites/all/modules/custom/ (jo sempre poso els meus mòduls en un subdirectori i els contribuïts a un subdirectori contrib). Llavors crearem el fitxer icontheme.info amb el contingut:

name = Icon theme
description = Nou tema d'icones per camps filefield
version = 6.x-0.1
core = 6.x
package = Ymbra

I llavors, crearem també el fitxer icontheme.module:

<?php
/**
 * @file
 * Nou tema d'icones per camps filefield
 */


/**
 * Implementation of hook_init()
 */
function icontheme_init() {
  // establim el tema mytheme com a tema predeterminat
  variable_set('filefield_icon_theme', 'mytheme');
}

/**
 * Implementation of hook_filefield_icon_sets().
 *
 * Define a list of icon sets and directories that contain the icons.
 */
function icontheme_filefield_icon_sets() {
  return array(
    'mytheme' => drupal_get_path('module', 'icontheme') . '/icons',
  );
}

I una vegada tinguem això, només quedarà crear un directori anomenat icons/ dins del nostre mòdul i allí col·locar totes les icones per al nostre nou tema.

Doncs això és tot. Si detecteu cap error o creieu que hi ha alguna part que es pugui millorar, deixeu un comentari.

Possibles ampliacions o millores

Aquest és un mòdul força senzill, però podria fer-se alguna ampliació o millora força interessant, com per exemple:

  • Tenir més d'un tema i crear una petita interfície d'administració on puguem seleccionar quin tema volem usar.
  • Poder crear temes mitjançant la interfície d'administració.