Exemple #1
0
function update_shopinfo_xml()
{
    global $spalten;
    if (!file_exists(DIR_FS_SHOPINFO_XML) || filesize(DIR_FS_SHOPINFO_XML) == 0) {
        echo '<p class="ok">OK, die Shopdatei wurde noch nicht angelegt und muss folglich auch nicht angepasst werden.</p>' . "\n";
        return true;
    }
    echo '<p>Lade Shopdatei: <code>' . DIR_FS_SHOPINFO_XML . '</code>' . "\n";
    $tree = new XML_Tree(DIR_FS_SHOPINFO_XML, '1.0" encoding="ISO-8859-1');
    #$tree->useCdataSections();
    $root =& $tree->getTreeFromFile();
    if (PEAR::isError($root)) {
        echo '<p class="error">Fehler beim Parsen der Shopdatei:<br>' . "\n";
        echo $root->toString() . "</p>\n";
        return false;
    }
    $name_parts = explode(':', $root->name);
    if (sizeof($name_parts) > 1) {
        $namespace = $name_parts[0] . ':';
    } else {
        $namespace = '';
    }
    $requests =& $tree->getNodeAt($namespace . 'Shop/Requests');
    if (PEAR::isError($requests)) {
        #echo '<p>Warnung: Zugriff auf Produktdaten in der Shopdatei nicht gefunden.</p>'."\n";
        // Request-Tag nach dem Url-Tag einfügen
        $pos = -1;
        for ($i = 0; $i < count($root->children); ++$i) {
            if ($root->children[$i]->name == 'Url') {
                $pos = $i + 1;
            }
        }
        $requests = new XML_Tree_Node('Requests');
        $res =& $root->insertChild(null, $pos, $requests);
        if (PEAR::isError($res)) {
            echo '<p class="error">Das Requests-Tag konnte nicht in die shopinfo.xml eingef&uuml;gt werden:<br>' . "\n";
            echo $res->toString() . "</p>\n";
            return false;
        }
    }
    $offlineRequest =& $tree->getNodeAt($namespace . 'Shop/Requests/OfflineRequest');
    if (PEAR::isError($offlineRequest)) {
        #echo '<p>Warnung: Produktdatei-Angaben in der Shopdatei nicht gefunden.</p>'."\n";
        $offlineRequest =& offlineRequest($requests);
        echo '<p class="ok">OK, Produktdatei-Angaben erg&auml;nzt.</p>' . "\n";
    } else {
        $header =& $tree->getNodeAt($namespace . 'Shop/Requests/OfflineRequest/Format/Tabular/CSV/Header');
        if (PEAR::isError($header)) {
            echo '<p class="error">Das Kopfzeilen-Tag in der Shopdatei nicht gefunden:<br>' . "\n";
            echo $header->toString() . "</p>\n";
            return false;
        }
        $old_titel = $header->content;
        // Funktion getContent gibt es nicht.
        #echo 'old_titel: '.htmlspecialchars($old_titel)."\n\n";
        $corrected = false;
        if ($header->getAttribute('columns') != count($spalten)) {
            $header->setAttribute('columns', count($spalten));
            $corrected = true;
        }
        $mappings =& $tree->getNodeAt($namespace . 'Shop/Requests/OfflineRequest/Format/Tabular/Mappings');
        if (PEAR::isError($mappings)) {
            echo '<p class="error">Das Mappings-Tag in der Shopdatei nicht gefunden:<br>' . "\n";
            echo $mappings->toString() . "</p>\n";
            return false;
        }
        foreach ($mappings->children as $idx => $child) {
            if (count($child->attributes) > 0) {
                if ($child->getAttribute('columnName') != $spalten[$child->getAttribute('column') - 1]) {
                    #echo $idx.': '.$child->getAttribute('columnName').' =&gt; ';
                    $mappings->children[$idx]->setAttribute('columnName', $spalten[$child->getAttribute('column') - 1]);
                    #echo $mappings->children[$idx]->getAttribute('columnName')."<br>\n";
                    $corrected = true;
                }
            }
        }
        if (defined('DEFAULT_QUOTE')) {
            $titel = DEFAULT_QUOTE . implode(DEFAULT_QUOTE . DEFAULT_DELIMITER . DEFAULT_QUOTE, $spalten) . DEFAULT_QUOTE;
        } else {
            $titel = implode(DEFAULT_DELIMITER, $spalten);
        }
        #echo 'titel: '.htmlspecialchars($titel)."\n\n";
        if ($old_titel != $titel) {
            $header->setContent($titel);
        }
        $special =& $tree->getNodeAt($namespace . 'Shop/Requests/OfflineRequest/Format/Tabular/CSV/SpecialCharacters');
        if (PEAR::isError($special)) {
            echo '<p class="error">Das Sonderzeichen-Tag in der Shopdatei nicht gefunden:<br>' . "\n";
            echo $special->toString() . "</p>\n";
            return false;
        }
        $old_escape = $special->getAttribute('escaped');
        $old_quote = $special->getAttribute('quoted');
        $old_lineend = $special->getAttribute('lineend');
        $old_delimiter = $special->getAttribute('delimiter');
        if (defined('DEFAULT_ESCAPE')) {
            $special->setAttribute('escaped', DEFAULT_ESCAPE);
        } else {
            $special->unsetAttribute('escaped');
        }
        if (defined('DEFAULT_QUOTE')) {
            $special->setAttribute('quoted', DEFAULT_QUOTE);
        } else {
            $special->unsetAttribute('quoted');
        }
        if (defined('DEFAULT_LINEEND')) {
            $special->setAttribute('lineend', DEFAULT_LINEEND == "\n" ? '\\n' : (DEFAULT_LINEEND == "\r" ? '\\r' : '\\r\\n'));
        } else {
            $special->unsetAttribute('lineend');
        }
        if (defined('DEFAULT_DELIMITER')) {
            $special->setAttribute('delimiter', DEFAULT_DELIMITER == "\t" ? '[tab]' : DEFAULT_DELIMITER);
        } else {
            $special->unsetAttribute('delimiter');
        }
        $new_escape = $special->getAttribute('escaped');
        $new_quote = $special->getAttribute('quoted');
        $new_lineend = $special->getAttribute('lineend');
        $new_delimiter = $special->getAttribute('delimiter');
        if (!$corrected && $old_titel == $titel && $new_escape == $old_escape && $new_quote == $old_quote && $new_lineend == $old_lineend && $new_delimiter == $old_delimiter) {
            echo '<p class="ok">OK, die Shopdatei wurde bereits aktualisiert.</p>' . "\n";
            return true;
        }
        if ($old_titel != $titel) {
            echo '<p class="ok">OK, Kopfzeile aktualisiert.</p>' . "\n";
        }
        if ($corrected) {
            echo '<p class="ok">OK, Spaltennamen aktualisiert.</p>' . "\n";
        }
        if ($new_escape != $old_escape) {
            echo '<p class="ok">OK, Escape-Zeichen aktualisiert.</p>' . "\n";
        }
        if ($new_quote != $old_quote) {
            echo '<p class="ok">OK, Zeichenkettenbegrenzer aktualisiert.</p>' . "\n";
        }
        if ($new_lineend != $old_lineend) {
            echo '<p class="ok">OK, Zeilenendezeichen aktualisiert.</p>' . "\n";
        }
        if ($new_delimiter != $old_delimiter) {
            echo '<p class="ok">OK, Trennzeichenzeichen aktualisiert.</p>' . "\n";
        }
    }
    #echo '<pre>'.(htmlspecialchars($tree->get())).'</pre>'."\n";
    if (!is_writable(DIR_FS_SHOPINFO_XML)) {
        echo '<p class="error">Die Shopdatei kann nicht geschrieben werden:<br>' . DIR_FS_SHOPINFO_XML . "</p>\n";
        return false;
    }
    if (!($handle = @fopen(DIR_FS_SHOPINFO_XML, 'wb'))) {
        echo '<p class="error">Die Shopdatei kann nicht zum Schreiben ge&ouml;ffnet werden:<br>' . DIR_FS_SHOPINFO_XML . "</p>\n";
        return false;
    }
    flock($handle, LOCK_EX);
    if (!@fwrite($handle, $tree->get())) {
        echo '<p class="error">Fehler beim Schreiben der Shopdatei:<br>' . DIR_FS_SHOPINFO_XML . "</p>\n";
        return false;
    }
    flock($handle, LOCK_UN);
    @fclose($handle);
    // wenn hier etwas schief geht, ignorieren
    #$tree->free();
    echo '<p class="ok">OK, die Shopdatei wurde aktualisiert.<br>' . DIR_FS_SHOPINFO_XML . '</p>' . "\n";
    return true;
}