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:
- Features modul hookok implementálása
- Az Entity API modul export funkciójának használata.
- 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:
- 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....
- 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:
- 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.
- 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.
- A modul ezt a kódot használta, hogy Drupal Commerce megtalálja a egyedi megrendelés státuszokat:
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.