xt:Commerce Währungskurse automatisch aktualisieren

Bietet man Produkte in verschiedenen Ländern an, dann wird der Preis natürlich in der Landeswährung angezeigt. Bei den teilweise starken Bewegungen auf den Finanzmärkten ist ein tagesaktueller Umrechnungskurs dabei besonders wichtig. xt:Commerce bietet von Haus aus leider keine Möglichkeit, diese Kurse automatisch zu aktualisieren. Mit einem kleinen Kniff lässt sich das aber leicht realisieren. Meine Kursaktualisierung habe ich in die Datei includes/classes/xtcPrice.php gepackt, und zwar in die Methode xtcPrice selbst (Konstruktormethode bei PHP 4.x):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        // [start] :ADDED: exanto.de - get current rates
        $ccache = DIR_FS_DOCUMENT_ROOT . 'cache/last_currency_run.txt';
        if (filemtime($ccache) + 86400 < time()) {
            // get new values from ecb
            $xml = @simplexml_load_file('http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml');
            if (is_object($xml)) {
                // successfully grabbed, touch markerfile, update db
                touch($ccache);
                foreach ($xml->Cube->Cube->Cube as $curEntry) {
                    xtDBquery("
                        UPDATE  " . TABLE_CURRENCIES . "
                        SET     value = '" . $curEntry['rate'] . "', last_updated = now()
                        WHERE   code = '" . $curEntry['currency'] . "'
                        LIMIT   1
                        ");
                }
            }
        }
        // [ end ] :ADDED: exanto.de - get current rates

Das war’s schon. Damit werden die konfigurierten Währungen im xt:Commerce Shop alle 24 Stunden automatisch an den aktuellen Wechselkurs der europäischen Zentralbank angepasst.

Getagged mit:
14 Kommentare zu “xt:Commerce Währungskurse automatisch aktualisieren
  1. Martin Sach sagt:

    Hallo,

    ganau so was habe ich gesucht! Leider bin ich nicht gerade ein PHP-Experte. Könnt Ihr mir sagen, an welcher Stelle ich den Code einfügen muss? Meine bisherigen Versuche endeten immer mit einer Fehlermeldung :- (

  2. IT sagt:

    Hallo Martin, steht doch oben: In die Konstruktormethode der xtcPrice Klasse. Vor der schließenden geschweiften Klammer.

    Gruß, Ingo

  3. Oliver sagt:

    Hallo, erst mal danke fuer dein Beitrag. Ich habe versucht dein Script zu installieren aber ich habe gar keine Pfad mit den Namen /classes/xtcPrice.php includes ja aber danach nur noch die verzeichnisse -src und config.php

    Mus man /classes/xtcPrice.php

    Verzeichnis erstellen ?

    Gruss

    Oliver

    • IT sagt:

      Hi Oliver, der Pfad ist includes/classes/ – stehe auch so im Artikel 😉 Gruß, Ingo

      • Digicam sagt:

        Bekomme nach Einbau die Fehlermeldung:

        Parse error: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in /users/digicam/www/includes/classes/xtcPrice.php on line 387

        In Line 387 steht: $ccache = DIR_FS_DOCUMENT_ROOT . ‚cache/last_currency_run.txt‘;

        Kann mir jemand helfen? Danke.

      • IT sagt:

        Ich tippe, daß da ein Semikolon am Ende der vorherigen Zeile fehlt, oder anderweitig falsch rein kopiert wurde. Das ist ein simpler Syntax-Fehler…

  4. Digicam sagt:

    Danke für die Antwort. Ist genauso reinkopiert worden, wie es oben steht. Die Zeile davor ist: // [start] :ADDED: exanto.de – get current rates Habe die PHP-Datei im UltraEdit geändert, der würde mir einen Syntax-Fehler anzeigen, tut er aber nicht. Ich habe wirklich keinen Plan..

  5. IT sagt:

    Hi, dann steht’s an der falschen Stelle. Der Block muß unter „function xtcPrice($currency, $cGroup) {„, also in die Methode mit rein, innerhalb der geschweiften Klammern.

  6. Digicam sagt:

    … ah jetzt ja… OK, das war der Fehler, jetzt rennt es. Danke, danke, danke.

  7. Digicam sagt:

    Jetzt habe ich das nächste Problem: ich habe 2 Währungen, CZK (Standard) und EUR. Ich habe die Refresh-Zeit auf 60 Sekunden eingestellt, aber die Währungen werden nicht upgedatet, Muss ich im XTC-Admin irgendwas einstellen? Danke.

    • IT sagt:

      Hi, die Kurse müssen nur alle 24 Stunden aktualisiert werden, so oft ändern die sich nicht. Wenn ein Produkt aufgerufen wird o.ä. passiert das automatisch. Manchmal kann es vorkommen, daß die Funktion „simplexml_load_file“ auf dem Server gesperrt ist – einfach mal das @ davor wegnehmen und dann schauen ob eine Fehlermeldung kommt.

  8. Digicam sagt:

    Hi IT, die Funktion “simplexml_load_file” scheint auf gem Server gesperrt zu sein. Ich habe das @ davor weggenommen und bekomme folgende Fehlermeldung: Warning: simplexml_load_file() [function.simplexml-load-file]: http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /users/digicam/www/includes/classes/xtcPrice.php on line 73

    Warning: simplexml_load_file(http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml) [function.simplexml-load-file]: failed to open stream: no suitable wrapper could be found in /users/digicam/www/includes/classes/xtcPrice.php on line 73

    Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity „http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml“ in /users/digicam/www/includes/classes/xtcPrice.php on line 73

    Kann ich das irgendwie umgehen? Danke.

  9. pete sagt:

    ein workaround wäre curl zu nutzen…

        $ccache = DIR_FS_DOCUMENT_ROOT . 'cache/last_currency_run.txt';
        if (filemtime($ccache) + 60 < time()) {
            // get new values from ecb
        function load_file($url) {
            $ch = curl_init($url);
            #Return http response in string
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            $xml = simplexml_load_string(curl_exec($ch));
            return $xml;
    

    }

    $feedurl = ‚http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml‘; $rss = load_file($feedurl);

            if (is_object($rss)) {
                touch($ccache);
                foreach ($rss->Cube->Cube->Cube as $curEntry) {
                    xtDBquery("
                        UPDATE  " . TABLE_CURRENCIES . "
                        SET     value = '" . $curEntry['rate'] . "', last_updated = now()
                        WHERE   code = '" . $curEntry['currency'] . "'
                        LIMIT   1
                        ");
                }
            }
        }
    

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.