From 7ec255abebf6aaa94d2552a6d8f33224fc48e1dc Mon Sep 17 00:00:00 2001
From: Marco Villegas <marvil07@gmail.com>
Date: Thu, 10 Jun 2010 18:37:18 -0500
Subject: [PATCH] feature #660258 by marvil07, franz, dixon_: Expose widgets as views fields.

This add support for the three vud_* submodules in the following way:

- vud_node: let you add a vud_node widget on a node view showing one
            widget per row.
- vud_comment: let you add a vud_comment widget on a comment view showing
               one widget per row.
- vud_term: let you add vud_term widgets on a node view showing one
            vud_term table per row. this is because vud_term vote tag
            depend on one nid.
---
 vud_comment/views/vud_comment.views.inc            |   32 +++++++++++++++
 .../views/vud_comment_handler_field_widget.inc     |   37 +++++++++++++++++
 vud_comment/vud_comment.module                     |    9 ++++
 vud_node/views/vud_node.views.inc                  |   32 +++++++++++++++
 vud_node/views/vud_node_handler_field_widget.inc   |   42 ++++++++++++++++++++
 vud_node/vud_node.module                           |   10 +++++
 vud_term/views/vud_term.views.inc                  |   32 +++++++++++++++
 vud_term/views/vud_term_handler_field_widget.inc   |   29 +++++++++++++
 vud_term/vud_term.module                           |   10 +++++
 9 files changed, 233 insertions(+), 0 deletions(-)
 create mode 100644 vud_comment/views/vud_comment.views.inc
 create mode 100644 vud_comment/views/vud_comment_handler_field_widget.inc
 create mode 100644 vud_node/views/vud_node.views.inc
 create mode 100644 vud_node/views/vud_node_handler_field_widget.inc
 create mode 100644 vud_term/views/vud_term.views.inc
 create mode 100644 vud_term/views/vud_term_handler_field_widget.inc

