osCommerce France : Accueil Forum Portail osCommerce France Réponses aux questions Foire aux contributions

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> [addon]Smart images sorting (V.1.0.1), dispatche les images catégories/produits en fonction des catégories
FoxP2
posté 10 Nov 2013, 16:54
Message #1


Ceinture marron OSC
Icône de groupe

Groupe : Modérateurs
Messages : 1665
Inscrit : 3-June 09
Membre no 25501



Marre de voir votre dossier images en bordel ?
Cet addon est fait pour vous.

Pour les catégories :

Lors d'une création d'une catégorie, créer automatiquement un dossier pour celle ci accueillant l'image de la catégorie.
Lors de la suppression de la catégorie, supprime son image et son dossier.(suppression récursive des sous dossiers catégories)

Pour les produits :

Lors d'une création d'un produit, créer automatiquement un dossier pour celui ci accueillant les images de ce produit dans sa catégorie.
Lors de la suppression du produit, supprime son image et son dossier (suppression récursive de toutes les images)

Sécurisation

Afin d'éviter toute interpolation dans le dossier images, les catégories sont classées dans un nouveau dossier categories (tel illustré ci dessous)
chaque dossier est renommé avec le nom de la catégorie et son identifiant (tout caractère non alpha-numérique et espace sont remplacés par un underscore ainsi qu'une nomination en minuscule)


categorie_smart_images_sorting par foxp2projects, sur Flickr

Afin d'éviter toute interpolation dans les dossiers categories, les produits sont classés dans un nouveau dossier produit (tel illustré ci dessous)
chaque dossier est renommé avec l'identifiant du produit.


product_smart_images_sorting par foxp2projects, sur Flickr

Factorisation du code et réutilisation de code existant

Cet addon modifie très peu le code source du noyau d' osCommerce en réutilisant l'existant,

à savoir :

la fonction tep_generate_category_path pour construire le chemin de chaque dossier (categories ou product)
la function tep_remove pour la suppression des dossiers pour :
les catégories
les produits

en factorisant le code avec la nouvelle fonction tep_smart_images_dir en double emploi avec (par exemple) :

création/modification d'une catégorie
création d'un produit ou modification d'un produit

Installation

télécharger: lien
importer le fichier update.sql avec phpmyadmin

si votre version du script osCommerce est vierge de toute modification sur les fichiers suivants :
- catalog\admin\categories.php
- catalog\admin\includes\functions\general.php
copier les fichiers vers leurs répertoires respectifs.
si votre dossier admin est renommé, adapter la destination des fichiers vers catalog/{nom_de_mon_dossier_admin}

si votre version d'osCommerce est modifié (ou une version inférieure à 2.3.3.4) , utiliser un comparateur de fichier.


Avertissment

Malgré le soin apporté à la rédaction de ce sujet ainsi qu'au développement de cet addon, il est probable que certains bugs persistent. N'hésitez pas à les commenter/signaler ici ou directement sur github : issue

Ce message a été modifié par FoxP2 - 14 Nov 2013, 09:11.
Raison de l'édition : Correction du bug 'suppression du répertoire images'


--------------------


Go to the top of the page
 
FoxP2
posté 10 Nov 2013, 20:33
Message #2


Ceinture marron OSC
Icône de groupe

Groupe : Modérateurs
Messages : 1665
Inscrit : 3-June 09
Membre no 25501



Modification manuelle (basé sur la version originale des fichiers) :

catalog/admin/categories.php

ligne 77 -> 94

Citation
}
}

$categories_image = new upload('categories_image');
$categories_image->set_destination(DIR_FS_CATALOG_IMAGES);

$categories_image = new upload('categories_image');
// bof smart-images-sorting
$dir = tep_smart_images_dir((int)$categories_id);

$categories_image->set_destination(DIR_FS_CATALOG_IMAGES . $dir);
// eof smart-images-sorting


