PHP - array naar zend nav xml

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Goedemiddag,

ik ben momenteel bezig om een menustructuur uit de database om te zetten naar een navigation.xml voor zend_acl. Ik wil de array niet rechtstreeks in zend_navigation plaatsen.

De array zoals ik die uit de database haal is als volgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
Array
(
    [0] => Array
        (
            [navitem_0] => Array
                (
                    [controller] => page
                    [action] => view
                    [label] => ITEM_1
                    [module] => admin
                    [resource] => adminnav
                    [order] => 1
                    [params] => Array
                        (
                            [id] => 1
                        )
                )
        )

    [1] => Array
        (
            [navitem_1] => Array
                (
                    [controller] => page
                    [action] => view
                    [label] => ITEM_2
                    [module] => admin
                    [resource] => adminnav
                    [order] => 2
                    [params] => Array
                        (
                            [id] => 2
                        )
                )

            [pages] => Array
                (
                    [0] => Array
                        (
                            [navitem_2] => Array
                                (
                                    [controller] => page
                                    [action] => view
                                    [label] => SUBITEM_2_1
                                    [module] => admin
                                    [resource] => adminnav
                                    [order] => 1
                                    [params] => Array
                                        (
                                            [id] => 3
                                        )
                                )
                        )
                )
        )

    [2] => Array
        (
            [navitem_3] => Array
                (
                    [controller] => page
                    [action] => view
                    [label] => ITEM_3
                    [module] => admin
                    [resource] => adminnav
                    [order] => 3
                    [params] => Array
                        (
                            [id] => 4
                        )

                )

            [pages] => Array
                (
                    [0] => Array
                        (
                            [navitem_4] => Array
                                (
                                    [controller] => page
                                    [action] => view
                                    [label] => SUBITEM_3_1
                                    [module] => admin
                                    [resource] => adminnav
                                    [order] => 1
                                    [params] => Array
                                        (
                                            [id] => 5
                                        )
                                )
                        )

                    [1] => Array
                        (
                            [navitem_5] => Array
                                (
                                    [controller] => page
                                    [action] => view
                                    [label] => SUBITEM_3_2
                                    [module] => admin
                                    [resource] => adminnav
                                    [order] => 2
                                    [params] => Array
                                        (
                                            [id] => 6
                                        )
                                )
                        )

                    [2] => Array
                        (
                            [navitem_6] => Array
                                (
                                    [controller] => page
                                    [action] => view
                                    [label] => SUBITEM_3_3
                                    [module] => admin
                                    [resource] => adminnav
                                    [order] => 3
                                    [params] => Array
                                        (
                                            [id] => 7
                                        )
                                )
                        )
                )
        )
)


Vervolg loop ik door deze array heen om de juiste xml te maken..

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// creating object of SimpleXMLElement
$navigation_xml = new SimpleXMLElement ( "<?xml version=\"1.0\"?><configdata></configdata>" );
$navigation_xml->addChild ( 'nav' );
        
// function call to convert array to xml
$this->array_to_xml ( $navtree, $navigation_xml );
        
//saving generated xml file
print $navigation_xml->asXML ();


public function array_to_xml($array, &$xml) {
        foreach ( $array as $key => $value ) {
            if (is_array ( $value )) {
                if (! is_numeric ( $key )) {
                    $subnode = $xml->addChild ( "$key" );
                    $this->array_to_xml ( $value, $subnode );
                } else {
                    $this->array_to_xml ( $value, $xml );
                }
            } else {
                $xml->addChild ( "$key", "$value" );
            }
        }
    }


Nu krijg ik echter niet het gewenste resultaat:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?xml version="1.0" encoding="UTF-8"?>

