t('Node export'), 'feature_source' => TRUE, 'default_hook' => 'node_export_features_default', 'default_file' => FEATURES_DEFAULTS_INCLUDED, ); return $features; } /** * Implements hook_features_export_options(). */ function node_export_features_features_export_options() { $options = array(); $query = db_select('node', 'n') ->fields('n', array('nid', 'title', 'type')) ->orderBy('type') ->orderBy('title') ->range(0, 250) ->addTag('node_export_features'); $result = $query->execute(); foreach ($result as $row) { $uuid = uuid_get_uuid('node', 'nid', $row->nid); if (empty($uuid)) { drupal_set_message( t('Some nodes are not available for export' . ' because of missing UUIDs. Ensure UUIDs are being generated for' . ' all content types and click the Create missing UUIDs' . ' button on the UUID settings page to help' . ' resolve this issue.', array('!url' => url('admin/settings/uuid')) ), 'warning', FALSE ); } else { $options[$uuid] = t('@type: @title', array( '@type' => node_type_get_name($row->type), '@title' => $row->title, )); } } if (count($options) == 250) { drupal_set_message( t('Due to limitations in Features only the first 250 nodes are available.' . ' The query is tagged node_export_features if you want to' . ' alter it.'), 'warning' ); } return $options; } /** * Implements hook_features_export(). */ function node_export_features_features_export($data, &$export, $module_name = '') { $pipe = array(); $export['dependencies']['module'] = 'node_export_features'; foreach ($data as $uuid) { $query = db_select('node', 'n') ->fields('n', array('type')) ->condition('n.uuid', $uuid); $type = $query->execute()->fetchField(); $export['features']['node_export_features'][$uuid] = $uuid; $pipe['node'][$type] = $type; } return $pipe; } /** * Implements hook_node_export_alter(). */ function node_export_features_node_export_alter(&$nodes, $format) { if (_node_export_features_currently_exporting()) { foreach ($nodes as $key => $node) { // Perform cleaning of the node before creating the export for features. // This can help strip volatile attributes like 'created' and 'changed'. $nodes[$key] = node_export_node_clone($node); } } } /** * Check if the code is currently running a feature export. */ function _node_export_features_currently_exporting($set = FALSE, $value = NULL) { $exporting = &drupal_static(__FUNCTION__, FALSE); if ($set) { $exporting = $value; } return $exporting; } /** * Implements hook_features_export_render(). */ function node_export_features_features_export_render($module, $data, $export = NULL) { $nids = entity_get_id_by_uuid('node', $data); _node_export_features_currently_exporting(TRUE, TRUE); $result = node_export($nids); _node_export_features_currently_exporting(TRUE, FALSE); if ($result['success']) { $node_export['code_string'] = $result['output']; $node_export_code = ' $node_export = ' . features_var_export($node_export) . ';'; } else { foreach ($result['output'] as $error) { $node_export_code = ' // ' . $error . PHP_EOL; } $node_export_code .= ' $node_export = array();'; } $node_export_code .= PHP_EOL . ' return $node_export;'; return array('node_export_features_default' => $node_export_code); } /** * Implements hook_features_revert(). */ function node_export_features_features_revert($module = NULL) { node_export_features_features_rebuild($module); } /** * Implements hook_features_rebuild(). */ function node_export_features_features_rebuild($module) { $node_export = features_get_default('node_export_features', $module); if (!empty($node_export)) { $result = node_export_import($node_export['code_string']); if (!$result['success']) { foreach ($result['output'] as $error) { drupal_set_message($error, 'error'); } } else { if (!isset($_GET['profile'])) { foreach ($result['output'] as $status) { drupal_set_message($status); } } } } }