if ($categories_image->parse() && $categories_image->save()) {
tep_db_query("update " . TABLE_CATEGORIES . " set categories_image = '" . tep_db_input($categories_image->filename) . "' where categories_id = '" . (int)$categories_id . "'");
// bof smart-images-sorting
tep_db_query("update " . TABLE_CATEGORIES . " set categories_image = '" . $dir . tep_db_input($categories_image->filename) . "' where categories_id = '" . (int)$categories_id . "'");
// eof smart-images-sorting

}

if (USE_CACHE == 'true') {


ligne 228 -> 232

Citation
'manufacturers_id' => (int)tep_db_prepare_input($HTTP_POST_VARS['manufacturers_id']));

$products_image = new upload('products_image');
$products_image->set_destination(DIR_FS_CATALOG_IMAGES);
if ($products_image->parse() && $products_image->save()) {
$sql_data_array['products_image'] = tep_db_prepare_input($products_image->filename);
}


if ($action == 'insert_product') {
$insert_sql_data = array('products_date_added' => 'now()');


ligne 233 -> 271

Citation
$products_id = tep_db_insert_id();

tep_db_query("insert into " . TABLE_PRODUCTS_TO_CATEGORIES . " (products_id, categories_id) values ('" . (int)$products_id . "', '" . (int)$current_category_id . "')");

// bof smart-images-sorting
$dir = tep_smart_images_dir((int)$cPath, true, (int)$products_id);

$products_image->set_destination(DIR_FS_CATALOG_IMAGES . $dir);

if ($products_image->parse() && $products_image->save()) {
$sql_data_array['products_image'] = $dir . tep_db_prepare_input($products_image->filename);
}
tep_db_perform(TABLE_PRODUCTS, $sql_data_array, 'update', "products_id = '" . (int)$products_id . "'");
// eof smart-images-sorting

} elseif ($action == 'update_product') {

// bof smart-images-sorting
$dir = tep_smart_images_dir((int)$cPath, true, (int)$products_id);
// eof smart-images-sorting

$update_sql_data = array('products_last_modified' => 'now()');

// bof smart-images-sorting
$products_image->set_destination(DIR_FS_CATALOG_IMAGES . $dir);

if ($products_image->parse() && $products_image->save()) {
$sql_data_array['products_image'] = $dir . tep_db_prepare_input($products_image->filename);
}
// eof smart-images-sorting

$sql_data_array = array_merge($sql_data_array, $update_sql_data);

tep_db_perform(TABLE_PRODUCTS, $sql_data_array, 'update', "products_id = '" . (int)$products_id . "'");


ligne 302 -> 320

Citation
'sort_order' => $pi_sort_order);

$t = new upload($key);
$t->set_destination(DIR_FS_CATALOG_IMAGES);

// bof smart-images-sorting
$dir = tep_smart_images_dir((int)$cPath, true, (int)$products_id);

$t->set_destination(DIR_FS_CATALOG_IMAGES . $dir);
// eof smart-images-sorting

if ($t->parse() && $t->save()) {
$sql_data_array['image'] = tep_db_prepare_input($t->filename);
// bof smart-images-sorting
$sql_data_array['image'] = $dir . tep_db_prepare_input($t->filename);
// eof smart-images-sorting

}

tep_db_perform(TABLE_PRODUCTS_IMAGES, $sql_data_array, 'update', "products_id = '" . (int)$products_id . "' and id = '" . (int)$matches[1] . "'");

$piArray[] = (int)$matches[1];


ligne 323 -> 342

Citation
'htmlcontent' => tep_db_prepare_input($HTTP_POST_VARS['products_image_htmlcontent_new_' . $matches[1]]));

$t = new upload($key);
$t->set_destination(DIR_FS_CATALOG_IMAGES);

// bof smart-images-sorting
$dir = tep_smart_images_dir((int)$cPath, true, (int)$products_id);

$t->set_destination(DIR_FS_CATALOG_IMAGES . $dir);
// eof smart-images-sorting