<configdata>
    <nav />
    <navitem_0>
        <controller>page</controller>
        <action>view</action>
        <label>ITEM_1</label>
        <module>admin</module>
        <resource>adminnav</resource>
        <order>1</order>
        <params>
            <id>1</id>
        </params>
    </navitem_0>
    <navitem_1>
        <controller>page</controller>
        <action>view</action>
        <label>ITEM_2</label>
        <module>admin</module>
        <resource>adminnav</resource>
        <order>2</order>
        <params>
            <id>2</id>
        </params>
    </navitem_1>
    <pages>
        <navitem_2>
            <controller>page</controller>
            <action>view</action>
            <label>SUBITEM_2_1</label>
            <module>admin</module>
            <resource>adminnav</resource>
            <order>1</order>
            <params>
                <id>3</id>
            </params>
        </navitem_2>
    </pages>
    <navitem_3>
        <controller>page</controller>
        <action>view</action>
        <label>ITEM_3</label>
        <module>admin</module>
        <resource>adminnav</resource>
        <order>3</order>
        <params>
            <id>4</id>
        </params>
    </navitem_3>
    <pages>
        <navitem_4>
            <controller>page</controller>
            <action>view</action>
            <label>SUBITEM_3_1</label>
            <module>admin</module>
            <resource>adminnav</resource>
            <order>1</order>
            <params>
                <id>5</id>
            </params>
        </navitem_4>
        <navitem_5>
            <controller>page</controller>
            <action>view</action>
            <label>SUBITEM_3_2</label>
            <module>admin</module>
            <resource>adminnav</resource>
            <order>2</order>
            <params>
                <id>6</id>
            </params>
        </navitem_5>
        <navitem_6>
            <controller>page</controller>
            <action>view</action>
            <label>SUBITEM_3_3</label>
            <module>admin</module>
            <resource>adminnav</resource>
            <order>3</order>
            <params>
                <id>7</id>
            </params>
        </navitem_6>
    </pages>
</configdata>



Wat ik als resultaat beoog is dat het <nav>-element aan het einde sluit ( <nav> ..items.. </nav> ).
Daarnaast worden de subelementen niet goed opgenomen in de xml.
<pages> dient binnen het hoofdelement opgenomen te worden.
Bijvoorbeeld. <navitem_3> moet pas worden gesloten NA de <pages>-elementen.
Dus: <navitem_3> <pages></pages></navitem_3>

Helaas kom ik er niet helemaal uit waar de fout zit.
Iemand een tip?

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Wat is de reden dat je _niet_ van array een vertaalslag wilt maken zodat je direct die array kan importeren in de factory van Zend_Navigation? Je doet nu een query, krijgt een array, maakt er een xml van, stopt dat in Zend_Config_Xml (?) en geeft die aan Zend_Navigate. Die parset er intern weer een array van. Hoezo performanceverlies 8)7

Wat je verder moet weten over recursion is dat je iets over recursion moet weten. Kijk anders [google=recursion] hier eens ;)

Tot slot moet je kijken waar je precies op controleert. Op dit moment is het puur een controle "is het een array ja/nee" en dan "is het numeriek ja/nee". Wat je mist is echter of iets een "navitem" is of een "pages" child.

Acties:
  • 0 Henk 'm!

  • Ventieldopje
  • Registratie: December 2005
  • Laatst online: 19-09 11:00

Ventieldopje

I'm not your pal, mate!

Ik heb toevallig pas een klasse geschreven om een array om te zetten naar XML, die is iets geavanceerder als die van jou :)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
protected function _arrayToXml($data, $writer = null, $key = null)
{
    if($writer == null)
    {
        $writer = new XMLWriter();
        $writer->openMemory();
        $writer->setIndent(true);
        $writer->setIndentString('  ');
        $writer->startDocument('1.0', 'UTF-8');
        
        if(count(array_keys($data)) > 1)
        {
            $writer->startElement('data');
            $this->_arrayToXml($data, $writer);
        }
        else
        {
            $keys = array_keys($data);
            $writer->startElement($keys[0]);                
            $this->_arrayToXml($data[$keys[0]], $writer);
        }
        
        $writer->endElement();
        
        $document = new DOMDocument();
        $document->loadXML($writer->outputMemory(true));
        
        return $document;
    }
    else
    {
        foreach($data as $k=>$v)
        {
            if(strpos($k, '@') === 0) // We dealing with an attribute?
            {
                $writer->writeAttribute(substr($k, 1), $v);
                continue;
            }
            
            if(is_array($v))
            {
                /*
                 * Dealing with a non associative array (numeric keys)?
                 * Then we need to substitute the numeric key with a name (name after >)
                 * Example: foo > bar { bar: bla, bar: boo } instead of
                 *          foo { 0: bla, 1: boo } which will not be valid XML, no numeric element names allowed
                 */
                if(strpos($k, '>') !== false)
                    $expl = explode('>', $k);
                else
                    $expl = null;
                
                $writer->startElement($expl == null ? ($key == null ? $k : $key) : trim($expl[0]));
                $this->_arrayToXml($v, $writer, $expl == null ? null : trim($expl[1]));
                $writer->endElement();
                
                continue;
            }
            
            $writer->writeElement($key == null ? $k : $key, $v);
        }
    }
}


