paragraphs.node_clone.inc 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. /**
  3. * @file
  4. * Holds relevant functions for paragraph's node clone integration.
  5. */
  6. /**
  7. * Implements hook_clone_node_alter().
  8. */
  9. function paragraphs_clone_node_alter(&$node, $context) {
  10. foreach (field_info_fields() as $field_name => $field) {
  11. if ($field['type'] == 'paragraphs' && isset($node->$field_name)) {
  12. $language = $node->language;
  13. foreach ($node->$field_name as $key => $values) {
  14. paragraphs_clone_items('node', $node, $field_name, $language);
  15. }
  16. }
  17. }
  18. }
  19. /**
  20. * Implements hook_form_alter().
  21. */
  22. function paragraphs_form_node_form_alter(&$form, &$form_state, $form_id) {
  23. // Alter the node edit forms for cloned nodes.
  24. if (('clone' == arg(2)) && ('_node_form' == substr($form_id, -10))) {
  25. // Go through all fields.
  26. foreach ($form_state['field'] as &$field_config) {
  27. $language = key($field_config);
  28. // Only find fields containing paragraphs items.
  29. if (isset($field_config[$language]['field']['type']) && ($field_config[$language]['field']['type'] == 'paragraphs')) {
  30. // Unset the item_id and revision_id of each paragraphs item so
  31. // that new items are created on save.
  32. foreach ($field_config as $language => $items) {
  33. if (isset($items['entity']) && count($items['entity'])) {
  34. foreach ($items['entity'] as $paragraph_item) {
  35. $paragraph_item->item_id = NULL;
  36. $paragraph_item->revision_id = NULL;
  37. }
  38. }
  39. }
  40. }
  41. }
  42. }
  43. }
  44. /**
  45. * Clone a Paragraphs item. Helper function for hook_clone_node_alter().
  46. */
  47. function paragraphs_clone_items($entity_type, &$entity, $field_name, $language = LANGUAGE_NONE) {
  48. $entity_wrapper = entity_metadata_wrapper($entity_type, $entity);
  49. $old_items = $entity_wrapper->{$field_name}->value();
  50. if (!is_array($old_items)) {
  51. $old_items = array($old_items);
  52. }
  53. unset($entity->{$field_name}[$language]);
  54. foreach ($old_items as $old_item) {
  55. list( , , $bundle) = entity_extract_ids('paragraphs_item', $old_item);
  56. /* @var $new_item ParagraphsItemEntity */
  57. $new_item = entity_create('paragraphs_item', array('bundle' => $bundle, 'field_name' => $field_name));
  58. $new_item->setHostEntity($entity_type, $entity, $language);
  59. // Check if any of the fields in the newly cloned fc item is a paragraph.
  60. foreach (field_info_instances('paragraphs_item', $bundle) as $new_field_name => $new_field_instance) {
  61. if (!empty($old_item->{$new_field_name})) {
  62. $new_item->{$new_field_name} = $old_item->{$new_field_name};
  63. $field_info = field_info_field($new_field_name);
  64. if ($field_info['type'] == 'paragraphs') {
  65. paragraphs_clone_items('paragraphs_item', $new_item, $new_field_name, $language);
  66. }
  67. }
  68. }
  69. }
  70. }