Plus d'images produits sur version 6.0.2

Bonjour :happy:
Ce qui serait bien c’est que lors de l’install ou upgrade il y ait un choix pour passer au nouveau système de fichier afin d’activer ou pas ce genre de code.
Ou dans la configuration de Dolibarr que ce genre d’option existe.

Bonjour,

Pouvez vous m’expliquer en detail comment faire pour la manip car j’y connais rien en php et autre.

Fred

Bonjour :happy:
Avant tout il existe des pro qui peuvent vous faire ça en toute sécurité pour vraiment pas cher du tout si vous préférez: consulter cette liste
Je n’en suis pas un…

[b]/!\ Avant tout sauvegardez vos données /![/b]

puis :whistle:

dans un fichier php vide (avec notepad) à la racine de votre Dolibarr (ex: monsite.com/erp/dolibarr/monnouveaufichier.php)
ajoutez ces lignes

include('conf/conf.php');//chemin vers le fichier conf.php
$db = new mysqli($dolibarr_main_db_host, $dolibarr_main_db_user, $dolibarr_main_db_pass, $dolibarr_main_db_name);
if ($db->connect_errno) {
    printf("Échec de la connexion : %s\n", $db->connect_error.'<br>');
    die();
}

copier le contenu du code proposé ici à la suite de ce fichier

renseignez cette variable $dir correctement en y précisant le chemin d’accès a votre dossier photo.

vérifiez que votre préfixe de base de donnée est llx_ sinon changez par le bon dans la ligne $sql .= " FROM llx_product AS p";

ps un fichier php débute toujours pas <?php et fini par ?>

allumer un cierge :tongue:

Accédez au fichier que vous avez crée et laisser tourner la moulinette.

Bonjour,

Un grand merci a dolibarr95 pour ces explications.
J’ai voulu faire un teste sur mon dolibarr « virtuel » (en local) avant de lancer la machine.

Juste une remarque j’ai indiqué le chemin des photos mais il rajoute un 0 à la fin de « product » donnant :
…/product0/0/…
J’aurai préféré product/0/0 qui est le vrai chemin.

Je voulais connaitre votre avis la dessus avant de lancer en production le script.

Frédéric

Bonjour :happy:
de-rien

En fait la variable $dir représente le chemin d’accès au images produits.
L’ancienne méthode de dossier est la suivante :
$dir suivi d’une séquence composée de l’id du produit
exemple pour l’id 987 (reférence produit AMPOULE)

$dossierphoto = $dir . '7/8/987/photos/';
ce qui évitait d’avoir plein de dossier en vrac

La nouvelle est la suivante :
$dir suivi de la ref du produit
exemple pour l’id 987 (reférence produit AMPOULE)

$dossierphoto = $dir . 'AMPOULE/';
dans ton cas si le dossier se nomme product0 ou product45 ce la ne change rien juste defini la variable
$dir = ‹ /chemin/complet/product0/ ›;

:wink:

Bonjour,

@dolibarr95 proposez-vous des prestations de développement spécifiques ?

Merci

Bonjour :happy:

