danielebarchiesi@4: array( danielebarchiesi@4: 'name' => t('Content types'), danielebarchiesi@4: 'feature_source' => TRUE, danielebarchiesi@4: 'default_hook' => 'node_info', danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_export_options(). danielebarchiesi@4: */ danielebarchiesi@4: function node_features_export_options() { danielebarchiesi@4: return node_type_get_names(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_export. danielebarchiesi@4: */ danielebarchiesi@4: function node_features_export($data, &$export, $module_name = '') { danielebarchiesi@4: $pipe = array(); danielebarchiesi@4: $map = features_get_default_map('node'); danielebarchiesi@4: danielebarchiesi@4: foreach ($data as $type) { danielebarchiesi@4: // Poll node module to determine who provides the node type. danielebarchiesi@4: if ($info = node_type_get_type($type)) { danielebarchiesi@4: // If this node type is provided by a different module, add it as a dependency danielebarchiesi@4: if (isset($map[$type]) && $map[$type] != $module_name) { danielebarchiesi@4: $export['dependencies'][$map[$type]] = $map[$type]; danielebarchiesi@4: } danielebarchiesi@4: // Otherwise export the node type. danielebarchiesi@4: elseif (in_array($info->base, array('node_content', 'features'))) { danielebarchiesi@4: $export['features']['node'][$type] = $type; danielebarchiesi@4: $export['dependencies']['node'] = 'node'; danielebarchiesi@4: $export['dependencies']['features'] = 'features'; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $fields = field_info_instances('node', $type); danielebarchiesi@4: foreach ($fields as $name => $field) { danielebarchiesi@4: $pipe['field_instance'][] = "node-{$field['bundle']}-{$field['field_name']}"; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: return $pipe; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_export_render(). danielebarchiesi@4: */ danielebarchiesi@4: function node_features_export_render($module, $data, $export = NULL) { danielebarchiesi@4: $elements = array( danielebarchiesi@4: 'name' => TRUE, danielebarchiesi@4: 'base' => FALSE, danielebarchiesi@4: 'description' => TRUE, danielebarchiesi@4: 'has_title' => FALSE, danielebarchiesi@4: 'title_label' => TRUE, danielebarchiesi@4: 'help' => TRUE, danielebarchiesi@4: ); danielebarchiesi@4: $output = array(); danielebarchiesi@4: $output[] = ' $items = array('; danielebarchiesi@4: foreach ($data as $type) { danielebarchiesi@4: if ($info = node_type_get_type($type)) { danielebarchiesi@4: // Force module name to be 'features' if set to 'node. If we leave as danielebarchiesi@4: // 'node' the content type will be assumed to be database-stored by danielebarchiesi@4: // the node module. danielebarchiesi@4: $info->base = ($info->base === 'node') ? 'features' : $info->base; danielebarchiesi@4: $output[] = " '{$type}' => array("; danielebarchiesi@4: foreach ($elements as $key => $t) { danielebarchiesi@4: if ($t) { danielebarchiesi@4: $text = str_replace("'", "\'", $info->$key); danielebarchiesi@4: $text = !empty($text) ? "t('{$text}')" : "''"; danielebarchiesi@4: $output[] = " '{$key}' => {$text},"; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $output[] = " '{$key}' => '{$info->$key}',"; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $output[] = " ),"; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: $output[] = ' );'; danielebarchiesi@4: $output[] = ' return $items;'; danielebarchiesi@4: $output = implode("\n", $output); danielebarchiesi@4: return array('node_info' => $output); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_revert(). danielebarchiesi@4: * danielebarchiesi@4: * @param $module danielebarchiesi@4: * name of module to revert content for danielebarchiesi@4: */ danielebarchiesi@4: function node_features_revert($module = NULL) { danielebarchiesi@4: if ($default_types = features_get_default('node', $module)) { danielebarchiesi@4: foreach ($default_types as $type_name => $type_info) { danielebarchiesi@4: // Delete node types danielebarchiesi@4: // We don't use node_type_delete() because we do not actually danielebarchiesi@4: // want to delete the node type (and invoke hook_node_type()). danielebarchiesi@4: // This can lead to bad consequences like CCK deleting field danielebarchiesi@4: // storage in the DB. danielebarchiesi@4: db_delete('node_type') danielebarchiesi@4: ->condition('type', $type_name) danielebarchiesi@4: ->execute(); danielebarchiesi@4: } danielebarchiesi@4: node_types_rebuild(); danielebarchiesi@4: menu_rebuild(); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_disable(). danielebarchiesi@4: * danielebarchiesi@4: * When a features module is disabled, modify any node types it provides so danielebarchiesi@4: * they can be deleted manually through the content types UI. danielebarchiesi@4: * danielebarchiesi@4: * @param $module danielebarchiesi@4: * Name of module that has been disabled. danielebarchiesi@4: */ danielebarchiesi@4: function node_features_disable($module) { danielebarchiesi@4: if ($default_types = features_get_default('node', $module)) { danielebarchiesi@4: foreach ($default_types as $type_name => $type_info) { danielebarchiesi@4: $type_info = node_type_load($type_name); danielebarchiesi@4: $type_info->module = 'node'; danielebarchiesi@4: $type_info->custom = 1; danielebarchiesi@4: $type_info->modified = 1; danielebarchiesi@4: $type_info->locked = 0; danielebarchiesi@4: node_type_save($type_info); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_enable(). danielebarchiesi@4: * danielebarchiesi@4: * When a features module is enabled, modify any node types it provides so danielebarchiesi@4: * they can no longer be deleted manually through the content types UI. danielebarchiesi@4: * danielebarchiesi@4: * @param $module danielebarchiesi@4: * Name of module that has been enabled. danielebarchiesi@4: */ danielebarchiesi@4: function node_features_enable($module) { danielebarchiesi@4: if ($default_types = features_get_default('node', $module)) { danielebarchiesi@4: foreach ($default_types as $type_name => $type_info) { danielebarchiesi@4: // Ensure the type exists. danielebarchiesi@4: if ($type_info = node_type_load($type_name)) { danielebarchiesi@4: $type_info->module = $module; danielebarchiesi@4: $type_info->custom = 0; danielebarchiesi@4: $type_info->modified = 0; danielebarchiesi@4: $type_info->locked = 1; danielebarchiesi@4: node_type_save($type_info); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: }