| 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: 11 let
|
|||
0