From baa75271053e00900dfa44bffed748f15a0aa78b Mon Sep 17 00:00:00 2001
From: Alex Barth <alex_b@53995.no-reply.drupal.org>
Date: Thu, 18 Feb 2010 16:43:40 +0000
Subject: [PATCH] Make configDefaults() implementation optional.

---
 includes/FeedsConfigurable.inc | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)

diff --git a/includes/FeedsConfigurable.inc b/includes/FeedsConfigurable.inc
index eed4ace5..1951a7c1 100644
--- a/includes/FeedsConfigurable.inc
+++ b/includes/FeedsConfigurable.inc
@@ -89,7 +89,7 @@ abstract class FeedsConfigurable {
    *   returned by configDefaults().
    */
   public function setConfig($config) {
-    $default_keys = $this->configDefaults();
+    $default_keys = $this->configDefaultsMerged();
     $this->config = array_intersect_key($config, $default_keys);
   }
 
@@ -102,7 +102,7 @@ abstract class FeedsConfigurable {
    */
   public function addConfig($config) {
     $this->config = array_merge($this->config, $config);
-    $default_keys = $this->configDefaults();
+    $default_keys = $this->configDefaultsMerged();
     $this->config = array_intersect_key($this->config, $default_keys);
   }
 
@@ -134,9 +134,30 @@ abstract class FeedsConfigurable {
    *   values are their default values.
    */
   public function configDefaults() {
-    $fake_form_state = array();
-    $form = $this->configForm($fake_form_state);
-    return element_children($form);
+    return array();
+  }
+
+  /**
+   * Return config defaults merged with the actual form definition. This is
+   * used for filtering values in setConfig and addConfig and allows
+   * implementers of configForm() to add form elements without necessarily
+   * declaring them in configDefaults().
+   *
+   * @todo Support nested form trees.
+   */
+  protected function configDefaultsMerged() {
+    $form_state = array();
+    $form = $this->configForm($form_state);
+    // Mimic Form API behavior.
+    drupal_alter('form_'. get_class($this) .'_feeds_config_form', $form, $form_state);
+    drupal_alter('form', $form, $form_state, get_class($this) .'_feeds_config_form');
+    $defaults = array();
+    foreach (element_children($form) as $e) {
+      if (isset($form[$e]['#default_value'])) {
+        $defaults[$e] = $form[$e]['#default_value'];
+      }
+    }
+    return $this->configDefaults() + $defaults;
   }
 
   /**
-- 
GitLab