if ($t->parse() && $t->save()) {
$pi_sort_order++;

$sql_data_array['image'] = tep_db_prepare_input($t->filename);
// bof smart-images-sorting
$sql_data_array['image'] = $dir . tep_db_prepare_input($t->filename);
// eof smart-images-sorting

$sql_data_array['sort_order'] = $pi_sort_order;

tep_db_perform(TABLE_PRODUCTS_IMAGES, $sql_data_array);


fichier catalog/admin/includes/functions/general.php

~ ligne 941 -> 960

Modification de la function tep_remove_category

Citation
if ($duplicate_image['total'] < 2) {
if (file_exists(DIR_FS_CATALOG_IMAGES . $category_image['categories_image'])) {
@unlink(DIR_FS_CATALOG_IMAGES . $category_image['categories_image']);
// bof smart-images-sorting
$dir_tmp = explode('/', trim($category_image['categories_image']));
$img = end($dir_tmp);
$dir = substr(DIR_FS_CATALOG_IMAGES . $category_image['categories_image'], 0, - strlen($img));
if( $dir !== DIR_FS_CATALOG_IMAGES) {
tep_remove($dir);
}
// eof smart-images-sorting

}
}


tep_db_query("delete from " . TABLE_CATEGORIES . " where categories_id = '" . (int)$category_id . "'");
tep_db_query("delete from " . TABLE_CATEGORIES_DESCRIPTION . " where categories_id = '" . (int)$category_id . "'");
tep_db_query("delete from " . TABLE_PRODUCTS_TO_CATEGORIES . " where categories_id = '" . (int)$category_id . "'");


~ ligne 971 -> 983

Modification de la function tep_remove_product

Citation
if ($duplicate_image['total'] < 2) {
if (file_exists(DIR_FS_CATALOG_IMAGES . $product_image['products_image'])) {
@unlink(DIR_FS_CATALOG_IMAGES . $product_image['products_image']);
// bof smart-images-sorting
$dir_tmp = explode('/', trim($product_image['products_image']));
$img = end($dir_tmp);
$dir = substr(DIR_FS_CATALOG_IMAGES . $product_image['products_image'], 0, - strlen($img));
if( $dir !== DIR_FS_CATALOG_IMAGES) {
tep_remove($dir);
}
// eof smart-images-sorting

}
}


ligne 989 -> 1001

Citation
if ($duplicate_image['total'] < 2) {
if (file_exists(DIR_FS_CATALOG_IMAGES . $product_images['image'])) {
@unlink(DIR_FS_CATALOG_IMAGES . $product_images['image']);
// bof smart-images-sorting
$dir_tmp = explode('/', trim($product_images['image']));
$img = end($dir_tmp);
$dir = substr(DIR_FS_CATALOG_IMAGES . $product_images['image'], 0, - strlen($img));

tep_remove($dir);
// eof smart-images-sorting

}
}
}


~ ligne 1491 -> 1518

ajout de la nouvelle function tep_smart_images_dir :

Citation
return is_writable($file);
}
}

// bof smart-images-sorting
function tep_smart_images_dir($category_id, $product = false, $product_id = null) {

$img_category_dir = tep_generate_category_path($category_id, 'category');

$dir = 'categories/';

foreach (array_reverse($img_category_dir[0]) as $cat) {
$dir .= preg_replace('/[^a-zA-Z0-9_.-]/i', '_', strtolower($cat['text'] . '_' . $cat['id'])) . '/';
}
if ($product) {
$dir .= 'product_' . $product_id . '/';
}

if (!is_dir(DIR_FS_CATALOG_IMAGES . $dir)) {

mkdir(DIR_FS_CATALOG_IMAGES . $dir, 0775, true);
}

return $dir;
}
// eof smart-images-sorting

?>


les lignes en vert sont à ajouter
les lignes en rouge sont à supprimer


réalisé avec la ligne de commande : git diff d98a21b 2edf6ce > diff.txt


