Hi, I just updated to views 6.x-2-4 and now receive this error:
warning: Invalid argument supplied for foreach() in /drupal/sites/all/modules/views/includes/base.in

I ran the update.php file after I installed the new views module.
Is there a fix for this?

Thanks

Support from Acquia helps fund testing for Drupal Acquia logo

Comments

merlinofchaos’s picture

Status: Active » Postponed (maintainer needs more info)

I need more context, like what you're doing when this error appears, and the full error (because it usually includes a line number).

sskully’s picture

Its show up on any of my main nodes/pages home, contact etc.
Here's the full error:
warning: Invalid argument supplied for foreach() in /Applications/MAMP/htdocs/VSA_site2/sites/all/modules/views/includes/base.inc on line 61.

Thanks for the quick reply.

Anonymous’s picture

I get the same error after upgrading to 6.x-2.4.

I noticed it when I try to use image_assist. It prevents any of the controls from being displayed in the image_assist pop-up window.

The error also shows up on all of my admin pages where warnings can be displayed.

People have been mentioning something similar here:
http://drupal.org/node/427556

Once I reverted back to Views 6.x-2.2 the error went away.

marcvangend’s picture

I have the same error:
warning: Invalid argument supplied for foreach() in E:\Apache\htdocs\mydrupalsite\sites\all\modules\views\includes\base.inc on line 61.
I'm not using image assist, but I do use these views-relates modules: views_datascource, views_checkboxes and views_accordion.
I tried to debug by altering _set_option_defaults():

  function _set_option_defaults(&$storage, $options, $level = 0) {
    if (isset($options)){ // check if $options is set
      foreach ($options as $option => $definition) {  //  <-- this is line 61 in the original module
        if (isset($definition['contains']) && is_array($definition['contains'])) {
          $storage[$option] = array();
          $this->_set_option_defaults($storage[$option], $definition['contains'], $level++);
        }
        elseif (!empty($definition['translatable']) && !empty($definition['default'])) {
          $storage[$option] = t($definition['default']);
        }
        else {
          $storage[$option] = isset($definition['default']) ? $definition['default'] : NULL;
        }
      }
    } else { // what is $storage when $options is not set?
      dsm($storage);
    }
  }

Checking if $options is set effectively removes the error message. I don't know if this its the real fix, or if there is a deeper lying problem that needs to be solved.
I added the else statement to see if I could find out anything about the context when $options is not set. It reveals that (in my situation) $storage is an empty array.

I hope this helps.

sskully’s picture

I think I'm doing something wrong with your fix. I copied your code with out the and replaced the function in the basic.inc file.
When I refresh my browser I get a blank screen.
I'm I doing something wrong?

Thanks.

marcvangend’s picture

sskully, the dsm() function can be undefined if you don't have the devel module installed - I guess that might cause a blank page. Anyway, the code in #4 is not meant as a fix (and it is not tested as such); consider it a tool which will hopefully help to find the cause of this problem. If you want to use this as a temporary workaround to hide the error message (no guarantees, use at your own risk) then try removing the else{} part.

sskully’s picture

Thanks marcvangend!
I have one other question, if I revert to my previous version of views will it screw up my site?

merlinofchaos’s picture

If you have devel.module installed, can you put a vsm_trace() at that line and paste where this is happening? It might also be valuable to see if the error only happens for certain views. It may be that there are some somehow corrupted or misconfigured views that are showing this error far away from where the real problem is.

ghmercado’s picture

Subscribing. Im getting same error message. Am using d6 and views version 6.x-2.4. It happened directly after adding a 'view feed'. I installed devel.module and got below:

* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: preg_match() expects parameter 2 to be string, array given in /home/exchange/public_html/mywebsite/sites/all/modules/admin_menu/admin_menu.inc on line 244.
* warning: Invalid argument supplied for foreach() in /home/exchange/public_html/mywebsite/sites/all/modules/views/includes/base.inc on line 61.

am not sure how to do a vsm_trace() sorry

