Completed
Push — master ( 01c28b...0d4f0a )
by Andreas
17:26
created

midcom_helper_exporter_xml::array2data()   B

Complexity

Conditions 8
Paths 9

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 8.6298

Importance

Changes 0
Metric Value
cc 8
eloc 14
nc 9
nop 3
dl 0
loc 24
ccs 11
cts 14
cp 0.7856
crap 8.6298
rs 8.4444
c 0
b 0
f 0
1
<?php
2
/**
3
 * @author tarjei huse
4
 * @package midcom.helper
5
 * @copyright The Midgard Project, http://www.midgard-project.org
6
 * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
7
 */
8
9
/**
10
 * Move midgard objects to and from XML
11
 *
12
 * @package midcom.helper
13
 */
14
class midcom_helper_exporter_xml extends midcom_helper_exporter
15
{
16
    /**
17
     * Make an array out of some xml.
18
     *
19
     * Note, the function expects xml like this:
20
     * <objecttype><attribute>attribute_value</attribute></objecttype>
21
     * But it will not return the objecttype.
22
     *
23
     * @param string $data xml
24
     * @return array with attribute => key values
25
     */
26 5
    public function data2array(string $data) : array
27
    {
28 5
        return $this->_xml_to_array(new SimpleXMLIterator($data));
29
    }
30
31 5
    private function _xml_to_array(SimpleXMLIterator $sxi) : array
32
    {
33 5
        $data = [];
34 5
        foreach ($sxi as $key => $val) {
35 5
            if ($sxi->hasChildren()) {
36 5
                $data[$key] = $this->_xml_to_array($val);
37
            } else {
38 5
                $val = trim($val);
39
                //TODO: This is mainly here for backward-compatibility. Its main effect
40
                // is that 0 is replaced by an empty string. The question is: Do we want/need this?
41 5
                if (!$val) {
42 5
                    $val = '';
43
                }
44 5
                $data[$key] = trim($val);
45
            }
46
        }
47 5
        return $data;
48
    }
49
50
    /**
51
     * Make XML out of an array.
52
     *
53
     * @param array $array
54
     * @return string
55
     */
56 73
    public function array2data(array $array, $root_node = 'array', $prefix = '') : string
57
    {
58 73
        $data = "{$prefix}<{$root_node}>\n";
59
60 73
        foreach ($array as $key => $field) {
61 73
            if (is_numeric($key)) {
62
                $key = 'value';
63
            }
64
65 73
            if (is_object($field)) {
66
                $data .= $this->object2data($field, "{$prefix}    ");
67 73
            } elseif (is_array($field)) {
68
                $data .= $this->array2data($field, $key, "{$prefix}    ") . "\n";
69 73
            } elseif (is_numeric($field) || $field === null || is_bool($field)) {
70 73
                $data .= "{$prefix}    <{$key}>{$field}</{$key}>\n";
71
            } else {
72
                // String
73 73
                $data .= "{$prefix}    <{$key}><![CDATA[{$field}]]></{$key}>\n";
74
            }
75
        }
76
77 73
        $data .= "{$prefix}</{$root_node}>\n";
78
79 73
        return $data;
80
    }
81
82
    /**
83
     * Make XML out of an object.
84
     *
85
     * @param midcom_core_dbaobject $object
86
     * @return string
87
     */
88 73
    public function object2data($object, $prefix = '') : string
89
    {
90 73
        $arr = $this->object2array($object);
91 73
        if (!$arr) {
92
            return '';
93
        }
94
95 73
        $classname = $this->_get_classname($object);
96
97 73
        $data = "";
98 73
        if (!empty($object->guid)) {
99 72
            $data .= "{$prefix}<{$classname} id=\"{$object->id}\" guid=\"{$object->guid}\">\n";
100
        } else {
101 1
            $data .= "{$prefix}<{$classname}>\n";
102
        }
103
104 73
        foreach ($arr as $key => $val) {
105 73
            if (is_array($val)) {
106 73
                $root_node = isset($object->{$key}) ? $this->_get_classname($object->{$key}) : "array";
107 73
                $data .= $this->array2data($val, $root_node, "    ");
108 73
            } elseif (is_numeric($val) || $val === null || is_bool($val)) {
109 73
                $data .= "{$prefix}    <{$key}>{$val}</{$key}>\n";
110
            } else {
111 73
                $data .= "{$prefix}    <{$key}><![CDATA[{$val}]]></{$key}>\n";
112
            }
113
        }
114
115 73
        $data .= "{$prefix}</{$classname}>";
116
117 73
        return $data;
118
    }
119
}
120