Création de produit en php

  • Posts: 453
  • Thank you received: 31
  • Hikamarket Multivendor Hikashop Business
2 years 6 months ago #341482

Bonjour,

j'ai un souci lors de la création de produit en php, les prix et les images ne s'intègrent pas, le product_sort_price sintègre pourtant

voici le retour en var_dump de l'objet $product après enregistrement :

object(stdClass)#366 (12) {
  ["product_name"]=>
  string(32) "Vase déco effet bosselé cuivre"
  ["product_quantity"]=>
  string(1) "1"
  ["product_code"]=>
  string(3) "d17"
  ["prices"]=>
  array(1) {
    [0]=>
    object(stdClass)#370 (2) {
      ["price_value"]=>
      string(5) "17.92"
      ["price_currency_id"]=>
      int(1)
    }
  }
  ["categories"]=>
  array(2) {
    [0]=>
    string(3) "546"
    [1]=>
    string(3) "519"
  }
  ["product_published"]=>
  int(1)
  ["images"]=>
  array(1) {
    [0]=>
    object(stdClass)#369 (1) {
      ["file_name"]=>
      string(39) "vase-deco-cuivre-thival-concept-big.jpg"
    }
  }
  ["product_modified"]=>
  int(1652103594)
  ["product_created"]=>
  int(1652103594)
  ["product_type"]=>
  string(4) "main"
  ["product_sort_price"]=>
  float(17.92)
  ["product_id"]=>
  int(15)
}

je ne comprends pas mon erreur en relisant la doc : www.hikashop.com/support/documentation/157

mon script récupère en boucle les produits de l'ancien site d'un client, fourni en csv, la boucle traite les produits ($item) comme ceci :
$product = new stdClass();

$product->product_name		= trim($item['Name']);

if(empty($item['QtyInStock'])){ $product->product_quantity = 0; }
else{ $product->product_quantity = $item['QtyInStock']; }

$product->product_code		= trim($item['code']);

$price = new stdClass();
$price->price_value			= str_replace(',', '.', $item['Price1VATExcluded']);
$price->price_currency_id	= 1;
$product->prices			= array($price);

$category_1 = array_reverse(explode('/', $item['Category1Name']))[0];
$db->setQuery('SELECT category_id FROM #__hikashop_category WHERE category_name = "'.$category_1 .'"');
$product->categories[]		= $db->loadResult();
if(!empty($item['Category2Name'])){ 
	$category_2 = array_reverse(explode('/', $item['Category2Name']))[0];
	$db->setQuery('SELECT category_id FROM #__hikashop_category WHERE category_name = "'.$category_2.'"');
	$product->categories[]	= $db->loadResult();
}
if(!empty($item['Category3Name'])){ 
	$category_3 = array_reverse(explode('/', $item['Category3Name']))[0];
	$db->setQuery('SELECT category_id FROM #__hikashop_category WHERE category_name = "'.$category_3.'"');
	$product->categories[]	= $db->loadResult();
}

$product->product_published = 1;

$url = trim($item['UrlDetailImgFileName']);
if($gix_config->url_exists($url)){
	$folder		= 'images/';
	$filename	= basename(parse_url($url, PHP_URL_PATH));
	file_put_contents($folder.$filename, file_get_contents($url));
	$image = new stdClass();
	$image->file_name			= $filename;
	$product->images			= array($image);
}



if(!defined('DS'))
	define('DS', DIRECTORY_SEPARATOR);
include_once(rtrim(JPATH_ADMINISTRATOR,DS).DS.'components'.DS.'com_hikashop'.DS.'helpers'.DS.'helper.php');
$productClass = hikashop_get('class.product');
$result = $productClass->save($product);
$productClass->updateCategories($product, $result);

Tout le reste fonctionne très bien, sauf l'insertion des tables price et file

Merci d'avance, désolée du dérangement

Please Log in or Create an account to join the conversation.

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
2 years 6 months ago #341485

Bonjour,

La fonction save ne sauvegarde que les informations du produit dans la table hikashop_product.
Donc normal que les prices et files ne soient pas prises en compte dans votre code.
Il faut rajouter quelques lignes de code comme pour les catégories:

$productClass->updatePrices($product, $result);
$productClass->updateFiles($product, $result, 'images');
$productClass->updateFiles($product, $result, 'files');

Last edit: 2 years 6 months ago by nicolas.

Please Log in or Create an account to join the conversation.

  • Posts: 453
  • Thank you received: 31
  • Hikamarket Multivendor Hikashop Business
2 years 6 months ago #341498

Bonjour,

merci beaucoup, en effet c'est logique :)

Please Log in or Create an account to join the conversation.

  • Posts: 453
  • Thank you received: 31
  • Hikamarket Multivendor Hikashop Business
2 years 6 months ago #341503

Bonjour,

Dans la même série, la fonction updateFiles me pose problème, j'ai l'erreur suivante : Object of class stdClass could not be converted to string
/administrator/components/com_hikashop/classes/product.php:3748

Pourtant l'objet est bien construit selon la doc www.hikashop.com/support/documentation/157