Een voorbeeld data array:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
array(
    'configdata' => array(
        'nav'   => array(
            'navitem_0' => array(
                'controller'    => 'page',
                'action'        => 'view',
                'label'         => 'ITEM_1',
                'module'        => 'admin',
                'resource'      => 'adminnav',
                'order'         => 1,
                'params'        => array(
                    'id'        => 1
                )
            )
        )
    )
);

www.maartendeboer.net
1D X | 5Ds | Zeiss Milvus 25, 50, 85 f/1.4 | Zeiss Otus 55 f/1.4 | Canon 200 f/1.8 | Canon 200 f/2 | Canon 300 f/2.8


Acties:
  • 0 Henk 'm!

  • Barleone
  • Registratie: Maart 2009
  • Nu online
Ik weet hoe frustrerend debuggen kan zijn, maar dat is wel precies wat ik je nog niet heb zien doen.
Kortom:
- welke conclusie kun je trekken uit je mislukte resultaat?
- welke actie onderneem je op je code (of bij Google)?
- kom je er niet uit: laat de case rusten, en richt je op een stapje voor stapje aanpak.
= (begin eens een array ZONDER diepte toe te voegen aan een stukje xml.)

Succes ermee, je redt het wel! :)

offtopic:
@Ventieldopje: seriously, ik dacht dat dit tweakers was, geen scriptrequesthelpdesk :o

Tweakers.net 6 nostalgie! - Wayback Machine
Have you tried turning it off and on again?


Verwijderd

Topicstarter
opgelost!

ik kan mijn huidige array_to_xml() blijven hanteren, echter moet ik dan wel de juiste array doorsturen :-)

in mijn array was 'Pages' een key naast 'navitem_x' ipv dat de pages onderdeel uitmaakte van de navitem.

de array had dus moeten zijn:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
<?php
Array
(
    [0] => Array
        (
            [navitem_0] => Array
                (
                    [controller] => page
                    [action] => view
                    [label] => ITEM_1
                    [module] => admin
                    [resource] => adminnav
                    [order] => 1
                    [params] => Array
                        (
                            [id] => 1
                        )
                )
        )

    [1] => Array
        (
            [navitem_1] => Array
                (
                    [controller] => page
                    [action] => view
                    [label] => ITEM_2
                    [module] => admin
                    [resource] => adminnav
                    [order] => 2
                    [params] => Array
                        (
                            [id] => 2
                        )
                    [pages] => Array
                    (
                        [0] => Array
                            (
                                [navitem_2] => Array
                                    (
                                        [controller] => page
                                        [action] => view
                                        [label] => SUBITEM_2_1
                                        [module] => admin
                                        [resource] => adminnav
                                        [order] => 1
                                        [params] => Array
                                            (
                                                [id] => 3
                                            )
                                    )
                            )
                    )
            )
        )

            

    [2] => Array
        (
            [navitem_3] => Array
                (
                    [controller] => page
                    [action] => view
                    [label] => ITEM_3
                    [module] => admin
                    [resource] => adminnav
                    [order] => 3
                    [params] => Array
                        (
                            [id] => 4
                        )
                    [pages] => Array
                                    (
                                        [0] => Array
                                            (
                                                [navitem_4] => Array
                                                    (
                                                        [controller] => page
                                                        [action] => view
                                                        [label] => SUBITEM_3_1
                                                        [module] => admin
                                                        [resource] => adminnav
                                                        [order] => 1
                                                        [params] => Array
                                                            (
                                                                [id] => 5
                                                            )
                                                    )
                                            )
                    
                                        [1] => Array
                                            (
                                                [navitem_5] => Array
                                                    (
                                                        [controller] => page
                                                        [action] => view
                                                        [label] => SUBITEM_3_2
                                                        [module] => admin
                                                        [resource] => adminnav
                                                        [order] => 2
                                                        [params] => Array
                                                            (
                                                                [id] => 6
                                                            )
                                                    )
                                            )
                    
                                        [2] => Array
                                            (
                                                [navitem_6] => Array
                                                    (
                                                        [controller] => page
                                                        [action] => view
                                                        [label] => SUBITEM_3_3
                                                        [module] => admin
                                                        [resource] => adminnav
                                                        [order] => 3
                                                        [params] => Array
                                                            (
                                                                [id] => 7
                                                            )
                                                    )
                                            )
                                    )

                )

            
        )
)
?>

  • TheNephilim
  • Registratie: September 2005
  • Laatst online: 17-09 11:07

TheNephilim

Wtfuzzle

Maar waarom parse je niet direct de array zoals mithras al aangaf? Of maak je er een xml bestand van zodat je niet steeds een sql-query nodig hebt om het menu te maken (file cash)?
Pagina: 1