| Commit | Line | Data |
|---|---|---|
| fe44beb7 EM |
1 | <?php |
| 2 | // $Id$ | |
| 3 | /** | |
| 4 | * @file | |
| 5 | * Contains the feed display plugin. | |
| 6 | */ | |
| 7 | ||
| 8 | /** | |
| 9 | * The plugin that handles a feed, such as RSS or atom. | |
| 10 | * | |
| 11 | * For the most part, feeds are page displays but with some subtle differences. | |
| 12 | * | |
| 13 | * @ingroup views_display_plugins | |
| 14 | */ | |
| 15 | class views_plugin_display_feed extends views_plugin_display_page { | |
| 16 | function uses_breadcrumb() { return FALSE; } | |
| 17 | function get_style_type() { return 'feed'; } | |
| 18 | ||
| 19 | /** | |
| 20 | * Feeds do not go through the normal page theming mechanism. Instead, they | |
| 21 | * go through their own little theme function and then return NULL so that | |
| 22 | * Drupal believes that the page has already rendered itself...which it has. | |
| 23 | */ | |
| 24 | function execute() { | |
| 455d2315 EM |
25 | $output = $this->view->render(); |
| 26 | if (empty($output)) { | |
| 27 | return drupal_not_found(); | |
| 28 | } | |
| 29 | print $output; | |
| fe44beb7 EM |
30 | } |
| 31 | ||
| 32 | function preview() { | |
| 8e293b1a EM |
33 | if (!empty($this->live_preview)) { |
| 34 | return '<pre>' . check_plain($this->view->render()) . '</pre>'; | |
| 35 | } | |
| 36 | return $this->view->render(); | |
| fe44beb7 EM |
37 | } |
| 38 | ||
| 39 | /** | |
| 40 | * Instead of going through the standard views_view.tpl.php, delegate this | |
| 41 | * to the style handler. | |
| 42 | */ | |
| 43 | function render() { | |
| 44 | return $this->view->style_plugin->render($this->view->result); | |
| 45 | } | |
| 46 | ||
| 47 | function defaultable_sections($section = NULL) { | |
| 48 | if (in_array($section, array('style_options', 'style_plugin', 'row_options', 'row_plugin',))) { | |
| 49 | return FALSE; | |
| 50 | } | |
| 51 | ||
| 52 | $sections = parent::defaultable_sections($section); | |
| 53 | ||
| 54 | // Tell views our sitename_title option belongs in the title section. | |
| 55 | if ($section == 'title') { | |
| 56 | $sections[] = 'sitename_title'; | |
| 57 | } | |
| 58 | elseif (!$section) { | |
| 59 | $sections['title'][] = 'sitename_title'; | |
| 60 | } | |
| 61 | return $sections; | |
| 62 | } | |
| 63 | ||
| 64 | function option_definition() { | |
| 65 | $options = parent::option_definition(); | |
| 66 | ||
| 67 | $options['displays'] = array('default' => array()); | |
| 68 | ||
| 69 | // Overrides for standard stuff: | |
| 70 | $options['style_plugin']['default'] = 'rss'; | |
| 71 | $options['style_options']['default'] = array('mission_description' => FALSE, 'description' => ''); | |
| 72 | $options['sitename_title']['default'] = FALSE; | |
| 73 | $options['row_plugin']['default'] = ''; | |
| 74 | $options['defaults']['default']['style_plugin'] = FALSE; | |
| 75 | $options['defaults']['default']['style_options'] = FALSE; | |
| 76 | $options['defaults']['default']['row_plugin'] = FALSE; | |
| 77 | $options['defaults']['default']['row_options'] = FALSE; | |
| 78 | ||
| 79 | return $options; | |
| 80 | } | |
| 81 | ||
| 82 | function options_summary(&$categories, &$options) { | |
| 83 | // It is very important to call the parent function here: | |
| 84 | parent::options_summary($categories, $options); | |
| 85 | ||
| 86 | // Since we're childing off the 'page' type, we'll still *call* our | |
| 87 | // category 'page' but let's override it so it says feed settings. | |
| 88 | $categories['page'] = array( | |
| 89 | 'title' => t('Feed settings'), | |
| 90 | ); | |
| 91 | ||
| 92 | if ($this->get_option('sitename_title')) { | |
| 93 | $options['title']['value'] = t('Using the site name'); | |
| 94 | } | |
| 95 | ||
| 96 | // I don't think we want to give feeds menus directly. | |
| 97 | unset($options['menu']); | |
| 98 | ||
| 99 | $displays = array_filter($this->get_option('displays')); | |
| 100 | if (count($displays) > 1) { | |
| 101 | $attach_to = t('Multiple displays'); | |
| 102 | } | |
| 103 | else if (count($displays) == 1) { | |
| 104 | $display = array_shift($displays); | |
| 105 | if (!empty($this->view->display[$display])) { | |
| 442142a8 | 106 | $attach_to = check_plain($this->view->display[$display]->display_title); |
| fe44beb7 EM |
107 | } |
| 108 | } | |
| 109 | ||
| 110 | if (!isset($attach_to)) { | |
| 111 | $attach_to = t('None'); | |
| 112 | } | |
| 113 | ||
| 114 | $options['displays'] = array( | |
| 115 | 'category' => 'page', | |
| 116 | 'title' => t('Attach to'), | |
| 117 | 'value' => $attach_to, | |
| 118 | ); | |
| 119 | } | |
| 120 | ||
| 121 | /** | |
| 122 | * Provide the default form for setting options. | |
| 123 | */ | |
| 124 | function options_form(&$form, &$form_state) { | |
| 125 | // It is very important to call the parent function here. | |
| 126 | parent::options_form($form, $form_state); | |
| 127 | ||
| 128 | switch ($form_state['section']) { | |
| 129 | case 'title': | |
| 130 | $title = $form['title']; | |
| 131 | // A little juggling to move the 'title' field beyond our checkbox. | |
| 132 | unset($form['title']); | |
| 133 | $form['sitename_title'] = array( | |
| 134 | '#type' => 'checkbox', | |
| 135 | '#title' => t('Use the site name for the title'), | |
| 136 | '#default_value' => $this->get_option('sitename_title'), | |
| 137 | ); | |
| 138 | $form['title'] = $title; | |
| 139 | $form['title']['#process'] = array('views_process_dependency'); | |
| 140 | $form['title']['#dependency'] = array('edit-sitename-title' => array(FALSE)); | |
| 141 | break; | |
| 142 | case 'displays': | |
| 143 | $form['#title'] .= t('Attach to'); | |
| 144 | $displays = array(); | |
| 145 | foreach ($this->view->display as $display_id => $display) { | |
| 146 | if (!empty($display->handler) && $display->handler->accept_attachments()) { | |
| 147 | $displays[$display_id] = $display->display_title; | |
| 148 | } | |
| 149 | } | |
| 150 | $form['displays'] = array( | |
| 151 | '#type' => 'checkboxes', | |
| 4dcdf508 | 152 | '#description' => t('The feed icon will be available only to the selected displays.'), |
| fe44beb7 EM |
153 | '#options' => $displays, |
| 154 | '#default_value' => $this->get_option('displays'), | |
| 155 | ); | |
| 156 | break; | |
| 157 | case 'path': | |
| 158 | $form['path']['#description'] = t('This view will be displayed by visiting this path on your site. It is recommended that the path be something like "path/%/%/feed" or "path/%/%/rss.xml", putting one % in the path for each argument you have defined in the view.'); | |
| 159 | } | |
| 160 | } | |
| 161 | ||
| 162 | /** | |
| 163 | * Perform any necessary changes to the form values prior to storage. | |
| 164 | * There is no need for this function to actually store the data. | |
| 165 | */ | |
| 114e317f | 166 | function options_submit(&$form, &$form_state) { |
| fe44beb7 EM |
167 | // It is very important to call the parent function here: |
| 168 | parent::options_submit($form, $form_state); | |
| 169 | switch ($form_state['section']) { | |
| 170 | case 'title': | |
| 171 | $this->set_option('sitename_title', $form_state['values']['sitename_title']); | |
| 172 | break; | |
| 173 | case 'displays': | |
| 174 | $this->set_option($form_state['section'], $form_state['values'][$form_state['section']]); | |
| 175 | break; | |
| 176 | } | |
| 177 | } | |
| 178 | ||
| 179 | /** | |
| 180 | * Attach to another view. | |
| 181 | */ | |
| 182 | function attach_to($display_id) { | |
| 183 | $displays = $this->get_option('displays'); | |
| 184 | if (empty($displays[$display_id])) { | |
| 185 | return; | |
| 186 | } | |
| 187 | ||
| 188 | // Defer to the feed style; it may put in meta information, and/or | |
| 189 | // attach a feed icon. | |
| 190 | $plugin = $this->get_plugin(); | |
| 191 | if ($plugin) { | |
| 455d2315 EM |
192 | $clone = $this->view->clone_view(); |
| 193 | $clone->set_display($this->display->id); | |
| 194 | $clone->build_title(); | |
| 195 | $plugin->attach_to($display_id, $this->get_path(), $clone->get_title()); | |
| fe44beb7 EM |
196 | } |
| 197 | } | |
| 1027bae8 EM |
198 | |
| 199 | function uses_link_display() { | |
| 200 | return TRUE; | |
| 201 | } | |
| fe44beb7 | 202 | } |