Jelenlegi hely

Új hozzászólás

CSÉCSY László képe

Képmező alapértelmezésének exportja D7-ben

Mindannyian szeretjük a képmezők alapértelmezéseit: nagyon egyszerű egy termék kedvcsináló képét vagy egy munkatárs arcképét megjeleníteni akkor is, ha a szerkesztő nem tölti fel azt, hiszen ilyenkor rendelkezésünkre áll mindenféle okosság, mint például különböző képstílusokkal való megjelenítés egy listában, a bevezetőben vagy a tényleges oldalon. Mindannyian szeretjük a Features modult, hiszen lehetővé teszi számunkra a Drupal 7 tartalomtípusok exportálását mindenféle beállításaikkal együtt.

Másrészről utáljuk, amikor a kettő találkozik, mert a Features nem tudja (megfelelően) exportálni a képmezők alapértelmezéseit.

Először is gondolkodjunk el az okokon. A képmezők alapértelmezései a {file_managed}.fid mezőre hivatkozó egész számokként vannak tárolva, amely a fájl egyedi azonosítója a Drupal számára, minden egyes fájlfeltöltéskor automatikusan megnövelve eggyel. A Features régóta nem tud mit kezdeni az automatikusan növelt számokkal azonosított objektumokkal: bár egy objektum azonosítója 321 az A webhelyen, ugyanazon objektum azonosítója lehet 123 vagy akármennyi a B webhelyen – ugyanis az azonosító akkor kerül hozzárendelésre, amikor a fájllal először találkozik a Drupal: feltöltéskor vagy a feature modul bekapcsolásakor. Ez összezavarja a Features működését, amely ezért aztán kétféleképpen próbálja megkerülni a problémát: vagy egyszerűen nem törődik vele (és az azonosítót úgy exportálja, ahogy van), vagy nem foglalkozik vele (és meg se próbálja exportálni az objektumot). Jelen esetünkben a Features egyáltalán nem exportálja a képmezők alapértelmezett értékeit.

A megoldás némi kód írása, amely megismerteti a Drupallal a képmezők alapértelmezéseit úgy, ahogy azt a Features nem teszi meg. A recept egyszerű: 1. hozzuk létre a feature modulunkat, ahogy szoktuk, majd 2. hozzunk létre egy fájl objektumot amikor a feature bekapcsolódik (azaz amikor telepítjük a modult), végül 3. rendeljük hozzá ezen a fájl objektum azonosítóját a kérdéses képmezőhöz.

1. Saját feature modul létrehozása

Legyen a neve myfeature – és ne felejtsük el hozzáadni a szóban forgó képmezőt. ;)

2. Fájl objektum létrehozása a modul bekapcsolásakor

A következő kódot adjuk hozzá a myfeature.install fájlhoz:

function myfeature_install() {
  // Create the product.hero_image field's default file reference.
  $filename = 'product-hero_image-default.png';
  $origfile = drupal_get_path('module', 'myfeature') . '/images/' . $filename;
  $uri = 'public://' . $filename;
  $file = (object) array(
    'uid' => 1,
    'filename' => $filename,
    'uri' => $origfile,
    'filemime' => 'image/png',
    'filesize' => filesize($origfile),
    'status' => FILE_STATUS_PERMANENT,
  );
  $file = file_copy($file, $uri, FILE_EXISTS_REPLACE);
  variable_set('myfeature_product_hero_image_fid', $file->fid);
}

3. Fájl azonosító hozzárendelése a kérdéses mezőhöz

A következő kódot adjuk hozzá a myfeature.module fájlhoz:

/**
 * Implements hook_field_default_field_instances_alter().
 *
 * Set the default image.
 */
function myfeature_field_default_field_instances_alter(&$fields) {
  if (isset($fields['node-product-field_product_hero_image']['settings']['default_image'])) {
    $fid = $fields['node-product-field_product_hero_image']['settings']['default_image'];
    $fields['node-product-field_product_hero_image']['settings']['default_image'] = variable_get('myfeature_product_hero_image_fid', $fid);
  }
}

Hogyan működik mindez?

A Features segítségével létrehozott bármely feature ugyanolyan modul, mint bármelyik másik: bekapcsolásakor lefut a hook_install() implementációja. Jelen implementációnk megismerteti a Drupallal az előkészített képfájlt, majd elmenti a fájl azonosítóját egy Drupal változóba. Később aztán lefut a hook_field_default_field_instances_alter() és ellenőrzi, hogy a kérdéses mezőnek van-e alapértelmezett beállítása (pl. a Features segítségével exportálva). Ha van alapértelmezett beállítás, akkor a kód megjegyzi a régi alapértelmezett azonosítót, majd előbányássza a saját fájlhoz a feature modul bekapcsolásakor rendelt azonosítót, végül a szükséges módon felülírja a mező(példány) definícióját.

Valójában az alapértelmezett képfájl azonosítója nincs exportálva, tehát importálni sem lehet a megszokott módon – de van egy megfelelő _alter hook a helyzet kezelésére: a végeredmény ugyanaz, mintha exportáltuk volna az azonosítót. Innentől kezdve a képmező alapértelmezését ugyanúgy használhatjuk, mint bármely, a szerkesztők által szállított tartalmat: képstílusokat alkalmazhatunk rá, megjeleníthetjük listákban, bevezetőkben, és így tovább.

Meg kell említenem, hogy ezen technikát nem csak képmezőkre, hanem egyszerű fájlmezőkre is lehet alkalmazni.

(Ez a cikk a https://gist.github.com/sprice/2003047 gist és hozzászólásainak felhasználásával készült.)

Technológia: