diff --git a/install-dev/upgrade/classes/ToolsInstall.php b/install-dev/upgrade/classes/ToolsInstall.php new file mode 100644 index 000000000..ca50e7ce9 --- /dev/null +++ b/install-dev/upgrade/classes/ToolsInstall.php @@ -0,0 +1,134 @@ + +* @copyright 2007-2012 PrestaShop SA +* @version Release: $Revision$ +* @license http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) +* International Registered Trademark & Property of PrestaShop SA +*/ + + + +class ToolsInstall +{ + /** + * Converts a simpleXML element into an array. Preserves attributes and everything. + * You can choose to get your elements either flattened, or stored in a custom index that + * you define. + * For example, for a given element + * + * if you choose to flatten attributes, you would get: + * $array['field']['name'] = 'someName'; + * $array['field']['type'] = 'someType'; + * If you choose not to flatten, you get: + * $array['field']['@attributes']['name'] = 'someName'; + * _____________________________________ + * Repeating fields are stored in indexed arrays. so for a markup such as: + * + * a + * b + * c + * + * you array would be: + * $array['parent']['child'][0] = 'a'; + * $array['parent']['child'][1] = 'b'; + * ...And so on. + * _____________________________________ + * @param simpleXMLElement $xml the XML to convert + * @param boolean $flattenValues Choose wether to flatten values + * or to set them under a particular index. + * defaults to true; + * @param boolean $flattenAttributes Choose wether to flatten attributes + * or to set them under a particular index. + * Defaults to true; + * @param boolean $flattenChildren Choose wether to flatten children + * or to set them under a particular index. + * Defaults to true; + * @param string $valueKey index for values, in case $flattenValues was set to + * false. Defaults to "@value" + * @param string $attributesKey index for attributes, in case $flattenAttributes was set to + * false. Defaults to "@attributes" + * @param string $childrenKey index for children, in case $flattenChildren was set to + * false. Defaults to "@children" + * @return array the resulting array. + */ + static public function simpleXMLToArray ($xml, $flattenValues = true, $flattenAttributes = true, $flattenChildren = true, $valueKey = '@value', $attributesKey = '@attributes', $childrenKey = '@children') + { + $return = array(); + if (!($xml instanceof SimpleXMLElement)) + return $return; + + $name = $xml->getName(); + $_value = trim((string)$xml); + if (strlen($_value) == 0) + $_value = null; + + if ($_value !== null) + { + if (!$flattenValues) + $return[$valueKey] = $_value; + else + $return = $_value; + } + + $children = array(); + $first = true; + foreach($xml->children() as $elementName => $child) + { + $value = ToolsInstall::simpleXMLToArray($child, $flattenValues, $flattenAttributes, $flattenChildren, $valueKey, $attributesKey, $childrenKey); + if (isset($children[$elementName])) + { + if ($first) + { + $temp = $children[$elementName]; + unset($children[$elementName]); + $children[$elementName][] = $temp; + $first=false; + } + $children[$elementName][] = $value; + } + else + $children[$elementName] = $value; + } + + if (count($children) > 0 ) + { + if (!$flattenChildren) + $return[$childrenKey] = $children; + else + $return = array_merge($return, $children); + } + + $attributes = array(); + foreach($xml->attributes() as $name => $value) + $attributes[$name] = trim($value); + + if (count($attributes) > 0) + { + if (!$flattenAttributes) + $return[$attributesKey] = $attributes; + else + $return = array_merge($return, $attributes); + } + + return $return; + } +}