Jump to content
csid

Ajouter des categories avec php

Recommended Posts

Bonjour,

 

je joue les apprentis sorcier...

 

Je veux (apres avoir abandonné la solution webservice) créer/mettre à jour mes categories via un script php.

Je recois les categories à jour via une api externe. pas de pb de ce coté là.

 

J'ai developpé ma moulinette à la main avec du sql de base => ca fonctionne.

 

Je veux profiter de cette moulinette pour appréhender un peu mieux et rentrer dans les techniques(un peu esotériques pour un vieux comme moi) de dev purement Prestashop.

Par la suite je m'attaque aux produits.

 

J'ai donc modifié ma moulinette comme suit après avoir épluché la classe Category :

$elems=$client->GetTbCategories($api_log, $api_key,$params);
foreach ($elems as $categ){
 //print_r ($categ);
 $cat=new Category();
 $cat->id=$categ->cat_code;
 $cat->id_category=$cat->id;
 $cat->active=1;
 $cat->position=0;
 if (trim($categ->cat_pere)==''){
$cat->id_parent=2;
 }else{
$cat->id_parent=$categ->cat_pere;
 }
 $cat->level_depth=$categ->cat_niveau + 1;
 $cat->date_add=date('Y-m-d H:i:s');
 $cat->date_upd=date('Y-m-d H:i:s');
 $cat->is_root_category=0;
 $cat->id_shop_default=1;

 $name=addslashes($categ->cat_libel);
 $description=addslashes($categ->cat_description);

 for ($lang=1;$lang<=6;$lang++){
	$cat->name[$lang]=addslashes($categ->cat_libel);
	$cat->description[$lang]=addslashes($categ->cat_description);
	$cat->link_rewrite[$lang]=url_rewrite($name);
	$cat->meta_title[$lang]=$name;
	$cat->meta_keywords[$lang]=$description;
	$cat->meta_description[$lang]=$description;
 }

 if(Category::categoryExists($cat->id)){
$cat->update();
 }else{
$cat->add();
 }
}

 

Mon problème est qu'il ne me crée pas la categori avec l'id que je veux... il utilise l'autoincrement.

 

Y-at-il moyen de forcer ca?

 

Au passage si vous avez des conseils sur le code.... Je prends

De même si vous avez des tutos expliquant comment utiliser les classes de ps pour faire telle ou telle chose... car je galère vraiment à essayer, tester et... ne finalement jamais être sur de bien faire.

 

Merci d'avance!

Edited by csid (see edit history)

Share this post


Link to post
Share on other sites

Je m'auto répond à moitié...

J'ai trouvé en fouillant le forum anglais que le pb venait de la method add de classes/ObjectModel.php

 

Apparemment une modification a été faite (que j'ai) pour l'import et pour forcer les id lors de l'import.

 

Dans la methode add il y a maintenant un flag qui permet de forcer les id :

// Database insertion

if (isset($this->id) && !Tools::getValue('forceIDs'))

unset($this->id);

 

Mais..... je ne sais pas comment forcer ce flag à partir de mon script.

 

Le module d'import CSV le gère. Mais moi, dans mon script, comment puis-je le forcer?....?

Share this post


Link to post
Share on other sites

Je m'auto répond encore....

j'ai trouvé une soluce qui me semble pas très propre mais bon... qui fonctionne!

 

j'ai ajouté en début de script :

$_POST['forceIDs']=TRUE;

 

c'est pas très catho mais au moins ca force les id quand add() est appelé

 

Si ya mieux... je prends

Edited by csid (see edit history)

Share this post


Link to post
Share on other sites

Hello,

dans ObjectModel, aussitôt (ou presque) après le

if (isset($this->id) && !Tools::getValue('forceIDs'))
unset($this->id);

Il y a un

$this->id = ObjectModel::$db->Insert_ID();

Qui se charge justement de contrecarrer tes plans et charger le last insert ...

 

Ton problème à mon sens vient d'une implémentation inachevée de ce 'forceIDs', vu qu'au final il ne sert à rien.

 

Si tu veux une gestion correcte d'un id existant c'est la méthode update qu'il te faut utiliser et non la méthode add.

Ton test doit se faire avant donc et fixer le champ id à null si nouveau , ou à l'id à utiliser si existant.

 

Par ailleurs ta ligne :

 $cat->id_category=$cat->id;

semble ne servir a rien sauf erreur...

1) dans objectModel , c'est $obj->id qui fixe l'id

2) $cat vient d'être instancié et pour le coup , sans id , donc id_category sera toujours null , mais vu qu'il est pas utilisé à la limite on s'en moque.

 

Pour le coup , l'idéal est d'instancier si elle existe la catégorie avec son bon id.

genre :

 

if (jeconnaisl'id categorie)
$cat = new Category(idquejeconnais);
else
$cat = new category();

Ensuite ton test doit être du genre :

 

 

 

if($cat->id){

$cat->update();

}else{

$cat->add();

}

 

 

Je sais pas si c'est très clair mais il est tard .... très tard.

Share this post


Link to post
Share on other sites

Selon le cas de figure rencontré :

Si tu doit changer des catégories existantes rien de mieux qu'un UPDATE des categories en question, si c pas le cas rien n'impêche de mettre ta table empty et l'auto incrémentation à 1 pour réinserer tes datas.

ALTER TABLE tablename AUTO_INCREMENT = 1

Share this post


Link to post
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...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More