Il deploy delle immagini di default

Come impostare automaticamente la default image per i campi di tipo immagine.

6 October, 2016

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:

  1. mappare il fid del file immagine da usare tramite una variabile Drupal;
  2. caricare il file in modo automatico in ogni ambiente.

Il primo punto lo risolviamo utilizando 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). Source image variable name Impostazione che trovi nella pagina di modifica del campo immagine (es. admin/structure/types/manage/CONTENT_TYPE/fields/field_MY_IMAGE

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);
    }