Ctools export API

czigor képe

Nemrég egy projektünkben a Commerce Custom Order Status modult használtuk egyedi commerce megrendelés státuszok létrehozására felhasználói felületen keresztül. Volt azonban egy probléma a modullal: a létrehozott státuszok egy, a modul által létrehozott adatbázis táblába kerültek, amit nem lehetett exportálni.

Ha egy modul adatbázis tábláját szeretnénk features-szel exportálhatóvá tenni, 3 lehetőségünk van:

  1. Features modul hookok implementálása
  2. Az Entity API modul export funkciójának használata.
  3. A Chaos tools modul export funkciójának használata.

A 3. választás tűnt a legegyszerűbbnek. Ennek megoldására nem találtam azonban működő minimális példát, így itt leírom a tapasztalataim, hátha segít másoknak.

Kezdés előtt fontos megérteni, hogy a ctools exportable-k (igazi) exportable-k és nem faux-exportable-k. Ez azt jelenti, hogy előfordulhat, hogy csak kódban vannak, adatbázisban nem. A ctools export API függvények viszont kitalálják nekünk, hogy hol keressék az exportált adatokat, így azokat kell használni az exportált adatok manipulására.

A Commerce Custom Order Status adatbázis táblájának exportálhatóvá tétele két lépésből állt:

  1. Az 'export' kulcs hozzáadása a sémához a commerce_custom_order_status_schema() függvényben. Ez elvileg egyszerű.
    'export' => array(
      key' => 'name',
      'key name' => 'Name',
      'primary key' => 'name',
      'default hook' => 'commerce_custom_order_status_settings_info',
      'api' => array(
        'owner' => 'commerce_custom_order_status',
        'api' => 'commerce_custom_order_status',
        'minimum_version' => 1,
        'current_version' => 1,
      ),
    ),

    Nem volt szükség megváltoztatni a meglévő adatbázis-szerkezetet. A ctools exportálhatóknak nincs szükségük adatbázisban lévő numerikus elsődleges kulcsra.

    Az export kulcs alatt használható kulcsok teljes listájához magyarázatokkal lásd http://cgit.drupalcode.org/ctools/plain/help/export.html?id=refs/heads/7....

  2. Nagyobb kihívás volt az egyedi adatbázis babrálásról áttérni a ctools export API függvények használatára beállításaink kinyerésére, beállítására és törlésére. Esetünkben a beállítások a commerce megrendelés státuszok voltak.

    Két példa:

    1. A modul ezt a kódot használta, hogy Drupal Commerce megtalálja a egyedi megrendelés státuszokat:
      /**
       * Implements hook_commerce_order_status_info().
       */
      function commerce_custom_order_status_commerce_order_status_info() {
         $statuses = array();
       
        foreach (commerce_custom_order_status_get_statuses() as $name => $status) {
          $status['custom'] = TRUE;
          $statuses[$name] = $status;
        }//end foreach
         return $statuses;
       }
       
      /**
       * Get all existing statuses from database.
       */
      function commerce_custom_order_status_get_statuses() {
        return db_select('commerce_custom_order_status')->fields('commerce_custom_order_status')->execute()->fetchAllAssoc('name', PDO::FETCH_ASSOC);
      }

      Ez a kód csak az adatbázisból szedi ki a státuszokat, ezért meg kellett változtatnunk erre:

      /**
       * Implements hook_commerce_order_status_info().
       */
      function commerce_custom_order_status_commerce_order_status_info() {
        ctools_include('export');
        $statuses = array();
        $status_objects = ctools_export_load_object('commerce_custom_order_status');
        foreach ($status_objects as $key => $status_object) {
          if (!isset($status_object->disabled) || !($status_object->disabled)) {
            $statuses[$key] = (array) $status_object;
            $statuses[$key]['custom'] = TRUE;
          }
        }
        return $statuses;
      }

      ctools_export_load_object() az összes exportálható objektummal tér vissza. Nem kell foglalkoznunk azzal, hogy ezek vajon kódban, adatbázisban, esetleg mindkét helyen vannak, mivel Ctools barát gondoskodik erről.

    2. A modul a következőt használta megrendelés státuszok eltávolítására:
        db_delete('commerce_custom_order_status')->condition('name', $values['name'])->execute();

      Mivel nem tudjuk, hogy a státuszunk adatbázisban vagy kódban lakik-e, a kódot erre változtattuk:

      ctools_include('export');
      $object = ctools_export_crud_load('commerce_custom_order_status', $values['name']);
      ctools_export_crud_disable('commerce_custom_order_status', $values['name']);
      ctools_export_crud_delete('commerce_custom_order_status', $values['name']);

      Mivel kódban lakó ctools exportálhatókat nem lehet törölni (delete) csak kikapcsolni (disable), biztosra megyünk és mindkettővel megpróbálkozunk.

Nagyjából ennyi. Ctools export API függvények teljes listájához lásd: http://drupalcontrib.org/api/drupal/contributions!ctools!includes!export....

A Commerce Custom Order Statuses folt megtekinthető itt.

Technológia: Drupal 7ctoolsexport