danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * @file
|
danielebarchiesi@4
|
5 * Provides Features integration for entity types using the CRUD API.
|
danielebarchiesi@4
|
6 */
|
danielebarchiesi@4
|
7
|
danielebarchiesi@4
|
8 /**
|
danielebarchiesi@4
|
9 * Returns the configured entity features controller.
|
danielebarchiesi@4
|
10 */
|
danielebarchiesi@4
|
11 function entity_features_get_controller($type) {
|
danielebarchiesi@4
|
12 $static = &drupal_static(__FUNCTION__);
|
danielebarchiesi@4
|
13 if (!isset($static[$type])) {
|
danielebarchiesi@4
|
14 $info = entity_get_info($type);
|
danielebarchiesi@4
|
15 $info += array('features controller class' => 'EntityDefaultFeaturesController');
|
danielebarchiesi@4
|
16 $static[$type] = $info['features controller class'] ? new $info['features controller class']($type) : FALSE;
|
danielebarchiesi@4
|
17 }
|
danielebarchiesi@4
|
18 return $static[$type];
|
danielebarchiesi@4
|
19 }
|
danielebarchiesi@4
|
20
|
danielebarchiesi@4
|
21 /**
|
danielebarchiesi@4
|
22 * Default controller handling features integration.
|
danielebarchiesi@4
|
23 */
|
danielebarchiesi@4
|
24 class EntityDefaultFeaturesController {
|
danielebarchiesi@4
|
25
|
danielebarchiesi@4
|
26 protected $type, $info;
|
danielebarchiesi@4
|
27
|
danielebarchiesi@4
|
28 public function __construct($type) {
|
danielebarchiesi@4
|
29 $this->type = $type;
|
danielebarchiesi@4
|
30 $this->info = entity_get_info($type);
|
danielebarchiesi@4
|
31 $this->info['entity keys'] += array('module' => 'module', 'status' => 'status');
|
danielebarchiesi@4
|
32 $this->statusKey = $this->info['entity keys']['status'];
|
danielebarchiesi@4
|
33 $this->moduleKey = $this->info['entity keys']['module'];
|
danielebarchiesi@4
|
34 if (!empty($this->info['bundle of'])) {
|
danielebarchiesi@4
|
35 $entity_info = entity_get_info($this->info['bundle of']);
|
danielebarchiesi@4
|
36 $this->bundleKey = $entity_info['bundle keys']['bundle'];
|
danielebarchiesi@4
|
37 }
|
danielebarchiesi@4
|
38 }
|
danielebarchiesi@4
|
39
|
danielebarchiesi@4
|
40 /**
|
danielebarchiesi@4
|
41 * Defines the result for hook_features_api().
|
danielebarchiesi@4
|
42 */
|
danielebarchiesi@4
|
43 public function api() {
|
danielebarchiesi@4
|
44 return array(
|
danielebarchiesi@4
|
45 // The entity type has to be the features component name.
|
danielebarchiesi@4
|
46 $this->type => array(
|
danielebarchiesi@4
|
47 'name' => $this->info['label'],
|
danielebarchiesi@4
|
48 'feature_source' => TRUE,
|
danielebarchiesi@4
|
49 'default_hook' => isset($this->info['export']['default hook']) ? $this->info['export']['default hook'] : 'default_' . $this->type,
|
danielebarchiesi@4
|
50 // Use the provided component callbacks making use of the controller.
|
danielebarchiesi@4
|
51 'base' => 'entity',
|
danielebarchiesi@4
|
52 'file' => drupal_get_path('module', 'entity') . '/entity.features.inc',
|
danielebarchiesi@4
|
53 ),
|
danielebarchiesi@4
|
54 );
|
danielebarchiesi@4
|
55 }
|
danielebarchiesi@4
|
56
|
danielebarchiesi@4
|
57 /**
|
danielebarchiesi@4
|
58 * Generates the result for hook_features_export_options().
|
danielebarchiesi@4
|
59 */
|
danielebarchiesi@4
|
60 public function export_options() {
|
danielebarchiesi@4
|
61 $options = array();
|
danielebarchiesi@4
|
62 foreach (entity_load_multiple_by_name($this->type, FALSE) as $name => $entity) {
|
danielebarchiesi@4
|
63 $options[$name] = entity_label($this->type, $entity);
|
danielebarchiesi@4
|
64 }
|
danielebarchiesi@4
|
65 return $options;
|
danielebarchiesi@4
|
66 }
|
danielebarchiesi@4
|
67
|
danielebarchiesi@4
|
68 /**
|
danielebarchiesi@4
|
69 * Generates the result for hook_features_export().
|
danielebarchiesi@4
|
70 */
|
danielebarchiesi@4
|
71 public function export($data, &$export, $module_name = '') {
|
danielebarchiesi@4
|
72 $pipe = array();
|
danielebarchiesi@4
|
73 foreach (entity_load_multiple_by_name($this->type, $data) as $name => $entity) {
|
danielebarchiesi@4
|
74 // If this entity is provided by a different module, add it as dependency.
|
danielebarchiesi@4
|
75 if (($entity->{$this->statusKey} & ENTITY_IN_CODE) && $entity->{$this->moduleKey} != $module_name) {
|
danielebarchiesi@4
|
76 $module = $entity->{$this->moduleKey};
|
danielebarchiesi@4
|
77 $export['dependencies'][$module] = $module;
|
danielebarchiesi@4
|
78 }
|
danielebarchiesi@4
|
79 // Otherwise export the entity.
|
danielebarchiesi@4
|
80 else {
|
danielebarchiesi@4
|
81 $export['features'][$this->type][$name] = $name;
|
danielebarchiesi@4
|
82
|
danielebarchiesi@4
|
83 // If this is a bundle of a fieldable entity, add its fields to the pipe.
|
danielebarchiesi@4
|
84 if (!empty($this->info['bundle of'])) {
|
danielebarchiesi@4
|
85 $fields = field_info_instances($this->info['bundle of'], $entity->{$this->bundleKey});
|
danielebarchiesi@4
|
86 foreach ($fields as $name => $field) {
|
danielebarchiesi@4
|
87 $pipe['field'][] = "{$field['entity_type']}-{$field['bundle']}-{$field['field_name']}";
|
danielebarchiesi@4
|
88 }
|
danielebarchiesi@4
|
89 }
|
danielebarchiesi@4
|
90 }
|
danielebarchiesi@4
|
91 }
|
danielebarchiesi@4
|
92 // Add the module providing the entity type as dependency.
|
danielebarchiesi@4
|
93 if ($data && !empty($this->info['module'])) {
|
danielebarchiesi@4
|
94 $export['dependencies'][$this->info['module']] = $this->info['module'];
|
danielebarchiesi@4
|
95 // In case entity is not already an indirect dependency, add it.
|
danielebarchiesi@4
|
96 // We can do so without causing redundant dependencies because,
|
danielebarchiesi@4
|
97 // if entity is an indirect dependency, Features will filter it out.
|
danielebarchiesi@4
|
98 $export['dependencies']['entity'] = 'entity';
|
danielebarchiesi@4
|
99 }
|
danielebarchiesi@4
|
100 return $pipe;
|
danielebarchiesi@4
|
101 }
|
danielebarchiesi@4
|
102
|
danielebarchiesi@4
|
103 /**
|
danielebarchiesi@4
|
104 * Generates the result for hook_features_export_render().
|
danielebarchiesi@4
|
105 */
|
danielebarchiesi@4
|
106 function export_render($module, $data, $export = NULL) {
|
danielebarchiesi@4
|
107 $output = array();
|
danielebarchiesi@4
|
108 $output[] = ' $items = array();';
|
danielebarchiesi@4
|
109 foreach (entity_load_multiple_by_name($this->type, $data) as $name => $entity) {
|
danielebarchiesi@4
|
110 $export = " \$items['$name'] = entity_import('{$this->type}', '";
|
danielebarchiesi@4
|
111 // Make sure to escape the characters \ and '.
|
danielebarchiesi@4
|
112 $export .= addcslashes(entity_export($this->type, $entity, ' '), '\\\'');
|
danielebarchiesi@4
|
113 $export .= "');";
|
danielebarchiesi@4
|
114 $output[] = $export;
|
danielebarchiesi@4
|
115 }
|
danielebarchiesi@4
|
116 $output[] = ' return $items;';
|
danielebarchiesi@4
|
117 $output = implode("\n", $output);
|
danielebarchiesi@4
|
118
|
danielebarchiesi@4
|
119 $hook = isset($this->info['export']['default hook']) ? $this->info['export']['default hook'] : 'default_' . $this->type;
|
danielebarchiesi@4
|
120 return array($hook => $output);
|
danielebarchiesi@4
|
121 }
|
danielebarchiesi@4
|
122
|
danielebarchiesi@4
|
123 /**
|
danielebarchiesi@4
|
124 * Generates the result for hook_features_revert().
|
danielebarchiesi@4
|
125 */
|
danielebarchiesi@4
|
126 function revert($module = NULL) {
|
danielebarchiesi@4
|
127 if ($defaults = features_get_default($this->type, $module)) {
|
danielebarchiesi@4
|
128 foreach ($defaults as $name => $entity) {
|
danielebarchiesi@4
|
129 entity_delete($this->type, $name);
|
danielebarchiesi@4
|
130 }
|
danielebarchiesi@4
|
131 }
|
danielebarchiesi@4
|
132 }
|
danielebarchiesi@4
|
133 }
|
danielebarchiesi@4
|
134
|
danielebarchiesi@4
|
135 /**
|
danielebarchiesi@4
|
136 * Implements of hook_features_api().
|
danielebarchiesi@4
|
137 */
|
danielebarchiesi@4
|
138 function entity_features_api() {
|
danielebarchiesi@4
|
139 $items = array();
|
danielebarchiesi@4
|
140 foreach (entity_crud_get_info() as $type => $info) {
|
danielebarchiesi@4
|
141 if (!empty($info['exportable']) && $controller = entity_features_get_controller($type)) {
|
danielebarchiesi@4
|
142 $items += $controller->api();
|
danielebarchiesi@4
|
143 }
|
danielebarchiesi@4
|
144 }
|
danielebarchiesi@4
|
145 return $items;
|
danielebarchiesi@4
|
146 }
|
danielebarchiesi@4
|
147
|
danielebarchiesi@4
|
148 /**
|
danielebarchiesi@4
|
149 * Features component callback.
|
danielebarchiesi@4
|
150 */
|
danielebarchiesi@4
|
151 function entity_features_export_options($entity_type) {
|
danielebarchiesi@4
|
152 return entity_features_get_controller($entity_type)->export_options();
|
danielebarchiesi@4
|
153 }
|
danielebarchiesi@4
|
154
|
danielebarchiesi@4
|
155 /**
|
danielebarchiesi@4
|
156 * Features component callback.
|
danielebarchiesi@4
|
157 */
|
danielebarchiesi@4
|
158 function entity_features_export($data, &$export, $module_name = '', $entity_type) {
|
danielebarchiesi@4
|
159 return entity_features_get_controller($entity_type)->export($data, $export, $module_name);
|
danielebarchiesi@4
|
160 }
|
danielebarchiesi@4
|
161
|
danielebarchiesi@4
|
162 /**
|
danielebarchiesi@4
|
163 * Features component callback.
|
danielebarchiesi@4
|
164 */
|
danielebarchiesi@4
|
165 function entity_features_export_render($module, $data, $export = NULL, $entity_type) {
|
danielebarchiesi@4
|
166 return entity_features_get_controller($entity_type)->export_render($module, $data, $export);
|
danielebarchiesi@4
|
167 }
|
danielebarchiesi@4
|
168
|
danielebarchiesi@4
|
169 /**
|
danielebarchiesi@4
|
170 * Features component callback.
|
danielebarchiesi@4
|
171 */
|
danielebarchiesi@4
|
172 function entity_features_revert($module = NULL, $entity_type) {
|
danielebarchiesi@4
|
173 return entity_features_get_controller($entity_type)->revert($module);
|
danielebarchiesi@4
|
174 }
|