1 |
31a5a6d6
|
Assos Assos
|
<?php
|
2 |
|
|
|
3 |
|
|
/**
|
4 |
|
|
* @file
|
5 |
|
|
* Install, update and uninstall functions for the field_collection module.
|
6 |
|
|
*/
|
7 |
|
|
|
8 |
|
|
/**
|
9 |
|
|
* Implements hook_schema().
|
10 |
|
|
*/
|
11 |
|
|
function field_collection_schema() {
|
12 |
|
|
|
13 |
|
|
$schema['field_collection_item'] = array(
|
14 |
|
|
'description' => 'Stores information about field collection items.',
|
15 |
|
|
'fields' => array(
|
16 |
|
|
'item_id' => array(
|
17 |
|
|
'type' => 'serial',
|
18 |
|
|
'not null' => TRUE,
|
19 |
|
|
'description' => 'Primary Key: Unique field collection item ID.',
|
20 |
|
|
),
|
21 |
|
|
'revision_id' => array(
|
22 |
|
|
'type' => 'int',
|
23 |
|
|
'not null' => TRUE,
|
24 |
|
|
'description' => 'Default revision ID.',
|
25 |
|
|
),
|
26 |
|
|
'field_name' => array(
|
27 |
|
|
'description' => 'The name of the field on the host entity embedding this entity.',
|
28 |
|
|
'type' => 'varchar',
|
29 |
|
|
'length' => 32,
|
30 |
|
|
'not null' => TRUE,
|
31 |
|
|
),
|
32 |
|
|
'archived' => array(
|
33 |
|
|
'description' => 'Boolean indicating whether the field collection item is archived.',
|
34 |
|
|
'type' => 'int',
|
35 |
|
|
'not null' => TRUE,
|
36 |
|
|
'default' => 0,
|
37 |
|
|
),
|
38 |
|
|
),
|
39 |
|
|
'primary key' => array('item_id'),
|
40 |
|
|
);
|
41 |
|
|
$schema['field_collection_item_revision'] = array(
|
42 |
|
|
'description' => 'Stores revision information about field collection items.',
|
43 |
|
|
'fields' => array(
|
44 |
|
|
'revision_id' => array(
|
45 |
|
|
'type' => 'serial',
|
46 |
|
|
'not null' => TRUE,
|
47 |
|
|
'description' => 'Primary Key: Unique revision ID.',
|
48 |
|
|
),
|
49 |
|
|
'item_id' => array(
|
50 |
|
|
'type' => 'int',
|
51 |
|
|
'not null' => TRUE,
|
52 |
|
|
'description' => 'Field collection item ID.',
|
53 |
|
|
),
|
54 |
|
|
),
|
55 |
|
|
'primary key' => array('revision_id'),
|
56 |
|
|
'indexes' => array(
|
57 |
|
|
'item_id' => array('item_id'),
|
58 |
|
|
),
|
59 |
|
|
'foreign keys' => array(
|
60 |
|
|
'versioned_field_collection_item' => array(
|
61 |
|
|
'table' => 'field_collection_item',
|
62 |
|
|
'columns' => array('item_id' => 'item_id'),
|
63 |
|
|
),
|
64 |
|
|
),
|
65 |
|
|
);
|
66 |
a1cafe7e
|
Assos Assos
|
|
67 |
|
|
if (module_exists('entitycache')) {
|
68 |
|
|
$schema['cache_entity_field_collection_item'] = drupal_get_schema_unprocessed('system', 'cache');
|
69 |
|
|
$schema['cache_entity_field_collection_item']['description'] = 'Cache table used to store field_collection_item entity records.';
|
70 |
|
|
}
|
71 |
|
|
|
72 |
31a5a6d6
|
Assos Assos
|
return $schema;
|
73 |
|
|
}
|
74 |
|
|
|
75 |
|
|
/**
|
76 |
|
|
* Implements hook_field_schema().
|
77 |
|
|
*/
|
78 |
|
|
function field_collection_field_schema($field) {
|
79 |
|
|
$columns = array(
|
80 |
|
|
'value' => array(
|
81 |
|
|
'type' => 'int',
|
82 |
|
|
'not null' => FALSE,
|
83 |
|
|
'description' => 'The field collection item id.',
|
84 |
|
|
),
|
85 |
|
|
'revision_id' => array(
|
86 |
|
|
'type' => 'int',
|
87 |
|
|
'not null' => FALSE,
|
88 |
|
|
'description' => 'The field collection item revision id.',
|
89 |
|
|
),
|
90 |
|
|
);
|
91 |
|
|
return array(
|
92 |
|
|
'columns' => $columns,
|
93 |
|
|
'indexes' => array(
|
94 |
|
|
'value' => array('value'),
|
95 |
|
|
'revision_id' => array('revision_id'),
|
96 |
|
|
),
|
97 |
|
|
);
|
98 |
|
|
}
|
99 |
|
|
|
100 |
|
|
/**
|
101 |
|
|
* Update the administer field collection permission machine name.
|
102 |
|
|
*/
|
103 |
|
|
function field_collection_update_7000() {
|
104 |
|
|
db_update('role_permission')
|
105 |
|
|
->fields(array('permission' => 'administer field collections'))
|
106 |
|
|
->condition('permission', 'administer field-collections')
|
107 |
|
|
->execute();
|
108 |
|
|
}
|
109 |
|
|
|
110 |
|
|
/**
|
111 |
|
|
* Add revision support.
|
112 |
|
|
*/
|
113 |
|
|
function field_collection_update_7001() {
|
114 |
|
|
|
115 |
|
|
// Add revision_id column to field_collection_item table.
|
116 |
|
|
$revision_id_spec = array(
|
117 |
|
|
'type' => 'int',
|
118 |
|
|
'not null' => TRUE,
|
119 |
|
|
'description' => 'Default revision ID.',
|
120 |
|
|
// Set default to 0 temporarily.
|
121 |
|
|
'initial' => 0,
|
122 |
|
|
);
|
123 |
|
|
// Field may already exist due to bug in 7.x-1.0-beta5.
|
124 |
|
|
if (!db_field_exists('field_collection_item', 'revision_id')) {
|
125 |
|
|
db_add_field('field_collection_item', 'revision_id', $revision_id_spec);
|
126 |
|
|
}
|
127 |
|
|
|
128 |
|
|
// Initialize the revision_id to be the same as the item_id.
|
129 |
|
|
db_update('field_collection_item')
|
130 |
|
|
->expression('revision_id', 'item_id')
|
131 |
|
|
->execute();
|
132 |
|
|
|
133 |
950416da
|
Assos Assos
|
// Add the archived column.
|
134 |
31a5a6d6
|
Assos Assos
|
$archived_spec = array(
|
135 |
|
|
'description' => 'Boolean indicating whether the field collection item is archived.',
|
136 |
|
|
'type' => 'int',
|
137 |
|
|
'not null' => TRUE,
|
138 |
|
|
'default' => 0,
|
139 |
|
|
);
|
140 |
|
|
// Field may already exist due to bug in 7.x-1.0-beta5.
|
141 |
|
|
if (!db_field_exists('field_collection_item', 'archived')) {
|
142 |
|
|
db_add_field('field_collection_item', 'archived', $archived_spec);
|
143 |
|
|
}
|
144 |
|
|
|
145 |
|
|
// Create the new table. It is important to explicitly define the schema here
|
146 |
|
|
// rather than use the hook_schema definition: http://drupal.org/node/150220.
|
147 |
|
|
$schema['field_collection_item_revision'] = array(
|
148 |
|
|
'description' => 'Stores revision information about field collection items.',
|
149 |
|
|
'fields' => array(
|
150 |
|
|
'revision_id' => array(
|
151 |
|
|
'type' => 'serial',
|
152 |
|
|
'not null' => TRUE,
|
153 |
|
|
'description' => 'Primary Key: Unique revision ID.',
|
154 |
|
|
),
|
155 |
|
|
'item_id' => array(
|
156 |
|
|
'type' => 'int',
|
157 |
|
|
'not null' => TRUE,
|
158 |
|
|
'description' => 'Field collection item ID.',
|
159 |
|
|
),
|
160 |
|
|
),
|
161 |
|
|
'primary key' => array('revision_id'),
|
162 |
|
|
'indexes' => array(
|
163 |
|
|
'item_id' => array('item_id'),
|
164 |
|
|
),
|
165 |
|
|
'foreign keys' => array(
|
166 |
|
|
'versioned_field_collection_item' => array(
|
167 |
|
|
'table' => 'field_collection_item',
|
168 |
|
|
'columns' => array('item_id' => 'item_id'),
|
169 |
|
|
),
|
170 |
|
|
),
|
171 |
|
|
);
|
172 |
|
|
// Table may already exist due to bug in 7.x-1.0-beta5.
|
173 |
|
|
if (db_table_exists('field_collection_item_revision')) {
|
174 |
|
|
db_drop_table('field_collection_item_revision');
|
175 |
|
|
}
|
176 |
|
|
db_create_table('field_collection_item_revision', $schema['field_collection_item_revision']);
|
177 |
|
|
|
178 |
|
|
// Fill the new table with the correct data.
|
179 |
|
|
$items = db_select('field_collection_item', 'fci')
|
180 |
|
|
->fields('fci')
|
181 |
|
|
->execute();
|
182 |
|
|
foreach ($items as $item) {
|
183 |
|
|
// Update field_collection_item_revision table.
|
184 |
|
|
db_insert('field_collection_item_revision')
|
185 |
|
|
->fields(array(
|
186 |
|
|
'revision_id' => $item->item_id,
|
187 |
|
|
'item_id' => $item->item_id,
|
188 |
|
|
))
|
189 |
|
|
->execute();
|
190 |
|
|
}
|
191 |
|
|
|
192 |
|
|
// Update the field_collection_field_schema columns for all tables.
|
193 |
|
|
// Add a revision_id column.
|
194 |
|
|
$revision_id_spec['description'] = 'The field collection item revision id.';
|
195 |
|
|
// Because $value_column below can be null, so must $revision_id_column.
|
196 |
|
|
$revision_id_spec['not null'] = FALSE;
|
197 |
|
|
foreach (field_read_fields(array('type' => 'field_collection')) as $field_name => $field) {
|
198 |
|
|
$table_prefixes = array('field_data', 'field_revision');
|
199 |
|
|
foreach ($table_prefixes as $table_prefix) {
|
200 |
|
|
|
201 |
|
|
$table = sprintf('%s_%s', $table_prefix, $field_name);
|
202 |
|
|
$value_column = sprintf('%s_value', $field_name);
|
203 |
|
|
$revision_id_column = sprintf('%s_revision_id', $field_name);
|
204 |
|
|
|
205 |
|
|
// Field may already exist due to bug in 7.x-1.0-beta5.
|
206 |
|
|
if (!db_field_exists($table, $revision_id_column)) {
|
207 |
|
|
db_add_field($table, $revision_id_column, $revision_id_spec);
|
208 |
|
|
}
|
209 |
|
|
else {
|
210 |
|
|
db_change_field($table, $revision_id_column, $revision_id_column, $revision_id_spec);
|
211 |
|
|
}
|
212 |
|
|
|
213 |
|
|
// Initialize the revision_id to be the same as the item_id.
|
214 |
|
|
db_update($table)
|
215 |
|
|
->expression($revision_id_column, $value_column)
|
216 |
|
|
->execute();
|
217 |
|
|
}
|
218 |
|
|
}
|
219 |
|
|
|
220 |
|
|
// Need to get the system up-to-date so drupal_schema_fields_sql() will work.
|
221 |
|
|
$schema = drupal_get_schema('field_collection_item_revision', TRUE);
|
222 |
|
|
}
|
223 |
|
|
|
224 |
|
|
/**
|
225 |
|
|
* Remove orphaned field collection item entities.
|
226 |
|
|
*/
|
227 |
|
|
function field_collection_update_7002() {
|
228 |
|
|
// Loop over all fields and delete any orphaned field collection items.
|
229 |
|
|
foreach (field_read_fields(array('type' => 'field_collection')) as $field_name => $field) {
|
230 |
|
|
|
231 |
|
|
$select = db_select('field_collection_item', 'fci')
|
232 |
|
|
->fields('fci', array('item_id'))
|
233 |
|
|
->condition('field_name', $field_name)
|
234 |
|
|
->condition('archived', 0);
|
235 |
|
|
$select->leftJoin('field_data_' . $field_name, 'field', "field.{$field_name}_value = fci.item_id ");
|
236 |
|
|
$select->isNull('field.entity_id');
|
237 |
a1cafe7e
|
Assos Assos
|
$ids = $select->execute()->fetchCol();
|
238 |
31a5a6d6
|
Assos Assos
|
|
239 |
|
|
entity_delete_multiple('field_collection_item', $ids);
|
240 |
|
|
drupal_set_message(t('Deleted @count orphaned field collection items.', array('@count' => count($ids))));
|
241 |
|
|
}
|
242 |
|
|
}
|
243 |
|
|
|
244 |
|
|
/**
|
245 |
|
|
* Update field_collection_field_schema columns for all tables.
|
246 |
|
|
*/
|
247 |
|
|
function field_collection_update_7003() {
|
248 |
|
|
// Revision_id column.
|
249 |
|
|
$revision_id_spec = array(
|
250 |
|
|
'type' => 'int',
|
251 |
|
|
'not null' => FALSE,
|
252 |
|
|
'description' => 'The field collection item revision id.',
|
253 |
|
|
'initial' => 0,
|
254 |
|
|
);
|
255 |
|
|
|
256 |
|
|
// Update the field_collection_field_schema columns for all tables,
|
257 |
|
|
// in case the buggy beta5 version of field_collection_update_7001()
|
258 |
|
|
// completed without complaint.
|
259 |
|
|
foreach (field_read_fields(array('type' => 'field_collection')) as $field_name => $field) {
|
260 |
|
|
$table_prefixes = array('field_data', 'field_revision');
|
261 |
|
|
foreach ($table_prefixes as $table_prefix) {
|
262 |
|
|
$table = sprintf('%s_%s', $table_prefix, $field_name);
|
263 |
|
|
$value_column = sprintf('%s_value', $field_name);
|
264 |
|
|
$revision_id_column = sprintf('%s_revision_id', $field_name);
|
265 |
|
|
db_change_field($table, $revision_id_column, $revision_id_column, $revision_id_spec);
|
266 |
|
|
}
|
267 |
|
|
}
|
268 |
|
|
|
269 |
|
|
// Need to get the system up-to-date so drupal_schema_fields_sql() will work.
|
270 |
|
|
$schema = drupal_get_schema('field_collection_item_revision', TRUE);
|
271 |
|
|
}
|
272 |
|
|
|
273 |
|
|
/**
|
274 |
|
|
* Add index on {$field_collection_field}_revision_id column for all tables.
|
275 |
|
|
*/
|
276 |
|
|
function field_collection_update_7004() {
|
277 |
|
|
// Update the field_collection_field_schema columns for all tables.
|
278 |
|
|
foreach (field_read_fields(array('type' => 'field_collection')) as $field_name => $field) {
|
279 |
|
|
$table_prefixes = array('field_data', 'field_revision');
|
280 |
|
|
foreach ($table_prefixes as $table_prefix) {
|
281 |
|
|
|
282 |
|
|
$table = sprintf('%s_%s', $table_prefix, $field_name);
|
283 |
|
|
$revision_id_column = sprintf('%s_revision_id', $field_name);
|
284 |
|
|
|
285 |
|
|
// Add index on revision_id column.
|
286 |
|
|
if (!db_index_exists($table, $revision_id_column)) {
|
287 |
|
|
db_add_index($table, $revision_id_column, array($revision_id_column));
|
288 |
|
|
}
|
289 |
|
|
}
|
290 |
|
|
}
|
291 |
|
|
}
|
292 |
|
|
|
293 |
|
|
/**
|
294 |
|
|
* Force the creation of the table cache_entity_field_collection_item.
|
295 |
|
|
*
|
296 |
|
|
* entity_update_7003 will attempt to install entitycache tables for existing
|
297 |
|
|
* modules, but it uses module_list() to get the list of available modules,
|
298 |
|
|
* which, when called from a database update, may not return field_collection
|
299 |
|
|
* since drupal is bootstrapped at a lower level.
|
300 |
|
|
*/
|
301 |
|
|
function field_collection_update_7005() {
|
302 |
|
|
if (module_exists('entitycache')) {
|
303 |
|
|
$entity_type = 'field_collection_item';
|
304 |
|
|
$table = 'cache_entity_' . $entity_type;
|
305 |
|
|
if (!db_table_exists($table)) {
|
306 |
|
|
$schema = drupal_get_schema_unprocessed('system', 'cache');
|
307 |
|
|
$schema['description'] = 'Cache table used to store' . $entity_type . ' entity records.';
|
308 |
|
|
db_create_table($table, $schema);
|
309 |
|
|
}
|
310 |
|
|
}
|
311 |
|
|
}
|
312 |
|
|
|
313 |
|
|
/**
|
314 |
|
|
* Ensures revision_id indexes are present at field_config table.
|
315 |
|
|
*/
|
316 |
|
|
function field_collection_update_7006() {
|
317 |
|
|
$result = db_query("SELECT id, field_name, data FROM {field_config} WHERE type = 'field_collection'");
|
318 |
|
|
foreach ($result as $field_config) {
|
319 |
|
|
$data = unserialize($field_config->data);
|
320 |
|
|
// Skip this record if the revision_id index is already present.
|
321 |
|
|
if (isset($data['indexes']['revision_id'])) {
|
322 |
|
|
continue;
|
323 |
|
|
}
|
324 |
|
|
// Otherwise, add the revision_id index and update the record.
|
325 |
|
|
$data['indexes']['revision_id'] = array('revision_id');
|
326 |
|
|
$data = serialize($data);
|
327 |
|
|
$num_updated = db_update('field_config')
|
328 |
|
|
->fields(array('data' => $data))
|
329 |
|
|
->condition('id', $field_config->id)
|
330 |
|
|
->execute();
|
331 |
|
|
// If for some reason the update failed, throw an exception.
|
332 |
|
|
if ($num_updated != 1) {
|
333 |
|
|
$t_args['@field'] = $field_config->field_name;
|
334 |
|
|
throw new DrupalUpdateException(t('An error was detected when attempting to update field configuration for field @field.', $t_args));
|
335 |
|
|
}
|
336 |
|
|
}
|
337 |
|
|
}
|
338 |
|
|
|
339 |
|
|
/**
|
340 |
|
|
* Add index on {$field_collection_field}_value column for all tables.
|
341 |
|
|
*/
|
342 |
|
|
function field_collection_update_7007() {
|
343 |
|
|
foreach (field_read_fields(array('type' => 'field_collection')) as $field_name => $field) {
|
344 |
|
|
if (!isset($field['indexes']['value'])) {
|
345 |
|
|
// Add index on the value column and update the field.
|
346 |
|
|
$field['indexes']['value'] = array('value');
|
347 |
|
|
field_update_field($field);
|
348 |
|
|
}
|
349 |
|
|
|
350 |
|
|
$table_prefixes = array('field_data', 'field_revision');
|
351 |
|
|
foreach ($table_prefixes as $table_prefix) {
|
352 |
|
|
$table = "{$table_prefix}_{$field_name}";
|
353 |
|
|
$value_column = "{$field_name}_value";
|
354 |
|
|
if (!db_index_exists($table, $value_column)) {
|
355 |
|
|
// Add index on the value column.
|
356 |
|
|
db_add_index($table, $value_column, array($value_column));
|
357 |
|
|
}
|
358 |
|
|
}
|
359 |
|
|
}
|
360 |
|
|
}
|
361 |
|
|
|
362 |
|
|
/**
|
363 |
|
|
* Update fields in field collections already set to use Entity Translation.
|
364 |
|
|
*/
|
365 |
|
|
function field_collection_update_7008() {
|
366 |
|
|
// Include FieldCollectionItemEntity class.
|
367 |
|
|
module_load_include('inc', 'field_collection', 'field_collection.entity');
|
368 |
|
|
|
369 |
|
|
$results = array();
|
370 |
|
|
foreach (field_info_fields() as $f_name => $field) {
|
371 |
|
|
if ($field['translatable'] == 1 && isset($field['bundles']['field_collection_item'])) {
|
372 |
|
|
$query = new EntityFieldQuery();
|
373 |
|
|
$query->entityCondition('entity_type', 'field_collection_item')
|
374 |
950416da
|
Assos Assos
|
->fieldLanguageCondition($f_name, LANGUAGE_NONE);
|
375 |
31a5a6d6
|
Assos Assos
|
$query_result = $query->execute();
|
376 |
|
|
if (isset($query_result['field_collection_item'])) {
|
377 |
a1cafe7e
|
Assos Assos
|
$results += $query_result['field_collection_item'];
|
378 |
31a5a6d6
|
Assos Assos
|
}
|
379 |
|
|
}
|
380 |
|
|
}
|
381 |
|
|
if (count($results)) {
|
382 |
950416da
|
Assos Assos
|
$orphans = array();
|
383 |
31a5a6d6
|
Assos Assos
|
$ids = array_keys($results);
|
384 |
|
|
$field_collection_items = entity_load('field_collection_item', $ids);
|
385 |
|
|
foreach ($field_collection_items as $item) {
|
386 |
950416da
|
Assos Assos
|
/** @var FieldCollectionItemEntity $item */
|
387 |
|
|
if ($item->hostEntity()) {
|
388 |
|
|
$item->copyTranslations(LANGUAGE_NONE);
|
389 |
|
|
$item->save(TRUE);
|
390 |
|
|
}
|
391 |
|
|
else {
|
392 |
|
|
$orphans[] = $item->identifier();
|
393 |
|
|
}
|
394 |
|
|
}
|
395 |
|
|
if ($orphans) {
|
396 |
|
|
$count = count($orphans);
|
397 |
|
|
entity_delete_multiple('field_collection_item', $orphans);
|
398 |
|
|
drupal_set_message("Deleted $count orphaned field collection items.");
|
399 |
31a5a6d6
|
Assos Assos
|
}
|
400 |
|
|
}
|
401 |
|
|
}
|
402 |
a1cafe7e
|
Assos Assos
|
|
403 |
|
|
/**
|
404 |
|
|
* Update revisions created before revision support was implemented.
|
405 |
|
|
*/
|
406 |
|
|
function field_collection_update_7009(&$sandbox) {
|
407 |
|
|
$items_per_pass = 10;
|
408 |
|
|
$field_collection_fields = field_read_fields(array('type' => 'field_collection'));
|
409 |
|
|
|
410 |
|
|
// If you don't have any field_collecton fields then skip this update.
|
411 |
|
|
if (empty($field_collection_fields)) {
|
412 |
|
|
return;
|
413 |
|
|
}
|
414 |
|
|
|
415 |
|
|
if (!isset($sandbox['current_field'])) {
|
416 |
|
|
$sandbox['field_collection_fields'] = array_keys($field_collection_fields);
|
417 |
|
|
$sandbox['current_field'] = 0;
|
418 |
|
|
$sandbox['current_field_collection_item'] = 0;
|
419 |
|
|
$sandbox['field_name'] = $sandbox['field_collection_fields'][$sandbox['current_field']];
|
420 |
|
|
$sandbox['inner_fields'] = field_read_instances(array('entity_type' => 'field_collection_item', 'bundle' => $sandbox['field_name']));
|
421 |
|
|
}
|
422 |
|
|
|
423 |
|
|
// Find field collection items with duplicate revision ids.
|
424 |
|
|
$query = db_select("field_revision_{$sandbox['field_name']}", 't')
|
425 |
|
|
->fields('t', array("{$sandbox['field_name']}_revision_id"))
|
426 |
|
|
->range($sandbox['current_field_collection_item'], $items_per_pass)
|
427 |
|
|
->groupBy("t.{$sandbox['field_name']}_revision_id");
|
428 |
5e632cae
|
Assos Assos
|
$query->having("COUNT(t.{$sandbox['field_name']}_revision_id) >= 2");
|
429 |
a1cafe7e
|
Assos Assos
|
$vids = $query->execute()->fetchCol();
|
430 |
|
|
|
431 |
|
|
// Each revision ID that occurs more than once.
|
432 |
|
|
foreach ($vids as $field_collection_duplicated_revision_id) {
|
433 |
|
|
// Find every instance of this revision ID.
|
434 |
|
|
$copies = db_select("field_revision_{$sandbox['field_name']}", 't')
|
435 |
|
|
->fields('t')
|
436 |
|
|
->condition("{$sandbox['field_name']}_revision_id", $field_collection_duplicated_revision_id)
|
437 |
|
|
->execute()
|
438 |
|
|
->fetchAllAssoc('revision_id');
|
439 |
|
|
|
440 |
|
|
$first_copy = reset($copies);
|
441 |
|
|
$field_collection_item_id = $first_copy->{"{$sandbox['field_name']}_value"};
|
442 |
|
|
|
443 |
|
|
// Find the currently used revision of this field collection item.
|
444 |
|
|
$field_collection_item_current_revision = db_select('field_collection_item', 'fci')
|
445 |
|
|
->fields('fci', array('revision_id'))
|
446 |
|
|
->condition('item_id', $field_collection_item_id)
|
447 |
|
|
->execute()
|
448 |
|
|
->fetchField();
|
449 |
|
|
|
450 |
|
|
// Find new revisions of this field collection item that were made after
|
451 |
|
|
// revisions were enabled in update_7003.
|
452 |
|
|
$modern_revisions = db_select("field_revision_{$sandbox['field_name']}", 't')
|
453 |
|
|
->fields('t')
|
454 |
|
|
->condition("{$sandbox['field_name']}_revision_id", $field_collection_duplicated_revision_id, '<>')
|
455 |
|
|
->condition("{$sandbox['field_name']}_value", $field_collection_item_id)
|
456 |
|
|
->orderBy('revision_id')
|
457 |
|
|
->execute()
|
458 |
|
|
->fetchAllAssoc('revision_id');
|
459 |
|
|
|
460 |
|
|
// Intentionally skip the first instance as it doesn't need to be modified.
|
461 |
|
|
while (FALSE !== ($row_to_replace = next($copies))) {
|
462 |
|
|
$new_revision_id = _field_collection_update_7009_new_revision($field_collection_item_id, $row_to_replace, $sandbox['inner_fields'], $sandbox['field_name']);
|
463 |
|
|
|
464 |
|
|
// Create copies of inner fields with new revision number.
|
465 |
|
|
foreach ($sandbox['inner_fields'] as $field) {
|
466 |
|
|
// Get the data to copy.
|
467 |
|
|
$data_rows = db_select("field_revision_{$field['field_name']}", 't')
|
468 |
|
|
->fields('t')
|
469 |
|
|
->condition('entity_type', 'field_collection_item')
|
470 |
|
|
->condition('revision_id', $field_collection_duplicated_revision_id)
|
471 |
|
|
->execute();
|
472 |
|
|
|
473 |
|
|
// Add new copy of data with new revision id.
|
474 |
|
|
while ($each_row = $data_rows->fetchAssoc()) {
|
475 |
|
|
$each_row['revision_id'] = $new_revision_id;
|
476 |
|
|
db_insert("field_revision_{$field['field_name']}")
|
477 |
|
|
->fields(array_keys($each_row), array_values($each_row))
|
478 |
|
|
->execute();
|
479 |
|
|
}
|
480 |
|
|
}
|
481 |
|
|
|
482 |
|
|
// Update the host's field data with new revision number.
|
483 |
|
|
db_update("field_revision_{$sandbox['field_name']}")
|
484 |
|
|
->fields(array("{$sandbox['field_name']}_revision_id" => $new_revision_id))
|
485 |
|
|
->condition('entity_type', $row_to_replace->entity_type)
|
486 |
|
|
->condition('revision_id', $row_to_replace->revision_id)
|
487 |
|
|
->condition('delta', $row_to_replace->delta)
|
488 |
|
|
->condition('language', $row_to_replace->language)
|
489 |
|
|
->execute();
|
490 |
|
|
|
491 |
5e632cae
|
Assos Assos
|
if ($field_collection_item_current_revision == $field_collection_duplicated_revision_id) {
|
492 |
|
|
_field_collection_update_7009_update_data($new_revision_id, $field_collection_duplicated_revision_id);
|
493 |
a1cafe7e
|
Assos Assos
|
|
494 |
5e632cae
|
Assos Assos
|
// Update the current field collection item data in its host.
|
495 |
|
|
db_update("field_data_{$sandbox['field_name']}")
|
496 |
|
|
->fields(array('revision_id' => $new_revision_id))
|
497 |
|
|
->condition('revision_id', $field_collection_duplicated_revision_id)
|
498 |
|
|
->condition('entity_type', $row_to_replace->entity_type)
|
499 |
|
|
->execute();
|
500 |
|
|
}
|
501 |
a1cafe7e
|
Assos Assos
|
}
|
502 |
|
|
|
503 |
5e632cae
|
Assos Assos
|
|
504 |
|
|
|
505 |
a1cafe7e
|
Assos Assos
|
foreach ($modern_revisions as $each_modern_revision) {
|
506 |
|
|
$new_revision_id = _field_collection_update_7009_new_revision($field_collection_item_id, $each_modern_revision, $sandbox['inner_fields'], $sandbox['field_name']);
|
507 |
|
|
|
508 |
|
|
// Update inner fields with new revision number.
|
509 |
|
|
foreach ($sandbox['inner_fields'] as $field) {
|
510 |
|
|
db_update("field_revision_{$field['field_name']}")
|
511 |
|
|
->fields(array('revision_id' => $new_revision_id))
|
512 |
|
|
->condition('revision_id', $each_modern_revision->{$sandbox['field_name'] . '_revision_id'})
|
513 |
|
|
->condition('entity_type', 'field_collection_item')
|
514 |
|
|
->execute();
|
515 |
|
|
}
|
516 |
|
|
|
517 |
|
|
// Update the host's field data with new revision number.
|
518 |
|
|
db_update("field_revision_{$sandbox['field_name']}")
|
519 |
|
|
->fields(array("{$sandbox['field_name']}_revision_id" => $new_revision_id))
|
520 |
|
|
->condition('entity_type', $each_modern_revision->entity_type)
|
521 |
|
|
->condition('revision_id', $each_modern_revision->revision_id)
|
522 |
|
|
->condition('delta', $each_modern_revision->delta)
|
523 |
|
|
->condition('language', $each_modern_revision->language)
|
524 |
|
|
->execute();
|
525 |
|
|
|
526 |
|
|
if ($field_collection_item_current_revision == $each_modern_revision->{"{$sandbox['field_name']}_revision_id"}) {
|
527 |
5e632cae
|
Assos Assos
|
_field_collection_update_7009_update_data($new_revision_id, $field_collection_item_current_revision);
|
528 |
a1cafe7e
|
Assos Assos
|
|
529 |
|
|
// Update the current field collection item data in its host.
|
530 |
|
|
db_update("field_data_{$sandbox['field_name']}")
|
531 |
5e632cae
|
Assos Assos
|
->fields(array('revision_id' => $new_revision_id))
|
532 |
|
|
->condition('revision_id', $field_collection_item_current_revision)
|
533 |
a1cafe7e
|
Assos Assos
|
->condition('entity_type', $each_modern_revision->entity_type)
|
534 |
|
|
->execute();
|
535 |
|
|
}
|
536 |
|
|
|
537 |
|
|
// Remove old copy of revision.
|
538 |
|
|
db_delete('field_collection_item_revision')
|
539 |
|
|
->condition('revision_id', $each_modern_revision->revision_id)
|
540 |
|
|
->execute();
|
541 |
|
|
}
|
542 |
|
|
|
543 |
|
|
$sandbox['current_field_collection_item']++;
|
544 |
|
|
}
|
545 |
|
|
|
546 |
|
|
$sandbox['#finished'] = 0;
|
547 |
|
|
|
548 |
|
|
if (count($vids) < $items_per_pass) {
|
549 |
|
|
$sandbox['current_field']++;
|
550 |
|
|
if ($sandbox['current_field'] == count($sandbox['field_collection_fields'])) {
|
551 |
|
|
$sandbox['#finished'] = 1;
|
552 |
|
|
return;
|
553 |
|
|
}
|
554 |
|
|
$sandbox['current_field_collection_item'] = 0;
|
555 |
|
|
$sandbox['field_name'] = $sandbox['field_collection_fields'][$sandbox['current_field']];
|
556 |
|
|
$sandbox['inner_fields'] = field_read_instances(array('entity_type' => 'field_collection_item', 'bundle' => $sandbox['field_name']));
|
557 |
|
|
}
|
558 |
|
|
}
|
559 |
|
|
|
560 |
|
|
function _field_collection_update_7009_new_revision($field_collection_item_id, $row_to_replace, $inner_fields, $field_name) {
|
561 |
|
|
// Add to field_collection_item_revision table.
|
562 |
|
|
$new_revision_id = db_insert('field_collection_item_revision')
|
563 |
|
|
->fields(array('item_id'), array($field_collection_item_id))
|
564 |
|
|
->execute();
|
565 |
|
|
|
566 |
|
|
return $new_revision_id;
|
567 |
|
|
}
|
568 |
|
|
|
569 |
|
|
function _field_collection_update_7009_update_data($new_revision, $old_revision) {
|
570 |
|
|
// Update the current field collection item.
|
571 |
|
|
db_update('field_collection_item')
|
572 |
|
|
->fields(array('revision_id' => $new_revision))
|
573 |
|
|
->condition('revision_id', $old_revision)
|
574 |
|
|
->execute();
|
575 |
|
|
} |