? iso_639.patch
Index: iso_639.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/iso_639/iso_639.module,v
retrieving revision 1.1
diff -u -p -r1.1 iso_639.module
--- iso_639.module	18 Aug 2010 17:55:29 -0000	1.1
+++ iso_639.module	19 Nov 2010 15:36:21 -0000
@@ -6,100 +6,92 @@
  * provide a list of language from ISO 639 standard
  */
 
-/////////////////////////////// THEME FUNCTIONS ///////////////////////////////
-
 /**
  * Implementation of hook_theme().
  */
 function iso_639_theme() {
   return array(
-    'iso_639' => array('arguments' => array('element' => NULL)),
+    'iso_639_formatter_default' => array('arguments' => array('element' => NULL)),
   );
 }
 
 /**
- * FAPI theme for an individual iso_639 element.
- *
- * @param $element
+ * Implementation of hook_field_formatter_info()
  */
-function theme_iso_639($element) {
-  return $element['#children'];
-}
-
-/////////////////////////////// FAPI FUNCTIONS ////////////////////////////////
-
-/**
- * Implementation of FAPI hook_elements().
- */
-function iso_639_elements() {
+function iso_639_field_formatter_info() {
   return array(
-    'iso_639' => array(
-      '#input' => TRUE,
-      '#columns' => array('language_code'),
-      '#delta' => 0,
-      '#process' => array('iso_639_process'),
-    ),
+    'default' => array(
+      'label' => t('Default'),
+      'field types' => array('iso_639_code'),
+      'multiple values' => CONTENT_HANDLE_CORE
+    )
   );
 }
 
 /**
- * Process an individual element.
+ * FAPI theme for an individual iso_639 element.
  *
  * @param $element
- * @param $edit
- * @param $form_state
- * @param $form
- */
-function iso_639_process($element, $edit, $form_state, $form) {
-  $field_name = $element['#field_name'];
-  $field = $form['#field_info'][$field_name];
-  $field_key  = $element['#columns'][0];
-
-  $element[$field_key] = array(
-    '#type' => 'select',
-    // Need to allow a slightly larger size that the field length to allow
-    // for some configurations where all characters won't fit in input field.
-    '#attributes' => array('class' => 'iso_639'),
-    // The following values were set by the content module and need
-    // to be passed down to the nested element.
-    '#options' => _iso_639_get_codes(),
-    '#title' => $element['#title'],
-    '#description' => $element['#description'],
-    '#required' => $element['#required'],
-    '#field_name' => $element['#field_name'],
-    '#type_name' => $element['#type_name'],
-    '#delta' => $element['#delta'],
-    '#columns' => $element['#columns'],
-    '#default_value' => $element['#default_value'],
-  );
-
-  $prefixes = array();
-  $suffixes = array();
-
-  // Make sure we don't wipe out element validation added elsewhere.
-  if (empty($element['#element_validate'])) {
-    $element['#element_validate'] = array();
-  }
-
-  // Used so that hook_field('validate') knows where to flag an error.
-  $element['_error_element'] = array(
-    '#type' => 'value',
-    '#value' => implode('][', array_merge($element['#parents'], array($field_key))),
-  );
-
-  return $element;
+ */
+function theme_iso_639_formatter_default($element) {
+  return _iso_639_language_from_code($element['#item']['safe']);
 }
 
-////////////////////////////// FIELD FUNCTIONS ////////////////////////////////
-
 /**
  * Implementation of hook_field().
  */
 function iso_639_field($op, &$node, $field, &$items, $teaser, $page) {
   switch ($op) {
     case 'validate':
-      // TODO VALIDATION
+      if (is_array($items)) {
+        foreach ($items as $delta => $item) {
+          $error_element = isset($item['_error_element']) ? $item['_error_element'] : '';
+          if (is_array($item) && isset($item['_error_element'])) unset($item['_error_element']);
+          if (!empty($item['value'])) {
+            if(!_iso_639_is_valid($item['value'])) {
+              form_set_error($error_element, t('%name: the value given is not a valid ISO 639 code.', array('%name' => $field['widget']['label'])));
+            }
+          }
+        }
+      }
       return $items;
+      break;
+      
+    case 'sanitize':
+      foreach ($items as $delta => $item) {
+        $example = check_plain($item['value']);
+        $items[$delta]['safe'] = $example;
+      }
+      break;
+  }
+}
+
+function _iso_639_is_valid($code) {
+  $codes = array_keys(_iso_639_get_codes());
+  return in_array($code, $codes);
+}
+
+/**
+ * Implementation of hook_field_settings().
+ */
+function iso_639_field_settings($op, $field) {
+  switch ($op) {
+    case 'form':
+      return array();
+      break;
+    case 'save':
+      return array();
+      break;
+    case 'database columns':
+      $columns['value'] = array(
+        'type' => 'varchar',
+        'length' => 2,
+        'not null' => FALSE,
+        'sortable' => TRUE,
+        'views' => TRUE
+      );
+      return $columns;
+      break;
   }
 }
 
@@ -115,32 +107,26 @@ function iso_639_field_info() {
   );
 }
 
-////////////////////////////// WIDGET FUNCTIONS ///////////////////////////////
-
 /**
  * Implementation of hook_widget().
  */
 function iso_639_widget(&$form, &$form_state, $field, $items, $delta = 0) {
-  $element = array();
-
-  $element['language_code'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Language code'),
-    '#collapsible' => TRUE,
-    '#collapsed' => FALSE,
-  );
-
-  $element['language_code']['value'] = array(
+  $element['value'] = array(
     '#type' => 'select',
+    '#title' => check_plain($field['widget']['label']),
+    '#required' => check_plain($field['required']),
     '#options' => _iso_639_get_codes(),
-    '#default_value' => isset($items[$delta]['language_code']['value']) ? $items[$delta]['language_code']['value'] : 'en',
-    '#attributes' => array('class' => 'iso_639'),
-    '#description' => t('Define the default language to be selected'),
+    '#default_value' => isset($items[$delta]) ? $items[$delta] : 'en',
+    '#attributes' => array('class' => 'iso_639')
   );
-
+  
+  if (empty($form['#parents'])) {
+    $form['#parents'] = array();
+  }
+  
   $element['_error_element'] = array(
     '#type' => 'value',
-    '#value' => implode('][', array_merge((array) $form['#parents'], array('value'))),
+    '#value' => implode('][', array_merge($form['#parents'], array('value'))),
   );
 
   return $element;
@@ -162,8 +148,6 @@ function iso_639_widget_info() {
   );
 }
 
-//////////////////////////////////// OTHER ////////////////////////////////////
-
 /**
  * Implementation of hook_content_is_empty().
  */
@@ -172,6 +156,14 @@ function iso_639_content_is_empty($item,
 }
 
 /**
+ * Return the language string corresponding to the language code
+ */
+function _iso_639_language_from_code($code) {
+  $codes = _iso_639_get_codes();
+  return $codes[$code];
+}
+
+/**
  * Return array containing language codes
  *
  * Taken from University of California's website, url:
@@ -179,7 +171,7 @@ function iso_639_content_is_empty($item,
  *
  */
 function _iso_639_get_codes() {
-  return array(
+  $languages = array(
     'aa' => 'Afar',
     'ab' => 'Abkhazian',
     'af' => 'Afrikaans',
@@ -345,4 +337,12 @@ function _iso_639_get_codes() {
     'zh' => 'Chinese',
     'zu' => 'Zulu',
   );
-}
\ No newline at end of file
+  
+  // Translate all languages before returning them
+  $codes = array_keys($languages);
+  foreach ($codes as $code) {
+    $languages[$code] = t($languages[$code]);
+  }
+  return $languages;
+    
+}
