danielebarchiesi@4: addField('fci', 'id'); danielebarchiesi@4: $query->condition('fci.bundle', $bundle); danielebarchiesi@4: $new_instance['id'] = $query->execute()->fetchField(); danielebarchiesi@4: } danielebarchiesi@4: // Check if we perform strict inheritance. danielebarchiesi@4: if ($strict) { danielebarchiesi@4: db_insert('bundle_hierarchy') danielebarchiesi@4: ->fields(array( danielebarchiesi@4: 'entity_type' => $entity_type, danielebarchiesi@4: 'bundle' => $bundle, danielebarchiesi@4: 'bundle_parent' => $bundle_parent danielebarchiesi@4: )) danielebarchiesi@4: ->execute(); danielebarchiesi@4: watchdog('bundle_inherit', 'The %bundle bundle of the entity %type was STRICTLY inherited from %parent_bundle bundle.', array('%bundle' => $bundle, '%bundle_parent' => $bundle_parent, '%type' => $entity_type)); danielebarchiesi@4: drupal_static_reset('bundle_inherit_bundle_get_children'); danielebarchiesi@4: } danielebarchiesi@4: else{ danielebarchiesi@4: watchdog('bundle_inherit', 'The %bundle bundle of the entity %type was SOFTLY inherited from %parent_bundle bundle.', array('%bundle' => $bundle, '%bundle_parent' => $bundle_parent, '%type' => $entity_type)); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_field_create_instance(). danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_field_create_instance($instance) { danielebarchiesi@4: $children = bundle_inherit_bundle_get_children($instance['entity_type'], $instance['bundle']); danielebarchiesi@4: foreach ($children as $bundle) { danielebarchiesi@4: $new_instance = $instance; danielebarchiesi@4: unset($new_instance['id']); danielebarchiesi@4: $new_instance['bundle'] = $bundle; danielebarchiesi@4: $new_instance['locked'] = TRUE; danielebarchiesi@4: field_create_instance($new_instance); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_field_update_instance(). danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_field_update_instance($instance, $prior_instance) { danielebarchiesi@4: $children = bundle_inherit_bundle_get_children($prior_instance['entity_type'], $prior_instance['bundle']); danielebarchiesi@4: danielebarchiesi@4: foreach ($children as $bundle) { danielebarchiesi@4: $old_instance = field_info_instance($instance['entity_type'], $instance['field_name'], $bundle); danielebarchiesi@4: danielebarchiesi@4: $new_instance = array( danielebarchiesi@4: 'id' => $old_instance['id'], danielebarchiesi@4: 'bundle' => $old_instance['bundle'], danielebarchiesi@4: 'locked' => TRUE danielebarchiesi@4: ); danielebarchiesi@4: $new_instance += $instance; danielebarchiesi@4: danielebarchiesi@4: field_update_instance($new_instance); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_field_delete_instance(). danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_field_delete_instance($instance) { danielebarchiesi@4: $children = bundle_inherit_bundle_get_children($instance['entity_type'], $instance['bundle']); danielebarchiesi@4: foreach ($children as $bundle) { danielebarchiesi@4: $new_instance = $instance; danielebarchiesi@4: $new_instance['bundle'] = $bundle; danielebarchiesi@4: $new_instance['locked'] = FALSE; danielebarchiesi@4: try { danielebarchiesi@4: field_update_instance($new_instance); danielebarchiesi@4: } danielebarchiesi@4: catch (Exception $e) { danielebarchiesi@4: drupal_set_message($e->getMessage(), 'error'); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_form_FORMID_alter(). danielebarchiesi@4: * danielebarchiesi@4: * Attach additional validation callback to the field_ui_field_overview_form. danielebarchiesi@4: * When adding new field instance to the parent we should check that all of it danielebarchiesi@4: * childrens hase not that field instances. danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_form_field_ui_field_overview_form_alter(&$form, &$form_instance, $form_id) { danielebarchiesi@4: $form['#validate'][] = 'bundle_inherit_validate_field_instance_creation'; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Additional validation function to the field_ui_field_overview_form. danielebarchiesi@4: * danielebarchiesi@4: * While adding existing field instance, get this form is created for and set danielebarchiesi@4: * form error if any of this children has instance of this field. danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_validate_field_instance_creation($form, &$form_state) { danielebarchiesi@4: $form_values = $form_state['values']['fields']; danielebarchiesi@4: if (!empty($form_values['_add_existing_field']['field_name'])) { danielebarchiesi@4: $children = bundle_inherit_bundle_get_children_all($form['#entity_type'], $form['#bundle']); danielebarchiesi@4: $bundles_with_instance = array(); danielebarchiesi@4: foreach ($children as $child) { danielebarchiesi@4: $prior_instance = field_info_instance($form['#entity_type'], $form_values['_add_existing_field']['field_name'], $child); danielebarchiesi@4: if (!empty($prior_instance)) { danielebarchiesi@4: $bundles_with_instance[] = $prior_instance['bundle']; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: if (count($bundles_with_instance) > 0) { danielebarchiesi@4: $string = implode(", ", $bundles_with_instance); danielebarchiesi@4: form_set_error('fields][_add_existing_field', t("Instance of the field %field can't be attached to %bundle bundle because this field instances are already attached to some of this bundle children bundles: %children", array('%bundle' => $form['#bundle'], '%field' => $form_values['_add_existing_field']['field_name'], '%children' => $string))); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Get direct children bundles of the selected entity bundle. danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_bundle_get_children($entity_type, $bundle_parent) { danielebarchiesi@4: $children = &drupal_static(__FUNCTION__); danielebarchiesi@4: if (!isset($children[$entity_type][$bundle_parent])) { danielebarchiesi@4: $children[$entity_type][$bundle_parent] = db_select('bundle_hierarchy', 'bh') danielebarchiesi@4: ->fields('bh', array('bundle')) danielebarchiesi@4: ->condition('bundle_parent', $bundle_parent) danielebarchiesi@4: ->condition('entity_type', $entity_type) danielebarchiesi@4: ->execute() danielebarchiesi@4: ->fetchCol(); danielebarchiesi@4: } danielebarchiesi@4: return $children[$entity_type][$bundle_parent]; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Get all children bundles of the selected entity bundle. danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_bundle_get_children_all($entity_type, $bundle_parent) { danielebarchiesi@4: $children = array(); danielebarchiesi@4: $children = bundle_inherit_bundle_get_children($entity_type, $bundle_parent); danielebarchiesi@4: foreach ($children as $child) { danielebarchiesi@4: $children = array_merge($children, bundle_inherit_bundle_get_children_all($entity_type, $child)); danielebarchiesi@4: } danielebarchiesi@4: return $children; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Get parent of the selected entity bundle. danielebarchiesi@4: * danielebarchiesi@4: * @return danielebarchiesi@4: * Entity type parent type. danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_bundle_get_parent($entity_type, $bundle) { danielebarchiesi@4: $parent = &drupal_static(__FUNCTION__); danielebarchiesi@4: if (!isset($parent[$entity_type][$bundle])) { danielebarchiesi@4: $parent[$entity_type][$bundle] = db_select('bundle_hierarchy', 'bh') danielebarchiesi@4: ->fields('bh', array('bundle_parent')) danielebarchiesi@4: ->condition('bh.bundle', $bundle) danielebarchiesi@4: ->execute() danielebarchiesi@4: ->fetchField(); danielebarchiesi@4: if (!$parent[$entity_type][$bundle]) $parent[$entity_type][$bundle] = ''; danielebarchiesi@4: } danielebarchiesi@4: return $parent[$entity_type][$bundle]; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Attach ineritance form to selected form element. danielebarchiesi@4: * danielebarchiesi@4: * @param $form danielebarchiesi@4: * Parent form element to attach inheritance form to. danielebarchiesi@4: * @param $form_state danielebarchiesi@4: * From state from the parent form. danielebarchiesi@4: * @param $entity_type danielebarchiesi@4: * Entity for which bundle is creating for. danielebarchiesi@4: * @param $bundle danielebarchiesi@4: * If editing existing bundle value for this argument should be provided. danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_attach_inherit_form(&$form, &$form_state, $entity_type, $bundle = '') { danielebarchiesi@4: $entity = entity_get_info($entity_type); danielebarchiesi@4: if (count($entity['bundles']) > 0) { danielebarchiesi@4: if (empty($bundle)) { danielebarchiesi@4: $form['bundle_inherit'] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#tree' => TRUE, danielebarchiesi@4: '#title' => t('Inheritance') danielebarchiesi@4: ); danielebarchiesi@4: $form['bundle_inherit']['entity_type'] = array('#type' => 'value', '#value' => $entity_type); danielebarchiesi@4: $form['bundle_inherit']['#parents'] = array('bundle_inherit'); danielebarchiesi@4: $form['bundle_inherit']['inherit'] = array( danielebarchiesi@4: '#type' => 'checkbox', danielebarchiesi@4: '#title' => t('Inherit from other') danielebarchiesi@4: ); danielebarchiesi@4: danielebarchiesi@4: foreach ($entity['bundles'] as $bundle_name => $bundle) { danielebarchiesi@4: $options[$bundle_name] = $bundle['label']; danielebarchiesi@4: } danielebarchiesi@4: $form['bundle_inherit']['parent_type'] = array( danielebarchiesi@4: '#type' => 'select', danielebarchiesi@4: '#options' => $options, danielebarchiesi@4: '#title' => t('Parent'), danielebarchiesi@4: '#states' => array( danielebarchiesi@4: // Hide the inheritance settings when inherit checkbox is disabled. danielebarchiesi@4: 'invisible' => array( danielebarchiesi@4: 'input[name="bundle_inherit[inherit]"]' => array('checked' => FALSE), danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: $form['bundle_inherit']['mode'] = array( danielebarchiesi@4: '#type' => 'radios', danielebarchiesi@4: '#options' => array( danielebarchiesi@4: 'strict' => t('Strict inherit'), danielebarchiesi@4: 'soft' => t('Soft inherit'), danielebarchiesi@4: ), danielebarchiesi@4: '#default_value' => 'strict', danielebarchiesi@4: '#required' => TRUE, danielebarchiesi@4: '#states' => array( danielebarchiesi@4: // Hide the inheritance settings when inherit checkbox is disabled. danielebarchiesi@4: 'invisible' => array( danielebarchiesi@4: 'input[name="bundle_inherit[inherit]"]' => array('checked' => FALSE), danielebarchiesi@4: ), danielebarchiesi@4: ), danielebarchiesi@4: '#title' => t('Inheritance mode') danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $parent_bundle_name = bundle_inherit_bundle_get_parent($entity_type, $bundle); danielebarchiesi@4: if (!empty($parent_bundle_name)) { danielebarchiesi@4: $form['bundle_inherit'] = array( danielebarchiesi@4: '#type' => 'fieldset', danielebarchiesi@4: '#tree' => TRUE, danielebarchiesi@4: '#title' => t('Inheritance') danielebarchiesi@4: ); danielebarchiesi@4: $form['bundle_inherit']['message'] = array( danielebarchiesi@4: '#markup' => t('This bundle was inherited from !parent_bundle bundle.', array('!parent_bundle' => l($entity['bundles'][$parent_bundle_name]['label'], $entity['bundles'][$parent_bundle_name]['admin']['real path'].'/fields'))) danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Should be executed when entity creation form is submiting. danielebarchiesi@4: * danielebarchiesi@4: * @param $bundle danielebarchiesi@4: * Newly created bundle name. danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_attach_inherit_form_submit($bundle, &$form, &$form_state) { danielebarchiesi@4: if (isset($form_state['values']['bundle_inherit']) && $form_state['values']['bundle_inherit']['inherit']) { danielebarchiesi@4: $bundle_inherit_values = $form_state['values']['bundle_inherit']; danielebarchiesi@4: bundle_inherit_perform($bundle_inherit_values['entity_type'], $bundle, $bundle_inherit_values['parent_type'], $bundle_inherit_values['mode'] == 'strict' ? TRUE : FALSE); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_field_attach_delete_bundle(). danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_field_attach_delete_bundle($entity_type, $bundle, $instances) { danielebarchiesi@4: db_delete('bundle_hierarchy') danielebarchiesi@4: ->condition('entity_type', $entity_type) danielebarchiesi@4: ->condition(db_or()->condition('bundle_parent', $bundle)->condition('bundle', $bundle)) danielebarchiesi@4: ->execute(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_field_attach_rename_bundle(). danielebarchiesi@4: */ danielebarchiesi@4: function bundle_inherit_field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) { danielebarchiesi@4: db_update('bundle_hierarchy') danielebarchiesi@4: ->condition('entity_type', $entity_type) danielebarchiesi@4: ->condition('bundle', $bundle_old) danielebarchiesi@4: ->fields(array( danielebarchiesi@4: 'bundle' => $bundle_new danielebarchiesi@4: )) danielebarchiesi@4: ->execute(); danielebarchiesi@4: db_update('bundle_hierarchy') danielebarchiesi@4: ->condition('entity_type', $entity_type) danielebarchiesi@4: ->condition('bundle_parent', $bundle_old) danielebarchiesi@4: ->fields(array( danielebarchiesi@4: 'bundle_parent' => $bundle_new danielebarchiesi@4: )) danielebarchiesi@4: ->execute(); danielebarchiesi@4: }