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 } |