Преглед изворни кода

ZF-9788: fix to prevent reindexing of numeric keys

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@22072 44c647ce-9c0f-0410-b52a-842ac1e357ba
alab пре 15 година
родитељ
комит
ae352ab197
2 измењених фајлова са 64 додато и 6 уклоњено
  1. 32 6
      library/Zend/Form.php
  2. 32 0
      tests/Zend/Form/FormTest.php

+ 32 - 6
library/Zend/Form.php

@@ -1324,7 +1324,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
                     }
                 }
                 $merge = $this->_attachToArray($element->getValue(), $key);
-                $values = array_merge_recursive($values, $merge);
+                $values = $this->_array_replace_recursive($values, $merge);
             }
         }
         foreach ($this->getSubForms() as $key => $subForm) {
@@ -1335,7 +1335,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
                 $merge = $this->_attachToArray($subForm->getValues(true),
                                                $subForm->getElementsBelongTo());
             }
-            $values = array_merge_recursive($values, $merge);
+            $values = $this->_array_replace_recursive($values, $merge);
         }
 
         if (!$suppressArrayNotation && $this->isArray()) {
@@ -1378,7 +1378,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
                         $key = $belongsTo . '[' . $key . ']';
                     }
                     $merge = $this->_attachToArray($element->getValue(), $key);
-                    $values = array_merge_recursive($values, $merge);
+                    $values = $this->_array_replace_recursive($values, $merge);
                 }
                 $data = $this->_dissolveArrayUnsetKey($data, $belongsTo, $key);
             }
@@ -1396,7 +1396,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
                     $merge = $this->_attachToArray($tmp, $form->getElementsBelongTo());
                 }
             }
-            $values = array_merge_recursive($values, $merge);
+            $values = $this->_array_replace_recursive($values, $merge);
         }
         if (!$suppressArrayNotation && $this->isArray() && !empty($values)) {
             $values = $this->_attachToArray($values, $this->getElementsBelongTo());
@@ -2101,6 +2101,32 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
     }
 
     /**
+     * This is a helper function until php 5.3 is widespreaded 
+     * 
+     * @param array $into
+     * @access protected
+     * @return void
+     */
+    protected function _array_replace_recursive(array $into)
+    {
+        $fromArrays = array_slice(func_get_args(),1);
+
+        foreach ($fromArrays as $from) {
+            foreach ($from as $key => $value) {
+                if (is_array($value)) {
+                    if (!isset($into[$key])) {
+                        $into[$key] = array();
+                    }
+                    $into[$key] = $this->_array_replace_recursive($into[$key], $from[$key]);
+                } else {
+                    $into[$key] = $value;
+                }
+            }
+        }
+        return $into;
+    }
+
+    /**
      * Validate the form
      *
      * @param  array $data
@@ -2379,7 +2405,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
                 $merge = $this->_attachToArray($subForm->getErrors(null, true),
                                                $subForm->getElementsBelongTo());
             }
-            $errors = array_merge_recursive($errors, $merge);
+            $errors = $this->_array_replace_recursive($errors, $merge);
         }
 
         if (!$suppressArrayNotation && $this->isArray()) {
@@ -2437,7 +2463,7 @@ class Zend_Form implements Iterator, Countable, Zend_Validate_Interface
                     $merge = $this->_attachToArray($merge,
                                                    $subForm->getElementsBelongTo());
                 }
-                $messages = array_merge_recursive($messages, $merge);
+                $messages = $this->_array_replace_recursive($messages, $merge);
             }
         }
 

+ 32 - 0
tests/Zend/Form/FormTest.php

@@ -1791,6 +1791,38 @@ class Zend_Form_FormTest extends PHPUnit_Framework_TestCase
         $this->assertSame($data['partial'], $this->form->getValidValues($data['invalid']));
     }
 
+    public function testZF9788_NumericArrayIndex()
+    {
+        $s = 2;
+        $e = 4;
+        $this->form->setName('f')
+                   ->setIsArray(true)
+                   ->addElement('text', (string)$e)
+                   ->$e->setRequired(true);
+        $this->form->addSubForm(new Zend_Form_SubForm(), $s)
+                   ->$s->addElement('text', (string)$e)
+                   ->$e->setRequired(true);
+
+        $valid = array('f' => array($e => 1,
+                                    $s => array($e => 1)));
+
+        $this->form->populate($valid);
+
+        $this->assertEquals($valid, $this->form->getValues());
+
+        $vv = $this->form->getValidValues(array('f' => array($e => 1,
+                                                             $s => array($e => 1))));
+        $this->assertEquals($valid, $vv);
+
+        $this->form->isValid(array());
+
+        $err = $this->form->getErrors();
+        $msg = $this->form->getMessages(); 
+        
+        $this->assertTrue(is_array($err['f'][$e]) && is_array($err['f'][$s][$e]));
+        $this->assertTrue(is_array($msg['f'][$e]) && is_array($msg['f'][$s][$e]));
+    }
+
     // Display groups
 
     public function testCanAddAndRetrieveSingleDisplayGroups()