| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 | <?php/** * @file * Theme functions for Views RSS module. *//** * Template preprocessor for views-view-views-rss.tpl.php. */function template_preprocess_views_view_views_rss(&$variables) {  $view = $variables['view'];  // Start building the feed array compatible with format_xml_elements().  $rss_feed = array(    'key' => 'rss',    'attributes' => array(      'version' => '2.0',    ),    'value' => array(),  );  // Prepare namespaces and add them to feed array.  // xml:base cannot be defined by hook_views_rss_namespaces() implementation,  // as we don't want its value to be cached, it needs to be dynamic.  $rss_feed['attributes']['xml:base'] = url('<front>', array('absolute' => TRUE));  // All other namespaces are taken from hook_views_rss_namespaces() implementations.  foreach (views_rss_get('namespaces') as $module => $module_namespaces) {    foreach ($module_namespaces as $namespace => $definition) {      // Check if definition provided through modules hooks      // should be overwritten by module configuration.      if (        isset($view->style_plugin->options['namespaces'][$module][$namespace])        && !empty($view->style_plugin->options['namespaces'][$module][$namespace])      ) {        $definition['uri'] = $view->style_plugin->options['namespaces'][$module][$namespace];      }      // Add namespace to feed array.      if (isset($definition['uri']) && !empty($definition['uri'])) {        // Namespaces with prefix, for example xml:base="" or xmlns:dc=""        if (isset($definition['prefix']) && !empty($definition['prefix'])) {          $namespace_key = $definition['prefix'] . ':' . $namespace;          $rss_feed['attributes'][$namespace_key] = $definition['uri'];        }        // Namespaces without prefix, for example: content="" or foaf=""        else {          $rss_feed['attributes'][$namespace] = $definition['uri'];        }      }    }  }  // Prepare <channel> elements and add them to feed array.  $rss_channel = array();  foreach (views_rss_get('channel_elements') as $module => $module_channel_elements) {    foreach ($module_channel_elements as $element => $definition) {      list($namespace, $element_name) = views_rss_extract_element_names($element, 'core');      // Try to fetch namespace value from view configuration.      if (isset($view->style_plugin->options['channel'][$namespace][$module][$element_name])) {        $value = $view->style_plugin->options['channel'][$namespace][$module][$element_name];      }      // Otherwise check if it was provided by element definition.      elseif (isset($definition['default_value'])) {        $value = $definition['default_value'];      }      else {        $value = NULL;      }      // Avoid double encoding: the $value might be already encoded here,      // depending on the field configuration/processing, and because we know      // it will be encoded again when the whole feed array will be passed to      // format_xml_elements(), let's make sure we decode it here first.      if (is_string($value)) {        $value = decode_entities($value);      }      // Start building XML channel element array compatible with format_xml_elements().      $rss_elements = array(        array(          'key' => $element,          'value' => $value,        ),      );      // Preprocess element value.      if (isset($definition['preprocess functions']) && is_array($definition['preprocess functions'])) {        foreach ($definition['preprocess functions'] as $preprocess_function) {          if (function_exists($preprocess_function)) {            $item_variables = array(              'elements' => &$rss_elements,              'item' => $view->style_plugin->options['channel'],              'view' => $view,            );            $preprocess_function($item_variables);          }        }      }      // If there is no value and no attributes (in case of self-closing elements)      // already set for the element at this stage, it is not going to be set      // at any point further, so the element should not be added to the feed.      foreach ($rss_elements as $key => $rss_element) {        if (empty($rss_element['value']) && empty($rss_element['attributes'])) {          unset($rss_elements[$key]);        }      }      if (empty($rss_elements)) continue;      // Add XML element(s) to the channel array.      $rss_channel = array_merge($rss_channel, $rss_elements);    }  }  // Channel array should not be added to the feed array yet, as first  // it needs to get populated with all <item> elements.  // Prepare <item> elements and add them to the channel array.  $item_elements = views_rss_get('item_elements');  $items = $view->style_plugin->map_rows($variables['rows']);  foreach ($items as $item_key => $item) {    // Start building XML item element array compatible with format_xml_elements().    $rss_item = array(      'key' => 'item',      'value' => array(),    );    // Preprocess whole item array before preprocessing separate elements.    foreach (module_implements('views_rss_preprocess_item') as $module) {      $preprocess_function = $module . '_views_rss_preprocess_item';      $item_variables = array(        'item' => &$item,        'view' => $view,      );      // Add raw row if generated based on raw item values provided by field formatter.      if (!empty($view->views_rss['raw_items'][$item_key])) {        $item_variables['raw'] = $view->views_rss['raw_items'][$item_key];      }      $preprocess_function($item_variables);    }    // Process each element separately.    foreach ($item as $module => $module_item_elements) {      foreach ($module_item_elements as $element => $value) {        // Avoid double encoding: the $value might be already encoded here,        // depending on the field configuration/processing, and because we know        // it will be encoded again when the whole feed array will be passed to        // format_xml_elements(), let's make sure we decode it here first.        if (is_string($value)) {          $value = decode_entities($value);        }        // Start building XML element array compatible with format_xml_elements().        $rss_elements = array(          array(            'key' => $element,            'value' => $value,          ),        );        // Preprocess element initial value if required.        if (isset($item_elements[$module][$element]['preprocess functions']) && is_array($item_elements[$module][$element]['preprocess functions'])) {          foreach ($item_elements[$module][$element]['preprocess functions'] as $preprocess_function) {            if (function_exists($preprocess_function)) {              $item_variables = array(                'elements' => &$rss_elements,                'item' => $item,                'view' => $view,              );              // Add raw item if provided by field formatter.              if (!empty($view->views_rss['raw_items'][$item_key][$module][$element])) {                $item_variables['raw'] = $view->views_rss['raw_items'][$item_key][$module][$element];              }              $preprocess_function($item_variables);            }          }        }        // If no preprocess function was defined, and we have received        // #rss_element value (XML element array) from the formatter, it should        // be added to the feed array without any further modifications.        elseif (          !empty($view->views_rss['raw_items'][$item_key][$module][$element])          && is_array($view->views_rss['raw_items'][$item_key][$module][$element])        ) {          // At this point we don't know yet if we got #rss_elements in raw          // values, so do not overwrite and empty main $rss_elements yet, just          // start working with new $formatter_rss_elements - it could be          // overwritten once we are sure we have all required values.          $formatter_rss_elements = array();          foreach ($view->views_rss['raw_items'][$item_key][$module][$element] as $raw_item) {            if (!empty($raw_item['rendered']['#rss_element'])) {              $formatter_rss_elements[] = $raw_item['rendered']['#rss_element'];            }          }          // Now we can overwrite main $rss_elements.          if (!empty($formatter_rss_elements)) {            $rss_elements = $formatter_rss_elements;          }        }        // If there is no value and no attributes (in case of self-closing elements)        // already set for the element at this stage, it is not going to be set        // at any point further, so the element should not be added to the feed.        foreach ($rss_elements as $key => $rss_element) {          if (empty($rss_element['value']) && empty($rss_element['attributes'])) {            unset($rss_elements[$key]);          }        }        if (empty($rss_elements)) continue;        // Add XML element(s) to the item array.        $rss_item['value'] = array_merge($rss_item['value'], $rss_elements);      }    }    // Add XML item element to the channe; array.    $rss_channel[] = $rss_item;  }  // Finally, let's put together the whole feed array.  $rss_feed['value'][] = array(    'key' => 'channel',    'value' => $rss_channel,  );  // Allow for altering it before final render and passing it to the template.  drupal_alter('views_rss_feed', $rss_feed);  // Assign rendered feed to the template variables.  $variables['rss_feed'] = format_xml_elements(array($rss_feed));  // Set XML header.  drupal_add_http_header('Content-Type', 'application/rss+xml; charset=utf-8');}
 |