Il problema di fondo è che i file delle immagini di default che imposti nel tuo
ambiente di sviluppo non possono essere trasferite in modo automatico
nei vari ambienti con il solo utilizzo di
Features.
Quando imposti un'immagine di default e poi esporti con Features quel campo,
ciò che viene memorizzato è il fid
del file che hai caricato.
Ma quel file è presente nel tuo ambiente e non negli altri; inoltre non puoi
garantire che l'identificativo fid del tuo file possa essere lo stesso dappertutto
perché i database dei vari ambienti hanno una vita propria.
La soluzione
Per risolvere la questione bisogna:
- mappare il fid del file immagine da usare tramite una variabile Drupal;
- caricare il file in modo automatico in ogni ambiente.
Il primo punto lo risolviamo utilizzando il modulo Default image ft. In questo modo possiamo scegliere il nome della variabile che immagazzinerà il fid dell'immagine (vedi ad esempio l'immagine seguente).
A questo punto possiamo
creare il nostro modulo custom per caricare l'immagine
in modo automatico. Le cose da fare sono due: posizionare l'immagine in una
sotto-cartella del modulo, ad esempio MY_MODULE_NAME/images/my_default_image.jpg
poi aggiungere il
file di installazione MY_MODULE_NAME.install. Inseriremo al suo interno la funzione
hook_update_N()
per caricare fisicamente l'immagine dentro
la directory public://default_images
e per assegnarle un fid
.
Qui di seguito vediamo i passaggi più importanti.
Crea la cartella di destinazione se non esiste
Ho scoperto l'esistenza di una funziona Drupal molto utile:
file_prepare_directory()
. Essa ci permette di verificare se
la directory esiste; nel caso non esista e Drupal ha i permessi di scrittura
nel filesystem, allora la crea.
Salva il file e ottieni il fid
Per prima cosa dobbiamo creare l'oggetto file Drupal. Per farlo dobbiamo
creare un oggetto PHP di tipo stdClass
e assegnarli gli attributi
descritti
in questa pagina per l'immagine sorgente. Qui di seguito trovate il frammento di codice.
// Create the surce file.
$file = new stdClass;
$file->filename = $filename;
$file->timestamp = REQUEST_TIME;
$file->uri = $source;
$file->filemime = file_get_mimetype($source);
$file->uid = 1;
$file->status = 1;
Copia il file
In Drupal esiste la funzione
file_copy()
che ti aiuta in questo compito. Dal frammento di codice seguente possiamo vedere
che questa funzione restitusce l'oggetto del file copiato. Questo ci permette
di ottenere il fid
che gli è stato assegnato da Drupal e
che salvereno nella nostra variabile.
// Copy the file into destination directory.
$file = file_copy($file, $destination_dir, FILE_EXISTS_REPLACE);
// Get the fid.
$fid = $file->fid;
Salva il fid nella variabile utilizzata dal modulo default_image_ft
In conclusione utilizzeremo la funzione
variable_set()
per memorizzare il fid dell'immagine.
// Set the default_image_ft variable.
variable_set('my_default_image_variable', $fid);
Il codice completo da inserire nel file .install
Sostituisci i segnaposto:
- MY_MODULE_NAME, con il nome del tuo modulo;
- my_default_image_variable, con il nome della tua variabile;
- my_default_image.jpg, con il nome della tua immagine.
/**
* Helper to replace default field base image.
*
* @param $filename
* @param $source
*/
function _MY_MODULE_NAME_replace_default_image($filename, $source) {
// Set the destination dir.
$destination_dir = 'public://default_images';
// Create new file object and get new fid.
if (file_exists($source)
&& file_prepare_directory($destination_dir, FILE_CREATE_DIRECTORY)) {
// Create the surce file.
$file = new stdClass;
$file->filename = $filename;
$file->timestamp = REQUEST_TIME;
$file->uri = $source;
$file->filemime = file_get_mimetype($source);
$file->uid = 1;
$file->status = 1;
// Copy the file into destination directory.
$file = file_copy($file, $destination_dir, FILE_EXISTS_REPLACE);
$fid = $file->fid;
// Set the default_image_ft variable.
variable_set('my_default_image_variable', $fid);
watchdog('MY_MODULE_NAME', 'Setted my_default_image_variable fid default image.');
}
}
/**
* Upload the default images for your image filed.
*/
function MY_MODULE_NAME_update_7100() {
$filename = 'my_default_image.jpg';
$source = drupal_get_path('module', 'MY_MODULE_NAME')
. '/images/' . $filename;
// Replace default image for $field_name field base.
_MY_MODULE_NAME_replace_default_image($filename, $source);
}