Интеграция с модулем Features

28.12.2012
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin
Автор:

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

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

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

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

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

/**
 * Implements hook_features_api().
 */
function idevels_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', 'idevels') .'/idevels.features.inc',
    ),
  );
}

Теперь создаем файл в корне модуля, который указали в hook_features_api. На нашем примере это idevels.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);
  }
}

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

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

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

idevels.zip
2 votes, Rating: 5
Share on FacebookShare on TwitterShare on GooglePlusShare on Linkedin

Также по теме

1

С развитием социальных сетей заказчики все чаще хотят интегрировать сайт с Facebook, Twitter, Google+ и т. д. На одном из проектов нужно было реализовать...

2

Опытные друпал-разработчики не представляют своей работы без утилиты Drush (Drupal shell), ведь с её помощью большинство рутинных дейстивий в друпале выполняются намного...

3

Ни для кого не секрет, что Google Analytics (далее - GA) - мощнейший инструмент для сбора данных о действиях...

4

В данной статье будет рассказано о том, как быстро настроить модуль Search API и...

5

Наша компания очень часто использует модуль Panels для построения сайтов. Хоть это решение добавляет немало...

Need a quote? Let's discuss the project

Are you looking for someone to help you with your Drupal Web Development needs? Let’s get in touch and discuss the requirements of your project. We would love to hear from you.

Join the people who have already subscribed!

Want to be aware of important and interesting things happening? We will inform you about new blog posts on Drupal development, design, QA testing and more, as well news about Drupal events.

No charge. Unsubscribe anytime