Index: checkbox_validate.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/checkbox_validate/checkbox_validate.module,v
retrieving revision 1.2
diff -u -p -r1.2 checkbox_validate.module
--- checkbox_validate.module	29 May 2008 14:14:40 -0000	1.2
+++ checkbox_validate.module	18 Jan 2010 17:16:22 -0000
@@ -2,60 +2,66 @@
 // $Id: checkbox_validate.module,v 1.2 2008/05/29 14:14:40 MegaGrunt Exp $
 
 /**
- * Implementation of hook_form_alter().
+ * @file
+ * Fixes behavior and display of required checkboxes in forms.
  */
-function checkbox_validate_form_alter(&$form, $form_state, $form_id) {
-  $form = checkbox_validate_recurse($form);
-  return; 
-}
 
 /**
- * Recurse through a form array to find required checkboxes
+ * Implements hook_elements().
  */
-function checkbox_validate_recurse($form_item) {
-  if (!is_array($form_item)) return;
-
-  while (list($key, $value) = each($form_item)) {
-
-    if (strpos($key, '#') === 0) {
+function checkbox_validate_elements() {
+  return array(
+    'checkbox' => array(
+      '#process' => array('checkbox_validate_process_element'),
+    ),
+    'optionwidgets_onoff' => array(
+      '#process' => array('checkbox_validate_process_element'),
+    ),
+  );
+}
 
-      if (isset($form_item['#type']) && $form_item['#type'] == 'checkbox' && isset($form_item['#required']) && $form_item['#required'] == TRUE) {
-         
-        $form_item['#element_validate'] = array('checkbox_validate_validation');
-        $form_item['#pre_render'][] = 'checkbox_validate_add_required_symbol'; 
-        return $form_item;
-      }
-      
-    }
-    else {
+/**
+ * Form element #process callback for checkbox form elements.
+ */
+function checkbox_validate_process_element($element) {
+  if (!empty($element['#required'])) {
+    $element['#element_validate'][] = 'checkbox_validate_element_validate';
+    $element['#pre_render'][] = 'checkbox_validate_pre_render_checkbox';
+  }
+  return $element;
+}
 
-      $form_item[$key] = checkbox_validate_recurse($value, $key);
+/**
+ * Form element validation handler for a required checkbox.
+ */
+function checkbox_validate_element_validate($element, &$form_state) {
+  // CCK option widget fields.
+  if (isset($element['#value']['value'])) {
+    if (empty($element['#value']['value'][0])) {
+      $title = filter_xss_admin($element['#title']);
     }
   }
+  elseif (empty($element['#value'])) {
+    $title = filter_xss_admin($element['#title']);
+  }
 
-  return $form_item;
-}     
-
-/* add required symbol here in this pre_render function 
-   so it doresn't display on error messages  */
-function checkbox_validate_add_required_symbol($form) { 
-	$form['#title'] .= ' <span class="form-required" title="' . t('This field is required.') . '">*</span>';
-	return $form;
-}
-
-/* validate a required checkbox */
-function checkbox_validate_validation($element) { 
-  if (empty($element['#value'])) form_error($element, t('!title field is required.', array('!title' => filter_xss_admin(($element['#title'])))));
-  return;
+  if (isset($title)) {
+    form_error($element, t('!title field is required.', array('!title' => $title)));
+  }
 }
 
 /**
- * Implementation of hook_theme().
+ * Adds required symbol during rendering, thus hiding it in error messages.
  */
-function checkbox_validate_theme() {
-  return array(
-    'checkbox_validate_required' => array(
-      'arguments' => array(),
-    ),
-  );
+function checkbox_validate_pre_render_checkbox($element) {
+  $marker = ' <span class="form-required" title="' . t('This field is required.') . '">*</span>';
+  // CCK fields store title in $element['value']['#title'].
+  if (isset($element['value']['#title'])) {
+    $element['value']['#title'] .= $marker;
+  }
+  else {
+    $element['#title'] .= $marker;
+  }
+  return $element;
 }
+
