Autor Zpráva
Pavel Strašák
Profil
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
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
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
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
tiso:
Děkuji :)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: