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ü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ä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').' => '; $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ö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; }