diff -up -N views_node_feed/README views_node_feed_6/README --- views_node_feed/README 2008-08-05 18:08:49.000000000 -0400 +++ views_node_feed_6/README 2008-12-02 07:27:09.000000000 -0500 @@ -7,7 +7,15 @@ How to use Views Node Feed: with nodes. You can sort and filter these nodes just as you regularly would with views. The view should provide a page. -4. Add the "Node: Views Node Feed Selector" argument to the view - and select the node feed you want to use under "option" -5. Access your view's node feed by adding /node_feed to the - end of your view page URL \ No newline at end of file +4. Add a "Feed" display by selecting "Feed" in the dropdown + at the upper left and then clicking "Add Display" +5. Click "Style" in the basic settings column of your new feed + and select "Views Node Feed" at the bottom of the page. + Click "Update" +6. There should be a Settings icon next to "Style: Views Node Feed" + in the "Basic Settings" column. Click that icon and select your feed. + **Remember to click both "Update" and then "Save"** +7. Go to the path you specified and view your feed! + +Note: views_node_feed no longer requires the /node_feed argument in order +to function. The path you specified will work as specified \ No newline at end of file diff -up -N views_node_feed/views_node_feed.info views_node_feed_6/views_node_feed.info --- views_node_feed/views_node_feed.info 2008-08-05 18:15:24.000000000 -0400 +++ views_node_feed_6/views_node_feed.info 2008-12-01 20:30:21.000000000 -0500 @@ -1,11 +1,7 @@ -; $Id: views_node_feed.info,v 1.1 2008/06/16 18:51:51 andrewlevine Exp $ +; $Id$ name = Views Node Feed description = Allows the Creation of node pages based on Custom Functions package = Views -dependencies = views views_ui - -; Information added by drupal.org packaging script on 2008-08-05 -version = "5.x-1.1" -project = "views_node_feed" -datestamp = "1217974524" - +dependencies[] = views +dependencies[] = views_ui +core = 6.x \ No newline at end of file diff -up -N views_node_feed/views_node_feed.module views_node_feed_6/views_node_feed.module --- views_node_feed/views_node_feed.module 2008-08-05 18:08:49.000000000 -0400 +++ views_node_feed_6/views_node_feed.module 2008-12-02 11:18:07.000000000 -0500 @@ -1,53 +1,96 @@ 2); +} -function views_node_feed_menu($may_cache) { +/** + * Implementation of hook_theme(). + */ +function views_node_feed_theme($existing, $type, $theme, $path) { + return array( + 'views_node_feed_admin' => array( + 'arguments' => array( + 'feeds' => NULL, + ), + ), + 'views_node_feed' => array( + 'arguments' => array( + 'view' => NULL, + 'nodes' => NULL, + 'type' => NULL + ), + ), + ); +} + + +/** + * Implementation of hook_menu(). + */ +function views_node_feed_menu() { $items = array(); - if ($may_cache) { - $items[] = array( - 'path' => 'admin/settings/views_node_feed', - 'title' => t('Views Node Feed'), - 'description' => t('Manage Different Types of Node Feeds'), - 'access' => user_access('administer views'), - 'callback' => 'views_node_feed_admin_settings', - 'type' => MENU_NORMAL_ITEM, - ); - } - else { - $items[] = array( - 'path' => 'admin/settings/views_node_feed/edit/' . arg(4), - 'title' => t('!op Node Feed', array('!op' => arg(4) === 'new' ? t('Add') : t('Edit'))), - 'access' => user_access('administer views'), - 'callback' => 'drupal_get_form', - 'callback arguments' => array('views_node_feed_edit_form', arg(4)), - 'type' => MENU_CALLBACK, - ); - $items[] = array( - 'path' => 'admin/settings/views_node_feed/delete/' . arg(4), - 'title' => t('Delete Node Feed'), - 'access' => user_access('administer views'), - 'callback' => 'drupal_get_form', - 'callback arguments' => array('views_node_feed_delete_form', arg(4)), - 'type' => MENU_CALLBACK, - ); - } + $items['admin/settings/views_node_feed'] = array( + 'title' => 'Views Node Feed', + 'description' => 'Manage Different Types of Node Feeds', + 'access arguments' => array('administer views'), + 'page callback' => 'views_node_feed_admin_settings', + 'type' => MENU_NORMAL_ITEM, + ); + $items['admin/settings/views_node_feed/edit'] = array( + 'title' => 'Add/Edit Node Feed', + 'title callback' => '_views_node_feed_edit_title_callback', + 'title arguments' => array(4, "test"), + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_node_feed_edit_form'), + 'access arguments' => array('administer views'), + 'type' => MENU_NORMAL_ITEM, + ); + $items['admin/settings/views_node_feed/delete'] = array( + 'title' => 'Delete Node Feed', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('views_node_feed_delete_form'), + 'access arguments' => array('Delete Node Feed'), + 'type' => MENU_CALLBACK, + ); return $items; } +/** + * Title Callback + */ +function _views_node_feed_edit_title_callback() { + $op = (arg(4) == 'new') ? "New" : "Edit"; + return t('!op Node Feed', array('!op' => $op)); +} +/** + * Build the themed admin page + */ function views_node_feed_admin_settings() { $feeds = views_node_feed_get_feeds(); return theme('views_node_feed_admin', $feeds); } -function views_node_feed_edit_form($ident) { +/** + * Provide the Views Node Feed create/edit form + */ +function views_node_feed_edit_form($arg1, $ident) { $new = $ident === 'new'; if (!$new) { - if (views_node_feed_valid_identifier($ident)) { + if (_views_node_feed_valid_identifier($ident)) { $feed = views_node_feed_get_feeds($ident); } if (!$feed) { @@ -72,14 +115,14 @@ function views_node_feed_edit_form($iden '#type' => 'textarea', '#title' => t('Wrapper Template'), '#description' => t('Template that will be placed around the list of nodes. Be sure to include the string ***VIEWS_NODE_FEED_ITEMS*** which will automatically be replaced with the necessary items. The variables $view, $nodes, and $type will be available.'), - '#default_value' => $new ? '***VIEWS_NODE_FEED_ITEMS***' : $feed['wrapper'], + '#default_value' => $new ? '***VIEWS_NODE_FEED_ITEMS***' : $feed['wrapper'], '#required' => FALSE, ); $form['node'] = array( '#type' => 'textarea', '#title' => t('Node template'), '#description' => t('Template that will be generated for each node. The variables $view, $nodes, $node, and $type will be available.'), - '#default_value' => $new ? 'title; ?>
' : $feed['node'], + '#default_value' => $new ? 'title; ?>
' : $feed['node'], '#required' => FALSE, ); $form['submit'] = array( @@ -89,33 +132,42 @@ function views_node_feed_edit_form($iden return $form; } -function views_node_feed_edit_form_validate($form_id, $form_values) { - if (!views_node_feed_valid_identifier($form_values['identifier'])) { +/** + * Validate the Views Node Feed create/edit form + */ +function views_node_feed_edit_form_validate($form, &$form_state) { + if (!_views_node_feed_valid_identifier($form_state['values']['identifier'])) { form_set_error('identifier', t('Invalid feed identifier')); } $feeds = views_node_feed_get_feeds(); - if ($form_values['new'] && in_array($form_values['identifier'], $feeds)) { + if ($form_state['values']['new'] && in_array($form_state['values']['identifier'], $feeds)) { form_set_error('identifier', t('Feed identifier already exists.')); } } -function views_node_feed_edit_form_submit($form_id, $form_values) { +/** + * Process submission of the Views Node Feed create/edit form + */ +function views_node_feed_edit_form_submit($form, &$form_state) { $val = array( - 'identifier' => $form_values['identifier'], - 'wrapper' => $form_values['wrapper'], - 'node' => $form_values['node'] + 'identifier' => $form_state['values']['identifier'], + 'wrapper' => $form_state['values']['wrapper'], + 'node' => $form_state['values']['node'] ); - $ident = $form_values['identifier']; + $ident = $form_state['values']['identifier']; $feeds = views_node_feed_get_feeds(); $feeds[$ident] = $ident; variable_set("views_node_feed_$ident", $val); variable_set("views_node_feed_feeds", $feeds); - - drupal_set_message('Node feed %feed updated', array('%feed' => $ident)); - return 'admin/settings/views_node_feed'; + + drupal_set_message(t('Node feed %feed updated', array('%feed' => $ident))); + $form_state['redirect'] = 'admin/settings/views_node_feed'; } -function views_node_feed_delete_form($ident) { +/** + * Provide the Views Node Feed delete form + */ +function views_node_feed_delete_form($info, $ident) { $feeds = views_node_feed_get_feeds(); if (!in_array($ident, $feeds)) { drupal_not_found(); @@ -130,18 +182,24 @@ function views_node_feed_delete_form($id t('Delete'), t('Cancel')); } -function views_node_feed_delete_form_submit($form_id, $form_values) { +/** + * Process submission of the Views Node Feed delete form + */ +function views_node_feed_delete_form_submit($form, &$form_state) { $feeds = views_node_feed_get_feeds(); - $ident = $form_values['identifier']; + $ident = $form_state['values']['identifier']; unset($feeds[$ident]); variable_del("views_node_feed_$ident"); variable_set("views_node_feed_feeds", $feeds); - drupal_set_message(t('Node feed %feed deleted.', t(array('%feed' => $ident)))); + drupal_set_message(t('Node feed %feed deleted.', array('%feed' => $ident))); } -function views_node_feed_valid_identifier($ident) { +/** + * Ensure that the Views Node Feed identifier is valid + */ +function _views_node_feed_valid_identifier($ident) { $ident = (string)$ident; - if (strlen($ident) <=0 || strlen($ident) > 50) { + if (drupal_strlen($ident) <=0 || drupal_strlen($ident) > 50) { return FALSE; } $new = preg_replace('/[^a-zA-Z0-9_]/', '', $ident); @@ -151,6 +209,13 @@ function views_node_feed_valid_identifie return TRUE; } +/** + * Get views_node_feed feeds + * @param $ident + * a string containing the views_node_feed feed identity + * @return + * An array of feeds + */ function views_node_feed_get_feeds($ident = NULL) { if ($ident === NULL) { return variable_get("views_node_feed_feeds", array()); @@ -161,152 +226,14 @@ function views_node_feed_get_feeds($iden } /** - * Provide views plugins for the feed types we support. - */ -function views_node_feed_views_style_plugins() { - return array( - 'views_node_feed' => array( - 'name' => t('Views Node Feed: Node feed'), - 'theme' => 'views_node_feed', - 'needs_table_header' => TRUE, - 'needs_fields' => TRUE, - 'even_empty' => TRUE, - ), - ); -} - -/** - * While we support the global selector, some might want to allow - * ONLY RSS feeds so we support a stingy selector too - */ -function views_node_feed_views_arguments() { - $feeds = views_node_feed_get_feeds(); - $arguments = array( - 'views_node_feed' => array( - 'name' => t('Node: Views Node Feed Selector'), - 'handler' => 'views_handler_arg_node_feed_feed', - 'option' => array( - '#type' => 'select', - '#options' => $feeds, - ), - 'help' => t('This argument specifies a specific Node feed selector; it will only select Node feeds, unlike the built-in selector which can select pluggable feeds. You may enter the title the feed will advertise in the title field here, and the description of the feed in the option field here.'), - ), - ); - return $arguments; -} - -/** - * handler for our own RSS argument; mimics the feed selector - */ -function views_handler_arg_node_feed_feed($op, &$query, $argtype, $arg = '') { - switch($op) { - case 'summary': - case 'sort': - case 'link': - case 'title': - break; - case 'filter': - // This is a clone of the default selector, but it just invokes ours - // rather than calling all of them. - views_node_feed_views_feed_argument('argument', $GLOBALS['current_view'], $arg, $argtype); - } -} - -/** - * post view for our own op -- mimics the feed selector - */ -function views_node_feed_views_post_view($view, $items, $output) { - foreach ($view->argument as $id => $argument) { - if ($argument['type'] == 'views_node_feed') { - $feed = $id; - break; - } - } - - if ($feed !== NULL) { - return views_node_feed_views_feed_argument('post_view', $view, 'node_feed'); - } -} - -/** - * feed argument hook that will convert us to RSS or display an icon. - * the 4th argument isn't part of the hook, but we use it to differentiate - * when called as a hook or when called manually from views_rss_views_post_view - */ -function views_node_feed_views_feed_argument($op, &$view, $arg, $argdata = NULL) { - if ($op == 'argument' && $arg == 'node_feed') { - $view->page_type = 'views_node_feed'; - - if ($argdata['options']) { - $view->node_feed_type = $argdata['options']; - } - - // reset the 'real url' to the URL without the feed argument. - $view_args = array(); - $max = count($view->args); - foreach ($view->args as $id => $view_arg) { - ++$count; - if ($view_arg == $arg && $view->argument[$id]['id'] == $argdata['id']) { - if ($count != $max) { - $view_args[] = $argdata['wildcard']; - } - } - else { - $view_args[] = $view_arg; - } - } - $view->feed_url = views_get_url($view, $view_args); - } - else if ($op == 'post_view' && $view->build_type != 'block') { - $args = views_post_view_make_args($view, $arg, 'node_feed'); - $url = views_get_url($view, $args); - $title = views_get_title($view, 'page', $args); - - if ($view->used_filters) { - $filters = drupal_query_string_encode($view->used_filters); - } - - } -} - -/** - * plugin that actually displays an RSS feed + * themes the views_node_feed admin page + * + * @ingroup themeable */ -function theme_views_node_feed($view, $nodes, $type) { - if ($type == 'block') { - return; - } - global $base_url; - - $feed = views_node_feed_get_feeds($view->node_feed_type); - $node_output = ''; - //append list of nodes using template and ob - foreach ($nodes as $node) { - // Load the specified node: - $node = node_load($node->nid); - ob_start(); - eval('?>' . $feed['node']); - $node_output .= ob_get_contents(); - ob_end_clean(); - } - ob_start(); - eval('?>' . $feed['wrapper']); - $wrapper_output = ob_get_contents(); - ob_end_clean(); - - //combine wrapper and nodes - $output = str_replace('***VIEWS_NODE_FEED_ITEMS***', $node_output, $wrapper_output); - - //drupal_set_header('Content-Type: text/xml; charset=utf-8'); - print $output; - module_invoke_all('exit'); - exit; -} - function theme_views_node_feed_admin($feeds) { $output = ''; - $output .= '

' . l(t('Add new node feed'), 'admin/settings/views_node_feed/edit/new') . '

'; - + $output .= '

'. l(t('Add new node feed'), 'admin/settings/views_node_feed/edit/new') .'

'; + $output .= '

'; if (count($feeds) == 0) { $output .= t("No existing node feeds"); @@ -315,11 +242,11 @@ function theme_views_node_feed_admin($fe $header = array(t('Identifier'), t('Actions')); $rows = array(); foreach ($feeds as $ident) { - $rows[] = array($ident, l(t('Edit'), 'admin/settings/views_node_feed/edit/'.$ident) . ' / ' . l(t('Delete'), 'admin/settings/views_node_feed/delete/'.$ident)); + $rows[] = array($ident, l(t('Edit'), 'admin/settings/views_node_feed/edit/'. $ident) .' / '. l(t('Delete'), 'admin/settings/views_node_feed/delete/'. $ident)); } $output .= theme('table', $header, $rows); } $output .= '

'; - + return $output; -} +} \ No newline at end of file diff -up -N views_node_feed/views_node_feed.views.inc views_node_feed_6/views_node_feed.views.inc --- views_node_feed/views_node_feed.views.inc 1969-12-31 19:00:00.000000000 -0500 +++ views_node_feed_6/views_node_feed.views.inc 2008-12-02 11:18:07.000000000 -0500 @@ -0,0 +1,28 @@ + 'views_node_feed', + 'style' => array( + 'views_node_feed' => array( + 'title' => t('Views Node Feed'), + 'handler' => 'views_node_feed_plugin_style_feed', + 'theme' => 'views_node_feed_view_feed', + 'uses row plugin' => FALSE, + 'uses options' => TRUE, + 'type' => 'feed', + 'help topic' => 'style-rss', + ), + ), + ); +} \ No newline at end of file diff -up -N views_node_feed/views_node_feed_plugin_style_feed.inc views_node_feed_6/views_node_feed_plugin_style_feed.inc --- views_node_feed/views_node_feed_plugin_style_feed.inc 1969-12-31 19:00:00.000000000 -0500 +++ views_node_feed_6/views_node_feed_plugin_style_feed.inc 2008-12-02 11:18:07.000000000 -0500 @@ -0,0 +1,52 @@ + 'select', + '#title' => t('Views Node Feed Template'), + '#options' => views_node_feed_get_feeds(), + '#default_value' => $this->options['format'], + ); + } + function render() { + $rows = array(); + $feed = views_node_feed_get_feeds($this->options['format']); + $nodes = array(); + foreach ($this->view->result as $row) { + $node = node_load($row->nid); + ob_start(); + eval('?>'. $feed['node']); + $evaluated_row = ob_get_contents(); + ob_end_clean(); + $node_output .= $evaluated_row; + $nodes[] = $node; + } + ob_start(); + eval('?>'. $feed['wrapper']); + $wrapper_output = ob_get_contents(); + ob_end_clean(); + //combine wrapper and nodes + $output = str_replace('***VIEWS_NODE_FEED_ITEMS***', $node_output, $wrapper_output); + // print $output; + return $output; + // return theme($this->theme_functions(), $this->view, $this->options, $node_output); + } +} \ No newline at end of file