--------------------


Go to the top of the page
 
thumba
posté 11 Nov 2013, 11:36
Message #3


Ceinture jaune OSC
Icône de groupe

Groupe : Membres
Messages : 51
Inscrit : 3-June 13
Membre no 32238



Bonjour,

super top, ça fonctionne nickel, merci Monsieur de vos contributions et aides (pour le bidouilleur-non programmeur que je suis !).

Y'a plus qu'à réintégrer les images dans l'admin.

Encore merci, bonne journée,

Thumba.


--------------------
Oscommerce 2.3.2 l HeaderTags SEO V 3.3.0 l Ultimate SEO URLS V22 l Dynamic Template System V2 l Ckeditor l googlexml sitemap seo V.1.6 l activate or inactivate category l dhtml state selection 2.3.1 l jsor-jcarousel l previous-next with details l shoppingCart cleanup l SLiCK reCaptcha 1.0.1 l Store Mode 1.3 l superfish horizontal navbar l QtPro 4.6.1 l MATC 1.1
Go to the top of the page
 
Budington
posté 2 Oct 2014, 13:56
Message #4


Ceinture blanche+ OSC
Icône de groupe

Groupe : Membres
Messages : 34
Inscrit : 4-February 12
Membre no 30570



Petite question...

J'ai install cette addon sur ma 2.3.4 et sa marche au poil si on a pas beaucoup de sous catégorie...

dès que l'on a une arborescence un peut longue, sa ne fonctionne plus (et si y'a des accents dans les catégories c'est encore pire)

ex...

L'IMAGE N'EXISTE PAS
categories/pi__ces_d__tach__e___lectrique_83/accumulateur_87/bos

la photo est bien uploader mais le nom de la photo est tronquer... le nombre de caractère dans l'adresse est limité...

Y'a t'il une solution simple autre que de revoir toute l'organisation des produits ?

Accessoirement lors de la suppression d'une catégorie, le dossier n'est pas supprimer du serveur

Merci

Ce message a été modifié par Budington - 2 Oct 2014, 14:04.
Go to the top of the page
 
momoxygene
posté 18 Mar 2015, 14:05
Message #5


Ceinture jaune OSC
Icône de groupe

Groupe : Membres
Messages : 72
Inscrit : 22-January 10
Lieu : Bourges 18
Membre no 26930



Bonjour FoxP2,

Super cette contribution!
cependant avant de me lancer dans son installation j'aurais une question.
Est ce qu'en installant cette contribution sur une boutique déjà en route depuis longtemps avec environ 700 produits les images et les dossiers vont se mettre en place automatiquement?
Ou faut il le faire manuellement après installation?

D'avance merci pour ta réponse. Aux autre aussi pour ceux qui l'auraient déjà installée

momoxygene


--------------------
Oscommerce 2.3.4 + Template algozone + Customer_Extra_Fields + Discount_coupon_3.1 + Quick_Updates_2.9.2 + order_edi
tor1.3 + SEO URL 5PRO (R205) + Auto backup + Multiorders V2.1 + oSticket + pdf_customer_invoice_v1.3(problème avec le symbole €)
Go to the top of the page
 
chti_poupon
posté 18 Mar 2015, 15:58
Message #6


Ceinture noire OSC
Icône de groupe

Groupe : TechDev
Messages : 2744
Inscrit : 9-September 08
Lieu : Douai
Membre no 22915



