- Posts: 511
- Thank you received: 37
Création de produit en php
4 years 5 months ago #341482
by Minie
Création de produit en php was created by Minie
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 :
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 :
Tout le reste fonctionne très bien, sauf l'insertion des tables price et file
Merci d'avance, désolée du dérangement
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 :
Code:
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 :
Code:
$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.
4 years 5 months ago - 4 years 5 months ago #341485
by nicolas
Replied by nicolas on topic Création de produit en php
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:
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:
Code:
$productClass->updatePrices($product, $result);
$productClass->updateFiles($product, $result, 'images');
$productClass->updateFiles($product, $result, 'files');
Last edit: 4 years 5 months ago by nicolas.
Please Log in or Create an account to join the conversation.
4 years 5 months ago #341498
by Minie
Replied by Minie on topic Création de produit en php
Bonjour,
merci beaucoup, en effet c'est logique
merci beaucoup, en effet c'est logique
Please Log in or Create an account to join the conversation.
4 years 5 months ago - 4 years 5 months ago #341503
by Minie
Replied by Minie on topic Création de produit en php
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
ci dessous la partie du code qui concerne l'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
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
Code:
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 :
Code:
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: 4 years 5 months ago by Minie.
Please Log in or Create an account to join the conversation.
4 years 5 months ago - 4 years 5 months ago #341505
by nicolas
Replied by nicolas on topic Création de produit en php
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:
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:
Code:
...
$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: 4 years 5 months ago by nicolas.
Please Log in or Create an account to join the conversation.
4 years 5 months ago #341725
by Minie
Replied by Minie on topic Création de produit en php
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
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
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.
4 years 5 months ago #341727
by nicolas
Replied by nicolas on topic Création de produit en php
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.
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.
4 years 4 months ago #341767
by Minie
Replied by Minie on topic Création de produit en php
Bonjour,
merci beaucoup pour vos explications
merci beaucoup pour vos explications
Please Log in or Create an account to join the conversation.
Time to create page: 0.137 seconds