annotate sites/all/modules/bundle_inherit/bundle_inherit.module @ 11:b0ee71395280

deleted .DS_Store files
author danieleb <danielebarchiesi@me.com>
date Mon, 28 Oct 2013 16:12:13 +0000
parents ce11bbd8f642
children
rev   line source
danielebarchiesi@4 1 <?php
danielebarchiesi@4 2 /**
danielebarchiesi@4 3 * @file
danielebarchiesi@4 4 * Bundle Inherit module.
danielebarchiesi@4 5 */
danielebarchiesi@4 6
danielebarchiesi@4 7 /**
danielebarchiesi@4 8 * Perform necesary inherit operations.
danielebarchiesi@4 9 */
danielebarchiesi@4 10 function bundle_inherit_perform($entity_type, $bundle, $bundle_parent, $strict = TRUE) {
danielebarchiesi@4 11 // Get fields from parent bundle.
danielebarchiesi@4 12 $instances = field_info_instances($entity_type, $bundle_parent);
danielebarchiesi@4 13 foreach ($instances as $instance) {
danielebarchiesi@4 14 $new_instance = $instance;
danielebarchiesi@4 15 $new_instance['bundle'] = $bundle;
danielebarchiesi@4 16
danielebarchiesi@4 17 if ($strict) {
danielebarchiesi@4 18 $new_instance['locked'] = TRUE;
danielebarchiesi@4 19 }
danielebarchiesi@4 20
danielebarchiesi@4 21 $new_instance = field_create_instance($new_instance);
danielebarchiesi@4 22 $query = db_select('field_config_instance', 'fci');
danielebarchiesi@4 23 $query->addField('fci', 'id');
danielebarchiesi@4 24 $query->condition('fci.bundle', $bundle);
danielebarchiesi@4 25 $new_instance['id'] = $query->execute()->fetchField();
danielebarchiesi@4 26 }
danielebarchiesi@4 27 // Check if we perform strict inheritance.
danielebarchiesi@4 28 if ($strict) {
danielebarchiesi@4 29 db_insert('bundle_hierarchy')
danielebarchiesi@4 30 ->fields(array(
danielebarchiesi@4 31 'entity_type' => $entity_type,
danielebarchiesi@4 32 'bundle' => $bundle,
danielebarchiesi@4 33 'bundle_parent' => $bundle_parent
danielebarchiesi@4 34 ))
danielebarchiesi@4 35 ->execute();
danielebarchiesi@4 36 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 37 drupal_static_reset('bundle_inherit_bundle_get_children');
danielebarchiesi@4 38 }
danielebarchiesi@4 39 else{
danielebarchiesi@4 40 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 41 }
danielebarchiesi@4 42 }
danielebarchiesi@4 43
danielebarchiesi@4 44 /**
danielebarchiesi@4 45 * Implements hook_field_create_instance().
danielebarchiesi@4 46 */
danielebarchiesi@4 47 function bundle_inherit_field_create_instance($instance) {
danielebarchiesi@4 48 $children = bundle_inherit_bundle_get_children($instance['entity_type'], $instance['bundle']);
danielebarchiesi@4 49 foreach ($children as $bundle) {
danielebarchiesi@4 50 $new_instance = $instance;
danielebarchiesi@4 51 unset($new_instance['id']);
danielebarchiesi@4 52 $new_instance['bundle'] = $bundle;
danielebarchiesi@4 53 $new_instance['locked'] = TRUE;
danielebarchiesi@4 54 field_create_instance($new_instance);
danielebarchiesi@4 55 }
danielebarchiesi@4 56 }
danielebarchiesi@4 57
danielebarchiesi@4 58 /**
danielebarchiesi@4 59 * Implements hook_field_update_instance().
danielebarchiesi@4 60 */
danielebarchiesi@4 61 function bundle_inherit_field_update_instance($instance, $prior_instance) {
danielebarchiesi@4 62 $children = bundle_inherit_bundle_get_children($prior_instance['entity_type'], $prior_instance['bundle']);
danielebarchiesi@4 63
danielebarchiesi@4 64 foreach ($children as $bundle) {
danielebarchiesi@4 65 $old_instance = field_info_instance($instance['entity_type'], $instance['field_name'], $bundle);
danielebarchiesi@4 66
danielebarchiesi@4 67 $new_instance = array(
danielebarchiesi@4 68 'id' => $old_instance['id'],
danielebarchiesi@4 69 'bundle' => $old_instance['bundle'],
danielebarchiesi@4 70 'locked' => TRUE
danielebarchiesi@4 71 );
danielebarchiesi@4 72 $new_instance += $instance;
danielebarchiesi@4 73
danielebarchiesi@4 74 field_update_instance($new_instance);
danielebarchiesi@4 75 }
danielebarchiesi@4 76 }
danielebarchiesi@4 77
danielebarchiesi@4 78 /**
danielebarchiesi@4 79 * Implements hook_field_delete_instance().
danielebarchiesi@4 80 */
danielebarchiesi@4 81 function bundle_inherit_field_delete_instance($instance) {
danielebarchiesi@4 82 $children = bundle_inherit_bundle_get_children($instance['entity_type'], $instance['bundle']);
danielebarchiesi@4 83 foreach ($children as $bundle) {
danielebarchiesi@4 84 $new_instance = $instance;
danielebarchiesi@4 85 $new_instance['bundle'] = $bundle;
danielebarchiesi@4 86 $new_instance['locked'] = FALSE;
danielebarchiesi@4 87 try {
danielebarchiesi@4 88 field_update_instance($new_instance);
danielebarchiesi@4 89 }
danielebarchiesi@4 90 catch (Exception $e) {
danielebarchiesi@4 91 drupal_set_message($e->getMessage(), 'error');
danielebarchiesi@4 92 }
danielebarchiesi@4 93 }
danielebarchiesi@4 94 }
danielebarchiesi@4 95
danielebarchiesi@4 96 /**
danielebarchiesi@4 97 * Implements hook_form_FORMID_alter().
danielebarchiesi@4 98 *
danielebarchiesi@4 99 * Attach additional validation callback to the field_ui_field_overview_form.
danielebarchiesi@4 100 * When adding new field instance to the parent we should check that all of it
danielebarchiesi@4 101 * childrens hase not that field instances.
danielebarchiesi@4 102 */
danielebarchiesi@4 103 function bundle_inherit_form_field_ui_field_overview_form_alter(&$form, &$form_instance, $form_id) {
danielebarchiesi@4 104 $form['#validate'][] = 'bundle_inherit_validate_field_instance_creation';
danielebarchiesi@4 105 }
danielebarchiesi@4 106
danielebarchiesi@4 107 /**
danielebarchiesi@4 108 * Additional validation function to the field_ui_field_overview_form.
danielebarchiesi@4 109 *
danielebarchiesi@4 110 * While adding existing field instance, get this form is created for and set
danielebarchiesi@4 111 * form error if any of this children has instance of this field.
danielebarchiesi@4 112 */
danielebarchiesi@4 113 function bundle_inherit_validate_field_instance_creation($form, &$form_state) {
danielebarchiesi@4 114 $form_values = $form_state['values']['fields'];
danielebarchiesi@4 115 if (!empty($form_values['_add_existing_field']['field_name'])) {
danielebarchiesi@4 116 $children = bundle_inherit_bundle_get_children_all($form['#entity_type'], $form['#bundle']);
danielebarchiesi@4 117 $bundles_with_instance = array();
danielebarchiesi@4 118 foreach ($children as $child) {
danielebarchiesi@4 119 $prior_instance = field_info_instance($form['#entity_type'], $form_values['_add_existing_field']['field_name'], $child);
danielebarchiesi@4 120 if (!empty($prior_instance)) {
danielebarchiesi@4 121 $bundles_with_instance[] = $prior_instance['bundle'];
danielebarchiesi@4 122 }
danielebarchiesi@4 123 }
danielebarchiesi@4 124 if (count($bundles_with_instance) > 0) {
danielebarchiesi@4 125 $string = implode(", ", $bundles_with_instance);
danielebarchiesi@4 126 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 127 }
danielebarchiesi@4 128 }
danielebarchiesi@4 129 }
danielebarchiesi@4 130
danielebarchiesi@4 131 /**
danielebarchiesi@4 132 * Get direct children bundles of the selected entity bundle.
danielebarchiesi@4 133 */
danielebarchiesi@4 134 function bundle_inherit_bundle_get_children($entity_type, $bundle_parent) {
danielebarchiesi@4 135 $children = &drupal_static(__FUNCTION__);
danielebarchiesi@4 136 if (!isset($children[$entity_type][$bundle_parent])) {
danielebarchiesi@4 137 $children[$entity_type][$bundle_parent] = db_select('bundle_hierarchy', 'bh')
danielebarchiesi@4 138 ->fields('bh', array('bundle'))
danielebarchiesi@4 139 ->condition('bundle_parent', $bundle_parent)
danielebarchiesi@4 140 ->condition('entity_type', $entity_type)
danielebarchiesi@4 141 ->execute()
danielebarchiesi@4 142 ->fetchCol();
danielebarchiesi@4 143 }
danielebarchiesi@4 144 return $children[$entity_type][$bundle_parent];
danielebarchiesi@4 145 }
danielebarchiesi@4 146
danielebarchiesi@4 147 /**
danielebarchiesi@4 148 * Get all children bundles of the selected entity bundle.
danielebarchiesi@4 149 */
danielebarchiesi@4 150 function bundle_inherit_bundle_get_children_all($entity_type, $bundle_parent) {
danielebarchiesi@4 151 $children = array();
danielebarchiesi@4 152 $children = bundle_inherit_bundle_get_children($entity_type, $bundle_parent);
danielebarchiesi@4 153 foreach ($children as $child) {
danielebarchiesi@4 154 $children = array_merge($children, bundle_inherit_bundle_get_children_all($entity_type, $child));
danielebarchiesi@4 155 }
danielebarchiesi@4 156 return $children;
danielebarchiesi@4 157 }
danielebarchiesi@4 158
danielebarchiesi@4 159 /**
danielebarchiesi@4 160 * Get parent of the selected entity bundle.
danielebarchiesi@4 161 *
danielebarchiesi@4 162 * @return
danielebarchiesi@4 163 * Entity type parent type.
danielebarchiesi@4 164 */
danielebarchiesi@4 165 function bundle_inherit_bundle_get_parent($entity_type, $bundle) {
danielebarchiesi@4 166 $parent = &drupal_static(__FUNCTION__);
danielebarchiesi@4 167 if (!isset($parent[$entity_type][$bundle])) {
danielebarchiesi@4 168 $parent[$entity_type][$bundle] = db_select('bundle_hierarchy', 'bh')
danielebarchiesi@4 169 ->fields('bh', array('bundle_parent'))
danielebarchiesi@4 170 ->condition('bh.bundle', $bundle)
danielebarchiesi@4 171 ->execute()
danielebarchiesi@4 172 ->fetchField();
danielebarchiesi@4 173 if (!$parent[$entity_type][$bundle]) $parent[$entity_type][$bundle] = '';
danielebarchiesi@4 174 }
danielebarchiesi@4 175 return $parent[$entity_type][$bundle];
danielebarchiesi@4 176 }
danielebarchiesi@4 177
danielebarchiesi@4 178 /**
danielebarchiesi@4 179 * Attach ineritance form to selected form element.
danielebarchiesi@4 180 *
danielebarchiesi@4 181 * @param $form
danielebarchiesi@4 182 * Parent form element to attach inheritance form to.
danielebarchiesi@4 183 * @param $form_state
danielebarchiesi@4 184 * From state from the parent form.
danielebarchiesi@4 185 * @param $entity_type
danielebarchiesi@4 186 * Entity for which bundle is creating for.
danielebarchiesi@4 187 * @param $bundle
danielebarchiesi@4 188 * If editing existing bundle value for this argument should be provided.
danielebarchiesi@4 189 */
danielebarchiesi@4 190 function bundle_inherit_attach_inherit_form(&$form, &$form_state, $entity_type, $bundle = '') {
danielebarchiesi@4 191 $entity = entity_get_info($entity_type);
danielebarchiesi@4 192 if (count($entity['bundles']) > 0) {
danielebarchiesi@4 193 if (empty($bundle)) {
danielebarchiesi@4 194 $form['bundle_inherit'] = array(
danielebarchiesi@4 195 '#type' => 'fieldset',
danielebarchiesi@4 196 '#tree' => TRUE,
danielebarchiesi@4 197 '#title' => t('Inheritance')
danielebarchiesi@4 198 );
danielebarchiesi@4 199 $form['bundle_inherit']['entity_type'] = array('#type' => 'value', '#value' => $entity_type);
danielebarchiesi@4 200 $form['bundle_inherit']['#parents'] = array('bundle_inherit');
danielebarchiesi@4 201 $form['bundle_inherit']['inherit'] = array(
danielebarchiesi@4 202 '#type' => 'checkbox',
danielebarchiesi@4 203 '#title' => t('Inherit from other')
danielebarchiesi@4 204 );
danielebarchiesi@4 205
danielebarchiesi@4 206 foreach ($entity['bundles'] as $bundle_name => $bundle) {
danielebarchiesi@4 207 $options[$bundle_name] = $bundle['label'];
danielebarchiesi@4 208 }
danielebarchiesi@4 209 $form['bundle_inherit']['parent_type'] = array(
danielebarchiesi@4 210 '#type' => 'select',
danielebarchiesi@4 211 '#options' => $options,
danielebarchiesi@4 212 '#title' => t('Parent'),
danielebarchiesi@4 213 '#states' => array(
danielebarchiesi@4 214 // Hide the inheritance settings when inherit checkbox is disabled.
danielebarchiesi@4 215 'invisible' => array(
danielebarchiesi@4 216 'input[name="bundle_inherit[inherit]"]' => array('checked' => FALSE),
danielebarchiesi@4 217 ),
danielebarchiesi@4 218 ),
danielebarchiesi@4 219 );
danielebarchiesi@4 220 $form['bundle_inherit']['mode'] = array(
danielebarchiesi@4 221 '#type' => 'radios',
danielebarchiesi@4 222 '#options' => array(
danielebarchiesi@4 223 'strict' => t('Strict inherit'),
danielebarchiesi@4 224 'soft' => t('Soft inherit'),
danielebarchiesi@4 225 ),
danielebarchiesi@4 226 '#default_value' => 'strict',
danielebarchiesi@4 227 '#required' => TRUE,
danielebarchiesi@4 228 '#states' => array(
danielebarchiesi@4 229 // Hide the inheritance settings when inherit checkbox is disabled.
danielebarchiesi@4 230 'invisible' => array(
danielebarchiesi@4 231 'input[name="bundle_inherit[inherit]"]' => array('checked' => FALSE),
danielebarchiesi@4 232 ),
danielebarchiesi@4 233 ),
danielebarchiesi@4 234 '#title' => t('Inheritance mode')
danielebarchiesi@4 235 );
danielebarchiesi@4 236 }
danielebarchiesi@4 237 else {
danielebarchiesi@4 238 $parent_bundle_name = bundle_inherit_bundle_get_parent($entity_type, $bundle);
danielebarchiesi@4 239 if (!empty($parent_bundle_name)) {
danielebarchiesi@4 240 $form['bundle_inherit'] = array(
danielebarchiesi@4 241 '#type' => 'fieldset',
danielebarchiesi@4 242 '#tree' => TRUE,
danielebarchiesi@4 243 '#title' => t('Inheritance')
danielebarchiesi@4 244 );
danielebarchiesi@4 245 $form['bundle_inherit']['message'] = array(
danielebarchiesi@4 246 '#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 247 );
danielebarchiesi@4 248 }
danielebarchiesi@4 249 }
danielebarchiesi@4 250 }
danielebarchiesi@4 251 }
danielebarchiesi@4 252
danielebarchiesi@4 253 /**
danielebarchiesi@4 254 * Should be executed when entity creation form is submiting.
danielebarchiesi@4 255 *
danielebarchiesi@4 256 * @param $bundle
danielebarchiesi@4 257 * Newly created bundle name.
danielebarchiesi@4 258 */
danielebarchiesi@4 259 function bundle_inherit_attach_inherit_form_submit($bundle, &$form, &$form_state) {
danielebarchiesi@4 260 if (isset($form_state['values']['bundle_inherit']) && $form_state['values']['bundle_inherit']['inherit']) {
danielebarchiesi@4 261 $bundle_inherit_values = $form_state['values']['bundle_inherit'];
danielebarchiesi@4 262 bundle_inherit_perform($bundle_inherit_values['entity_type'], $bundle, $bundle_inherit_values['parent_type'], $bundle_inherit_values['mode'] == 'strict' ? TRUE : FALSE);
danielebarchiesi@4 263 }
danielebarchiesi@4 264 }
danielebarchiesi@4 265
danielebarchiesi@4 266 /**
danielebarchiesi@4 267 * Implements hook_field_attach_delete_bundle().
danielebarchiesi@4 268 */
danielebarchiesi@4 269 function bundle_inherit_field_attach_delete_bundle($entity_type, $bundle, $instances) {
danielebarchiesi@4 270 db_delete('bundle_hierarchy')
danielebarchiesi@4 271 ->condition('entity_type', $entity_type)
danielebarchiesi@4 272 ->condition(db_or()->condition('bundle_parent', $bundle)->condition('bundle', $bundle))
danielebarchiesi@4 273 ->execute();
danielebarchiesi@4 274 }
danielebarchiesi@4 275
danielebarchiesi@4 276 /**
danielebarchiesi@4 277 * Implements hook_field_attach_rename_bundle().
danielebarchiesi@4 278 */
danielebarchiesi@4 279 function bundle_inherit_field_attach_rename_bundle($entity_type, $bundle_old, $bundle_new) {
danielebarchiesi@4 280 db_update('bundle_hierarchy')
danielebarchiesi@4 281 ->condition('entity_type', $entity_type)
danielebarchiesi@4 282 ->condition('bundle', $bundle_old)
danielebarchiesi@4 283 ->fields(array(
danielebarchiesi@4 284 'bundle' => $bundle_new
danielebarchiesi@4 285 ))
danielebarchiesi@4 286 ->execute();
danielebarchiesi@4 287 db_update('bundle_hierarchy')
danielebarchiesi@4 288 ->condition('entity_type', $entity_type)
danielebarchiesi@4 289 ->condition('bundle_parent', $bundle_old)
danielebarchiesi@4 290 ->fields(array(
danielebarchiesi@4 291 'bundle_parent' => $bundle_new
danielebarchiesi@4 292 ))
danielebarchiesi@4 293 ->execute();
danielebarchiesi@4 294 }