Autor | Zpráva | ||
---|---|---|---|
Pavel Strašák Profil |
#1 · Zasláno: 20. 2. 2015, 17:35:28
Dobrý den,
Tvořím PHP script, který převede XML feed od dodavatele na formát čitelný pro můj fakturační systém. Vyskytl se mi problém, když importuji kategorie produktů. Všechny kategorie se v pořádku zapíší do XML souboru, ale pod ně se vypíše dalších cca 500 prázdných kategorií, které způsobují mému systému problémy. Konkrétně se asi 500x pod sebe vypíše toto : <skupina-zbozi update="ignore"> <nazev/> <id>code:</id> <kod/> </skupina-zbozi> Správný kód vypadá takto : <skupina-zbozi update="ignore"> <nazev>Ostatní sortiment</nazev> <id>code:-2147483644</id> <kod>-2147483644</kod> </skupina-zbozi> Jak jsem již zmínil, všechny kategorie se vypíší správně, jen se pod ně přidají i prázdné. Kde je prosím chyba? Děkuji. Můj kód (na chyby nesouvisící s problémem prosím neberte ohled, script není dokokčen) : <!DOCTYPE html> <head> <meta charset="utf-8"> </head> <body> <?php ini_set('max_execution_time', 300); $doc2 = new DOMDocument(); $doc2->load ( 'http://www.redo.cz/export_client.php' ); $root = $doc2->getElementsByTagName( "item" ); $doc = new DOMDocument(); $doc->load( 'http://www.redo.cz/publicdoc/cz_complete_03_nw.xml' ); $shop = $doc->getElementsByTagName( "product" ); $categoryList = $doc->getElementsByTagName( "category" ); $winstrom = array(); $zarazeniDoKategoriiMain = array(); foreach ($categoryList as $singleCategory) { $idKategorie = $singleCategory->getAttribute('id'); $nadrazenaKategorie = $singleCategory->getAttribute('parent'); $nazevKategorie = $singleCategory->getAttribute('name'); $zarazeniDoKategoriiMain [] = array( 'nazevKategorie' => $nazevKategorie, 'idKategorie' => "code:$idKategorie", 'nadrazenaKategorie' => $nadrazenaKategorie, 'kod' => "$idKategorie", ); } foreach( $shop as $product ) { $nazvy = $product->getElementsByTagName( "nazev" ); $nazev = $nazvy->item(0)->nodeValue; $kody= $product->getElementsByTagName( "kod" ); $kod= $kody->item(0)->nodeValue; $popisy = $product->getElementsByTagName( "popis" ); $popis = $popisy->item(0)->nodeValue; $shortpopisy = $product->getElementsByTagName( "popisshort" ); $popisshort = $shortpopisy->item(0)->nodeValue; $stavskladu = $product->getElementsByTagName( "stav" ); $stav = $stavskladu->item(0)->nodeValue; $kategorie = $product->getElementsByTagName( "category" ); $category = $kategorie->item(0)->nodeValue; $obrazky = $product->getElementsByTagName( "image" ); $image = $obrazky->item(0)->nodeValue; foreach ($root as $item) { $kodKPorovnani = $item->getAttribute('kod'); if ($kodKPorovnani == $kod) { $prodejniCena = $item->getAttribute('price_vat'); $nakupniCena = $item->getAttribute('price'); break 1; } } if($stav = 0) { $dodacilhuta = 0; } else { $dodacilhuta = 5; } if($popisshort == "Gabol, Španělsko") { $kratkypopis = "$nazev, Gabol"; } else { $kratkypopis = "$popisshort"; } echo "Název : <b>$nazev</b><br>Kategorie : $category<br>Cena : $prodejniCena<br>Dodací lhůta je $dodacilhuta dnů<br>Krátký popis : $kratkypopis <br> Kód : $kod Je stejny jako tento ? $kodKPorovnani<br>Popis : $popis\n<br>"; $winstrom [] = array( 'nazev' => $nazev, 'kod' => $kod, 'popis' => $popis, 'kratkyPopis' => $kratkypopis, 'dodaciLhuta' => "$dodacilhuta.0", 'vyrobce' => "code:GABOL", 'linkPicture' => "true", 'dph' => 21, 'imgName' => "$nazev", 'imgType' => "image/jpeg", 'cena' => "$prodejniCena.0", 'zaruka' => 24, 'typceny' => "typCeny.bezDph", 'cena2' => $nakupniCena, 'gabol' => "code:GABOL", 'obrazek' => $image, 'kategorie' => "code:$category" ); } $doc = new DOMDocument('1.0', 'utf-8'); $doc->formatOutput = true; $r = $doc->createElement( "winstrom" ); $doc->appendChild( $r ); foreach( $zarazeniDoKategoriiMain as $seznamKategorii) { $h = $doc->createElement( "skupina-zbozi" ); $atributSkupinyZbozi = $doc->createAttribute('update'); $atributSkupinyZbozi->value = ( 'ignore' ); $h->appendChild($atributSkupinyZbozi); $nazevSkupinyZbozi = $doc->createElement( "nazev" ); $nazevSkupinyZbozi->appendChild( $doc->createTextNode( $seznamKategorii['nazevKategorie'] ) ); $h->appendChild( $nazevSkupinyZbozi ); $idSkupinyZbozi = $doc->createElement( "id" ); $idSkupinyZbozi->appendChild( $doc->createTextNode( $seznamKategorii['idKategorie'] ) ); $h->appendChild( $idSkupinyZbozi ); $idNadrazeneKategorie = $doc->createElement( "kod" ); $idNadrazeneKategorie->appendChild( $doc->createTextNode( $seznamKategorii['kod'] ) ); $h->appendChild( $idNadrazeneKategorie ); $r->appendChild( $h ); } foreach( $winstrom as $cenik ) { $b = $doc->createElement( "cenik" ); $nazev = $doc->createElement( "nazev" ); $nazev->appendChild( $doc->createTextNode( $cenik['nazev'] ) ); $b->appendChild( $nazev ); $kod = $doc->createElement( "kod" ); $kod->appendChild( $doc->createTextNode( $cenik['kod'] ) ); $b->appendChild( $kod ); $typceny = $doc->createElement( "typCenyDphK" ); $typceny->appendChild( $doc->createTextNode( $cenik['typceny'] ) ); $b->appendChild( $typceny ); $popis = $doc->createElement( "popis" ); $popis->appendChild( $doc->createTextNode( $cenik['popis'] ) ); $b->appendChild( $popis ); $popisshort = $doc->createElement( "kratkyPopis" ); $popisshort->appendChild( $doc->createTextNode( $cenik['kratkyPopis'] ) ); $b->appendChild( $popisshort ); $dodacilhuta = $doc->createElement( "dodaciLhuta" ); $dodacilhuta->appendChild( $doc->createTextNode( $cenik['dodaciLhuta'] ) ); $b->appendChild( $dodacilhuta ); $zaruka = $doc->createElement( "zaruka" ); $zaruka->appendChild( $doc->createTextNode( $cenik['zaruka'] ) ); $b->appendChild( $zaruka ); $cenaDPH = $doc->createElement( "cenaZaklVcDph"); $cenaDPH->appendChild( $doc->createTextNode( $cenik['cena'] ) ); $b->appendChild ($cenaDPH); $vyrobce = $doc->createElement( "vyrobce" ); $vyrobce->appendChild( $doc->createTextNode( $cenik['vyrobce'] ) ); $atributShowAs2 = $doc->createAttribute('showAs'); $atributShowAs2->value = ( 'GABOL: REDO s.r.o.' ); $vyrobce->appendChild($atributShowAs2); $b->appendChild( $vyrobce ); $dodavatele = $doc->createElement( "dodavatele" ); $b->appendChild( $dodavatele ); $dodavatel = $doc->createElement( "dodavatel" ); $dodavatele->appendChild( $dodavatel ); $firma = $doc->createElement( "firma" ); $firma->appendChild( $doc->createTextNode( $cenik['gabol'] ) ); $atributShowAs = $doc->createAttribute('showAs'); $atributShowAs->value = ( 'GABOL: Gabol, Španělsko' ); $firma->appendChild($atributShowAs); $dodavatel->appendChild( $firma ); $nakupCena = $doc->createElement('nakupCena'); $nakupCena->appendChild( $doc->createTextNode( $cenik['cena2'] ) ); $dodavatel->appendChild( $nakupCena ); $prilohy = $doc->createElement( "prilohy" ); $b->appendChild( $prilohy ); $priloha = $doc->createElement( "priloha" ); $prilohy->appendChild( $priloha ); $link = $doc->createElement( "link" ); $link->appendChild( $doc->createTextNode( $cenik['obrazek'] ) ); $priloha->appendChild( $link ); $linkPicture = $doc->createElement( "linkPicture" ); $linkPicture->appendChild( $doc->createTextNode( $cenik[ 'linkPicture' ] ) ); $nazSoub = $doc->createElement( "nazSoub" ); $nazSoub->appendChild( $doc->createTextNode( $cenik[ 'imgName' ] ) ); $priloha->appendChild( $nazSoub ); $typSoub = $doc->createElement( "contentType" ); $typSoub->appendChild( $doc->createTextNode( $cenik[ 'imgType' ] ) ); $priloha->appendChild( $typSoub ); $szbDph = $doc->createElement( "szbDph" ); $szbDph->appendChild( $doc->createTextNode( $cenik['dph'] ) ); $b->appendChild( $szbDph ); $skupZboz = $doc->createElement( "skupZboz" ); $skupZboz->appendChild( $doc->createTextNode( $cenik['kategorie'] ) ); $b->appendChild( $skupZboz ); $r->appendChild( $b ); } echo $doc->saveXML(); $doc->save("redo.xml") ?> } </body> |
||
Joker Profil |
#2 · Zasláno: 20. 2. 2015, 18:01:38
Pavel Strašák:
Tak nejjednodušší vysvětlení je, že název a ld není tam, odkud se plní. Tj. zaměřte se na $cenik["nazev"] a $cenik["kod"] |
||
Pavel Strašák Profil |
#3 · Zasláno: 20. 2. 2015, 18:53:36
Joker:
Všechny kategorie se vypíší v pořádku, jen se za ně doplní mnoho dalších, prázdných. V array $cenik problém není, produkty se importují v pořádku... |
||
tiso Profil |
#4 · Zasláno: 21. 2. 2015, 00:37:01
Toto je niečo do seriálu o debugovaní:
- kategórie pridávaš do výsledného XML vo foreach ($zarazeniDoKategoriiMain as $seznamKategorii) {
- keď si vypíšeš obsah $zarazeniDoKategoriiMain zistíš, že okrem plne vyplnených kategórií obsahuje aj nejaké ďalšie
- takže ich zle načítavaš, vznikajú tu: foreach ($categoryList as $singleCategory) {
- berie sa to z $categoryList = $doc->getElementsByTagName("category"); čo sú všetky elementy "category" z celého XML
- a naozaj, vstupné XML obsahuje okrem shop/categories/category aj ďalšie kategórie Takže riešením je načítať len tie kategórie, ktoré ťa zaujímajú: $doc = new DOMDocument(); $doc->preserveWhiteSpace = false; $doc->load('http://www.redo.cz/publicdoc/cz_complete_03_nw.xml'); $categoryList = $doc->documentElement->firstChild->childNodes; |
||
Pavel Strašák Profil |
#5 · Zasláno: 21. 2. 2015, 13:52:11
tiso:
Děkuji :) |
||
Časová prodleva: 10 let
|
0