Jump to content

Vérifier si produit existe déjà (fonction PHP)


Recommended Posts

Bonjour, je retravaille un fichier php et je souhaite intégrer une méthode pour vérifier si un produit existe déjà et le modifier en conséquence.

 

if (le produit existe)
{ "on ne change rien"
}
else
{ "on applique les modification"
}

 

Si quelqu'un peut m'aider.

 

Merci

Link to comment
Share on other sites

Donc il suffit de regarder dans la classe Product et il existe une fonction pour ça :

Product::getByReference($reference) et donc :

if(Product::getByReference($reference))
{
}
else
{
}

 

La fonction retourne l'ID du produit si il existe sinon false.

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

On peut également chercher si l'ID produit existe tout court dans la page où l'on se trouve.

 

En gros, si vous voulez l'ID d'un produit, il faut être sur une page où il existe (par exemple la page produit).

 

Si vous êtes sur une page produit, il est dans l'URL vous pouvez donc le récupérer en faisant:

if(Tools::getValue('id_product'){
//mes actions
}else{
//pas d'id produit sur cette page
}

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

Oui, j'ai compris le principe.

Pour moi c'est la référence produit que je doit aller chercher.

 

J'ai mis ça en rapport avec ma récupération de donnée.

if(Product::getByReference($Product->Name))

 

On verra si ça marche.

Merci

Link to comment
Share on other sites

Bah, il faudrait savoir tu me dis que tu veux faire une recherche par référence et puis maintenant tu fais la recherche avec le nom.

Donc la fonction que je t'ai donné ne fonctionnera pas.

Une recherche par le nom c'est pas génial, si tu as des produits avec des noms plus ou moins identiques cela va retourner un produit qui peut-être n'existe pas.

Donc, il faut d'abord faire une requête SQL sur la table product_lang.

$sql = ‘SELECT id_product FROM ‘._DB_PREFIX_.’product_lang WHERE name="'.ton nom a chercher.'"’;
  $id_product= Db::getInstance()->getValue($sql);
if($id_product)
{
}
else
{
}

Link to comment
Share on other sites

Parfait, je viens de tester le code ce matin et cela fonctionne parfaitement. Merci Merci

 

J'ai juste un dernier petit problème concernant une autre fonctionnalité, il s'agit de l'importation des images du webservice vers mon prestashop.

 

 

Pour l'instant, l'importation se faisait avec l'ancien système d'image hors je suis passé au nouveau et je cherche comment importer avec la bonne url mes images.

 

Pour l'instant, quand j'importe mes images, j'ai une image 404, l'image s'enregistre sur l'ancien système et je suis obligé de régénérer les images pour qu'elles s'affichent correctement.

 

Voici la parti intégration image:

// Images
 $i = 0;
 foreach ($Product->Images->children() as $img)
 {
  $tempFileRaw = file_get_contents('http://www.xxxxx.com/images/products/' . $img);
  $imageData = array(
   'id_product' => $idProduct,
   'position' => $i+1,
   'cover' => ($i == 0 ? 1 : 0)
  );
  $db->autoExecute(_DB_PREFIX_ . "image", $imageData, 'INSERT');	
  $idImage = $db->Insert_ID();

  $imageLangData = array(
   'id_image' => $idImage,
   'id_lang' => 2,
   'legend' => pSQL(ucfirst(strtolower($Product->Description)))
  );
  $db->autoExecute(_DB_PREFIX_ . "image_lang", $imageLangData, 'INSERT');

  $image = new Image($idImage);
  $imgFile = _PS_PROD_IMG_DIR_ . $idProduct . '-' . $idImage . '.jpg';
  file_put_contents($imgFile, $tempFileRaw);
  $imagesTypes = ImageType::getImagesTypes('products');
  foreach ($imagesTypes AS $k => $imageType)
  {
   imageResize($imgFile, _PS_PROD_IMG_DIR_ . $idProduct . '-' . $idImage . '-' . stripslashes($imageType['name']) . '.' . $image->image_format, $imageType['width'], $imageType['height'], $image->image_format);
  }
  $i++;
 }

 

Je présume qu'il faut changer

$imgFile = _PS_PROD_IMG_DIR_ . $idProduct . '-' . $idImage . '.jpg';

par le nouveau système d'image mais je ne trouve pas le code adéquat.

 

Si vous avez une idée.

Link to comment
Share on other sites

Bonjour,

Normalement tu aurais dû clore ce topic en le mettant résolu et tu aurais dû en ouvrir un nouveau. Car cette nouvelle question ne correspond pas au titre de ton topic.

Mais pour l'url tu as cette fonction :

$url_image=$image->getExistingImgPath();

Link to comment
Share on other sites

Merci pour ça.

Mais j'ai l'impression que cette méthode sert pour l'url hors pour moi, je cherche à importer l'image dans le fichier correspondant.

Exemple: /img/p/2/5/4/0/9/25409.jpg

 

Alors que là ça va me renvoyer: 25409-home/amplificateur-large-bande-15-18db.jpg

 

 

Par contre je n'ai pas fermé le topic car la méthode que vous m'avez donné ne marche pas.

J'ai crié victoire trop vite.

 

Je pense que dans mon cas il faut un autre système pour vérifier si la référence est déjà existante dans la BDD.

 

Merci

Link to comment
Share on other sites

Pour moi la requête sql que je t'ai donnée fonctionne très bien donc tu dois mal faire quelque chose.

Pour l'url de l'image c'est pareil cette fonction retourne bien : img/p/1/2/3/4/1234.jpg si tu utilises le nouveau système et l'autre url si tu utilises l'ancien.

Link to comment
Share on other sites

J'ai voulu faire un test avec un fichier php .

Voici mon code:

<?php
$ref = 'EBP04L';
$sql = "SELECT id_product
  FROM " . _DB_PREFIX_ . "product
  WHERE reference = '$ref'
	 AND supplier_reference = '$ref'";  
$id_product= Db::getInstance()->getValue($sql);
if($id_product)
{
echo "le produit existe";
}
else
{
echo  "Pas de produit";
}
?>

 

Y a t'il une faute dans mon code.

Sachant que ce code là me renvoi une erreur 500 si je l'effectue.

 

Merci

Link to comment
Share on other sites

Bonjour,

Apparemment soit tu ne lis pas les messages correctement soit tu n'en fait qu'à ta tête. Tu dis que tu fais la recherche par référence, puis finalement c'est par nom. Je te donne un bout de code avec une recherche par nom et tu ré-utilises la reference. Donc la franchement je ne sais plus ce que tu veux exactement ??????

Mais bon pour ta requête, la bonne syntaxe est :

$sql = 'SELECT id_product
	  FROM '. _DB_PREFIX_ .'product
	  WHERE reference ="'.$ref.'"
			 AND supplier_reference ="'.$ref.'"';  

Il faut faire attention aux ' et ";

Link to comment
Share on other sites

J'avoue ne pas connaitre le php mais depuis le début ma recherche se fait par référence produit (voir post n°3) et pour moi

 

$sql = 'SELECT id_product
			  FROM '. _DB_PREFIX_ .'product
			  WHERE reference ="'.$ref.'"
							 AND supplier_reference ="'.$ref.'"';

est une recherche par référence produit.

 

Pour info, si vous me relisez (voir post n°9 et 11) la référence produit et récupérer du webservice de mon fourniseur avec la variable $Product->name.

 

Vous avez peut être fait une confusion.

Link to comment
Share on other sites

Et pourtant, je viens de faire le test à l'instant et erreur 500.

<?php
$ref = 'EBP04L';
    $sql = 'SELECT id_product
			  FROM '. _DB_PREFIX_ .'product
			  WHERE reference ="'.$ref.'"
							 AND supplier_reference ="'.$ref.'"';   
    $id_product= Db::getInstance()->getValue($sql);
if($id_product)
{
echo "le produit existe";
}
else
{
echo  "Pas de produit";
}
?>

 

J'avoue ne pas comprendre ??

Link to comment
Share on other sites

Si tu lances ton script comme ça effectivement cela ne fonctionnera pas car il utilise des fonctions prestashop. Donc il faut d'abord initialiser Prestashop.

<?php
include('config/config.inc.php');
$ref = 'MYREF34';
	$sql = 'SELECT id_product
	  FROM ' . _DB_PREFIX_ . 'product
	  WHERE reference = "'.$ref.'"
			 AND supplier_reference = "'.$ref.'"';
	$id_product= Db::getInstance()->getValue($sql);
if($id_product)
{
echo "le produit existe";
}
else
{
echo  "Pas de produit";
}
?>

Regardes le include si tu places ton fichier à la racine de prestashop.

PS: Ce script ne fonctionne pas si tu as des déclinaisons de produits.

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

Ok ça marche.

Donc le problème vient peut-être du fait que sur mon fichier php, l'appel include('config/config.inc.php'); n'est pas présent.

 

Voici ce qui est présent au début du fichier:

<?php
error_reporting(0);
ini_set('max_execution_time', 0); // Aucune limite d'execution
include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php');
require_once(PS_ADMIN_DIR . '/../modules/velleman/libs/velleman.php');
require_once(PS_ADMIN_DIR . '/../modules/velleman/libs/BBCode.class.php');

 

 

Donc si je rajoute:

<?php
error_reporting(0);
ini_set('max_execution_time', 0); // Aucune limite d'execution

include('config/config.inc.php');
include_once(PS_ADMIN_DIR.'/../classes/AdminTab.php');
require_once(PS_ADMIN_DIR . '/../modules/webservicexxl/libs/webservice.php');
require_once(PS_ADMIN_DIR . '/../modules/webservicexxl/libs/BBCode.class.php');

 

Cela devrait marcher??

 

Je ne teste pas pour l'instant de peur d'une instabilité que j'ai déjà rencontré mercredi et qui m'a coûté quelques sueurs froides.

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

En fait le fichier est dans un module et j'ai fait mon test à la racine. Le fichier n'est aucunement placé dans admin.

 

N'y a t'il pas de possibilité que certaine variable rentre en conflit en intégrant cette include?

 

De toute manière je pense tester cela en local mais j'ai peur que le webservice ne fonctionne plus.

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

si le fichier est dans un module aucun de tes includes n'est bon.

Si le module est webservicexxl tes includes devraient être :

include('../../config/config.inc.php');

include_once('../../classes/AdminTab.php');

require_once('libs/webservice.php');

require_once('libs/BBCode.class.php');

Link to comment
Share on other sites

Bah désolé mais si tu as placé ce fichier dans le répertoire du module webservicexxl les includes et require ne peuvent pas fonctionner.

Donc je ne comprends pas et je te conseil de contacter le développeur.

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...