? 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 @@ +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 .= '
'; + 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') : ' '; + + array_unshift($view->table_header, $extra); + + $output .= theme('views_form_table', $view->table_header, $rows); + $output .= '
'; + + 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; }