views_rss_yandex_realty_plugin_style_fields.inc in Views RSS: Yandex Elements 7
Extends the views_rss_plugin_style_fields class to provide RSS for Yandex.Realty.
File
views_rss_yandex_realty/views/views_rss_yandex_realty_plugin_style_fields.incView source
<?php
/**
* @file
* Extends the views_rss_plugin_style_fields class to provide RSS for Yandex.Realty.
*/
class views_rss_yandex_realty_plugin_style_fields extends views_rss_plugin_style_fields {
function option_definition() {
$options = parent::option_definition();
// Unset not needed options.
foreach (array(
'namespaces',
'channel',
'item',
'feed_settings',
) as $key) {
unset($options[$key]);
}
// Offer element defaults.
$offer_elements = views_rss_get('yandex_realty_offer_elements');
if (count($offer_elements)) {
foreach ($offer_elements as $module => $module_offer_elements) {
foreach (array_keys($module_offer_elements) as $element) {
list($namespace, $element_name) = views_rss_extract_element_names($element, 'yandex_realty_offer');
$options['offer'][$namespace][$module][$element_name] = array(
'default' => NULL,
);
}
}
}
return $options;
}
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
// Unset not needed form elements.
foreach (array(
'namespaces',
'channel',
'item',
'feed_settings',
) as $key) {
unset($form[$key]);
}
$handlers = $this->display->handler
->get_handlers('field');
// 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 = views_rss_get('element_groups');
// Offer elements settings.
$offer_elements = views_rss_get('yandex_realty_offer_elements');
if (count($offer_elements)) {
foreach ($offer_elements as $module => $module_offer_elements) {
foreach ($module_offer_elements as $element => $definition) {
if (!isset($definition['configurable']) || $definition['configurable']) {
list($namespace, $element_name) = views_rss_extract_element_names($element, 'yandex_realty_offer');
// Add fieldset for namespace if not yet added.
if (!isset($form['offer'][$namespace])) {
$form['offer'][$namespace] = array(
'#type' => 'fieldset',
'#title' => t('Yandex.Realty offer elements : @namespace', array(
'@namespace' => $namespace,
)),
'#description' => t('Select fields containing relevant values for <offer> 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' => FALSE,
);
}
// Prepare form element.
$default_value = NULL;
if (!empty($this->options['offer'][$namespace][$module][$element_name])) {
$default_value = $this->options['offer'][$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']);
}
}
// Allow to add into possible options.
if (!empty($definition['settings form options']) && is_array($definition['settings form options'])) {
$form_item['#options'] = array_merge($definition['settings form options'], $field_names);
}
// 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['offer'][$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['offer'][$namespace][$module][$definition['group']] = array(
'#type' => 'fieldset',
'#title' => filter_xss($group_title),
'#description' => filter_xss($group_description),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
// Do not include group into form element parents.
'#parents' => array(
'style_options',
'offer',
$namespace,
$module,
),
);
}
$form['offer'][$namespace][$module][$definition['group']][$element_name] = $form_item;
}
else {
$form['offer'][$namespace][$module][$element_name] = $form_item;
}
}
}
}
}
}
/**
* 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();
$offer_elements = views_rss_get('yandex_realty_offer_elements');
foreach ($rendered as $id => $row) {
$item = $raw_item = array();
foreach ($offer_elements as $module => $module_item_elements) {
foreach (array_keys($module_item_elements) as $element) {
list($namespace, $element_name) = views_rss_extract_element_names($element, 'yandex_realty_offer');
// 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_yandex_realty().
if (isset($this->options['offer'][$namespace][$module][$element_name]) && isset($row[$this->options['offer'][$namespace][$module][$element_name]])) {
$item[$module][$element] = $row[$this->options['offer'][$namespace][$module][$element_name]];
}
elseif (isset($this->options['offer'][$namespace][$module][$element_name]) && substr($this->options['offer'][$namespace][$module][$element_name], 0, 24) == 'views_rss_yandex_realty_') {
$item[$module][$element] = $this->options['offer'][$namespace][$module][$element_name];
}
else {
$item[$module][$element] = NULL;
}
// Keep raw values too.
if (!empty($this->options['offer'][$namespace][$module][$element_name]) && !empty($raw[$id][$this->options['offer'][$namespace][$module][$element_name]])) {
$raw_item[$module][$element] = $raw[$id][$this->options['offer'][$namespace][$module][$element_name]];
}
}
}
$items[$id] = $item;
$raw_items[$id] = $raw_item;
}
$this->view->views_rss['raw_items'] = $raw_items;
return $items;
}
}
Classes
Name![]() |
Description |
---|---|
views_rss_yandex_realty_plugin_style_fields | @file Extends the views_rss_plugin_style_fields class to provide RSS for Yandex.Realty. |