THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bon.. ça avance...

Encore quelques soucis à régler :
1/ Si on vide les tables avant d'importer :
- ça ne reset pas l'auto increment => Je vais voir pour lancer un alter table
- ça ne supprime pas les urls => Je vais voir pour supprimer les urls
2/ Si une erreur se glisse dans les produits (doublons de référence notamment ça plante) => Je vais voir pour intercepter l'erreur pour la renvoyer et éviter que ça plante


Aide les autres, ils t'aideront en retour.

Offline


Elyos wrote:

Bon.. ça avance...

Encore quelques soucis à régler :
1/ Si on vide les tables avant d'importer :
- ça ne reset pas l'auto increment => Je vais voir pour lancer un alter table
- ça ne supprime pas les urls => Je vais voir pour supprimer les urls
2/ Si une erreur se glisse dans les produits (doublons de référence notamment ça plante) => Je vais voir pour intercepter l'erreur pour la renvoyer et éviter que ça plante

1/ OK
2/ J'intercepte l'erreur sans enregistrer le produit et je passe au produit suivant.

3/ La suppression des images dans la table ne supprime pas physiquement les images... je vais donc voir pour rajouter une boucle de suppression d'images.

4/ CAS PARTICULIER 1 : J'ai besoin de manipuler les documents enregistrés (via un autre module sûrement), est ce qu'il existe un "event" à ce niveau qui peut être intercepté par un module externe à celui-ci et récupérer les bonnes informations (en l'occurrence le chemin du document) ?

5/ CAS PARTICULIER 2 : J'ai besoin d'ajouter d'autres informations aux produits (via un autre module sûrement), est ce qu'il existe un "event" à ce niveau qui peut être intercepté par un module externe à celui-ci et récupérer les bonnes informations (en l'occurrence un champ du CSV) ?


Aide les autres, ils t'aideront en retour.

Offline


Bon bah ça tournait... et là... ça bug aléatoirement...

Je lance un import de 1 500 produits et à un moment ça me met une erreur du genre :

Attempted to load class "ProductDocumentI18n" from namespace "Thelia\Model\Base"

ou concernant un Event... donc j'ai dû mal à comprendre ce qui pose souci vu que c'est aléatoire...

Là ça vient de couper à 30 lignes... tout à l'heure c'était 210 ... en sachant que je ne change pas le fichier entre temps...


Aide les autres, ils t'aideront en retour.

Offline


Bon bah après une ré-install propre de thélia (suite à la modification serveur) ça a l'air de tourner...

450 imported elements on 1542 total, 1092 to go,


Aide les autres, ils t'aideront en retour.

Offline


Bon bah fausse joie... j'ai eu le droit à une erreur 500 arrivé à 860... j'investigue...


Aide les autres, ils t'aideront en retour.

Offline


Maintenant je viens de voir qu'il gardait mon .csv en cache... au lieu de traiter le nouveau importé...


Aide les autres, ils t'aideront en retour.

Offline


J'ai renommé mon fichier et là ça a bien pris le dernier fichier uploadé...

J'ai tout de même testé avec l'ancien nom de fichier et en fait ça prend bien le fichier uploadé mais dans le traitement des données ça garde les anciennes données...

Bizarre bizarre... Si quelqu'un a une idée...

public function initData($file,$lang,$reset)
	{
		$fileinfo = new \SplFileInfo($file);
		$fileobj = $fileinfo->openFile('r');
		$serializer = new Serializer\PointVirguleCSVSerializer();
		$this->datas = $serializer->unserialize($fileobj); // ça me sort bien les données du dernier fichier UP
		$this->locale = $lang->getLocale();
...
public function importData($startRecord)
	{
		set_time_limit(0);
		ini_set('max_execution_time', '0');
		$errors = [];
        $cpt = 0;
		
		$max = $startRecord+$this->getChunkSize();
        if ($max > $this->getTotalCount()) {
            $max = $this->getTotalCount();
        }
        
        for ($cpt = $startRecord; $cpt < $max; $cpt++){
            
            if (isset($this->datas[$cpt])) {
                try
                {
					$this->currentData = $this->datas[$cpt];
					$this->checkMandatoryColumns();
		
					foreach($this->currentData as $k => $value){
						$this->currentData[$k] = trim($value); // ça me sort les données de l'ancien fichier UP (sauf si je renomme le fichier)
					}
...

Sinon... toujours une erreur 500 (Internal Server Error) arrivé à 860... (en mode dev et donc je ne vois pas de message d'erreur)


Aide les autres, ils t'aideront en retour.

Offline


Concernant l'erreur 500 j'ai corrigé quelque chose... peut être que ça résoudra le souci...

$categoryI18n = CategoryI18nQuery::create()
				->filterByLocale($this->locale)
				->findOneByTitle($title);
			if ($categoryI18n !== null) {
				$category = $categoryI18n->getCategory();
				$idCat = $category->getId();
				$parentCat = $category->getParent();
				if($idCat && $parentCat == $parent){
					$parent = $idCat;
					continue;
				}
			}else{
				$categoriesI18n = CategoryI18nQuery::create()
				->filterByLocale($this->locale)
				->find()
				->getData();
				$closestIdCat = 0;
				$closestPct = 80;
				foreach($categoriesI18n as $categoryI18n){
					$similar = similar_text($title, $categoryI18n->getTitle(), $pct);
					$category = $categoryI18n->getCategory();
					$idCat = $category->getId();
					$parentCat = $category->getParent();
					if($idCat && $parentCat == $parent && $pct>$closestPct){
						$closestPct = $pct;
						$closestIdCat = $idCat;
					}
				}
				if($closestIdCat){
					$parent = $closestIdCat;
					continue;
				}
			}

Je ne traitais pas le fait qu'une sous-catégorie pouvait avoir le même titre qu'une autre (dans une autre catégorie), du coup ça me créé plein de sous catégorie avec le même titre...

Correction :

$categorysI18n = CategoryI18nQuery::create()
				->filterByLocale($this->locale)
				->filterByTitle($title)
				->find()
				->getData();
				$find = false;
			foreach($categoriesI18n as $categoryI18n){
				$category = $categoryI18n->getCategory();
				$idCat = $category->getId();
				$parentCat = $category->getParent();
				if($idCat && $parentCat == $parent){
					$parent = $idCat;
					$find = true;
					break;
				}
			}
			if(!$find){
				$categoriesI18n = CategoryI18nQuery::create()
				->filterByLocale($this->locale)
				->find()
				->getData();
				$closestIdCat = 0;
				$closestPct = 80;
				foreach($categoriesI18n as $categoryI18n){
					$similar = similar_text($title, $categoryI18n->getTitle(), $pct);
					$category = $categoryI18n->getCategory();
					$idCat = $category->getId();
					$parentCat = $category->getParent();
					if($idCat && $parentCat == $parent && $pct>$closestPct){
						$closestPct = $pct;
						$closestIdCat = $idCat;
					}
				}
				if($closestIdCat){
					$parent = $closestIdCat;
					continue;
				}
			}

Aide les autres, ils t'aideront en retour.

Offline


Je viens de passer les 860... ça devait donc bien être ça la cause du souci...


Aide les autres, ils t'aideront en retour.

Offline


Bon bah je pensais m'en être sorti mais non...

Suite à une url d'image erronée ça s'est stoppé... j'ai corrigé mon code pour contrer le souci et depuis au bout de 10 => erreur interne... je suis en train de m'arracher les cheveux...!!!

Last edited by Elyos (13-04-2021 18:27:35)


Aide les autres, ils t'aideront en retour.

Offline


J'ai viré le code :

					$file_headers = get_headers($image);
					if(strpos($file_headers[0], '404') !== false){
						continue;
					}

et ça remarche... mais du coup pas moyen de contrer le

$dataImage = file_get_contents($image);

si l'url contenu dans $image est erronée ou inexistante...


Aide les autres, ils t'aideront en retour.

Offline


$dataImage = @file_get_contents($image);

OpenStudio Toulouse

Offline


roadster31 wrote:
$dataImage = @file_get_contents($image);

Ah bah oui.. le seul truc que j'avais pas testé...

Merci!!!


Aide les autres, ils t'aideront en retour.

Offline


Autres questions :
Si d'autres modules agissent sur les produits (à l'ajout, l'update, etc...), je suppose que je dois passer par les events pour que ces modules se déclencent automatiquement ?

https://doc.thelia.net/en/documentation … index.html

et je les lance comment ..?

Pour l'instant j'ai que ça dans mon code

			$event = new FeatureProductDeleteEvent($productId, $featureId);
			$this->dispatcher->dispatch(TheliaEvents::PRODUCT_FEATURE_DELETE_VALUE, $event);
			
			if($isFree){
				$event = new FeatureProductUpdateEvent($productId, $featureId, $featureAv, true);
				$event->setLocale($this->locale);
				$this->dispatcher->dispatch(TheliaEvents::PRODUCT_FEATURE_UPDATE_VALUE, $event);
			}else{
				$featureAvs = explode(";",$featureAv);
				foreach($featureAvs as $featureAvId){
					$event = new FeatureProductUpdateEvent($productId, $featureId, $featureAvId);
					$event->setLocale($this->locale);
					$this->dispatcher->dispatch(TheliaEvents::PRODUCT_FEATURE_UPDATE_VALUE, $event);
				}
			}

qui, si je ne dis pas de bêtises, lance les modules qui interceptent ces évènements...?


Aide les autres, ils t'aideront en retour.

Offline


je les lance comment

On ne "lance" pas des events, on les dispatche.

$dispatcher->dispatch(...)

Tu ne dois pas "lancer" des modules. Les modules écoutent les events et font ce qu'ils ont à faire, ce n'est pas ton problème. C'est toute la beauté du pattern Observer

Donc tu dispatches les events et c'est tout.


OpenStudio Toulouse

Offline


Après plusieurs imports je viens de remarquer que j'avais des doublons de référence...

En effet, après l'import de produits pour une rubrique spécifique "pro", certains produits (qui n'avaient pas les mêmes titres) se retrouvent en double (même référence mais pas même titre...)

Dans mon code, je remarque que je check au niveau du titre et non de la référence en croyant qu'un doublon de référence serait bloqué au niveau de la BDD (ou lors du "save"), mais non...

Donc le mieux serait de checker ET le titre ET la référence ?


Aide les autres, ils t'aideront en retour.

Offline


Il y a un index unique sur la colonne ref de la table produit. A moins que tu aies supprimé cet index unique, tu ne peux pas insérer deux produits avec la même référence.

download


OpenStudio Toulouse

Offline


Non non chez moi c'est Unique aussi.

J'ai les doublons dans les PSE et non dans les products

Et je viens de regarder je vérifie tout de même les ref pour les products (mais pas pour les pse)

$productI18n = ProductI18nQuery::create()
	->filterByLocale($this->locale)
	->findOneByTitle($title);
if ($productI18n === null) {
	$product = ProductQuery::create()
	->findOneByRef($ref);
	if($product !== null) {
		return null;
	}
...
if($product === null){
	$errors[] = "Product line $cpt : Product error maybe duplicate ref ($ref)";
	continue;
}

Last edited by Elyos (07-07-2021 08:11:37)


Aide les autres, ils t'aideront en retour.

Offline


Alors tu n'a pas de problèmes avec les produits, mais avec les PSE (question précise = réponse précise).

Contrairement aux références des produits, les références des PSE ne sont pas uniques, car plusieurs PSE d'un même produit peuvent porter la référence du produit.


OpenStudio Toulouse

Offline


Hum... en effet... ça se tient... ^^'

Bon bah je vais chercher une solution pour ça


Aide les autres, ils t'aideront en retour.