? forms_patch_3.patch
? forms_patch_4.patch
Index: views.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/views.module,v
retrieving revision 1.166.2.43
diff -u -p -r1.166.2.43 views.module
--- views.module	14 Jul 2007 18:54:16 -0000	1.166.2.43
+++ views.module	8 Sep 2007 00:12:13 -0000
@@ -2143,4 +2143,35 @@ function views_form_alter($form_id, &$fo
 // An implementation of hook_devel_caches() from devel.module. Must be in views.module so it always is included.
 function views_devel_caches() {
   return array('cache_views');
-}
\ No newline at end of file
+}
+
+/**
+* Implementation of hook_elements();
+*
+* Here we define a views_node_selector form element that can be used to
+* get back 1 or more nids using a view.
+*
+* We use the #multiple field to indicate if this element is to be used for
+* selecting a single item using radios or multiple items using checkboxes.
+*/
+function views_elements() {
+
+  $type['views_node_selector'] = array(
+    '#input' => TRUE,
+    '#process' => array('expand_views_node_selector' => array()),
+    '#view_nodes' => array(),
+    '#view' => '',
+    '#multiple' => FALSE,
+    '#disabled_nodes' => array(),
+  );
+
+  return $type;
+}
+
+/**
+ * A place holder for the element processing function, located in views_form.inc
+ */
+function expand_views_node_selector($element) {
+  include_once drupal_get_path('module', 'views') . '/views_form.inc';
+  return _expand_views_node_selector($element);
+}
Index: views_form.inc
===================================================================
RCS file: views_form.inc
diff -N views_form.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ views_form.inc	8 Sep 2007 00:12:13 -0000
@@ -0,0 +1,123 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Helper functions for the views_node_selector form element type. 
+ */
+
+/**
+ * Theme function for the views_node_selector form element
+ *
+ * Display the nodes of a view as a form in a table with radios or checkboxes.
+ */
+function theme_views_node_selector($element) {
+  $fields = _views_get_fields();
+  $view = $element['#view'];
+  $multiple = $element['#multiple'];
+  $output = '';
+
+  // Make sure we have the table header.
+  if (!isset($view->table_header)) {
+    $view->table_header = _views_construct_header($view, $fields);
+  }
+
+  // Add CSS classes for the whole form.
+  $class = 'views-form '. ($element['#multiple'] ? 'views-form-multiple' : 'views-form-single');
+  if (isset($element['#attributes']['class'])) {
+    $class .= ' '. $element['#attributes']['class'];
+  }
+
+  $output .=  '<div class = "'. $class .'">';
+  if (!empty($element['#view_nodes']) && is_array($element['#view_nodes'])) {
+    $rows = array();
+    foreach ($element['#view_nodes'] as $node) {
+      $arow = array();
+      $arow[] = array('data' => ($multiple ? theme('checkbox', $element[$node->nid]) : theme('radio', $element[$node->nid])));
+      
+      foreach ($view->field as $field) {
+        if ($fields[$field['id']]['visible'] !== FALSE) {
+          $cell['data'] = views_theme_field('views_handle_field', $field['queryname'],
+            $fields, $field, $node, $view);
+          $cell['class'] = "view-field ". views_css_safe('view-field-'. $field['queryname']);
+          $arow[] = $cell;
+        }
+      }
+      $rows[] = $arow;
+    }
+  }
+  else  {
+    $rows[] = array(array('data' => t('No posts available.'), 'colspan' => (count($view->table_header) + 1)));
+  }
+  // Add a column to the header to accomodate our selection column, and include
+  // the 'select all' checkbox if we are using checkboxes.
+  $extra = $multiple ? theme('table_select_header_cell') : '&nbsp;';
+
+  array_unshift($view->table_header, $extra);
+
+  $output .= theme('views_form_table', $view->table_header, $rows);
+  $output .= '</div>';
+
+  return theme('form_element', $element, $output);
+}
+
+
+/**
+ * Default views_node_selector form table theme function.
+ */
+function theme_views_form_table($header, $rows) {
+  return theme('table', $header, $rows);
+}
+
+/**
+ * True views_node_selector form element expansion function. 
+ *
+ * @see views_elements() in views.module
+ * @see expand_views_node_selector()  in views.module
+ * @see form_builder() in Drupal core includes/form.inc
+ */
+function _expand_views_node_selector($element){
+  $options = array();
+
+  foreach($element['#view_nodes'] as $node) {
+    $options[$node->nid] = '';
+  }
+
+  $element['#options'] = $options;
+  if ($element['#multiple']) {
+    $element = expand_checkboxes($element);
+  }
+  else {
+    // Handle the case of an array of default values for radios.
+    if (is_array($element['#default_value'])) {
+      $element['#default_value'] = current($element['#default_value']);
+    }
+    $element = expand_radios($element);
+  }
+
+  // Check for disabled items
+  foreach($options as $nid => $v) {
+    if (in_array($nid, $element['#disabled_nodes'])) {
+      $element[$nid]['#disabled'] = TRUE;
+    }
+    // Disable the theme function for the radio/checkbox elements so that
+    // the output can be built in theme_views_node_selector.
+    $element[$nid]['#theme'] = '';
+    // Add CSS class.
+    $element[$nid]['#attributes']['class'] = 'view-field';
+  }
+
+  return $element;
+}
+
+/**
+ * Pre-process default values when using checkboxes.
+ *
+ * @see form_builder() in Drupal core includes/form.inc
+ */
+function views_node_selector_value(&$form) {
+  if ($form['#multiple']) {
+    checkboxes_value($form);
+  }
+}
+
Index: views_ui.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/views/Attic/views_ui.module,v
retrieving revision 1.44.2.25
diff -u -p -r1.44.2.25 views_ui.module
--- views_ui.module	14 Jul 2007 19:54:20 -0000	1.44.2.25
+++ views_ui.module	8 Sep 2007 00:12:13 -0000
@@ -715,7 +715,7 @@ function _views_check_ops(&$view, $op, $
 /**
  * Custom form element to do our nice images.
  */
-function views_elements() {
+function views_ui_elements() {
   $type['views_imagebutton'] = array('#input' => TRUE, '#button_type' => 'submit',);
   return $type;
 }
