FINAL suepr merge step : added all modules to this super repos
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Views plugins, handlers and hooks definition for Views RSS module.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements hook_views_style_plugins().
|
||||
* Adds view types to views UI interface.
|
||||
*/
|
||||
function views_rss_views_plugins() {
|
||||
return array(
|
||||
'style' => array(
|
||||
'rss_fields' => array(
|
||||
'type' => 'feed',
|
||||
'title' => t('RSS Feed - Fields'),
|
||||
'help' => t('Outputs a RSS formatted feed'),
|
||||
'handler' => 'views_rss_plugin_style_fields',
|
||||
'path' => VIEWS_RSS_PATH . '/views',
|
||||
'theme' => 'views_view_views_rss',
|
||||
'theme file' => 'theme.inc',
|
||||
'theme path' => VIEWS_RSS_PATH . '/theme',
|
||||
'uses row plugin' => FALSE,
|
||||
'uses fields' => TRUE,
|
||||
'uses options' => TRUE,
|
||||
'uses grouping' => FALSE,
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_views_handlers().
|
||||
*/
|
||||
function views_rss_views_handlers() {
|
||||
return array(
|
||||
'info' => array(
|
||||
'path' => VIEWS_RSS_PATH . '/views',
|
||||
),
|
||||
'handlers' => array(
|
||||
'views_rss_handler_field_user_mail' => array(
|
||||
'parent' => 'views_handler_field_user_mail',
|
||||
),
|
||||
'views_rss_handler_field_term_node_tid' => array(
|
||||
'parent' => 'views_handler_field_term_node_tid',
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_views_data_alter().
|
||||
*/
|
||||
function views_rss_views_data_alter(&$data) {
|
||||
$data['users']['mail']['field']['handler'] = 'views_rss_handler_field_user_mail';
|
||||
$data['node']['term_node_tid']['field']['handler'] = 'views_rss_handler_field_term_node_tid';
|
||||
}
|
@@ -0,0 +1,163 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Field handler to provide additional control for the All Taxonomy Terms field.
|
||||
*/
|
||||
|
||||
class views_rss_handler_field_term_node_tid extends views_handler_field_term_node_tid {
|
||||
|
||||
function option_definition() {
|
||||
$options = parent::option_definition();
|
||||
$options['rss_domain'] = array('default' => 'none');
|
||||
$options['rss_include_parents'] = array('default' => 0);
|
||||
$options['rss_include_vocabulary'] = array('default' => 0);
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_form(&$form, &$form_state) {
|
||||
parent::options_form($form, $form_state);
|
||||
// New display type: "RSS <category> element".
|
||||
$form['type']['#weight'] = 2;
|
||||
$form['separator']['#weight'] = 3;
|
||||
$form['type']['#options']['rss_category'] = t('RSS <category> element');
|
||||
|
||||
// Additional options for "domain" attribute.
|
||||
$form['rss_domain'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('<em>Domain</em> attribute'),
|
||||
'#description' => t("<em>domain</em> attribute identifies the category's taxonomy.") . ' ' . l('[?]', 'http://www.rssboard.org/rss-profile#element-channel-item-category', array('attributes' => array('title' => t('Need more information?')))),
|
||||
'#options' => array(
|
||||
'none' => t('None'),
|
||||
'path' => t('Path'),
|
||||
'alias' => t('URL alias'),
|
||||
),
|
||||
'#default_value' => $this->options['rss_domain'],
|
||||
'#dependency' => array('radio:options[type]' => array('rss_category')),
|
||||
'#weight' => 3,
|
||||
);
|
||||
|
||||
// Output terms with their parents.
|
||||
// Example: parent2/parent1/term
|
||||
$form['rss_include_parents'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Include term parents'),
|
||||
'#description' => t('Output terms from hierarchical vocabularies together with their parents (slash-delimited).'),
|
||||
'#default_value' => $this->options['rss_include_parents'],
|
||||
'#dependency' => array('radio:options[type]' => array('rss_category')),
|
||||
'#weight' => 4,
|
||||
);
|
||||
|
||||
// Output terms with their parents and vocabulary.
|
||||
// Example: vocabulary/parent2/parent1/term
|
||||
$form['rss_include_vocabulary'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Include term vocabulary'),
|
||||
'#description' => t('Add vocabulary name before term parents.'),
|
||||
'#default_value' => $this->options['rss_include_vocabulary'],
|
||||
'#process' => array('ctools_dependent_process'),
|
||||
'#dependency_count' => 2,
|
||||
'#dependency' => array(
|
||||
'radio:options[type]' => array('rss_category'),
|
||||
'edit-options-rss-include-parents' => array(1),
|
||||
),
|
||||
'#weight' => 5,
|
||||
);
|
||||
|
||||
// Hide "Link this field to its term page" checkbox
|
||||
// if "RSS <category> element" is selected as "Display type".
|
||||
$form['link_to_taxonomy']['#weight'] = 4;
|
||||
$form['link_to_taxonomy']['#states'] = array(
|
||||
'visible' => array(
|
||||
':input[name="options[type]"]' => array('!value' => 'rss_category'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
function pre_render(&$values) {
|
||||
parent::pre_render($values);
|
||||
// For "RSS <category> element" display type make sure
|
||||
// that field value will never be rendered as link.
|
||||
if ($this->options['type'] == 'rss_category') {
|
||||
foreach ($this->items as $node_nid => $terms) {
|
||||
foreach ($terms as $term_tid => $term) {
|
||||
if (isset($term['make_link'])) {
|
||||
$this->items[$node_nid][$term_tid]['make_link'] = FALSE;
|
||||
}
|
||||
if ($this->options['rss_domain'] != 'none' && empty($this->options['link_to_taxonomy'])) {
|
||||
$this->items[$node_nid][$term_tid]['path'] = 'taxonomy/term/' . $term_tid;
|
||||
}
|
||||
if ($this->options['rss_include_parents']) {
|
||||
$this->items[$node_nid][$term_tid]['parents'] = taxonomy_get_parents_all($term_tid);
|
||||
}
|
||||
if ($this->options['rss_include_vocabulary']) {
|
||||
$this->items[$node_nid][$term_tid]['vocabulary'] = $term['vocabulary'];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function render_items($items) {
|
||||
if (!empty($items)) {
|
||||
if ($this->options['type'] == 'rss_category') {
|
||||
return implode('', $items);
|
||||
}
|
||||
// Default render_items().
|
||||
return parent::render_items($items);
|
||||
}
|
||||
}
|
||||
|
||||
function render_item($count, $item) {
|
||||
if ($this->options['type'] == 'rss_category') {
|
||||
// Basic XML element details.
|
||||
$rss_element = array(
|
||||
'key' => 'category',
|
||||
'value' => $item['name'],
|
||||
);
|
||||
// Slash-delimited list of all parents with the term at the end.
|
||||
// $item['parents'] array contains the current term as well.
|
||||
if ($this->options['rss_include_parents'] && isset($item['parents'])) {
|
||||
$parents = array();
|
||||
// Add vocabulary if required.
|
||||
if ($this->options['rss_include_vocabulary'] && isset($item['vocabulary'])) {
|
||||
$parents[] = $item['vocabulary'];
|
||||
}
|
||||
// Add all terms (parent and current one).
|
||||
foreach (array_reverse($item['parents']) as $parent) {
|
||||
$parents[] = $parent->name;
|
||||
}
|
||||
if (count($parents)) {
|
||||
$rss_element['value'] = implode('/', $parents);
|
||||
}
|
||||
}
|
||||
// Add "domain" attribute if required.
|
||||
if ($this->options['rss_domain'] == 'path') {
|
||||
$rss_element['attributes']['domain'] = url('<front>', array('absolute' => TRUE)) . $item['path'];
|
||||
}
|
||||
elseif ($this->options['rss_domain'] == 'alias') {
|
||||
$rss_element['attributes']['domain'] = url($item['path'], array('absolute' => TRUE));
|
||||
}
|
||||
// Prepare raw-rendered values to store in view results.
|
||||
$rendered = array(
|
||||
'#item' => $item,
|
||||
'#markup' => format_xml_elements(array($rss_element)),
|
||||
'#rss_element' => $rss_element,
|
||||
'#settings' => $this->options,
|
||||
);
|
||||
// Store raw-rendered values in view results, the same way
|
||||
// as values from standard field formatters are added.
|
||||
$row_index = $this->view->row_index;
|
||||
$field_name = 'field_' . $this->field;
|
||||
$this->view->result[$row_index]->{$field_name}[$count] = array(
|
||||
'rendered' => $rendered,
|
||||
'raw' => $item,
|
||||
);
|
||||
// Return formatted XML element.
|
||||
return format_xml_elements(array($rss_element));
|
||||
}
|
||||
// Standard Views render_item().
|
||||
return parent::render_item($count, $item);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Field handler to provide additional control for the email field.
|
||||
*/
|
||||
|
||||
class views_rss_handler_field_user_mail extends views_handler_field_user_mail {
|
||||
|
||||
function option_definition() {
|
||||
$options = parent::option_definition();
|
||||
$options['rss_format'] = array('default' => 'default');
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_form(&$form, &$form_state) {
|
||||
parent::options_form($form, $form_state);
|
||||
$form['rss_format'] = array(
|
||||
'#title' => t('Display type'),
|
||||
'#type' => 'select',
|
||||
'#options' => array(
|
||||
'default' => t('Generic email'),
|
||||
'with_name' => t('RSS <author> element (with user name)'),
|
||||
),
|
||||
'#default_value' => isset($this->options['rss_format']) ? $this->options['rss_format'] : 'default',
|
||||
'#weight' => 0,
|
||||
);
|
||||
// Hide "Link this field" radios if "RSS <author> element"
|
||||
// is selected as "Display type".
|
||||
$form['link_to_user']['#states'] = array(
|
||||
'visible' => array(
|
||||
':input[name="options[rss_format]"]' => array('!value' => 'with_name'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
function render_link($data, $values) {
|
||||
if ($this->options['rss_format'] == 'with_name') {
|
||||
// Try to load full user object based on email address.
|
||||
$value = $data;
|
||||
if ($account = user_load_by_mail($data)) {
|
||||
$value = $account->mail . ' (' . $account->name . ')';
|
||||
}
|
||||
// Basic XML element details.
|
||||
$rss_element = array(
|
||||
'key' => 'author',
|
||||
'value' => $value,
|
||||
);
|
||||
// Prepare and store raw-rendered values in view results,
|
||||
// the same way as values from standard field formatters are added.
|
||||
$rendered = array(
|
||||
'#item' => $data,
|
||||
'#markup' => format_xml_elements(array($rss_element)),
|
||||
'#rss_element' => $rss_element,
|
||||
'#settings' => $this->options,
|
||||
);
|
||||
// Store raw-rendered values in view results, the same way
|
||||
// as values from standard field formatters are added.
|
||||
$row_index = $this->view->row_index;
|
||||
$field_name = 'field_' . $this->field;
|
||||
$this->view->result[$row_index]->{$field_name}[0] = array(
|
||||
'rendered' => $rendered,
|
||||
'raw' => $data,
|
||||
);
|
||||
// Return formatted XML element.
|
||||
return format_xml_elements(array($rss_element));
|
||||
}
|
||||
// Standard Views render_link().
|
||||
return parent::render_link($data, $values);
|
||||
}
|
||||
|
||||
}
|
@@ -0,0 +1,409 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Extends the view_plugin_style class to provide new RSS view style.
|
||||
*/
|
||||
|
||||
class views_rss_plugin_style_fields extends views_plugin_style {
|
||||
|
||||
/**
|
||||
* Attach this view to another display as a feed.
|
||||
*/
|
||||
function attach_to($display_id, $path, $title) {
|
||||
$display = $this->view->display[$display_id]->handler;
|
||||
$url_options = array('absolute' => TRUE);
|
||||
$input = $this->view->get_exposed_input();
|
||||
if ($input) {
|
||||
$url_options['query'] = $input;
|
||||
}
|
||||
|
||||
$url = url($this->view->get_url(NULL, $path), $url_options);
|
||||
if ($display->has_path() && !$this->options['feed_settings']['feed_in_links']) {
|
||||
if (empty($this->preview)) {
|
||||
drupal_add_feed($url, $title);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (empty($this->view->feed_icon)) {
|
||||
$this->view->feed_icon = '';
|
||||
}
|
||||
|
||||
$this->view->feed_icon .= theme('feed_icon', array('url' => $url, 'title' => $title));
|
||||
drupal_add_html_head_link(array(
|
||||
'rel' => 'alternate',
|
||||
'type' => 'application/rss+xml',
|
||||
'title' => $title,
|
||||
'href' => $url,
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
function option_definition() {
|
||||
$options = parent::option_definition();
|
||||
|
||||
// Namespace defaults.
|
||||
$namespaces = views_rss_get('namespaces');
|
||||
if (count($namespaces)) {
|
||||
foreach ($namespaces as $module => $module_namespaces) {
|
||||
foreach (array_keys($module_namespaces) as $namespace) {
|
||||
$options['namespaces'][$module][$namespace] = array('default' => NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Channel element defaults.
|
||||
$channel_elements = views_rss_get('channel_elements');
|
||||
if (count($channel_elements)) {
|
||||
foreach ($channel_elements as $module => $module_channel_elements) {
|
||||
foreach (array_keys($module_channel_elements) as $element) {
|
||||
list($namespace, $element_name) = views_rss_extract_element_names($element, 'core');
|
||||
$options['channel'][$namespace][$module][$element_name] = array('default' => NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Item element defaults.
|
||||
$item_elements = views_rss_get('item_elements');
|
||||
if (count($item_elements)) {
|
||||
foreach ($item_elements as $module => $module_item_elements) {
|
||||
foreach (array_keys($module_item_elements) as $element) {
|
||||
list($namespace, $element_name) = views_rss_extract_element_names($element, 'core');
|
||||
$options['item'][$namespace][$module][$element_name] = array('default' => NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Other feed settings defaults.
|
||||
$options['feed_settings']['feed_in_links'] = array('default' => 0);
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide a form for setting options.
|
||||
*
|
||||
* @param array $form
|
||||
* @param array $form_state
|
||||
*/
|
||||
function options_form(&$form, &$form_state) {
|
||||
parent::options_form($form, $form_state);
|
||||
|
||||
$handlers = $this->display->handler->get_handlers('field');
|
||||
if (empty($handlers)) {
|
||||
drupal_set_message(t('You need at least one field before you can configure your field settings.'), 'error');
|
||||
}
|
||||
else {
|
||||
|
||||
// Field chooser.
|
||||
$field_names = array('' => '--');
|
||||
foreach ($handlers as $field => $handler) {
|
||||
if ($label = $handler->label()) {
|
||||
$field_names[$field] = $label;
|
||||
}
|
||||
else {
|
||||
$field_names[$field] = $handler->ui_name();
|
||||
}
|
||||
}
|
||||
|
||||
// Element groups could be used both in channel and item settings.
|
||||
$element_groups = views_rss_get('element_groups');
|
||||
|
||||
// Channel elements settings.
|
||||
$channel_elements = views_rss_get('channel_elements');
|
||||
if (count($channel_elements)) {
|
||||
foreach ($channel_elements as $module => $module_channel_elements) {
|
||||
foreach ($module_channel_elements as $element => $definition) {
|
||||
if (!isset($definition['configurable']) || $definition['configurable']) {
|
||||
list($namespace, $element_name) = views_rss_extract_element_names($element, 'core');
|
||||
// Add fieldset for namespace if not yet added.
|
||||
if (!isset($form['channel'][$namespace])) {
|
||||
$form['channel'][$namespace] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Channel elements : @namespace', array('@namespace' => $namespace)),
|
||||
'#description' => t('Provide values for <channel> elements in "@namespace" namespace. See <a href="@guide_url">Views RSS documentation</a> for more information.', array(
|
||||
'@namespace' => $namespace,
|
||||
'@guide_url' => url('http://drupal.org/node/1344136'),
|
||||
)),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
}
|
||||
// Prepare form element.
|
||||
$default_value = NULL;
|
||||
if (!empty($this->options['channel'][$namespace][$module][$element_name])) {
|
||||
$default_value = $this->options['channel'][$namespace][$module][$element_name];
|
||||
}
|
||||
$form_item = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => filter_xss(isset($definition['title']) ? $definition['title'] : $element_name),
|
||||
'#description' => filter_xss(isset($definition['description']) ? $definition['description'] : NULL),
|
||||
'#default_value' => $default_value,
|
||||
);
|
||||
// Allow to overwrite default form element.
|
||||
if (!empty($definition['settings form'])) {
|
||||
$form_item = array_merge($form_item, $definition['settings form']);
|
||||
// Make sure that #options is an associative array.
|
||||
if (!empty($definition['settings form']['#options'])) {
|
||||
$form_item['#options'] = views_rss_map_assoc($definition['settings form']['#options']);
|
||||
}
|
||||
}
|
||||
if (!empty($definition['settings form options callback'])) {
|
||||
$function = $definition['settings form options callback'];
|
||||
$form_item['#options'] = views_rss_map_assoc($function());
|
||||
}
|
||||
// Add help link if provided.
|
||||
if (!empty($definition['help'])) {
|
||||
$form_item['#description'] .= ' ' . l('[?]', $definition['help'], array('attributes' => array('title' => t('Need more information?'))));
|
||||
}
|
||||
// Check if element should be displayed in a subgroup.
|
||||
if (!empty($definition['group'])) {
|
||||
// Add a subgroup to the form if it not yet added.
|
||||
if (!isset($form['channel'][$namespace][$module][$definition['group']])) {
|
||||
// Does module provide the group definition?
|
||||
$group_title = !empty($element_groups[$module][$definition['group']]['title']) ? $element_groups[$module][$definition['group']]['title'] : $definition['group'];
|
||||
$group_description = !empty($element_groups[$module][$definition['group']]['description']) ? $element_groups[$module][$definition['group']]['description'] : NULL;
|
||||
$form['channel'][$namespace][$module][$definition['group']] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => filter_xss($group_title),
|
||||
'#description' => filter_xss($group_description),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
}
|
||||
$form['channel'][$namespace][$module][$definition['group']][$element_name] = $form_item;
|
||||
}
|
||||
// Display element normally (not within a subgroup).
|
||||
else {
|
||||
$form['channel'][$namespace][$module][$element_name] = $form_item;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Item elements settings.
|
||||
$item_elements = views_rss_get('item_elements');
|
||||
if (count($item_elements)) {
|
||||
foreach ($item_elements as $module => $module_item_elements) {
|
||||
foreach ($module_item_elements as $element => $definition) {
|
||||
if (!isset($definition['configurable']) || $definition['configurable']) {
|
||||
list($namespace, $element_name) = views_rss_extract_element_names($element, 'core');
|
||||
// Add fieldset for namespace if not yet added.
|
||||
if (!isset($form['item'][$namespace])) {
|
||||
$form['item'][$namespace] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Item elements : @namespace', array('@namespace' => $namespace)),
|
||||
'#description' => t('Select fields containing relevant values for <item> elements in "@namespace" namespace. See <a href="@guide_url">Views RSS documentation</a> for more information.', array(
|
||||
'@namespace' => $namespace,
|
||||
'@guide_url' => url('http://drupal.org/node/1344136'),
|
||||
)),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
}
|
||||
// Prepare form element.
|
||||
$default_value = NULL;
|
||||
if (!empty($this->options['item'][$namespace][$module][$element_name])) {
|
||||
$default_value = $this->options['item'][$namespace][$module][$element_name];
|
||||
}
|
||||
$form_item = array(
|
||||
'#type' => 'select',
|
||||
'#title' => filter_xss(isset($definition['title']) ? $definition['title'] : $element_name),
|
||||
'#description' => filter_xss(isset($definition['description']) ? $definition['description'] : NULL),
|
||||
'#options' => $field_names,
|
||||
'#default_value' => $default_value,
|
||||
);
|
||||
// Allow to overwrite default form element.
|
||||
if (!empty($definition['settings form'])) {
|
||||
$form_item = array_merge($form_item, $definition['settings form']);
|
||||
// Make sure that #options is an associative array.
|
||||
if (!empty($definition['settings form']['#options'])) {
|
||||
$form_item['#options'] = views_rss_map_assoc($definition['settings form']['#options']);
|
||||
}
|
||||
}
|
||||
// Add help link if provided.
|
||||
if (isset($definition['help']) && $definition['help']) {
|
||||
$form_item['#description'] .= ' ' . l('[?]', $definition['help'], array('attributes' => array('title' => t('Need more information?'))));
|
||||
}
|
||||
// Check if element should be displayed in a subgroup.
|
||||
if (isset($definition['group']) && $definition['group']) {
|
||||
// Add a subgroup to the form if it not yet added.
|
||||
if (!isset($form['item'][$namespace][$module][$definition['group']])) {
|
||||
// Does module provide the group definition?
|
||||
$group_title = !empty($element_groups[$module][$definition['group']]['title']) ? $element_groups[$module][$definition['group']]['title'] : $definition['group'];
|
||||
$group_description = !empty($element_groups[$module][$definition['group']]['description']) ? $element_groups[$module][$definition['group']]['description'] : NULL;
|
||||
$form['item'][$namespace][$module][$definition['group']] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => filter_xss($group_title),
|
||||
'#description' => filter_xss($group_description),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
}
|
||||
$form['item'][$namespace][$module][$definition['group']][$element_name] = $form_item;
|
||||
}
|
||||
// Display element normally (not within a subgroup).
|
||||
else {
|
||||
$form['item'][$namespace][$module][$element_name] = $form_item;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Undefined namespaces derived from <channel> and/or <item>
|
||||
// elements defined by extension modules.
|
||||
$namespaces = views_rss_get('namespaces');
|
||||
if (count($namespaces)) {
|
||||
foreach ($namespaces as $module => $module_namespaces) {
|
||||
foreach ($module_namespaces as $namespace => $definition) {
|
||||
if (empty($definition['uri'])) {
|
||||
// Add fieldset for namespace if not yet added.
|
||||
if (!isset($form['namespaces'])) {
|
||||
$form['namespaces'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Namespaces'),
|
||||
'#description' => t('Enter missing URLs for namespaces derived from <channel> and/or <item> elements defined by extension modules.'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
}
|
||||
if (!empty($this->options['namespaces'][$module][$namespace])) {
|
||||
$default_value = $this->options['namespaces'][$module][$namespace];
|
||||
}
|
||||
else {
|
||||
$default_value = NULL;
|
||||
}
|
||||
$form['namespaces'][$module][$namespace] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => check_plain($namespace),
|
||||
'#default_value' => $default_value,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Other feed settings.
|
||||
$form['feed_settings'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Other feed settings'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => TRUE,
|
||||
);
|
||||
$form['feed_settings']['absolute_paths'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t("Replace relative paths with absolute URLs"),
|
||||
'#description' => t('Enabling this option will replace all relative paths (like <em>/node/1</em>) with absolute URLs (<em>!absolute_url</em>) in all feed elements configured to use this feature (for example <description> element).', array(
|
||||
'!absolute_url' => trim($GLOBALS['base_url'], '/') . '/node/1',
|
||||
)),
|
||||
'#default_value' => !empty($this->options['feed_settings']['absolute_paths']) || !isset($this->options['feed_settings']['absolute_paths']),
|
||||
'#weight' => 1,
|
||||
);
|
||||
$form['feed_settings']['feed_in_links'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Display feed icon in the links attached to the view'),
|
||||
'#default_value' => !empty($this->options['feed_settings']['feed_in_links']),
|
||||
'#weight' => 3,
|
||||
);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow other modules to validate options form values prior to submit.
|
||||
*/
|
||||
function options_validate(&$form, &$form_state) {
|
||||
foreach (module_implements('views_rss_options_form_validate') as $module) {
|
||||
$function = $module . '_views_rss_options_form_validate';
|
||||
$function($form, $form_state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Allow other modules to perform any necessary changes
|
||||
* to options form values prior to storage.
|
||||
*/
|
||||
function options_submit(&$form, &$form_state) {
|
||||
foreach (module_implements('views_rss_options_form_submit') as $module) {
|
||||
$function = $module . '_views_rss_options_form_submit';
|
||||
$function($form, $form_state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure the display and all associated handlers are valid.
|
||||
*/
|
||||
function validate() {
|
||||
parent::validate();
|
||||
$errors = array();
|
||||
$channel_elements = views_rss_get('channel_elements');
|
||||
$item_elements = views_rss_get('item_elements');
|
||||
if (empty($channel_elements) && empty($item_elements)) {
|
||||
$errors[] = t('You have not enabled any modules providing feed elements. Please enable at least <a href="@modules_url">Views RSS: Core Elements</a> module.', array(
|
||||
'@modules_url' => url('admin/modules', array('fragment' => 'edit-modules-views')),
|
||||
));
|
||||
}
|
||||
return $errors;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map views row result to an RSS item.
|
||||
*/
|
||||
function map_rows($rows) {
|
||||
// Fields must be pre-rendered starting from version 2.3 of Views module.
|
||||
$rendered = $raw = array();
|
||||
$keys = array_keys($this->view->field);
|
||||
foreach ($rows as $count => $row) {
|
||||
$this->view->row_index = $count;
|
||||
foreach ($keys as $id) {
|
||||
$rendered[$count][$id] = $this->view->field[$id]->theme($row);
|
||||
// Also let's keep raw value for further processing.
|
||||
$field_name = 'field_' . $id;
|
||||
if (!empty($row->$field_name)) {
|
||||
$raw[$count][$id] = $row->$field_name;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Rewrite view rows to XML item rows.
|
||||
$items = $raw_items = array();
|
||||
$item_elements = views_rss_get('item_elements');
|
||||
foreach ($rendered as $id => $row) {
|
||||
$item = $raw_item = array();
|
||||
foreach ($item_elements as $module => $module_item_elements) {
|
||||
foreach (array_keys($module_item_elements) as $element) {
|
||||
list($namespace, $element_name) = views_rss_extract_element_names($element, 'core');
|
||||
// Assign values for all elements, not only those defined in view settings.
|
||||
// If element value is not defined in view settings, let's just assign NULL.
|
||||
// It will not be passed to final theme function anyway during processing
|
||||
// taking place in template_preprocess_views_view_views_rss().
|
||||
if (
|
||||
isset($this->options['item'][$namespace][$module][$element_name])
|
||||
&& isset($row[$this->options['item'][$namespace][$module][$element_name]])
|
||||
) {
|
||||
$item[$module][$element] = $row[$this->options['item'][$namespace][$module][$element_name]];
|
||||
}
|
||||
else {
|
||||
$item[$module][$element] = NULL;
|
||||
}
|
||||
// Keep raw values too.
|
||||
if (
|
||||
!empty($this->options['item'][$namespace][$module][$element_name])
|
||||
&& !empty($raw[$id][$this->options['item'][$namespace][$module][$element_name]])
|
||||
) {
|
||||
$raw_item[$module][$element] = $raw[$id][$this->options['item'][$namespace][$module][$element_name]];
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
$items[$id] = $item;
|
||||
$raw_items[$id] = $raw_item;
|
||||
}
|
||||
|
||||
$this->view->views_rss['raw_items'] = $raw_items;
|
||||
return $items;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user