Bonjour
Le premier message de ce fil parle de créer des répertoires en arborescence, avec des noms conformes.
Il n'y a donc aucune copie d'images anciennes, dont d'ailleurs le nom ne t'est pas demandé.
Il faut donc effectivement tout reprendre un par un. Et, si nécessaire, renommer les produits et catégories pour leur donner un nom conforme (sinon, voir le msg de Budington)**
Dans ce cas, le téléchargement du répertoire images actuel en local (s'il n'existe pas déjà) simplifiera le travail, qui peut se faire petit à petit, le fonctionnement étant assuré tant que l'ancien répertoire images n'est pas supprimé!
Bon code !!
Chti poupon
PS: Attention, dans certains hébergements mutualisés où SAFE_MODE est actif, mkdir crée un répertoire inaccessible au téléchargement par php (pb propriétaire).
Utiliser alors l'alternative FTP (par exemple ici)
On peut aisément détecter le SAFE_MODE comme décrit ici
**Pour les accents, on peut traiter le nom de la catégorie et du produit par la fonction accents (proposée par chrysalide dans la contrib MondialRelay):
Code
function accents($chaine)
    {
        $conversion = array("¥" => "Y", "µ" => "u", "À" => "A", "Á" => "A",
                "Â" => "A", "Ã" => "A", "Ä" => "A", "Å" => "A",
                "Æ" => "A", "Ç" => "C", "È" => "E", "É" => "E",
                "Ê" => "E", "Ë" => "E", "Ì" => "I", "Í" => "I",
                "Î" => "I", "Ï" => "I", "Ð" => "D", "Ñ" => "N",
                "Ò" => "O", "Ó" => "O", "Ô" => "O", "Õ" => "O",
                "Ö" => "O", "Ø" => "O", "Ù" => "U", "Ú" => "U",
                "Û" => "U", "Ü" => "U", "Ý" => "Y", "ß" => "s",
                "à" => "a", "á" => "a", "â" => "a", "ã" => "a",
                "ä" => "a", "å" => "a", "æ" => "a", "ç" => "c",
                "è" => "e", "é" => "e", "ê" => "e", "ë" => "e",
                "ì" => "i", "í" => "i", "î" => "i", "ï" => "i",
                "ð" => "o", "ñ" => "n", "ò" => "o", "ó" => "o",
                "ô" => "o", "õ" => "o", "ö" => "o", "ø" => "o",
                "ù" => "u", "ú" => "u", "û" => "u", "ü" => "u",
                "ý" => "y", "ÿ" => "y", "°" => "");

return strtr("$chaine", $conversion);
    }
Go to the top of the page
 
momoxygene
posté 18 Mar 2015, 17:03
Message #7


Ceinture jaune OSC
Icône de groupe

Groupe : Membres
Messages : 72
Inscrit : 22-January 10
Lieu : Bourges 18
Membre no 26930



Encore une fois merci chti_poupon.

Les accents c'est pas grave avec SEO url 5 pro j'ai été obligé de ne pas les mettre mais je vais quand même étudier ça de plus prêt car cela me permettra peut être de les ajouter.

Donc si je résume:

  1. - Que j'importe mon dossier image en local et que je créais tout les répertoires et sous répertoires moi même en ajoutant des underscore à la place de chaque espace
  2. - Que je place toutes les images dans les répertoires aux quels elles sont destinées.
  3. - Ensuite je ré-upload le tout dans le dossier images.
  4. - Et j'install la contribution.


Une fois tout ça fait lorsque je créerais un nouveau produit ou une nouvelle catégorie les répertoires devraient se créer tout seul.
C'est bien ça?

Il me reste une précision au sujet de la façon de nommer les répertoires. Est ce que je me fie au nom lors de la création des produits ou des répertoires, ou je dois me fier à l'url une fois qu'elle est traitée pas SEO url 5 pro?

D'avance merci de ton aide.


--------------------
Oscommerce 2.3.4 + Template algozone + Customer_Extra_Fields + Discount_coupon_3.1 + Quick_Updates_2.9.2 + order_edi
tor1.3 + SEO URL 5PRO (R205) + Auto backup + Multiorders V2.1 + oSticket + pdf_customer_invoice_v1.3(problème avec le symbole €)
Go to the top of the page
 

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



RSS Version bas débit Nous sommes le : 18th November 2017 - 22:38
Ce site est déclaré auprès de la commision Nationale
de l'Informatique et des Libertés (déclaration n°: 1043896)