views_rss_core.field.inc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <?php
  2. /**
  3. * @file
  4. * Field formatters for Views RSS: Core Elements module.
  5. */
  6. /**
  7. * Implements hook_field_formatter_info().
  8. */
  9. function views_rss_core_field_formatter_info() {
  10. $formatters = array(
  11. 'enclosure' => array(
  12. 'label' => t('RSS <enclosure> element'),
  13. 'field types' => array('file', 'media', 'image', 'text', 'link_field'),
  14. ),
  15. );
  16. return $formatters;
  17. }
  18. /**
  19. * Implements hook_field_formatter_settings_form().
  20. */
  21. function views_rss_core_field_formatter_settings_form($field, $instance, $view_mode, $form, &$form_state) {
  22. $display = $instance['display'][$view_mode];
  23. $settings = $display['settings'];
  24. $element = NULL;
  25. if ($field['type'] == 'image') {
  26. $image_styles = image_style_options(FALSE);
  27. $element['image_style'] = array(
  28. '#title' => t('Image style'),
  29. '#type' => 'select',
  30. '#default_value' => $settings['image_style'],
  31. '#empty_option' => t('None (original image)'),
  32. '#options' => $image_styles,
  33. );
  34. }
  35. return $element;
  36. }
  37. /**
  38. * Implements hook_field_formatter_settings_summary().
  39. */
  40. function views_rss_core_field_formatter_settings_summary($field, $instance, $view_mode) {
  41. $display = $instance['display'][$view_mode];
  42. $settings = $display['settings'];
  43. $summary = array();
  44. if ($field['type'] == 'image') {
  45. $image_styles = image_style_options(FALSE);
  46. // Unset possible 'No defined styles' option.
  47. unset($image_styles['']);
  48. // Styles could be lost because of enabled/disabled modules that defines
  49. // their styles in code.
  50. if (!empty($settings['image_style']) && !empty($image_styles[$settings['image_style']])) {
  51. $summary[] = t('Image style: @style', array('@style' => $image_styles[$settings['image_style']]));
  52. }
  53. else {
  54. $summary[] = t('Original image');
  55. }
  56. }
  57. return implode('<br />', $summary);
  58. }
  59. /**
  60. * Implements hook_field_formatter_view().
  61. *
  62. * This is a dirty trick here. Essentially, we do not want to call a theme
  63. * function from here, as it should be called from within a view (amongst
  64. * other to have $view object in $variables). Therefore here we want to
  65. * return value only, hence use of array('#markup' => $value). However,
  66. * in some cases it won't be just a simple string value to return,
  67. * sometimes we'd want to return an array (for example value with
  68. * additional arguments) - hence the need to serialize it (plus add
  69. * "serialized" string at the beginning so that our field preprocess
  70. * function template_preprocess_views_view_views_rss_field() is able
  71. * to recognize it as serialized array and treat accordingly.
  72. *
  73. * Any better ideas?
  74. */
  75. function views_rss_core_field_formatter_view($entity_type, $entity, $field, $instance, $langcode, $items, $display) {
  76. $element = NULL;
  77. foreach ($items as $delta => $item) {
  78. // Inside a view item may contain NULL data. In that case, just return.
  79. if (
  80. ($field['type'] == 'file' || $field['type'] == 'image') && empty($item['fid'])
  81. || $field['type'] == 'media' && empty($item['file']->fid)
  82. || $field['type'] == 'text' && empty($item['safe_value'])
  83. || $field['type'] == 'link_field' && empty($item['url'])
  84. ) {
  85. unset($items[$delta]);
  86. continue;
  87. }
  88. // Get full image URL based on provided image style.
  89. if ($field['type'] == 'image' && !empty($display['settings']['image_style']) && $image_style = image_style_load($display['settings']['image_style'])) {
  90. $uri = image_style_url($display['settings']['image_style'], $item['uri']);
  91. // Get file size of image preset file (if it has already been created,
  92. // otherwise just create it first and then get file size).
  93. $path = image_style_path($display['settings']['image_style'], $item['uri']);
  94. if (file_exists($path) || image_style_create_derivative($image_style, $item['uri'], $path)) {
  95. $item['filesize'] = filesize($path);
  96. }
  97. }
  98. elseif ($field['type'] == 'media') {
  99. $uri = file_create_url($item['file']->uri);
  100. $item['filesize'] = $item['file']->filesize;
  101. $item['filemime'] = $item['file']->filemime;
  102. }
  103. elseif ($field['type'] == 'text' || $field['type'] == 'link_field') {
  104. $uri = ($field['type'] == 'text') ? $item['safe_value'] : $item['url'];
  105. // Great idea to use get_headers() here by Dan Feidt,
  106. // http://drupal.org/user/60005 Thanks Dan!
  107. $headers = get_headers($uri, $format = 1);
  108. $item['filesize'] = $headers['Content-Length'];
  109. $item['filemime'] = $headers['Content-Type'];
  110. }
  111. else {
  112. $uri = file_create_url($item['uri']);
  113. }
  114. // XML element array in format_xml_elements() format.
  115. $rss_element = array(
  116. 'key' => 'enclosure',
  117. 'attributes' => array(
  118. 'url' => $uri,
  119. 'length' => $item['filesize'],
  120. 'type' => $item['filemime'],
  121. ),
  122. );
  123. $element[$delta] = array(
  124. '#item' => $item,
  125. '#markup' => format_xml_elements(array($rss_element)),
  126. '#rss_element' => $rss_element,
  127. );
  128. }
  129. return $element;
  130. }