? noderefence_buttons.patch
Index: modules/nodereference/nodereference.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/cck/modules/nodereference/nodereference.module,v
retrieving revision 1.138.2.15
diff -u -p -r1.138.2.15 nodereference.module
--- modules/nodereference/nodereference.module	10 Jul 2008 00:41:30 -0000	1.138.2.15
+++ modules/nodereference/nodereference.module	13 Jul 2008 20:15:25 -0000
@@ -28,6 +28,9 @@ function nodereference_theme() {
     'nodereference_select' => array(
       'arguments' => array('element' => NULL),
     ),
+    'nodereference_buttons' => array(
+      'arguments' => array('element' => NULL),
+    ),
     'nodereference_autocomplete' => array(
       'arguments' => array('element' => NULL),
     ),
@@ -306,6 +309,14 @@ function nodereference_widget_info() {
         'default value' => CONTENT_CALLBACK_DEFAULT,
       ),
     ),
+    'nodereference_buttons' => array(
+      'label' => t('Check boxes/radio buttons'),
+      'field types' => array('nodereference'),
+      'multiple values' => CONTENT_HANDLE_MODULE,
+      'callbacks' => array(
+        'default value' => CONTENT_CALLBACK_DEFAULT,
+      ),
+    ),
     'nodereference_autocomplete' => array(
       'label' => t('Autocomplete text field'),
       'field types' => array('nodereference'),
@@ -336,6 +347,11 @@ function nodereference_elements() {
       '#columns' => array('uid'), '#delta' => 0,
       '#process' => array('nodereference_select_process'),
       ),
+    'nodereference_buttons' => array(
+      '#input' => TRUE,
+      '#columns' => array('uid'), '#delta' => 0,
+      '#process' => array('nodereference_buttons_process'),
+      ),
     'nodereference_autocomplete' => array(
       '#input' => TRUE,
       '#columns' => array('name'), '#delta' => 0,
@@ -384,6 +400,12 @@ function nodereference_widget(&$form, &$
         '#default_value' => $items,
       );
       break;
+    case 'nodereference_buttons':
+      $element = array(
+        '#type' => 'nodereference_buttons',
+        '#default_value' => $items,
+      );
+      break;
 
     case 'nodereference_autocomplete':
       $element = array(
@@ -448,6 +470,36 @@ function nodereference_select_process($e
  * Build the form element. When creating a form using FAPI #process,
  * note that $element['#value'] is already set.
  *
+ * The $fields array is in $form['#field_info'][$element['#field_name']].
+ */
+function nodereference_buttons_process($element, $edit, $form_state, $form) {
+  // The nodereference_select widget doesn't need to create its own
+  // element, it can wrap around the optionwidgets_select element.
+  // Add a validation step where the value can be unwrapped.
+  $field_key  = $element['#columns'][0];
+  $element[$field_key] = array(
+    '#type' => 'optionwidgets_buttons',
+    '#default_value' => isset($element['#value']) ? $element['#value'] : '',
+    '#element_validate' => array('optionwidgets_validate', 'nodereference_select_validate'),
+    // The following values were set by the content module and need
+    // to be passed down to the nested element.
+    '#title' => $element['#title'],
+    '#required' => $element['#required'],
+    '#description' => $element['#description'],
+    '#field_name' => $element['#field_name'],
+    '#type_name' => $element['#type_name'],
+    '#delta' => $element['#delta'],
+    '#columns' => $element['#columns'],
+  );
+  return $element;
+}
+
+/**
+ * Process an individual element.
+ *
+ * Build the form element. When creating a form using FAPI #process,
+ * note that $element['#value'] is already set.
+ *
  */
 function nodereference_autocomplete_process($element, $edit, $form_state, $form) {
   // Add a few CSS overrides required for autocomplete results returned by Views.
@@ -740,6 +792,11 @@ function theme_nodereference_select($ele
   return $element['#children'];
 }
 
+function theme_nodereference_buttons($element) {
+  return $element['#children'];
+}
+
+
 function theme_nodereference_autocomplete($element) {
   return $element['#children'];
 }
\ No newline at end of file
