public function testStaticConfigMerge() { // main config $mainContent = array('foo' => 'bar', 'blubb' => array('firstname' => 'Hermann'), 'tags' => array('tag1', 'tag2', 'tag3')); $main = new Zend_Config($mainContent, true); // config to merge $mergeContent = array('blubb' => array('lastname' => 'Kunz'), 'tags' => array('newtag1', 'newtag2')); $merge = new Zend_Config($mergeContent, true); // do it $merged = Kwf_Config_Web::mergeConfigs($main, $merge); $mergedArray = $merged->toArray(); $expectedResult = $mainContent; $expectedResult['blubb']['lastname'] = 'Kunz'; $expectedResult['tags'] = array('newtag1', 'newtag2'); $this->assertEquals($expectedResult, $mergedArray); // config to merge $mergeContent = array('blubb' => array('firstname' => 'Kurt')); $merge = new Zend_Config($mergeContent, true); // do it $merged = Kwf_Config_Web::mergeConfigs($merged, $merge); $mergedArray = $merged->toArray(); $expectedResult['blubb']['firstname'] = 'Kurt'; $this->assertEquals($expectedResult, $mergedArray); }
/** * Diesen Merge sollte eigentlich das Zend machen, aber das merged nicht so * wie wir das erwarten. Beispiel: * * Main Config: * bla.blubb[] = x * bla.blubb[] = y * bla.blubb[] = z * * Merge Config: * bla.blubb[] = a * bla.blubb[] = b * * Nach den Config-Section regeln würde man erwarten, dass nach dem mergen nur mehr * a und b drin steht. Tatsächlich merget Zend aber so, dass a, b, z überbleibt. * Zend überschreibt die Werte, was wir nicht wollen, deshalb dieses * händische mergen hier. */ public static function mergeConfigs(Zend_Config $main, Zend_Config $merge) { // check if all keys are of type 'integer' and if so, only use merge config $everyKeyIsInteger = true; foreach ($merge as $key => $item) { if (!is_int($key)) { $everyKeyIsInteger = false; break; } } if ($everyKeyIsInteger) { return $merge; } foreach ($merge as $key => $item) { if (isset($main->{$key})) { if ($item instanceof Zend_Config && $main->{$key} instanceof Zend_Config) { $main->{$key} = Kwf_Config_Web::mergeConfigs($main->{$key}, new Zend_Config($item->toArray(), !$main->readOnly())); } else { $main->{$key} = $item; } } else { if ($item instanceof Zend_Config) { $main->{$key} = new Zend_Config($item->toArray(), !$main->readOnly()); } else { $main->{$key} = $item; } } } return $main; }