object(stdClass)#369 (12) {
  ["product_name"]=>
  string(34) "Brûleur à huile cylindrique kaki"
  ["product_quantity"]=>
  string(1) "1"
  ["product_code"]=>
  string(3) "S49"
  ["prices"]=>
  array(1) {
    [0]=>
    object(stdClass)#366 (8) {
      ["price_value"]=>
      string(4) "3.83"
      ["price_currency_id"]=>
      int(1)
      ["price_min_quantity"]=>
      int(0)
      ["price_id"]=>
      string(4) "NULL"
      ["price_access"]=>
      string(3) "all"
      ["price_users"]=>
      string(0) ""
      ["price_start_date"]=>
      int(0)
      ["price_end_date"]=>
      int(0)
    }
  }
  ["categories"]=>
  array(2) {
    [0]=>
    string(3) "425"
    [1]=>
    string(3) "530"
  }
  ["product_published"]=>
  int(1)
  ["images"]=>
  array(1) {
    [0]=>
    object(stdClass)#370 (1) {
      ["file_name"]=>
      string(40) "bruleur-cylindre-kaki.jpg"
    }
  }
  ["product_modified"]=>
  int(1652175250)
  ["product_created"]=>
  int(1652175250)
  ["product_type"]=>
  string(4) "main"
  ["product_sort_price"]=>
  float(3.83)
  ["product_id"]=>
  int(48)
}

ci dessous la partie du code qui concerne l'image :
if(!empty($url) AND $gix_config->url_exists($url)){
  $folder		= 'images/';
  $filename	= str_replace('-big', '', basename(parse_url($url, PHP_URL_PATH)));
  file_put_contents($folder.$filename, file_get_contents($url));
  $image = new stdClass();
  $image->file_name			= $filename;
  $product->images			= array($image);
}

la ligne 3748 de la class product
$filter = 'AND file_id NOT IN ('.implode(',',$element->$type).')';
attend visiblement une liste d'id d'images en tableau, mais bien sur on ne peut connaitre l'id de l'image avant que la ligne soit créée dans la table

Last edit: 2 years 6 months ago by Minie.

Please Log in or Create an account to join the conversation.

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
2 years 6 months ago #341505

Bonjour,

Il vous faut en effet d'abord sauvegarder les images dans la table hikashop_file. Dans $product->images vous devait avoir un array des ids des éléments dans la table hikashop_file:

...
	$result = $productClass->save($product);
	$image = new stdClass();
	$image->file_name = $filename;
	$image->file_path = $filename;
	$image->file_ref_id = $result;
	$image->file_type = 'product';
	$fileClass = hikashop_get('class.file');
	$file_id = $fileClass->save($image);
	$product->images = array($file_id);
	$productClass->updateFiles($product, $result, 'images');
...

Last edit: 2 years 6 months ago by nicolas.

Please Log in or Create an account to join the conversation.

  • Posts: 453
  • Thank you received: 31
  • Hikamarket Multivendor Hikashop Business
2 years 6 months ago #341725

Bonjour,

je n'ai pas reçu la notification de réponse au sujet, me voilà donc une semaine plus tard, arriver ici pensant qu'il n'y avait pas de réponse :) donc contente d'en trouver une !

Merci pour votre réponse complète, j'avais donc fait une requête sql à l'arrache pour ajouter les images dans hikashop_file.

Une fois que les lignes sont insérées dans hikashop_file, le file_ref_id est présent et l'image est donc liées au produit, donc si je comprends bien d'après la lecture de la fonction updateFiles dans le fichier class product, celle ci permet la création de la miniature et l'ordering des fichiers ?

Pardonnez cette question de pure curiosité / intérêt du fonctionnement hikashop, nous développons énormément avec hikashop justement car l'extension est très orientée développeurs (et encore merci beaucoup pour ca, c'est vraiment top)

Merci :)

Please Log in or Create an account to join the conversation.

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
2 years 6 months ago #341727

Bonjour,

En fait, lorsque vous utilisez l'uploader dans l'interface, HikaShop ajoute déjà l'image dans hikashop_file (et rempli le file_ref_id si l'id du produit est déjà disponible) durant l'upload du produit. Du coup, dans saveForm, la fonction qui gère la sauvegarde de l'interface d'édition d'un produit, c'est une liste de l'id de chaque image qui est récupérée, et donc il n'y a pas de sauvegarde à faire dans hikashop_file. Par contre, vous qu'il est possible de changer l'ordre des images dans l'interface, la fonction updateFiles va pouvoir changer l'ordre des images. Et aussi, lorsqu'un nouveau produit est créé, le file_ref_id n'a pas pu être renseigné durant l'upload. C'est donc updateFiles qui va le rajouter.

Concernant les miniatures, HikaShop fonctionne sur un système en mode "lazy". C'est à dire qu'il ne génère pas de miniature à la sauvegarde. C'est lorsqu'il a besoin d'afficher les miniatures qu'il va regarder si elles sont déjà générées et si non, il va les générer.

Please Log in or Create an account to join the conversation.

  • Posts: 453
  • Thank you received: 31
  • Hikamarket Multivendor Hikashop Business
2 years 6 months ago #341767

Bonjour,

merci beaucoup pour vos explications :)

Please Log in or Create an account to join the conversation.

Time to create page: 0.057 seconds
Powered by Kunena Forum