? views
Index: currency.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/currency/currency.module,v
retrieving revision 1.8.2.2.2.3
diff -u -p -r1.8.2.2.2.3 currency.module
--- currency.module	12 Sep 2008 16:01:32 -0000	1.8.2.2.2.3
+++ currency.module	8 Sep 2009 13:10:17 -0000
@@ -143,4 +143,14 @@ function currency_form_submit($form, &$f
   $_SESSION['currency_to']     = $to;
 
   drupal_set_message($result);
+}                 
+
+// views bits
+// Implementation of hook_views
+function currency_views_api() {
+  return array(
+    'api' => 2,
+    'path' => drupal_get_path('module', 'currency'). '/views',
+  );
 }
+
Index: views/currency.views.inc
===================================================================
RCS file: views/currency.views.inc
diff -N views/currency.views.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ views/currency.views.inc	8 Sep 2009 13:10:18 -0000
@@ -0,0 +1,129 @@
+<?php
+/**
+ * Implementation of hook_views_handlers() to register all of the basic handlers
+ * views uses.
+ */
+function currency_views_handlers() {
+  return array(
+    'info' => array(
+      'path' => drupal_get_path('module', 'currency') . '/views/handlers',
+    ),
+    'handlers' => array(
+      'currency_handler_field_currency' => array(
+        'parent' => 'views_handler_field',
+      ),
+      'currency_handler_argument_currency' => array(
+        'parent' => 'views_handler_argument',
+      ),
+      'currency_handler_filter_currency' => array(
+        'parent' => 'views_handler_filter_in_operator',
+      ),
+    ),
+  );
+}
+
+/**
+ * Implementation of hook_views_data
+ */
+function currency_views_data() {
+  $data['currencyapi']['table']['group']  = t('Currency');
+
+  $data['currencyapi']['table']['base'] = array(
+    'title' => t('Exchange Rates'),
+    'help' => t('Exchange rates provided by the currency_api module'),
+  );
+  
+  $data['currencyapi']['currency_from'] = array(
+    'title' => t('Currency from'),
+    'help' => t('The currency that the amount is converted from'),
+    'field' => array(
+      'handler' => 'currency_handler_field_currency',
+    ),
+    'argument' => array(
+      'handler' => 'currency_handler_argument_currency',
+    ),
+    'filter' => array(
+      'handler' => 'currency_handler_filter_currency',
+    ),
+  );
+  
+  $data['currencyapi']['currency_to'] = array(
+    'title' => t('Currency to'),
+    'help' => t('The currency that the amount is converted to'),
+    'field' => array(
+      'handler' => 'currency_handler_field_currency',
+    ),
+    'argument' => array(
+      'handler' => 'currency_handler_argument_currency',
+    ),
+    'filter' => array(
+      'handler' => 'currency_handler_filter_currency',
+    ),
+  );
+
+  $data['currencyapi']['rate'] = array(
+    'title' => t('Exchange rate'),
+    'help' => t('The exchange rate used for conversion'),
+    'field' => array(
+      'handler' => 'views_handler_field_numeric',
+    ),
+  );
+
+  $data['currencyapi']['timestamp'] = array(
+    'title' => t('Timestamp'),
+    'help' => t('The time that the exchange rate was last updated'),
+    'field' => array(
+      'handler' => 'views_handler_field_date',
+    ),
+  );
+
+  return $data;
+}                             
+                       
+/**
+ * Calls currency_api_convert for every exchange rate that should be displayed according to filter and argument settings
+ * to ensure that rates are in the database when views performs it's query
+ */
+function currency_views_preload($view) {
+  static $processed = FALSE;           
+  
+  if(!$processed) {
+    // $this->value for keyed array of selected currencies
+    if($view->filter['currency_from']) {            
+      $selected_from = _currency_views_get_selected_options($view->filter['currency_from']->value);
+    } else if($view->argument['currency_from'] && $currency_from = $view->args[$view->argument['currency_from']->position]) {
+      // process argument
+      $selected_from = array($currency_from);
+    }
+
+    if($view->filter['currency_to']) {            
+      $selected_to = _currency_views_get_selected_options($view->filter['currency_to']->value);
+    } else if($view->argument['currency_to'] && $currency_to = $view->args[$view->argument['currency_to']->position]) {
+      $selected_to = array($currency_to);
+    }                                                                      
+
+    if($selected_from && $selected_to) {
+      // selected currencies - make sure exchange rates are in database by calling currency_api for each from/to currency combination           
+      foreach($selected_from as $currency_from) {
+        foreach($selected_to as $currency_to) {
+          currency_api_convert($currency_from, $currency_to);
+        }
+      }
+    }
+    
+    $processed = TRUE;      
+  }                                                                                                            
+}                                                                                                            
+                      
+function _currency_views_get_selected_options($options) {
+  foreach($options as $key => $set) {
+    if($set) {
+      // i.e. not equal to 0
+      $selected_options[] = $set;
+    }
+  }
+
+  return $selected_options;
+}
+
+?>
\ No newline at end of file
Index: views/handlers/currency_handler_argument_currency.inc
===================================================================
RCS file: views/handlers/currency_handler_argument_currency.inc
diff -N views/handlers/currency_handler_argument_currency.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ views/handlers/currency_handler_argument_currency.inc	8 Sep 2009 13:10:18 -0000
@@ -0,0 +1,7 @@
+<?php
+class currency_handler_argument_currency extends views_handler_argument {       
+  function query() {      
+    currency_views_preload($this->view);
+    return parent::query();    
+  }  
+}
\ No newline at end of file
Index: views/handlers/currency_handler_field_currency.inc
===================================================================
RCS file: views/handlers/currency_handler_field_currency.inc
diff -N views/handlers/currency_handler_field_currency.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ views/handlers/currency_handler_field_currency.inc	8 Sep 2009 13:10:18 -0000
@@ -0,0 +1,28 @@
+<?php 
+class currency_handler_field_currency extends views_handler_field {
+  function render($values) {  
+    if($this->options['display_code_only']) {
+      return parent::render($values);
+    } else {                 
+      $currency_names = currency_api_get_list();
+      $value = $currency_names[$values->{$this->field_alias}];
+      return check_plain($value);
+    }
+  }
+    
+  function option_definition() {
+    $options = parent::option_definition();
+    $options['display_code_only'] = array('default' => FALSE);
+    return $options;
+  }
+
+  function options_form(&$form, &$form_state) {
+    parent::options_form($form, $form_state);
+    $form['display_code_only'] = array(
+      '#title' => t('Display as currency code only'),
+      '#description' => t('Hides the descriptive currency name.'),
+      '#type' => 'checkbox',
+      '#default_value' => !empty($this->options['display_code_only']),
+    );
+  }  
+}
Index: views/handlers/currency_handler_filter_currency.inc
===================================================================
RCS file: views/handlers/currency_handler_filter_currency.inc
diff -N views/handlers/currency_handler_filter_currency.inc
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ views/handlers/currency_handler_filter_currency.inc	8 Sep 2009 13:10:18 -0000
@@ -0,0 +1,13 @@
+<?php
+class currency_handler_filter_currency extends views_handler_filter_in_operator {     
+  function get_value_options() {
+    $this->value_options = currency_api_get_list();
+  }       
+  
+  function query() {                  
+    currency_views_preload($this->view); 
+    return parent::query();
+  }  
+
+}
+
