Bonjour
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
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
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
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
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/ ›;
Bonjour
Non désolé (car il faut pouvoir assurer le sav après 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 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
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
Oui exactement
ps ne le faites pas sur un serveur en prod ou au moins faites une sauvegarde avant.
Bonjour
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
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 ((
Tant pis
Fred
Bonjour
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.
<?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>';
}
}
}
}
}
}
}
}
}
}
}
?>
Bonjour
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)