RSS
 

Drupal 7 + интеграция своего модуля с features

При необходимости перенесения каких-либо изменений в базе с одного сайта на другой, переливание всей базы, как правило, является достаточно проблематичным, а иногда и невозможным через наполнение сайта контентом. Для этого существует модуль Features. Чтобы подобных проблем не возникало, в этой статье мы расскажем, как создавать свою фичу (feature), как создавать в ней свои пункты и как экспортировать части сайта на другой сайт.

К примеру, у нас есть три значения в базе (их мы создадим с помощью функции variable_set() позже), которые нужно перенести на другой сайт. При этом нужно выбрать, какие значения экспортировать, а какие нет.

1) Устанавливаем модуль Features.

2) Создаем свой модуль.

В нашем случае он будет называться soul. В файле soul.module добавляем hook_features_api(). С помощью этого хука мы объявим о своей фиче и зададим ей некие параметры.

/**
 * Implements hook_features_api().
 */
function soul_features_api() {
  return array(
    'values' => array(
      'name' => t('Deploy values'),
      'default_hook' => 'values_defaults',
      'default_file' => FEATURES_DEFAULTS_INCLUDED,
      'feature_source' => TRUE,
      'file' => drupal_get_path('module', 'soul') .'/soul.features.inc',
    ),
  );
}

Теперь создаем файл в корне модуля, который указали в hook_features_api. На нашем примере это soul.features.inc.

В этом файле добавляем хук hook_features_export_options().

Обратите внимание на важный момент: хуки, которые касаются работы фичи нужно называть не названием модуля, а названием фичи. В нашем случае это values​​.

/**
 * Implements hook_features_export_options().
 */
function values_features_export_options()  {
  //only create variables
  variable_set('value1', 'value1');
  variable_set('value2', 'value2');
  variable_set('value3', 'value3');
 
  return array(
    'value1' => t('VALUE 1'),
    'value2' => t('VALUE 2'),
    'value3' => t('VALUE 3'),
  );
} 

Для наглядности создадим три значения с помощью функции variable_set().

В хуке hook_features_export_options() задаем какие опции пользователь может переносить. Это будет выглядеть следующим образом:

/**
 * Implements of hook_features_export().
 */
function values_features_export($data, &$export, $module_name = '') {
  foreach ($data as $name) {
    $export['features']['values'][$name] = $name;
  }
  return array();
}

И теперь, когда мы выбираем какую-либо опцию, видим, что будет экспортироваться. В нашем случае это выглядит так:

Затем добавляем хук hook_features_export_render(), который рендерит в файл значения, что экспортируются.

/**
 * Implements hook_features_export_render().
 */
function values_features_export_render($module_name, $data) {
  $code = array();
  $values = array();
  foreach ($data as $name) {
    $values[$name] = variable_get($name);
  }
  $code = '  $data = ' . features_var_export($values, '  ') . ';' . PHP_EOL;
  $code .= "  return \$data;";
  return array('values_defaults' => $code);
}

Осталось описать два хука, которые будут отвечать за внесение данных на новый сайт с нашей фичи. Это hook_features_rebuild() и hook_features_revert(). У нас они выполняют одну задачу, поэтому это будет выглядеть так:

/**
 * Implements hook_features_rebuild().
 */
function values_features_rebuild($module) {
  values_features_revert($module);
}
 
/**
 * Implements hook_features_revert().
 */
function values_features_revert($module) {
  $data = module_invoke($module, 'values_defaults');
  foreach ($data as $name => $value) {
    variable_set($name, $value);
  }
}

Таким образом, эти хуки будут менять данные на новом сайте на те, что лежат в нашей фиче.

На таком банальном примере мы научились экспортировать части сайта.

Модуль, по которому была создана статья, добавлен ниже для загрузки.

Взято здесь: http://internetdevels.ru/blog/custom-feature