Toon posts:

[php5] simplexmliterator en current setten

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik maak nu gebruik van simplexml en de built-in SimpleXMLIterator.
Om een lijst weer te geven met alle items uit het xml-bestand gebruik ik de for-each loop.

Maar natuurlijk moet ik ook details tonen van een item.
Dus als ik op 1 van de items klik wordt het bestand herladen en wordt een variabele meegestuurd ($_GET['cid']) waarin de id van het item staat.

Ik haal vervolgens het item op dmv xpath.
Nu gaat dat prima.

Aangezien ik dus van de built-in SimpleXmlIterator gebruik maak / wil maken (dus dan kan ik gebruik maken van next, rewind, valid etc.), wil ik de met xpath gevonden node de current maken (is dit overloaden?) in self::$xml. Of zou ik toch anders moeten gaan zoeken, dus niet middels xpath?
Natuurlijk, kun je hiertoe ook weer een foreach loop gebruiken en dan de node vergelijken met de node van xpath en als die gevonden is, de loop onderbreken. Maar dat lijkt me niet echt de gewenste oplossing


In feite wil ik straks 2 knopjes maken: vorige & volgende en op die manier door de lijst lopen.


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
<?php
class Businesscards{
    public static $xml = NULL;
    var $active_card   = NULL;
    
    function loadXml($file = NULL)
    {
        try{
            if(!is_null($file)){
                if(file_exists($file)){
                    self::$xml = simplexml_load_file('businesscards.xml','SimpleXMLIterator');
                }else{
                    throw new Exception('het opgegeven bestand bestaat niet!');
                }
            }else{
                throw new Exception('u dient een bestandsnaam op te geven!');
            }
        }
        catch(Exception $e){
            echo 'Er is een fout opgetreden: ',  $e->getMessage(), "\n";
            exit();
        }
    }

    public function buildSurvey()
    {
        if(!is_null(self::$xml))
        {
            if(self::$xml->count()>0)
            {
                foreach(self::$xml->card as $card)
                {
                    printf('<dd%1$s><a href="%2$s?cid=%3$s">%4$s %5$s</a></dd>',
                                /* 1 */ ($card['id']==$this->active_card)?' class="active_card"':'',
                                /* 2 */ $_SERVER['PHP_SELF'],
                                /* 3 */ $card['id'],
                                /* 3 */ $card->firstname,
                                /* 4 */ $card->lastname);
                }
                unset($card);
            }
            else
            {
                print '<dd class="error">' . self::NO_CARDS_FOUND . '</dd>';
            }
        }
        else
        {
            print '<dd class="error">' . self::NO_XML_DATA . '</dd>';
        }
    }

    public function buildCard($cardID = NULL){
        if(!is_null(self::$xml))
        {
            /**
                Indien de parameter $cardID niet aan de functie wordt meegegeven,
                wordt de businesscard uit de class variabele $active_card weergegeven,
                indien deze wel een waarde heeft.
            */
            if(is_null($cardID) && !is_null($this->active_card))
            {
                $cardID = $this->active_card;
            }
            if(!is_null($cardID))
            {
                $result = self::$xml->xpath('//card[@id=' . $cardID . ']');
                if($result)
                {
                    /* Hier wil ik dus eigenlijk de gevonde node current maken -> self::$xml->current moet de gevonden node zijn */
                    printf('%1$s', 
                            /* 1 */ $result[0]->firstname);
                    
                }
                else
                {
                    print '<p class="error">' . self::CARD_NOT_FOUND . '</p>';
                }
                unset($result);
            }
            else
            {
                print '<p class="error">' . self::NO_CARD_SELECTED . '</p>';
            }
        }
        else
        {
            print '<p class="error">' . self::NO_XML_DATA . '</p>';
        }
    }
}

$cards = new Businesscards();
$cards->loadXml('businesscards.xml');
if(isset($_GET['cid']) && is_numeric($_GET['cid']))
{
    $cards->active_card = (int)$_GET['cid'];
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Businesscards</title>
<link href="css/layout.css" rel="stylesheet" type="text/css" media="all" />
</head>

<body>
<div id="column_left">
 <div id="card"><?php $cards->buildCard(); ?></div>
</div>
<div id="column_right">
 <dl>
  <dt>Alle contactpersonen</dt>
  <?php $cards->buildSurvey(); ?>
 </dl>
</div>
</body>
</html>
<?php
$cards->test();
unset($cards);
?>


Het is allemaal een beetje warrig misschien (tis dan ook zaterdagavond), maar ik ben dus nog maar net begonnen met OOP.

Ook zag ik cacheiterator staan, waarmee je ook kunt kijken of een node een volgende heeft. maar ik snap niet helemaal ook ik dat in de bovenstaande class zou moeten verwerken.

Verwijderd

Topicstarter
Niemand die mij een zetje in de goede richting kan zetten?

Wellicht kan iemand mij iets anders uitleggen dan?

ik heb de volgende simpele code:
PHP:
1
2
3
4
5
6
7
8
9
10
$xml = simplexml_load_file('businesscards.xml','SimpleXMLIterator');

for($xml->rewind();$xml->valid();$xml->next()){
    print '<pre>';
    print_r($xml->current());
    print '</pre>';
    if($xml->valid()){
        print 'volgende<br />';
    }
}


Nu worden alle items getoond uit het xml bestand
Nu zou ik bij de laatste niet het woorde "volgende" verwachten.
Echter: er wordt na ieder item trouw "volgende" geprint.

Maar hoe kan dit?
$xml->valid zou toch leeg moeten zijn bij het laatste item?!

  • OnTracK
  • Registratie: Oktober 2002
  • Laatst online: 10:02
Verwijderd schreef op zondag 08 april 2007 @ 20:39:
Niemand die mij een zetje in de goede richting kan zetten?

Wellicht kan iemand mij iets anders uitleggen dan?

ik heb de volgende simpele code:
PHP:
1
2
3
4
5
6
7
8
9
10
$xml = simplexml_load_file('businesscards.xml','SimpleXMLIterator');

for($xml->rewind();$xml->valid();$xml->next()){
    print '<pre>';
    print_r($xml->current());
    print '</pre>';
    if($xml->valid()){
        print 'volgende<br />';
    }
}


Nu worden alle items getoond uit het xml bestand
Nu zou ik bij de laatste niet het woorde "volgende" verwachten.
Echter: er wordt na ieder item trouw "volgende" geprint.

Maar hoe kan dit?
$xml->valid zou toch leeg moeten zijn bij het laatste item?!
jouw code is zo'n beetje hetzelfde als
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$xml = simplexml_load_file('businesscards.xml','SimpleXMLIterator');
$xml->rewind();

while($xml->valid()) {
    print '<pre>';
    print_r($xml->current());
    print '</pre>';
    if($xml->valid()){
        print 'volgende<br />';
    }
    $xml->next();
}
Zoe je nu waarom tóch "volgende" word geprint?

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


Verwijderd

Topicstarter
mja ik begreep m eigenlijk verkeerd.
Ik dacht dat met $xml->valid werd gecontroleerd of er een volgend item bestaat.
Maar eigenlijk wordt er dus eerst naar het volgende item gesprongen en dan pas wordt gecontroleerd of het een valid item is.