Non désolé (car il faut pouvoir assurer le sav après :laugh:happy: mais si vous avez besoin de conseils je suis là.

Comme je l’ai déjà dit vous pouvez passer par des intégrateurs Dolibarr ATM, Patasmonkey, Netlogic etc (désolé pour ceux que j’oublie) qui sont franchement réglos et compétents.

Bonjour,

Ok pas de problème. Je bloque sur une modification du code… Voir ce que j’ai décris dans ce post:
www.dolibarr.fr/forum/t/reference-fournisseur-dans-commande-facture-client/26043/1

Si quelqu’un a une idée, je suis preneur…

Merci

Bonsoir,

Bon, j’ai failli serrer… mais après 2 jours j’ai enfin réussi à faire tourner votre moulinette dolibarr95 merci pour ce code qui fonctionne très bien :wink: et merci aux autres qui on aussi utilisé ce post, ils ont posé les bonnes questions.

P.S - pourquoi à chaque grosse màj il y a ce problème avec les images ??

Bonjour :happy:
De-rien
En théorie ce problème ne devrait plus survenir étant donné que vous avez abandonné la constante PRODUCT_USE_OLD_PATH_FOR_PHOTO

Bonjour,

Dolibarr95, si j’ai bien compris le $dir est le suivant pour moi

$dir = ‹ /websites/ABCDE.cf/documents/produit/ ›;//old path car après j’ai les fameux /0/0/800/photos/fff.jpg etc…

C’est pour etre certain de mon script
Merci

Fred

Bonjour :happy:
Oui exactement :wink:
ps ne le faites pas sur un serveur en prod ou au moins faites une sauvegarde avant.

Bonjour :happy:
Voici le code complet :

<?php
/**
 *	Move the picture form old to new path for Dolibarr.
 *
 *	\warning	/!\ ALWAYS BACKUP YOUR FILE BEFORE RUNNING THIS CODE /!\
 *
 *	\todo		Before running this code save this file on you server as a php file.
 *
 *	\todo		One you have run this code don't foreget to delete or set to 0 the constant PRODUCT_USE_OLD_PATH_FOR_PHOTO. And delete this file from you server.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 */	
 
 
// parameters to configure START 
 
 /**
 *	\var	string		$conf	Path to the conf.php file
 */  
$conf	= '../conf/conf.php';

 /**
 *	\var	string		$dir	Path to the products pictures
 */ 
$dir	= '/home/server/data/produit/';

// parameters to configure END 



include($conf);
$db = new mysqli($dolibarr_main_db_host, $dolibarr_main_db_user, $dolibarr_main_db_pass, $dolibarr_main_db_name);
if ($db->connect_errno) {
    printf("Connection error : %s\n", $db->connect_error.'<br>');
    die();
}


for($i=0;$i<10;$i++){//first level of directory (eg /home/server/data/produit/1)
	
	for($e=0;$e<10;$e++){//second level of directory (eg /home/server/data/produit/1/8)
		
		$idliste = scandir($dir.$i.'/'.$e.'/');//list of all in this directory
		
		foreach($idliste as $id){//list files and directories inside $dir.$i.'/'.$e.'/'
			if(is_numeric($id)){ //third level of directory (eg /home/server/data/produit/1/8/15781)
				if(is_dir($dir.$i.'/'.$e.'/'.$id.'/photos/')){//check directory photos (eg /home/server/data/produit/1/8/15781/photos)
					
					$contenu = scandir($dir.$i.'/'.$e.'/'.$id.'/photos/');//list of all in this directory
											
					$sql  = "SELECT";
					$sql .= " p.ref";
					$sql .= " FROM ".$dolibarr_main_db_prefix."product AS p";
					$sql .= " WHERE p.rowid = ".$id;
					$resql = $db->query($sql);
	
					if ($resql ){
						
						if( $resql->num_rows == 1  ){//this product exists in database
							
							$obj = $resql->fetch_object();
					
							foreach($contenu as $fichiers){//for each element of this directory
								
								if(is_file($dir.$i.'/'.$e.'/'.$id.'/photos/'.$fichiers)){//only files not directory
							
									print 'change this file :'.$dir.$i.'/'.$e.'/'.$id.'/photos/'.$fichiers.' in  '.$dir.$obj->ref.'/'.$fichiers.'<br>';	
							  		
									if(!is_dir($dir.$obj->ref.'/')){//if directory doesn't exist create it
										mkdir($dir.$obj->ref.'/', 0755);
									}
									rename($dir.$i.'/'.$e.'/'.$id.'/photos/'.$fichiers, $dir.$obj->ref.'/'.$fichiers );//faster than copy and paste
								   
		
							 
								}elseif($fichiers == 'thumbs'){//list of all in thumbs
							 
									$icones = scandir($dir.$i.'/'.$e.'/'.$id.'/photos/thumbs/');
									foreach($icones as $icone){
									
										if(is_file($dir.$i.'/'.$e.'/'.$id.'/photos/thumbs/'.$icone)){
							 
											print 'change this file :'.$dir.$i.'/'.$e.'/'.$id.'/photos/thumbs/'.$icone.' in '.$dir.$obj->ref.'/thumbs/'.$icone.'<br>';	
										
												if(!is_dir($dir.$obj->ref.'/thumbs/')){//if directory doesn't exist create it
													mkdir($dir.$obj->ref.'/thumbs/', 0755);
												}
											rename($dir.$i.'/'.$e.'/'.$id.'/photos/thumbs/'.$icone, $dir.$obj->ref.'/thumbs/'.$icone );//faster than copy and paste
				
										}	
									}
								}
							}		
						}
					}					
				}
			}
		}
	}
}
?>

Bonjour dolibarr95,

Merci pour ton code. Par contre cela ne fait rien chez moi. J’ai demandé l’adresse à mon provider pour être sur de la variable $dir et pour le fichier conf.

Quand je lance ton script rien ne se passe et tout mes dossier son en /0/0/…
Dois je activé la fonction old_path comme indiqué dans le premier post?

Merci de ton aide
Fred

Bonjour :happy:
Que PRODUCT_USE_OLD_PATH_FOR_PHOTO soit actif ou pas le code lui doit pouvoir transférer les photos dans le dossier.
Vérifie le $dir.

Dans ton fichier dolibarr/product/card.php
Tout à la fin du document après $db->close();

Ajoute

print $conf->product->multidir_output[$object->entity];
ou

print $conf->produit->dir_output;

Puis accède à une fiche produit au hasard tout en bas de la page doit être écrit une ligne en plus ce doit être la valeur a renseigner pour $dir.

Rétabli ensuite le fichier card.php comme à on origine.

Salut,

Merci dolibarr95, le seul soucis mes dossiers sont bien créés mais rien ne s’affiche en miniature dans les fiches produits :unhappy:((

Tant pis

Fred

Bonjour :happy:

Va dans ton ancien système de dossier et vérifie que le dossier qui contient les miniatures se nomme « thumbs ».
Puis relance le code et copie ici le résultat qui s’imprime à l’écran.

Voici le code mis à jour avec les erreurs qui s’affichent au cas ou. :wink:

<?php
/**
 *	Move the picture form old to new path for Dolibarr.
 *
 *	\warning	/!\ ALWAYS BACKUP YOUR FILE BEFORE RUNNING THIS CODE /!\
 *
 *	\todo		Before running this code save this file on you server as a php file.
 *
 *	\todo		One you have run this code don't foreget to delete or set to 0 the constant PRODUCT_USE_OLD_PATH_FOR_PHOTO. And delete this file from you server.
 *
 *	This program is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU General Public License for more details.
 *
 */	
 
 
// parameters to configure START 
 
 /**
 *	\var	string		$conf	Path to the conf.php file
 */  
$conf	= '../conf/conf.php';

 /**
 *	\var	string		$dir	Path to the products pictures
 */ 
$dir	= '/home/server/data/produit/';

// parameters to configure END 



include($conf);
$db = new mysqli($dolibarr_main_db_host, $dolibarr_main_db_user, $dolibarr_main_db_pass, $dolibarr_main_db_name);
if ($db->connect_errno) {
    printf("Connection error : %s\n", $db->connect_error.'<br>');
    die();
}


for($i=0;$i<10;$i++){//first level of directory (eg /home/server/data/produit/1)
	
	for($e=0;$e<10;$e++){//second level of directory (eg /home/server/data/produit/1/8)
		
		$idliste = scandir($dir.$i.'/'.$e.'/');//list of all in this directory
		
		foreach($idliste as $id){//list files and directories inside $dir.$i.'/'.$e.'/'
			if(is_numeric($id)){ //third level of directory (eg /home/server/data/produit/1/8/15781)
				if(is_dir($dir.$i.'/'.$e.'/'.$id.'/photos/')){//check directory photos (eg /home/server/data/produit/1/8/15781/photos)
					
					$contenu = scandir($dir.$i.'/'.$e.'/'.$id.'/photos/');//list of all in this directory
											
					$sql  = "SELECT";
					$sql .= " p.ref";
					$sql .= " FROM ".$dolibarr_main_db_prefix."product AS p";
					$sql .= " WHERE p.rowid = ".$id;
					$resql = $db->query($sql);
	
					if ($resql ){
						
						if( $resql->num_rows == 1  ){//this product exists in database
							
							$obj = $resql->fetch_object();
					
							foreach($contenu as $fichiers){//for each element of this directory
								
								if(is_file($dir.$i.'/'.$e.'/'.$id.'/photos/'.$fichiers)){//only files not directory
						
									if(!is_dir($dir.$obj->ref.'/')){//if directory doesn't exist create it
										mkdir($dir.$obj->ref.'/', 0755);
									}
									
									if(is_dir($dir.$obj->ref.'/')){
										
										print 'the dir : '.$dir.$obj->ref.'/'.' exists'.'<br>';	
										
										if(rename($dir.$i.'/'.$e.'/'.$id.'/photos/'.$fichiers, $dir.$obj->ref.'/'.$fichiers )){//faster than copy and paste
											print 'transfert this file :'.$dir.$i.'/'.$e.'/'.$id.'/photos/'.$fichiers.' in '.$dir.$obj->ref.'/'.$fichiers.'<br>';	
										}else{
											print '<b style="color:red">unable to transfert this file :'.$dir.$i.'/'.$e.'/'.$id.'/photos/'.$fichiers.' in '.$dir.$obj->ref.'/'.$fichiers.'</b><br>';	
										}

									}else{
										print '<b style="color:red">the dir : '.$dir.$obj->ref.'/'.' doesnt exist'.'</b><br>';	
									}
									
								print '<hr>';
								   
							 
								}elseif($fichiers == 'thumbs'){//list of all in thumbs
							 
									$icones = scandir($dir.$i.'/'.$e.'/'.$id.'/photos/thumbs/');
									foreach($icones as $icone){
									
										if(is_file($dir.$i.'/'.$e.'/'.$id.'/photos/thumbs/'.$icone)){
							 
												if(!is_dir($dir.$obj->ref.'/thumbs/')){//if directory doesn't exist create it
													mkdir($dir.$obj->ref.'/thumbs/', 0755);
												}
												
												if( is_dir($dir.$obj->ref.'/thumbs/') ){
													
													print 'the dir : '.$dir.$obj->ref.'/thumbs/'.' exists'.'<br>';	
													
													if(rename($dir.$i.'/'.$e.'/'.$id.'/photos/thumbs/'.$icone, $dir.$obj->ref.'/thumbs/'.$icone )){//faster than copy and paste
														print 'transfert this file :'.$dir.$i.'/'.$e.'/'.$id.'/photos/thumbs/'.$icone.' in '.$dir.$obj->ref.'/thumbs/'.$icone.'<br>';	
													}else{
														print '<b style="color:red">unable to transfert this file :'.$dir.$i.'/'.$e.'/'.$id.'/photos/thumbs/'.$icone.' in '.$dir.$obj->ref.'/thumbs/'.$icone.'</b><br>';	
													}
													
												}else{
													print '<b style="color:red">the dir : '.$dir.$obj->ref.'/thumbs/'.' doesnt exist'.'</b><br>';	
												}
												
										print '<hr>';		
				
										}	
									}
								}
							}		
						}
					}					
				}
			}
		}
	}
}
?>

@fred55800
Tiens moi au courant : :wink:

Bonjour :happy:

Bug corrigé dans les prochaines versions :
https://github.com/Dolibarr/dolibarr/commit/bfc476a118a40f4d05af7e6b5c5c1aa297c664ec

Bonjour

Je suis sur une v704 et l image produit n apparait pas sur sa fiche
(elle apparait qd je survole le lien vers la fiche avec la souris depuis la liste)