From f5d7375c15587cbd5da33d6ea517be47f3d97e61 Mon Sep 17 00:00:00 2001
From: Neil Drumm <drumm@3064.no-reply.drupal.org>
Date: Fri, 25 Aug 2006 07:58:48 +0000
Subject: [PATCH] #80471 by Eaton and chx. Fix handling of default values in
 programmatically submitted forms.

---
 includes/form.inc | 65 +++++++++++++++++++++++++----------------------
 1 file changed, 35 insertions(+), 30 deletions(-)

diff --git a/includes/form.inc b/includes/form.inc
index ae4397e93311..ee5d194c65e7 100644
--- a/includes/form.inc
+++ b/includes/form.inc
@@ -500,38 +500,43 @@ function form_builder($form_id, $form) {
         foreach ($form['#parents'] as $parent) {
           $edit = isset($edit[$parent]) ? $edit[$parent] : NULL;
         }
-        switch ($form['#type']) {
-          case 'checkbox':
-            $form['#value'] = !empty($edit) ? $form['#return_value'] : 0;
-            break;
-          case 'select':
-            if (isset($form['#multiple']) && $form['#multiple']) {
-              if (isset($edit) && is_array($edit)) {
-                $form['#value'] = drupal_map_assoc($edit);
+        if (!$form['#programmed'] || isset($edit)) {
+          switch ($form['#type']) {
+            case 'checkbox':
+              $form['#value'] = !empty($edit) ? $form['#return_value'] : 0;
+              break;
+
+            case 'select':
+              if (isset($form['#multiple']) && $form['#multiple']) {
+                if (isset($edit) && is_array($edit)) {
+                  $form['#value'] = drupal_map_assoc($edit);
+                }
+                else {
+                  $form['#value'] = array();
+                }
               }
-              else {
-                $form['#value'] = array();
+              elseif (isset($edit)) {
+                $form['#value'] = $edit;
               }
-            }
-            elseif (isset($edit)) {
-              $form['#value'] = $edit;
-            }
-            break;
-          case 'textfield':
-            if (isset($edit)) {
-              // Equate $edit to the form value to ensure it's marked for validation
-              $edit = str_replace(array("\r", "\n"), '', $edit);
-              $form['#value'] = $edit;
-            }
-            break;
-          default:
-            if (isset($edit)) {
-              $form['#value'] = $edit;
-            }
-        }
-        // Mark all posted values for validation
-        if ((isset($form['#value']) && $form['#value'] === $edit) || (isset($form['#required']) && $form['#required'])) {
-          $form['#needs_validation'] = TRUE;
+              break;
+
+            case 'textfield':
+              if (isset($edit)) {
+                // Equate $edit to the form value to ensure it's marked for validation
+                $edit = str_replace(array("\r", "\n"), '', $edit);
+                $form['#value'] = $edit;
+              }
+              break;
+
+            default:
+              if (isset($edit)) {
+                $form['#value'] = $edit;
+              }
+          }
+          // Mark all posted values for validation
+          if ((isset($form['#value']) && $form['#value'] === $edit) || (isset($form['#required']) && $form['#required'])) {
+            $form['#needs_validation'] = TRUE;
+          }
         }
       }
       if (!isset($form['#value'])) {
-- 
GitLab