diff --git vud_comment/views/vud_comment.views.inc vud_comment/views/vud_comment.views.inc
new file mode 100644
index 0000000..7deca07
--- /dev/null
+++ vud_comment/views/vud_comment.views.inc
@@ -0,0 +1,32 @@
+<?php
+// $Id$
+
+/**
+ * Implementation of hook_views_data_alter().
+ */
+function vud_comment_views_data_alter(&$data) {
+  $data['comments']['vud_comment_widget'] = array(
+    'group' => t('Vote Up/Down'),
+    'title' => t('Comment Widget'),
+    'help' => t('Provide a comment widget for the Vote up/Down module.'),
+    'field' => array(
+      'handler' => 'vud_comment_handler_field_widget',
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_views_handlers().
+ */
+function vud_comment_views_handlers() {
+  return array(
+    'info' => array(
+      'path' => drupal_get_path('module', 'vud_comment') . '/views'
+    ),
+    'handlers' => array(
+      'vud_comment_handler_field_widget' => array(
+        'parent' => 'views_handler_field',
+      ),
+    ),
+  );
+}
diff --git vud_comment/views/vud_comment_handler_field_widget.inc vud_comment/views/vud_comment_handler_field_widget.inc
new file mode 100644
index 0000000..b2fbbe3
--- /dev/null
+++ vud_comment/views/vud_comment_handler_field_widget.inc
@@ -0,0 +1,37 @@
+<?php
+// $Id$
+
+/**
+ * A handler that provides a Vote Up/Down widget field for nodes.
+ */
+class vud_comment_handler_field_widget extends views_handler_field {
+  function query() {
+    // We have to override the parent here, because we don't want
+    // to do anything.
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    // It doesn't make sense to have the ability to alter the output.
+    $form['alter']['#access'] = FALSE;
+  }
+
+  function render($values) {
+    $widget = '';
+    $query = 'SELECT n.type FROM {comments} c LEFT JOIN {node} n ON c.nid = n.nid WHERE c.cid = %d';
+    $type = db_result(db_query($query, $values->cid));
+    $comment_allow = in_array($type, variable_get('vud_comment_node_types', array()), TRUE);
+    if ($comment_allow && user_access('use vote up/down on comments')) {
+      $tag = variable_get('vud_tag', 'vote');
+      $widget_type = variable_get('vud_comment_widget', 'plain');
+      $widget = theme('vud_widget', $values->cid, 'comment', $tag, $widget_type);
+    }
+
+    return $widget;
+  }
+}
diff --git vud_comment/vud_comment.module vud_comment/vud_comment.module
index ccf16f4..8ff8876 100644
--- vud_comment/vud_comment.module
+++ vud_comment/vud_comment.module
@@ -193,3 +193,12 @@ function vud_comment_template_suggestions($template_type, $plugin, $content_id)
   );
 }
 
+/**
+ * Implementation of hook_views_api().
+ */
+function vud_comment_views_api() {
+  return array(
+    'api' => 2,
+    'path' => drupal_get_path('module', 'vud_comment') . '/views',
+  );
+}
diff --git vud_node/views/vud_node.views.inc vud_node/views/vud_node.views.inc
new file mode 100644
index 0000000..5eb74d0
--- /dev/null
+++ vud_node/views/vud_node.views.inc
@@ -0,0 +1,32 @@
+<?php
+// $Id$
+
+/**
+ * Implementation of hook_views_data_alter().
+ */
+function vud_node_views_data_alter(&$data) {
+  $data['node']['vud_node_widget'] = array(
+    'group' => t('Vote Up/Down'),
+    'title' => t('Node Widget'),
+    'help' => t('Provide a node widget for the Vote up/Down module.'),
+    'field' => array(
+      'handler' => 'vud_node_handler_field_widget',
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_views_handlers().
+ */
+function vud_node_views_handlers() {
+  return array(
+    'info' => array(
+      'path' => drupal_get_path('module', 'vud_node') . '/views'
+    ),
+    'handlers' => array(
+      'vud_node_handler_field_widget' => array(
+        'parent' => 'views_handler_field',
+      ),
+    ),
+  );
+}
diff --git vud_node/views/vud_node_handler_field_widget.inc vud_node/views/vud_node_handler_field_widget.inc
new file mode 100644
index 0000000..618cb1c
--- /dev/null
+++ vud_node/views/vud_node_handler_field_widget.inc
@@ -0,0 +1,42 @@
+<?php
+// $Id$
+
+/**
+ * A handler that provides a Vote Up/Down widget field for nodes.
+ */
+class vud_node_handler_field_widget extends views_handler_field {
+  function query() {
+    // We have to override the parent here, because we don't want
+    // to do anything.
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    // It doesn't make sense to have the ability to alter the output.
+    $form['alter']['#access'] = FALSE;
+  }
+
+  function render($values) {
+    $widget = '';
+    if (($can_edit = user_access('use vote up/down on nodes')) || user_access('view vote up/down count on nodes')) {
+      $nid = $values->nid;
+      $type = db_result(db_query("SELECT type FROM {node} WHERE nid = '%d'", $nid));
+      $valid_type = in_array($type, variable_get('vud_node_types', array()), TRUE);
+
+      if ($valid_type) {
+        $tag = variable_get('vud_tag', 'vote');
+        $widget_type = variable_get('vud_node_widget', 'plain');
+        $widget_message_code = (!$can_edit) ? VUD_WIDGET_MESSAGE_DENIED : VUD_WIDGET_MESSAGE_ERROR;
+
+        $widget = theme('vud_widget', $nid, 'node', $tag, $widget_type, !$can_edit, $widget_message_code);
+      }
+    }
+
+    return $widget;
+  }
+}
diff --git vud_node/vud_node.module vud_node/vud_node.module
index fe47937..729bf72 100644
--- vud_node/vud_node.module
+++ vud_node/vud_node.module
@@ -48,6 +48,16 @@ function vud_node_menu() {
 }
 
 /**
+ * Implementation of hook_views_api().
+ */
+function vud_node_views_api() {
+  return array(
+    'api' => 2,
+    'path' => drupal_get_path('module', 'vud_node') . '/views',
+  );
+}
+
+/**
  * Access Callback from hook_menu (vud_node_menu).
  */
 function vud_node_tab_view_stats($node) {
diff --git vud_term/views/vud_term.views.inc vud_term/views/vud_term.views.inc
new file mode 100644
index 0000000..415da82
--- /dev/null
+++ vud_term/views/vud_term.views.inc
@@ -0,0 +1,32 @@
+<?php
+// $Id$
+
+/**
+ * Implementation of hook_views_data_alter().
+ */
+function vud_term_views_data_alter(&$data) {
+  $data['node']['vud_term_widget'] = array(
+    'group' => t('Vote Up/Down'),
+    'title' => t('Term Widget'),
+    'help' => t('Provide a term widget for the Vote up/Down module.'),
+    'field' => array(
+      'handler' => 'vud_term_handler_field_widget',
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_views_handlers().
+ */
+function vud_term_views_handlers() {
+  return array(
+    'info' => array(
+      'path' => drupal_get_path('module', 'vud_term') . '/views'
+    ),
+    'handlers' => array(
+      'vud_term_handler_field_widget' => array(
+        'parent' => 'views_handler_field',
+      ),
+    ),
+  );
+}
diff --git vud_term/views/vud_term_handler_field_widget.inc vud_term/views/vud_term_handler_field_widget.inc
new file mode 100644
index 0000000..54399d7
--- /dev/null
+++ vud_term/views/vud_term_handler_field_widget.inc
@@ -0,0 +1,29 @@
+<?php
+// $Id$
+
+/**
+ * A handler that provides a Vote Up/Down widget field for nodes.
+ */
+class vud_term_handler_field_widget extends views_handler_field {
+  function query() {
+    // We have to override the parent here, because we don't want
+    // to do anything.
+  }
+
+  function option_definition() {
+    $options = parent::option_definition();
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    // It doesn't make sense to have the ability to alter the output.
+    $form['alter']['#access'] = FALSE;
+  }
+
+  function render($values) {
+    $node = node_load($values->nid);
+    _vud_term_generate_table($node);
+    return $node->content['vud_term_show_table']['#value'];
+  }
+}
diff --git vud_term/vud_term.module vud_term/vud_term.module
index 495d8c5..ba4fde9 100644
--- vud_term/vud_term.module
+++ vud_term/vud_term.module
@@ -172,3 +172,13 @@ function vud_term_template_suggestions($template_type, $plugin, $content_id) {
     $template_type. '_term_' . $plugin['name'] . '__' . $term->vid,
   );
 }
+
+/**
+ * Implementation of hook_views_api().
+ */
+function vud_term_views_api() {
+  return array(
+    'api' => 2,
+    'path' => drupal_get_path('module', 'vud_term') . '/views',
+  );
+}
-- 
1.7.1

