Jump to content

Petit script suite à erreur Google merchant


Recommended Posts

Bonjour à tous.

Suite à une erreur dans le fichier xls généré pour Google merchant, nous avions tous les liens des images des produits que nous désirions référencer chez eux depuis prestashop, erronés.

Quand il s'agit de deux ou trois erreurs, à la main ça va vite à corriger.

Mais quand il s'agit de 269 erreurs, là il faut trouver une solution pour éviter de se taper les corrections pendant trois jours...

J'ai écris cette routine afin de, à partir de la liste de liens générés par Google merchant, retrouver les images idouane et qu'elles correspondent avec leurs liens respectifs, afficher, copier/coller dans le bloc-note, par exemple, la liste ainsi recréée, corriger les erreurs puis réintroduire la colonne d'url d'images dans la feuille de calcul Google merchant et recharger le flux (déjà que Google merchant est une usine à gaz inutilement redondante d'absurdités...).

J'espère avoir été clair jusque là.

Ci dessous le code php (qui aurait sûrement pu être optimisé ou en utilisant PDO mais pas fait pour des raisons de version php de différents serveurs):

 

/* ***** listing.php à poser à la racine de prestashop (au plus simple) ***** */
<?php
$op = $_POST["op"];
$mode = $_POST["mode"];
// Dessous, les url sont à importer de la liste que Google merchant génère, donc uniquement les produits en erreur dans leur feuille de calcul
$tableau = array('url1'=>'http://www.lemagasin.com/product.php?id_product=xxx','url2'=>'...ecaetera...');
if (!$op)
{
foreach($tableau as $valeur)
{
 echo "<pre>";
 echo $valeur ,'<br/>';
 echo "</pre>";
}
// Affichage des couples clé / valeur
//foreach($tableau as $cle => $valeur)
//{
 //echo $cle ,' : ', $valeur ,'<br/>';
//}
echo "<pre>";
?>
<form action="listing.php" method="post" enctype="multipart/form-data" name="tracer" target="_self">
<input name="op" type="hidden" value="start" />
<label>Type d'affichage</label></br>
<label>Mode texte</label><input name="mode" type="radio" value="text" checked />
<label>Mode image</label><input name="mode" type="radio" value="pic" />
<input name="" type="submit" value="Tracer" />
</form>
<?php
echo "</pre>";
}
else
{
$countvalues = count(array_values($tableau));// on compte le nombre de valeurs dans le array $tableau en haut
if($mode=="pic")// mode pictures pas nécessaire mais c'est juste pour visualiser si les images sont bien présentes et conformes
{
 // Ci dessous, à part <table>, les 4 colonnes entre <tr></tr> pas forcément nécessaires
?>
	<table>
	  <tr>
		<th style="width:<?php echo round(100/$nbCols);?>%;"></th>
		<th style="width:<?php echo round(100/$nbCols);?>%;"></th>
		<th style="width:<?php echo round(100/$nbCols);?>%;"></th>
		<th style="width:<?php echo round(100/$nbCols);?>%;"></th>
	  </tr>
<?php
}
$nbCols = 4; // nombre de colonnes du tableau
$cpt = 0; // compteur d'éléments
// Mise en tableau, adaptée du tuto viPHP http://forum.phpfrance.com/faq-tutoriels/nombre-colonnes-dynamique-operateur-modulo-t241626.html
while ($cpt<=$countvalues/6)
// $countvalues=la totalité des arrays du $tableau et /6 car sinon on se retrouve avec 2x2 doublons donc 4 fois la même image à chaque image...
{ // parcours des résultats
 // début d'une ligne
 if ($cpt%$nbCols==0) // on divise le nb d'élément par le nb de colonnes. Si le reste est de 0 ...
 echo '<tr>'; // ..., alors on est sur le premier élément d'une ligne
 // On place chaque élément dans une cellule du tableau
 for ($i=1; $i<$countvalues+1; $i++)
 {
  $adresse = $tableau['url'.$i];
  $handle = @fopen($adresse, "r");
  $contents = @file_get_contents($adresse);
  @fclose($handle);
  //Recherche des liens
  $pattern = '/<div id="image-block">(.*?)<\/div>/si';
  if(preg_match_all($pattern, $contents, $matches))
  {
foreach($matches as $values)
{
 if (preg_match('/src="([^"]+)"/i', $values[0], $matches))
 {
  $imageUrl = $matches[1];
  switch ($mode)
  {
   case "text":
   //Afficher en mode text
   echo "<td></td></tr><pre>";
   echo $adresse.' => ' .$matches[1]. '<br>';
   echo "</pre><tr><td></td>";
   break;
   case "pic":
   //Afficher en mode images
   echo '<td><a href="'.$adresse.'" target="_blank"><img src="'.$matches[1].'" border="0" /></a></td>';
   break;
  }
 }
 break;
}
  }
 // fin d'une ligne
 if ($cpt%$nbCols==($nbCols-1)) // on divise le nb d'élément par le nb de colonnes. Si le reste est de ($nbCols-1) ...
 echo '</tr>'; // ..., on est sur le dernier élément d'une ligne
 $cpt++; // on incrémente le compteur pour savoir où on en est
 }
 // Au cas où ...
 if ($cpt!=0 && $cpt%$nbCols!=0) { // S'il n'y a pas eu assez de cellules dans la boucle pour finir la ligne ...
 echo '<td colspan="'.($nbCols - ($cpt%$nbCols) ).'"> </td>'; // ... on complète avec une cellule vide de la bonne taille...
 echo '</tr>'; // ... et on ferme la ligne
 }
}
?>
</table>
<?php
}
?>

 

Cela peut être utile pour ceux qui seraient dans mon cas et ce source peut être adapté pour différentes applications.

Cordialement.

SagittariuS

Edited by asf21 (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...