field_collection_from_field.inc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. <?php
  2. /**
  3. * @file
  4. * Plugin to provide a relationship handler for a field collection field.
  5. */
  6. // Plugin definition.
  7. $plugin = array(
  8. 'title' => t('Field collection item'),
  9. 'description' => t('Creates an entity context from a field collection field on a field.'),
  10. 'context' => 'field_collection_field_collection_from_field_context',
  11. 'edit form' => 'field_collection_field_collection_from_field_edit_form',
  12. 'get child' => 'field_collection_field_collection_from_field_get_child',
  13. 'get children' => 'field_collection_field_collection_from_field_get_children',
  14. 'defaults' => array('delta' => 0),
  15. );
  16. /**
  17. * Get child callback.
  18. */
  19. function field_collection_field_collection_from_field_get_child($plugin, $parent, $child) {
  20. $plugins = field_collection_field_collection_from_field_get_children($plugin, $parent);
  21. return $plugins[$parent . ':' . $child];
  22. }
  23. /**
  24. * Get children callback.
  25. */
  26. function field_collection_field_collection_from_field_get_children($plugin, $parent) {
  27. $plugins = array();
  28. $instances_info = field_info_instances();
  29. if (isset($instances_info['field_collection_item'])) {
  30. $field_collection_items = $instances_info['field_collection_item'];
  31. foreach (field_read_instances() as $instance) {
  32. if (isset($field_collection_items[$instance['field_name']])) {
  33. $child_plugin_id = $parent . ':' . $instance['entity_type'] . ':' . $instance['bundle'] . ':' . $instance['field_name'];
  34. $child_plugin = $plugin;
  35. $child_plugin['context name'] = $instance['entity_type'] . ':' . $instance['bundle'] . ':' . $instance['field_name'];
  36. $child_plugin['title'] = t(
  37. '!label field collection (!field_name) from !entity_type (!bundle)',
  38. array(
  39. '!label' => $instance['label'],
  40. '!field_name' => $instance['field_name'],
  41. '!entity_type' => $instance['entity_type'],
  42. '!bundle' => $instance['bundle']
  43. )
  44. );
  45. $restrictions = array('type' => array($instance['bundle']));
  46. $child_plugin['required context'] = new ctools_context_required(ucfirst($instance['entity_type']), $instance['entity_type'], $restrictions);
  47. $child_plugin['parent'] = $parent;
  48. $child_plugin['keyword'] = 'Field collection';
  49. $child_plugin['entity_type'] = $instance['entity_type'];
  50. $child_plugin['field_name'] = $instance['field_name'];
  51. $child_plugin['name'] = $child_plugin_id;
  52. $plugins[$child_plugin_id] = $child_plugin;
  53. }
  54. }
  55. }
  56. return $plugins;
  57. }
  58. /**
  59. * Return a new field collection context based on an existing context.
  60. */
  61. function field_collection_field_collection_from_field_context($context, $conf) {
  62. $plugin_info = ctools_get_relationship($conf['name']);
  63. $delta = (int) $conf['delta'];
  64. $entity = $context->data;
  65. if (isset($entity->{$plugin_info['field_name']})) {
  66. $items = field_get_items($plugin_info['entity_type'], $entity, $plugin_info['field_name']);
  67. if (isset($items[$delta]['value'])) {
  68. $field_collection_item = field_collection_item_load($items[$delta]['value']);
  69. }
  70. return ctools_context_create('entity:field_collection_item', $items[$delta]['value']);
  71. }
  72. return ctools_context_create_empty('entity:field_collection_item', NULL);
  73. }
  74. /**
  75. * Settings form.
  76. */
  77. function field_collection_field_collection_from_field_edit_form($form, &$form_state) {
  78. $conf = $form_state['conf'];
  79. $form['delta'] = array(
  80. '#type' => 'textfield',
  81. '#title' => t('Delta'),
  82. '#size' => 3,
  83. '#description' => t('The relationship can only create one context, but multiple items can be related. Please type in the number you want. The first one will be 0.'),
  84. '#default_value' => empty($conf['delta']) ? 0 : $conf['delta'],
  85. );
  86. return $form;
  87. }