marcvangend’s picture

@merlinofchaos #8: I'll get back on that on tuesday, when I'm back at work.

deviantintegral’s picture

Here is a vsm_trace() for you. It appears to be affecting all of my views. This one is generated by previewing a View in the edit tab, so it should only be from that single view. It appears that $options is being set to an empty array occasionally. Sorry for the length :(

base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_display.inc: views_plugin_display->get_plugin line 446
views_plugin_display.inc: views_plugin_display->uses_fields line 1630
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_style.inc: views_plugin_display->get_plugin line 24
views_plugin_display.inc: views_plugin_style->init line 463
views_plugin_display.inc: views_plugin_display->get_plugin line 446
views_plugin_display.inc: views_plugin_display->uses_fields line 1630
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_field.inc: views_object->construct line 29
views_handler_field_node.inc: views_handler_field->construct line 16
handlers.inc: views_handler_field_node->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1632
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 65
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_field.inc: views_object->construct line 29
views_handler_field_node.inc: views_handler_field->construct line 16
handlers.inc: views_handler_field_node->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1632
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_field.inc: views_object->construct line 29
views_handler_field_markup.inc: views_handler_field->construct line 19
handlers.inc: views_handler_field_markup->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1632
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 65
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_field.inc: views_object->construct line 29
views_handler_field_markup.inc: views_handler_field->construct line 19
handlers.inc: views_handler_field_markup->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1632
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_display.inc: views_plugin_display->get_plugin line 1648
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_style.inc: views_plugin_display->get_plugin line 24
views_plugin_display.inc: views_plugin_style->init line 463
views_plugin_display.inc: views_plugin_display->get_plugin line 1648
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_style.inc: views_plugin_display->get_plugin line 189
views_plugin_display.inc: views_plugin_style->validate line 1653
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_argument.inc: views_object->construct line 39
handlers.inc: views_handler_argument->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1665
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_filter_in_operator.inc: views_object->construct line 14
handlers.inc: views_handler_filter_in_operator->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1665
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 65
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_filter_in_operator.inc: views_object->construct line 14
handlers.inc: views_handler_filter_in_operator->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1665
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_filter_boolean_operator.inc: views_object->construct line 25
handlers.inc: views_handler_filter_boolean_operator->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1665
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 65
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_filter_boolean_operator.inc: views_object->construct line 25
handlers.inc: views_handler_filter_boolean_operator->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1665
view.inc: views_plugin_display->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_display.inc: views_plugin_display->get_plugin line 446
views_plugin_display.inc: views_plugin_display->uses_fields line 1630
views_plugin_display_page.inc: views_plugin_display->validate line 463
view.inc: views_plugin_display_page->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_style.inc: views_plugin_display->get_plugin line 24
views_plugin_display.inc: views_plugin_style->init line 463
views_plugin_display.inc: views_plugin_display->get_plugin line 446
views_plugin_display.inc: views_plugin_display->uses_fields line 1630
views_plugin_display_page.inc: views_plugin_display->validate line 463
view.inc: views_plugin_display_page->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_field.inc: views_object->construct line 29
views_handler_field_node.inc: views_handler_field->construct line 16
handlers.inc: views_handler_field_node->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1632
views_plugin_display_page.inc: views_plugin_display->validate line 463
view.inc: views_plugin_display_page->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 65
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_field.inc: views_object->construct line 29
views_handler_field_node.inc: views_handler_field->construct line 16
handlers.inc: views_handler_field_node->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1632
views_plugin_display_page.inc: views_plugin_display->validate line 463
view.inc: views_plugin_display_page->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_field.inc: views_object->construct line 29
views_handler_field_markup.inc: views_handler_field->construct line 19
handlers.inc: views_handler_field_markup->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1632
views_plugin_display_page.inc: views_plugin_display->validate line 463
view.inc: views_plugin_display_page->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 65
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
views_handler_field.inc: views_object->construct line 29
views_handler_field_markup.inc: views_handler_field->construct line 19
handlers.inc: views_handler_field_markup->construct line 24
handlers.inc: _views_create_handler line 101
views.module: _views_prepare_handler line 639
views_plugin_display.inc: views_get_handler line 510
views_plugin_display.inc: views_plugin_display->get_handlers line 1632
views_plugin_display_page.inc: views_plugin_display->validate line 463
view.inc: views_plugin_display_page->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_display.inc: views_plugin_display->get_plugin line 1648
views_plugin_display_page.inc: views_plugin_display->validate line 463
view.inc: views_plugin_display_page->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_style.inc: views_plugin_display->get_plugin line 24
views_plugin_display.inc: views_plugin_style->init line 463
views_plugin_display.inc: views_plugin_display->get_plugin line 1648
views_plugin_display_page.inc: views_plugin_display->validate line 463
view.inc: views_plugin_display_page->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_style.inc: views_plugin_display->get_plugin line 189
views_plugin_display.inc: views_plugin_style->validate line 1653
views_plugin_display_page.inc: views_plugin_display->validate line 463
view.inc: views_plugin_display_page->validate line 1511
admin.inc: view->validate line 362
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
view.inc: views_get_plugin line 298
view.inc: view->init_style line 588
view.inc: view->build line 658
view.inc: view->execute line 757
views_plugin_display.inc: view->render line 1613
view.inc: views_plugin_display->preview line 852
admin.inc: view->preview line 384
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
base.inc: views_object->_set_option_defaults line 54
base.inc: views_object->set_default_options line 40
handlers.inc: views_object->construct line 24
views.module: _views_create_handler line 677
views_plugin_display.inc: views_get_plugin line 460
views_plugin_style.inc: views_plugin_display->get_plugin line 24
view.inc: views_plugin_style->init line 305
view.inc: view->init_style line 588
view.inc: view->build line 658
view.inc: view->execute line 757
views_plugin_display.inc: view->render line 1613
view.inc: views_plugin_display->preview line 852
admin.inc: view->preview line 384
menu.inc: call_user_func_array line 348
index.php: menu_execute_active_handler line 18
merlinofchaos’s picture

deviantintegral: Thanks. That's unfortunately just making me go 'buh' even more. It *looks* like somewhere, some handler has an improperly created 'option_definition()' method. Let's try this:

Just before line 61 where it crashes:

  if (!is_array($options)) {
    dsm($this->options);
    dsm(get_class($this));
  }

Let's see if that shows us anything interesting.

merlinofchaos’s picture

Status: Postponed (maintainer needs more info) » Fixed
FileSize
945 bytes

Thanks to deviantintegral we have figured this out. The fix is committed but here is the patch for those not operating out of CVS.

marcvangend’s picture

Nice work, thanks for the fix.

yched’s picture

er, oops :-(

merlinofchaos’s picture

yched: No worries, these things happen. =)

Anonymous’s picture

I'm getting the same set of warnings on admin pages regarding admin_menu.inc line 244 (as noted in post #9). I do not get the warning about base.inc.

This is directly after upgrading from 2.3->2.5, and after running the DB update script.

Anonymous’s picture

Status: Fixed » Active
merlinofchaos’s picture

Status: Active » Fixed

admin_menu.inc is not a Views file so I don't believe that's related to Views.

Anonymous’s picture

Perhaps. The error popped up right after my update to 2.5. Backing down to 2.3 resolves the issue.

highermath’s picture

You aren't by any chance, running devel? This issue has popped up there and is resolved by going to the dev version. http://drupal.org/node/430374

Anonymous’s picture

You aren't by any chance, running devel? This issue has popped up there and is resolved by going to the dev version. http://drupal.org/node/430374

I am in fact. I disabled it, however these errors seem very random in nature so it made testing difficult. I wonder why the Views update kicked off the warnings caused by devel? Either way thanks!

Anonymous’s picture

It also pops up if you use the image assist module, after upgrading Views. See bug http://drupal.org/node/42755
EDIT: sorry, this was already mentioned earlier...

ghmercado’s picture

Yup, figured that out. Thanks a lot for the fix.

Status: Fixed » Closed (fixed)

Automatically closed -- issue fixed for 2 weeks with no activity.

jrabeemer’s picture

#22, I was getting a foreach() error at

views/includes/base.inc on line 173.

Disabling the Devel module fixed it.

alexx90’s picture

I have the same problem I tried every thing but that not help
warning: Invalid argument supplied for foreach() in /home/pa2230rd/public_html/grps/sites/all/modules/views/includes/base.inc on line 60.

the file is

<?php
/**
 * @file
 *
 * Provides the basic object definitions used by plugins and handlers.
 */

/**
 * Basic definition for many views objects
 */
class views_object {
  /**
   * Except for displays, options for the object will be held here.
   */
  var $options = array();
  /**
   * Information about options for all kinds of purposes will be held here.
   * @code
   * 'option_name' => array(
   *  - 'default' => default value,
   *  - 'translatable' => TRUE/FALSE (wrap in t() on export if true),
   *  - 'contains' => array of items this contains, with its own defaults, etc.
   *      If contains is set, the default will be ignored and assumed to
   *      be array()
   *
   *  ),
   *  @endcode
   * Each option may have any of the following functions:
   *  - export_option_OPTIONNAME -- Special export handling if necessary.
   *  - translate_option_OPTIONNAME -- Special handling for translating data
   *    within the option, if necessary.
   */
  function option_definition() { return array(); }

  /**
   * Views handlers use a special construct function so that we can more
   * easily construct them with variable arguments.
   */
  function construct() { $this->set_default_options(); }

  /**
   * Set default options on this object. Called by the constructor in a
   * complex chain to deal with backward compatibility.
   */
  function options() { }

  /**
   * Set default options.
   * For backward compatibility, it sends the options array; this is a
   * feature that will likely disappear at some point.
   */
  function set_default_options() {
    $this->_set_option_defaults($this->options, $this->option_definition());

    // Retained for complex defaults plus backward compatibility.
    $this->options($this->options);
  }

  function _set_option_defaults(&$storage, $options, $level = 0) {
  foreach ($options as $option => $definition ) {
    if (isset($definition['contains']) && is_array($definition['contains'])) {
      $storage[$option] = array();
      $this->_set_option_defaults($storage[$option], $definition['contains'], $level++);
    }
    elseif (!empty($definition['translatable']) && !empty($definition['default'])) {
      $storage[$option] = t($definition['default']);
    }
    else {
      $storage[$option] = isset($definition['default']) ? $definition['default'] : NULL;
    }
  }
}

  /**
   * Unpack options over our existing defaults, drilling down into arrays
   * so that defaults don't get totally blown away.
   */
  function unpack_options(&$storage, $options, $definition = NULL, $check = TRUE) {
    if ($check && !is_array($options)) {
      return;
    }

    if (!isset($definition)) {
      $definition = $this->option_definition();
    }

    foreach ($options as $key => $value) {
      if (is_array($value)) {
        if (!isset($storage[$key]) || !is_array($storage[$key])) {
          $storage[$key] = array();
        }

        $this->unpack_options($storage[$key], $value, isset($definition[$key]['contains']) ? $definition[$key]['contains'] : array(), FALSE);
      }
      else if (!empty($definition[$key]['translatable']) && !empty($value)) {
        $storage[$key] = t($value);
      }
      else {
        $storage[$key] = $value;
      }
    }
  }

  /**
   * Let the handler know what its full definition is.
   */
  function set_definition($definition) {
    $this->definition = $definition;
    if (isset($definition['field'])) {
      $this->real_field = $definition['field'];
    }
  }

  function destroy() {
    if (isset($this->view)) {
      unset($this->view);
    }

    if (isset($this->display)) {
      unset($this->display);
    }

    if (isset($this->query)) {
      unset($this->query);
    }
  }
}