annotate sites/all/modules/features/includes/features.field.inc @ 9:830c812b520f

added smtp module
author root <root@paio.local>
date Mon, 28 Oct 2013 15:34:27 +0000
parents ce11bbd8f642
children
rev   line source
danielebarchiesi@4 1 <?php
danielebarchiesi@4 2
danielebarchiesi@4 3 /**
danielebarchiesi@4 4 * Implements hook_features_api().
danielebarchiesi@4 5 */
danielebarchiesi@4 6 function field_features_api() {
danielebarchiesi@4 7 return array(
danielebarchiesi@4 8 'field' => array(
danielebarchiesi@4 9 // this is deprecated by field_base and field_instance
danielebarchiesi@4 10 // but retained for compatibility with older exports
danielebarchiesi@4 11 'name' => t('Fields'),
danielebarchiesi@4 12 'default_hook' => 'field_default_fields',
danielebarchiesi@4 13 'default_file' => FEATURES_DEFAULTS_INCLUDED,
danielebarchiesi@4 14 'feature_source' => FALSE,
danielebarchiesi@4 15 ),
danielebarchiesi@4 16 'field_base' => array(
danielebarchiesi@4 17 'name' => t('Field Bases'),
danielebarchiesi@4 18 'default_hook' => 'field_default_field_bases',
danielebarchiesi@4 19 'default_file' => FEATURES_DEFAULTS_INCLUDED,
danielebarchiesi@4 20 'feature_source' => TRUE,
danielebarchiesi@4 21 'supersedes' => 'field',
danielebarchiesi@4 22 ),
danielebarchiesi@4 23 'field_instance' => array(
danielebarchiesi@4 24 'name' => t('Field Instances'),
danielebarchiesi@4 25 'default_hook' => 'field_default_field_instances',
danielebarchiesi@4 26 'default_file' => FEATURES_DEFAULTS_INCLUDED,
danielebarchiesi@4 27 'feature_source' => TRUE,
danielebarchiesi@4 28 'supersedes' => 'field',
danielebarchiesi@4 29 )
danielebarchiesi@4 30 );
danielebarchiesi@4 31 }
danielebarchiesi@4 32
danielebarchiesi@4 33 /**
danielebarchiesi@4 34 * Implements hook_features_export_options().
danielebarchiesi@4 35 */
danielebarchiesi@4 36 function field_base_features_export_options() {
danielebarchiesi@4 37 $options = array();
danielebarchiesi@4 38 $fields = field_info_fields();
danielebarchiesi@4 39 foreach ($fields as $field_name => $field) {
danielebarchiesi@4 40 $options[$field_name] = $field_name;
danielebarchiesi@4 41 }
danielebarchiesi@4 42 return $options;
danielebarchiesi@4 43 }
danielebarchiesi@4 44
danielebarchiesi@4 45 /**
danielebarchiesi@4 46 * Implements hook_features_export_options().
danielebarchiesi@4 47 */
danielebarchiesi@4 48 function field_instance_features_export_options() {
danielebarchiesi@4 49 $options = array();
danielebarchiesi@4 50 foreach (field_info_fields() as $field_name => $field) {
danielebarchiesi@4 51 foreach ($field['bundles'] as $entity_type => $bundles) {
danielebarchiesi@4 52 foreach ($bundles as $bundle) {
danielebarchiesi@4 53 $identifier = "{$entity_type}-{$bundle}-{$field_name}";
danielebarchiesi@4 54 $options[$identifier] = $identifier;
danielebarchiesi@4 55 }
danielebarchiesi@4 56 }
danielebarchiesi@4 57 }
danielebarchiesi@4 58 ksort($options);
danielebarchiesi@4 59 return $options;
danielebarchiesi@4 60 }
danielebarchiesi@4 61
danielebarchiesi@4 62 /**
danielebarchiesi@4 63 * Implements hook_features_export().
danielebarchiesi@4 64 */
danielebarchiesi@4 65 function field_base_features_export($data, &$export, $module_name = '') {
danielebarchiesi@4 66 $pipe = array();
danielebarchiesi@4 67 $map = features_get_default_map('field_base');
danielebarchiesi@4 68
danielebarchiesi@4 69 // The field_default_field_bases() hook integration is provided by the
danielebarchiesi@4 70 // features module so we need to add it as a dependency.
danielebarchiesi@4 71 $export['dependencies']['features'] = 'features';
danielebarchiesi@4 72
danielebarchiesi@4 73 foreach ($data as $identifier) {
danielebarchiesi@4 74 if ($base = features_field_base_load($identifier)) {
danielebarchiesi@4 75 // If this field is already provided by another module, remove the field
danielebarchiesi@4 76 // and add the other module as a dependency.
danielebarchiesi@4 77 if (isset($map[$identifier]) && $map[$identifier] != $module_name) {
danielebarchiesi@4 78 if (isset($export['features']['field_base'][$identifier])) {
danielebarchiesi@4 79 unset($export['features']['field_base'][$identifier]);
danielebarchiesi@4 80 }
danielebarchiesi@4 81 $module = $map[$identifier];
danielebarchiesi@4 82 $export['dependencies'][$module] = $module;
danielebarchiesi@4 83 }
danielebarchiesi@4 84 // If the field has not yet been exported, add it
danielebarchiesi@4 85 else {
danielebarchiesi@4 86 $export['features']['field_base'][$identifier] = $identifier;
danielebarchiesi@4 87 $export['dependencies'][$base['module']] = $base['module'];
danielebarchiesi@4 88 if ($base['storage']['type'] != variable_get('field_storage_default', 'field_sql_storage')) {
danielebarchiesi@4 89 $export['dependencies'][$base['storage']['module']] = $base['storage']['module'];
danielebarchiesi@4 90 }
danielebarchiesi@4 91 // If taxonomy field, add in the vocabulary
danielebarchiesi@4 92 if ($base['type'] == 'taxonomy_term_reference' && !empty($base['settings']['allowed_values'])) {
danielebarchiesi@4 93 foreach ($base['settings']['allowed_values'] as $allowed_values) {
danielebarchiesi@4 94 if (!empty($allowed_values['vocabulary'])) {
danielebarchiesi@4 95 $pipe['taxonomy'][] = $allowed_values['vocabulary'];
danielebarchiesi@4 96 }
danielebarchiesi@4 97 }
danielebarchiesi@4 98 }
danielebarchiesi@4 99 }
danielebarchiesi@4 100 }
danielebarchiesi@4 101 }
danielebarchiesi@4 102 return $pipe;
danielebarchiesi@4 103 }
danielebarchiesi@4 104
danielebarchiesi@4 105 /**
danielebarchiesi@4 106 * Implements hook_features_export().
danielebarchiesi@4 107 */
danielebarchiesi@4 108 function field_instance_features_export($data, &$export, $module_name = '') {
danielebarchiesi@4 109 $pipe = array('field_base' => array());
danielebarchiesi@4 110 $map = features_get_default_map('field_instance');
danielebarchiesi@4 111
danielebarchiesi@4 112 // The field_default_field_instances() hook integration is provided by the
danielebarchiesi@4 113 // features module so we need to add it as a dependency.
danielebarchiesi@4 114 $export['dependencies']['features'] = 'features';
danielebarchiesi@4 115
danielebarchiesi@4 116 foreach ($data as $identifier) {
danielebarchiesi@4 117 if ($instance = features_field_instance_load($identifier)) {
danielebarchiesi@4 118 // If this field is already provided by another module, remove the field
danielebarchiesi@4 119 // and add the other module as a dependency.
danielebarchiesi@4 120 if (isset($map[$identifier]) && $map[$identifier] != $module_name) {
danielebarchiesi@4 121 if (isset($export['features']['field_instance'][$identifier])) {
danielebarchiesi@4 122 unset($export['features']['field_instance'][$identifier]);
danielebarchiesi@4 123 }
danielebarchiesi@4 124 $module = $map[$identifier];
danielebarchiesi@4 125 $export['dependencies'][$module] = $module;
danielebarchiesi@4 126 }
danielebarchiesi@4 127 // If the field has not yet been exported, add it
danielebarchiesi@4 128 else {
danielebarchiesi@4 129 $export['features']['field_instance'][$identifier] = $identifier;
danielebarchiesi@4 130 $export['dependencies'][$instance['widget']['module']] = $instance['widget']['module'];
danielebarchiesi@4 131 foreach ($instance['display'] as $key => $display) {
danielebarchiesi@4 132 if (isset($display['module'])) {
danielebarchiesi@4 133 $export['dependencies'][$display['module']] = $display['module'];
danielebarchiesi@4 134 // @TODO: handle the pipe to image styles
danielebarchiesi@4 135 }
danielebarchiesi@4 136 }
danielebarchiesi@4 137 $pipe['field_base'][] = $instance['field_name'];
danielebarchiesi@4 138 }
danielebarchiesi@4 139 }
danielebarchiesi@4 140 }
danielebarchiesi@4 141 return $pipe;
danielebarchiesi@4 142 }
danielebarchiesi@4 143
danielebarchiesi@4 144 /**
danielebarchiesi@4 145 * Implements hook_features_export_render().
danielebarchiesi@4 146 */
danielebarchiesi@4 147 function field_base_features_export_render($module, $data, $export = NULL) {
danielebarchiesi@4 148 $translatables = $code = array();
danielebarchiesi@4 149 $code[] = ' $field_bases = array();';
danielebarchiesi@4 150 $code[] = '';
danielebarchiesi@4 151 foreach ($data as $identifier) {
danielebarchiesi@4 152 if ($field = features_field_base_load($identifier)) {
danielebarchiesi@4 153 unset($field['columns']);
danielebarchiesi@4 154 // unset($field['locked']);
danielebarchiesi@4 155 // Only remove the 'storage' declaration if the field is using the default
danielebarchiesi@4 156 // storage type.
danielebarchiesi@4 157 if ($field['storage']['type'] == variable_get('field_storage_default', 'field_sql_storage')) {
danielebarchiesi@4 158 unset($field['storage']);
danielebarchiesi@4 159 }
danielebarchiesi@4 160 // If we still have a storage declaration here it means that a non-default
danielebarchiesi@4 161 // storage type was altered into to the field definition. And noone would
danielebarchiesi@4 162 // never need to change the 'details' key, so don't render it.
danielebarchiesi@4 163 if (isset($field['storage']['details'])) {
danielebarchiesi@4 164 unset($field['storage']['details']);
danielebarchiesi@4 165 }
danielebarchiesi@4 166
danielebarchiesi@4 167 _field_instance_features_export_sort($field);
danielebarchiesi@4 168 $field_export = features_var_export($field, ' ');
danielebarchiesi@4 169 $field_identifier = features_var_export($identifier);
danielebarchiesi@4 170 $code[] = " // Exported field_base: {$field_identifier}";
danielebarchiesi@4 171 $code[] = " \$field_bases[{$field_identifier}] = {$field_export};";
danielebarchiesi@4 172 $code[] = "";
danielebarchiesi@4 173 }
danielebarchiesi@4 174 }
danielebarchiesi@4 175 $code[] = ' return $field_bases;';
danielebarchiesi@4 176 $code = implode("\n", $code);
danielebarchiesi@4 177 return array('field_default_field_bases' => $code);
danielebarchiesi@4 178 }
danielebarchiesi@4 179
danielebarchiesi@4 180 /**
danielebarchiesi@4 181 * Implements hook_features_export_render().
danielebarchiesi@4 182 */
danielebarchiesi@4 183 function field_instance_features_export_render($module, $data, $export = NULL) {
danielebarchiesi@4 184 $translatables = $code = array();
danielebarchiesi@4 185
danielebarchiesi@4 186 $code[] = ' $field_instances = array();';
danielebarchiesi@4 187 $code[] = '';
danielebarchiesi@4 188
danielebarchiesi@4 189 foreach ($data as $identifier) {
danielebarchiesi@4 190 if ($instance = features_field_instance_load($identifier)) {
danielebarchiesi@4 191 _field_instance_features_export_sort($instance);
danielebarchiesi@4 192 $field_export = features_var_export($instance, ' ');
danielebarchiesi@4 193 $instance_identifier = features_var_export($identifier);
danielebarchiesi@4 194 $code[] = " // Exported field_instance: {$instance_identifier}";
danielebarchiesi@4 195 $code[] = " \$field_instances[{$instance_identifier}] = {$field_export};";
danielebarchiesi@4 196 $code[] = "";
danielebarchiesi@4 197
danielebarchiesi@4 198 if (!empty($instance['label'])) {
danielebarchiesi@4 199 $translatables[] = $instance['label'];
danielebarchiesi@4 200 }
danielebarchiesi@4 201 if (!empty($instance['description'])) {
danielebarchiesi@4 202 $translatables[] = $instance['description'];
danielebarchiesi@4 203 }
danielebarchiesi@4 204 }
danielebarchiesi@4 205 }
danielebarchiesi@4 206 if (!empty($translatables)) {
danielebarchiesi@4 207 $code[] = features_translatables_export($translatables, ' ');
danielebarchiesi@4 208 }
danielebarchiesi@4 209 $code[] = ' return $field_instances;';
danielebarchiesi@4 210 $code = implode("\n", $code);
danielebarchiesi@4 211 return array('field_default_field_instances' => $code);
danielebarchiesi@4 212 }
danielebarchiesi@4 213
danielebarchiesi@4 214 // Helper to enforce consistency in field export arrays.
danielebarchiesi@4 215 function _field_instance_features_export_sort(&$field, $sort = TRUE) {
danielebarchiesi@4 216
danielebarchiesi@4 217 // Some arrays are not sorted to preserve order (for example allowed_values).
danielebarchiesi@4 218 static $sort_blacklist = array(
danielebarchiesi@4 219 'allowed_values',
danielebarchiesi@4 220 'format_handlers',
danielebarchiesi@4 221 );
danielebarchiesi@4 222
danielebarchiesi@4 223 if ($sort) {
danielebarchiesi@4 224 uksort($field, 'strnatcmp');
danielebarchiesi@4 225 }
danielebarchiesi@4 226 foreach ($field as $k => $v) {
danielebarchiesi@4 227 if (is_array($v)) {
danielebarchiesi@4 228 _field_instance_features_export_sort($field[$k], !in_array($k, $sort_blacklist));
danielebarchiesi@4 229 }
danielebarchiesi@4 230 }
danielebarchiesi@4 231 }
danielebarchiesi@4 232
danielebarchiesi@4 233 /**
danielebarchiesi@4 234 * Implements hook_features_revert().
danielebarchiesi@4 235 */
danielebarchiesi@4 236 function field_base_features_revert($module) {
danielebarchiesi@4 237 field_base_features_rebuild($module);
danielebarchiesi@4 238 }
danielebarchiesi@4 239
danielebarchiesi@4 240 /**
danielebarchiesi@4 241 * Implements hook_features_revert().
danielebarchiesi@4 242 */
danielebarchiesi@4 243 function field_instance_features_revert($module) {
danielebarchiesi@4 244 field_instance_features_rebuild($module);
danielebarchiesi@4 245 }
danielebarchiesi@4 246
danielebarchiesi@4 247 /**
danielebarchiesi@4 248 * Implements of hook_features_rebuild().
danielebarchiesi@4 249 * Rebuilds fields from code defaults.
danielebarchiesi@4 250 */
danielebarchiesi@4 251 function field_base_features_rebuild($module) {
danielebarchiesi@4 252 if ($fields = features_get_default('field_base', $module)) {
danielebarchiesi@4 253 field_info_cache_clear();
danielebarchiesi@4 254
danielebarchiesi@4 255 // Load all the existing field bases up-front so that we don't
danielebarchiesi@4 256 // have to rebuild the cache all the time.
danielebarchiesi@4 257 $existing_fields = field_info_fields();
danielebarchiesi@4 258
danielebarchiesi@4 259 foreach ($fields as $field) {
danielebarchiesi@4 260 // Create or update field.
danielebarchiesi@4 261 if (isset($existing_fields[$field['field_name']])) {
danielebarchiesi@4 262 $existing_field = $existing_fields[$field['field_name']];
danielebarchiesi@4 263 if ($field + $existing_field != $existing_field) {
danielebarchiesi@4 264 field_update_field($field);
danielebarchiesi@4 265 }
danielebarchiesi@4 266 }
danielebarchiesi@4 267 else {
danielebarchiesi@4 268 field_create_field($field);
danielebarchiesi@4 269 $existing_fields[$field['field_name']] = $field;
danielebarchiesi@4 270 }
danielebarchiesi@4 271 variable_set('menu_rebuild_needed', TRUE);
danielebarchiesi@4 272 }
danielebarchiesi@4 273 }
danielebarchiesi@4 274 }
danielebarchiesi@4 275
danielebarchiesi@4 276 /**
danielebarchiesi@4 277 * Implements of hook_features_rebuild().
danielebarchiesi@4 278 * Rebuilds field instances from code defaults.
danielebarchiesi@4 279 */
danielebarchiesi@4 280 function field_instance_features_rebuild($module) {
danielebarchiesi@4 281 if ($instances = features_get_default('field_instance', $module)) {
danielebarchiesi@4 282 field_info_cache_clear();
danielebarchiesi@4 283
danielebarchiesi@4 284 // Load all the existing instances up-front so that we don't
danielebarchiesi@4 285 // have to rebuild the cache all the time.
danielebarchiesi@4 286 $existing_instances = field_info_instances();
danielebarchiesi@4 287
danielebarchiesi@4 288 foreach ($instances as $field_instance) {
danielebarchiesi@4 289 // If the field base information does not exist yet, cancel out.
danielebarchiesi@4 290 if (!field_info_field($field_instance['field_name'])) {
danielebarchiesi@4 291 continue;
danielebarchiesi@4 292 }
danielebarchiesi@4 293
danielebarchiesi@4 294 // Create or update field instance.
danielebarchiesi@4 295 if (isset($existing_instances[$field_instance['entity_type']][$field_instance['bundle']][$field_instance['field_name']])) {
danielebarchiesi@4 296 $existing_instance = $existing_instances[$field_instance['entity_type']][$field_instance['bundle']][$field_instance['field_name']];
danielebarchiesi@4 297 if ($field_instance + $existing_instance != $existing_instance) {
danielebarchiesi@4 298 try {
danielebarchiesi@4 299 field_update_instance($field_instance);
danielebarchiesi@4 300 }
danielebarchiesi@4 301 catch (FieldException $e) {
danielebarchiesi@4 302 watchdog('features', 'Attempt to update field instance %label (in %entity entity type %bundle bundle) failed: %message', array('%label' => $field_instance['field_name'], '%entity' => $field_instance['entity_type'], '%bundle' => $field_instance['bundle'], '%message' => $e->getMessage()), WATCHDOG_ERROR);
danielebarchiesi@4 303 }
danielebarchiesi@4 304 }
danielebarchiesi@4 305 }
danielebarchiesi@4 306 else {
danielebarchiesi@4 307 try {
danielebarchiesi@4 308 field_create_instance($field_instance);
danielebarchiesi@4 309 }
danielebarchiesi@4 310 catch (FieldException $e) {
danielebarchiesi@4 311 watchdog('features', 'Attempt to create field instance %label (in %entity entity type %bundle bundle) failed: %message', array('%label' => $field_instance['field_name'], '%entity' => $field_instance['entity_type'], '%bundle' => $field_instance['bundle'], '%message' => $e->getMessage()), WATCHDOG_ERROR);
danielebarchiesi@4 312 }
danielebarchiesi@4 313 $existing_instances[$field_instance['entity_type']][$field_instance['bundle']][$field_instance['field_name']] = $field_instance;
danielebarchiesi@4 314 }
danielebarchiesi@4 315 }
danielebarchiesi@4 316
danielebarchiesi@4 317 if ($instances) {
danielebarchiesi@4 318 variable_set('menu_rebuild_needed', TRUE);
danielebarchiesi@4 319 }
danielebarchiesi@4 320 }
danielebarchiesi@4 321 }
danielebarchiesi@4 322
danielebarchiesi@4 323 /**
danielebarchiesi@4 324 * Load a field base configuration by a field_name identifier.
danielebarchiesi@4 325 */
danielebarchiesi@4 326 function features_field_base_load($field_name) {
danielebarchiesi@4 327 if ($field_info = field_info_field($field_name)) {
danielebarchiesi@4 328 unset($field_info['id']);
danielebarchiesi@4 329 unset($field_info['bundles']);
danielebarchiesi@4 330 return $field_info;
danielebarchiesi@4 331 }
danielebarchiesi@4 332 return FALSE;
danielebarchiesi@4 333 }
danielebarchiesi@4 334
danielebarchiesi@4 335 /**
danielebarchiesi@4 336 * Load a field's instance configuration by an entity_type-bundle-field_name
danielebarchiesi@4 337 * identifier.
danielebarchiesi@4 338 */
danielebarchiesi@4 339 function features_field_instance_load($identifier) {
danielebarchiesi@4 340 list($entity_type, $bundle, $field_name) = explode('-', $identifier);
danielebarchiesi@4 341 if ($instance_info = field_info_instance($entity_type, $field_name, $bundle)) {
danielebarchiesi@4 342 unset($instance_info['id']);
danielebarchiesi@4 343 unset($instance_info['field_id']);
danielebarchiesi@4 344 return $instance_info;
danielebarchiesi@4 345 }
danielebarchiesi@4 346 return FALSE;
danielebarchiesi@4 347 }
danielebarchiesi@4 348
danielebarchiesi@4 349 /* ----- DEPRECATED FIELD EXPORT -----
danielebarchiesi@4 350 * keep this code for backward compatibility with older exports
danielebarchiesi@4 351 * until v3.x
danielebarchiesi@4 352 */
danielebarchiesi@4 353
danielebarchiesi@4 354 /**
danielebarchiesi@4 355 * Implements hook_features_export_options().
danielebarchiesi@4 356 */
danielebarchiesi@4 357 function field_features_export_options() {
danielebarchiesi@4 358 $options = array();
danielebarchiesi@4 359 $instances = field_info_instances();
danielebarchiesi@4 360 foreach ($instances as $entity_type => $bundles) {
danielebarchiesi@4 361 foreach ($bundles as $bundle => $fields) {
danielebarchiesi@4 362 foreach ($fields as $field) {
danielebarchiesi@4 363 $identifier = "{$entity_type}-{$bundle}-{$field['field_name']}";
danielebarchiesi@4 364 $options[$identifier] = $identifier;
danielebarchiesi@4 365 }
danielebarchiesi@4 366 }
danielebarchiesi@4 367 }
danielebarchiesi@4 368 return $options;
danielebarchiesi@4 369 }
danielebarchiesi@4 370
danielebarchiesi@4 371 /**
danielebarchiesi@4 372 * Implements hook_features_export().
danielebarchiesi@4 373 */
danielebarchiesi@4 374 function field_features_export($data, &$export, $module_name = '') {
danielebarchiesi@4 375 $pipe = array();
danielebarchiesi@4 376 // Convert 'field' to 'field_instance' on features-update.
danielebarchiesi@4 377 $pipe['field_instance'] = $data;
danielebarchiesi@4 378 return $pipe;
danielebarchiesi@4 379 }
danielebarchiesi@4 380
danielebarchiesi@4 381 /**
danielebarchiesi@4 382 * Implements hook_features_export_render().
danielebarchiesi@4 383 */
danielebarchiesi@4 384 function field_features_export_render($module, $data, $export = NULL) {
danielebarchiesi@4 385 $translatables = $code = array();
danielebarchiesi@4 386
danielebarchiesi@4 387 $code[] = ' $fields = array();';
danielebarchiesi@4 388 $code[] = '';
danielebarchiesi@4 389 foreach ($data as $identifier) {
danielebarchiesi@4 390 if ($field = features_field_load($identifier)) {
danielebarchiesi@4 391 unset($field['field_config']['columns']);
danielebarchiesi@4 392 // Only remove the 'storage' declaration if the field is using the default
danielebarchiesi@4 393 // storage type.
danielebarchiesi@4 394 if ($field['field_config']['storage']['type'] == variable_get('field_storage_default', 'field_sql_storage')) {
danielebarchiesi@4 395 unset($field['field_config']['storage']);
danielebarchiesi@4 396 }
danielebarchiesi@4 397 // If we still have a storage declaration here it means that a non-default
danielebarchiesi@4 398 // storage type was altered into to the field definition. And noone would
danielebarchiesi@4 399 // never need to change the 'details' key, so don't render it.
danielebarchiesi@4 400 if (isset($field['field_config']['storage']['details'])) {
danielebarchiesi@4 401 unset($field['field_config']['storage']['details']);
danielebarchiesi@4 402 }
danielebarchiesi@4 403
danielebarchiesi@4 404 _field_features_export_sort($field);
danielebarchiesi@4 405 $field_export = features_var_export($field, ' ');
danielebarchiesi@4 406 $field_identifier = features_var_export($identifier);
danielebarchiesi@4 407 $code[] = " // Exported field: {$field_identifier}.";
danielebarchiesi@4 408 $code[] = " \$fields[{$field_identifier}] = {$field_export};";
danielebarchiesi@4 409 $code[] = "";
danielebarchiesi@4 410
danielebarchiesi@4 411 // Add label and description to translatables array.
danielebarchiesi@4 412 if (!empty($field['field_instance']['label'])) {
danielebarchiesi@4 413 $translatables[] = $field['field_instance']['label'];
danielebarchiesi@4 414 }
danielebarchiesi@4 415 if (!empty($field['field_instance']['description'])) {
danielebarchiesi@4 416 $translatables[] = $field['field_instance']['description'];
danielebarchiesi@4 417 }
danielebarchiesi@4 418 }
danielebarchiesi@4 419 }
danielebarchiesi@4 420 if (!empty($translatables)) {
danielebarchiesi@4 421 $code[] = features_translatables_export($translatables, ' ');
danielebarchiesi@4 422 }
danielebarchiesi@4 423 $code[] = ' return $fields;';
danielebarchiesi@4 424 $code = implode("\n", $code);
danielebarchiesi@4 425 return array('field_default_fields' => $code);
danielebarchiesi@4 426 }
danielebarchiesi@4 427
danielebarchiesi@4 428 // Helper to enforce consistency in field export arrays.
danielebarchiesi@4 429 function _field_features_export_sort(&$field, $sort = TRUE) {
danielebarchiesi@4 430
danielebarchiesi@4 431 // Some arrays are not sorted to preserve order (for example allowed_values).
danielebarchiesi@4 432 static $sort_blacklist = array(
danielebarchiesi@4 433 'allowed_values',
danielebarchiesi@4 434 'format_handlers',
danielebarchiesi@4 435 );
danielebarchiesi@4 436
danielebarchiesi@4 437 if ($sort) {
danielebarchiesi@4 438 ksort($field);
danielebarchiesi@4 439 }
danielebarchiesi@4 440 foreach ($field as $k => $v) {
danielebarchiesi@4 441 if (is_array($v)) {
danielebarchiesi@4 442 _field_features_export_sort($field[$k], !in_array($k, $sort_blacklist));
danielebarchiesi@4 443 }
danielebarchiesi@4 444 }
danielebarchiesi@4 445 }
danielebarchiesi@4 446
danielebarchiesi@4 447 /**
danielebarchiesi@4 448 * Implements hook_features_revert().
danielebarchiesi@4 449 */
danielebarchiesi@4 450 function field_features_revert($module) {
danielebarchiesi@4 451 field_features_rebuild($module);
danielebarchiesi@4 452 }
danielebarchiesi@4 453
danielebarchiesi@4 454 /**
danielebarchiesi@4 455 * Implements of hook_features_rebuild().
danielebarchiesi@4 456 * Rebuilds fields from code defaults.
danielebarchiesi@4 457 */
danielebarchiesi@4 458 function field_features_rebuild($module) {
danielebarchiesi@4 459 if ($fields = features_get_default('field', $module)) {
danielebarchiesi@4 460 field_info_cache_clear();
danielebarchiesi@4 461
danielebarchiesi@4 462 // Load all the existing fields and instance up-front so that we don't
danielebarchiesi@4 463 // have to rebuild the cache all the time.
danielebarchiesi@4 464 $existing_fields = field_info_fields();
danielebarchiesi@4 465 $existing_instances = field_info_instances();
danielebarchiesi@4 466
danielebarchiesi@4 467 foreach ($fields as $field) {
danielebarchiesi@4 468 // Create or update field.
danielebarchiesi@4 469 $field_config = $field['field_config'];
danielebarchiesi@4 470 if (isset($existing_fields[$field_config['field_name']])) {
danielebarchiesi@4 471 $existing_field = $existing_fields[$field_config['field_name']];
danielebarchiesi@4 472 if ($field_config + $existing_field != $existing_field) {
danielebarchiesi@4 473 try {
danielebarchiesi@4 474 field_update_field($field_config);
danielebarchiesi@4 475 }
danielebarchiesi@4 476 catch (FieldException $e) {
danielebarchiesi@4 477 watchdog('features', 'Attempt to update field %label failed: %message', array('%label' => $field_config['field_name'], '%message' => $e->getMessage()), WATCHDOG_ERROR);
danielebarchiesi@4 478 }
danielebarchiesi@4 479 }
danielebarchiesi@4 480 }
danielebarchiesi@4 481 else {
danielebarchiesi@4 482 try {
danielebarchiesi@4 483 field_create_field($field_config);
danielebarchiesi@4 484 }
danielebarchiesi@4 485 catch (FieldException $e) {
danielebarchiesi@4 486 watchdog('features', 'Attempt to create field %label failed: %message', array('%label' => $field_config['field_name'], '%message' => $e->getMessage()), WATCHDOG_ERROR);
danielebarchiesi@4 487 }
danielebarchiesi@4 488 $existing_fields[$field_config['field_name']] = $field_config;
danielebarchiesi@4 489 }
danielebarchiesi@4 490
danielebarchiesi@4 491 // Create or update field instance.
danielebarchiesi@4 492 $field_instance = $field['field_instance'];
danielebarchiesi@4 493 if (isset($existing_instances[$field_instance['entity_type']][$field_instance['bundle']][$field_instance['field_name']])) {
danielebarchiesi@4 494 $existing_instance = $existing_instances[$field_instance['entity_type']][$field_instance['bundle']][$field_instance['field_name']];
danielebarchiesi@4 495 if ($field_instance + $existing_instance != $existing_instance) {
danielebarchiesi@4 496 field_update_instance($field_instance);
danielebarchiesi@4 497 }
danielebarchiesi@4 498 }
danielebarchiesi@4 499 else {
danielebarchiesi@4 500 field_create_instance($field_instance);
danielebarchiesi@4 501 $existing_instances[$field_instance['entity_type']][$field_instance['bundle']][$field_instance['field_name']] = $field_instance;
danielebarchiesi@4 502 }
danielebarchiesi@4 503 }
danielebarchiesi@4 504
danielebarchiesi@4 505 if ($fields) {
danielebarchiesi@4 506 variable_set('menu_rebuild_needed', TRUE);
danielebarchiesi@4 507 }
danielebarchiesi@4 508 }
danielebarchiesi@4 509 }
danielebarchiesi@4 510
danielebarchiesi@4 511 /**
danielebarchiesi@4 512 * Load a field's configuration and instance configuration by an
danielebarchiesi@4 513 * entity_type-bundle-field_name identifier.
danielebarchiesi@4 514 */
danielebarchiesi@4 515 function features_field_load($identifier) {
danielebarchiesi@4 516 list($entity_type, $bundle, $field_name) = explode('-', $identifier);
danielebarchiesi@4 517 $field_info = field_info_field($field_name);
danielebarchiesi@4 518 $instance_info = field_info_instance($entity_type, $field_name, $bundle);
danielebarchiesi@4 519 if ($field_info && $instance_info) {
danielebarchiesi@4 520 unset($field_info['id']);
danielebarchiesi@4 521 unset($field_info['bundles']);
danielebarchiesi@4 522 unset($instance_info['id']);
danielebarchiesi@4 523 unset($instance_info['field_id']);
danielebarchiesi@4 524 return array(
danielebarchiesi@4 525 'field_config' => $field_info,
danielebarchiesi@4 526 'field_instance' => $instance_info,
danielebarchiesi@4 527 );
danielebarchiesi@4 528 }
danielebarchiesi@4 529 return FALSE;
danielebarchiesi@4 530 }