[SI-LINDER-PARTNER-2][OSC] - Refonte du site Internet pour supporter le Responsive Design /* ATTENTION - le design du site ne peut pas être passé en doctype html (html 5) dans la révision 1 du design. bien qu'une révision 2 sera instanciée plus tard (l'année prochaine), il faudra se contenter de nombreux workaround en restant en HTML TRANSITIONAL 4.01 Du fait du nombre massif des éléments DE CETTE PAGE (et de ce qui en découlerait) qui seront à revoir pour transformer le design en design responsive.. .. il est alors plus judicieux de globaliser un TAG unique pour cette tâche pour ne pas alourdir de commentaires le code déjà suffisemment alourdi comme cela! En gros, ici, pour cette méga-tâche, je vais utiliser un format maison de commentaires pour cette tâche précise: --> pour en comprendre les méandres, voir le fichier /[!] - Saphyra-Interactive-TaskList-Explanations/[SI-LINDER-PARTNER-2][OSC]--semantic.php */ // <- [SI-LINDER-PARTNER-2][OSC] - Refonte du site Internet pour supporter le Responsive Design ?>add(NAVBAR_TITLE, tep_href_link(FILENAME_PRODUCTS_NEW)); ?> > <?php echo TITLE; ?> [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions]:{ - 1/ on déclare une petite variable, sous forme de tableau associatif, ce tableau servira à identifier la page (au lieu d'utiliser PHP_SELF etc..) et cette identification servira dans le nouveau fichier d'inclusion de design dynamique inclu en [2] c'est tout simple ! - 2/ inclusion du fichier PHP chargeur du design, ce sera à ce fichier inclu de décider quels assets (scripts, feuilles de styles, autres) charger! } */ ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN // [RESPONSIVE_DESIGN_2020_IMPLEMENTATION_CARDBOARD_2020_SAPHYRA_INTERACTIVE_ETAPE_1] $_SI__NewDesign = array( 'pageFilepath' => '/products_new.php' ); // ([1])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([2])-->BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END require_once('--SI--2020DesignInitializer.php'); /* [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions] ************************************************************************/ ?> [SI-LINDER-PARTNER-2][OSC][AddClassDescription(isPage--ProductsNew isResponsive--Main)]:{" ATTENTION (ne pas oublier cette ligne!) servira à cibler cette page précise dans un sélecteur css.. // [RESPONSIVE_DESIGN_2020_IMPLEMENTATION_CARDBOARD_2020_SAPHYRA_INTERACTIVE_ETAPE_2] "} ?> [SI-LINDER-PARTNER-2][OSC][SimpleTaskDescription]:{" on modifie la taille de cette cellule, qui est celle de gauche (avant) gérée via la constante PHP BOX_WIDTH de OSCommerce, (désormais), gérée par une valeur en dur, pourquoi? (1) la valeur initiale est gérée par une constante PHP, mais sa valeur... est aussi la modificatrice de la cellule de droite.. Ce qui pose problème quand on veut juste modifier celle de gauche et ne pas intervenir sur celle de droite, donc, ici, on modifie le echo BOX_WIDTH par une valeur fixée plus souple et enfin, on ajoute une classe pour pouvoir cibler cette cellule de tableau afin de la masquer en responsive ou autres ! // [RESPONSIVE_DESIGN_2020_IMPLEMENTATION_CARDBOARD_2020_SAPHYRA_INTERACTIVE_ETAPE_3] "} ?> [SI-LINDER-PARTNER-2][OSC][SimpleTaskDescription]:{" on ajoute une classe pour pouvoir cibler cette cellule de tableau afin de la masquer en responsive ou autres ! // [RESPONSIVE_DESIGN_2020_IMPLEMENTATION_CARDBOARD_2020_SAPHYRA_INTERACTIVE_ETAPE_4] "} ?>
OSC-78: Gestion de catégories réservées aux professionnels // Si le client n'est pas identifié, cela aménerait une warning ERROR (de fait que la variable $customer_id) n'existerait pas! // Ainsi, on vérifie si la variable est vide/inexistante // Par précaution, on va créé une variable temporaire et l'utiliser pour stocker le customer_id. et on on la déclare valorisée à vide si c'est le cas sinon on créé. // Modifier la variable par défaut créée par oscommerce n'ammènerait que des ennuis (et pas forcément tout de suite mais lors de futurs développements). // Ainsi, on créé une variable vide: $osc_78_customer_id_container = ''; if (empty($customer_id)) { $osc_78_customer_id_container = ''; } else { $osc_78_customer_id_container = $customer_id; } // On ajoute des clauses WHERE à la requête SQL basé (pour éviter de retourner TOUT ce qui est PRO si l'utilisateur ne l'est pas (ou n'est pas identifié)) // Les clauses WHERE additionnelles seront sur ce que nous retournera la fonction find_pro_cat_sql_filter() // déclarée dans le fichier ../functions/general.php // Si la clause: p2c.products_id = p.products_id and // Est omise: osCommerce affichera quand même les produits qui sont dans les catégories pros... // Car, au niveau SQL, plus d'un enregistrement sera renvoyé ! // // Important: ici, on écrit le SELECT DISTINCT en majuscule pas en minuscules. // Sinon: on aura une erreur de syntaxe SQL: near '*) as total from products p, products_description pd, specials s, products_to_c' at line 1 // Cela est du au fait que MySQL ne tolère pas la fonction distinct avec un '*' dans un COUNT() en ce qui concerne les fonctions. // La chaîne de code "select count(distinct *) est ajouté par oscommerce via la classe: splitPageResults // -> includes/classes/split_page_results.php // C'est donc cette classe qui provoque ce bug.. // Mais elle ne modifie QUE SI la clause: "distinct" est écrite en minuscule (planterait aussi sur le GROUP BY).. $products_new_query_raw = "SELECT DISTINCT p.products_id, pd.products_name, p.products_image, p.products_price, p.products_tax_class_id, p.products_date_added, m.manufacturers_name from " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on (p.manufacturers_id = m.manufacturers_id), " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c where p2c.products_id = p.products_id and p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '" . (int)$languages_id . "' " . find_pro_cat_sql_filter("p2c.", "and", $osc_78_customer_id_container) . " order by p.products_date_added DESC, pd.products_name"; // <- OSC-78: Gestion de catégories réservées aux professionnels // [VTAB-TEAM-LINDER-PARTNER-1][OSC][SimpleTaskDescription]:{" suite à une demande du client, on augmente le nombre de produits listés par pages dynamiques en ce qui concerne ce fichier "Nouveaux Produits" : on multiplie par deux la constante PHP (qui est issue d'une configuration dans le backOffice) "} $products_new_split = new splitPageResults($products_new_query_raw, (MAX_DISPLAY_PRODUCTS_NEW * 2)); // -> OSC-78: Gestion de catégories réservées aux professionnels // Fixe un bug avec l'affichage de page par la classe splitPageResults(). // Ce bug retournait: 1 produit (ou 2).. // Ce n'est PAS du tout le véritable chiffre QUE me retourne phpMyAdmin si j'y tapes la requête contenue dans $products_new_query_raw. // Ainsi, je vais laisser splitPageResults() se lancer, mais modifier JUSTE après ses valeurs (qu'elles aura faussé avec la modification de la requête SQL). // // explication: // La modification érronnée (dans ce cas) de la commande SQL s'effectue dans le fichier: includes/classes/split_page_results.php // Et on voit clairement qu'avec les strpos, la classe tente de réorganiser la requête du COUNT() // // solution: // Pour cela, il faut faire un count sur le nombre de lignes retournés par la commande SQL. $sqlRequest_for_finding_all_new_products_by_usergroup = tep_db_query($products_new_query_raw); $countHowMany_new_products_exists_in = tep_db_num_rows($sqlRequest_for_finding_all_new_products_by_usergroup); // die(strval($countHowMany_new_products_exists_in)); <= renvoie le chiffre exact au format texte car en int ça affiche rien (en debug). // Avec le chiffre retourné par MySQL, on va revaloriser toutes propriétés faussées par splitPageResults(). // // Nombre de LIGNES: $products_new_split->number_of_rows = $countHowMany_new_products_exists_in; // Nombre de produits par PAGES: // [VTAB-TEAM-LINDER-PARTNER-1][OSC][SimpleTaskDescription]:{" suite à une demande du client, on augmente le nombre de produits listés par pages dynamiques en ce qui concerne ce fichier "Nouveaux Produits" : on multiplie par deux la constante PHP (qui est issue d'une configuration dans le backOffice) "} $products_new_split->number_of_rows_per_page = (MAX_DISPLAY_PRODUCTS_NEW * 2); // Nombre de PAGES: $products_new_split->number_of_pages = ceil($products_new_split->number_of_rows / $products_new_split->number_of_rows_per_page); // Page ACTUELLE: if (!empty($_GET['page'])) { $products_new_split->current_page_number = $_GET['page']; } else { $products_new_split->current_page_number = 1; } // Et on modifie les frontières (de l'enregistrement SQL -> à l'enregistrement SQL) en temps réél, car la classe s'est complètement plantée ! // En ajoutant la clause LIMIT correcte tout en revalorisant la propriété sql_query ayant été revalorisé par la classe qui a ajouté limit 0, 10. // Pour cela un peu de mathématique: $frontiers = ($products_new_split->number_of_rows_per_page * ($products_new_split->current_page_number - 1)); // max() est une fonction PHP qui va retourner la plus haute valeur dans un tableau (ou si ce n'est pas un tableau, l'élément sous forme chiffrée)). $products_new_split->sql_query = $products_new_query_raw . " LIMIT " . max($frontiers, 0) . ", " . $products_new_split->number_of_rows_per_page; // Le reste fonctionnera sans besoin d'être modifié. // <- OSC-78: Gestion de catégories réservées aux professionnels /************************************************************************ [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions]:{ - 1/ on va plus joliment styliser cet endroit afin d'afficher le tableau de pagination, avec beaucoup plus de style et proprement - 2/ on modifie la valeur vérifiée de PREV_NEXT_BAR_LOCATION, par 2, au lieu de 1, afin d'afficher le tableau de pagination, proprement - 3/ on ajoute au tableau ces classes CSS: infoTableCounterPagination et uk-table - 4/ on ajoute à la suite de cette cellule qui a déjà la classe 'smallText' ces classes CSS: infoCellCounterPagination et productsCounter et on modifie aussi le terme 'Afficher' par 'Affichage de' - 5/ on ajoute à la suite de cette cellule qui a déjà la classe 'smallText' ces classes CSS: infoCellCounterPagination et paginationLinks [VTAB-TEAM-LINDER-PARTNER-1][OSC][MultiTaskDescriptions] - Revue de la charte Graphique: - 1/ ajout d'une nouvelle classe la afin de permettre l'alignement nécessaire des indicateurs de suivi de page pour qu'ils ne sortent pas de leur conteneur et entraîne un décalage au niveau de l'écran } */ // ([1])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN // ([2])-->BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END if (($products_new_split->number_of_rows > 0) && ((PREV_NEXT_BAR_LOCATION == '2') || (PREV_NEXT_BAR_LOCATION == '3'))) { ?> BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END /* [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions] ************************************************************************/ ?> [SI-LINDER-PARTNER-2][OSC][AddClassDescription(productsNewListing)]:{" on aura besoin de cibler très sérieusement ce tableau plus tard, on va donc lui donner une classe "} ?> [VTAB-TEAM-LINDER-PARTNER-1][OSC][SimpleTaskDescription]:{" modification de l'attribut HTML width en interne "} ?> [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions]:{ - 1/ on va plus joliment styliser cet endroit afin d'afficher le tableau de pagination, avec beaucoup plus de style et proprement - 2/ on ajoute au tableau ces classes CSS: infoTableCounterPagination et uk-table - 3/ on ajoute à la suite de cette cellule qui a déjà la classe 'smallText' ces classes CSS: infoCellCounterPagination et productsCounter et on modifie aussi le terme 'Afficher' par 'Affichage de' - 4/ on ajoute à la suite de cette cellule qui a déjà la classe 'smallText' ces classes CSS: infoCellCounterPagination et paginationLinks - 5/ exceptionnellement pour ici, on intervertit l'ordre d'affichage des deux cellules en [3] et [4], ainsi que leur "align="right"" [VTAB-TEAM-LINDER-PARTNER-1][OSC][MultiTaskDescriptions] - Revue de la charte Graphique: - 1/ ajout d'une nouvelle classe la afin de permettre l'alignement nécessaire des indicateurs de suivi de page pour qu'ils ne sortent pas de leur conteneur et entraîne un décalage au niveau de l'écran } */ // ([1])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN if (($products_new_split->number_of_rows > 0) && ((PREV_NEXT_BAR_LOCATION == '2') || (PREV_NEXT_BAR_LOCATION == '3'))) { ?> BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END /* [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions] ************************************************************************/ ?>
[SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions]:{ - 1/ petits changements sur la structure et sur le texte sert uniquement à restyliser l'élément pour le centrer par exemple et le re-marger - 2/ à l'origine, ici, il y avait une image, désormais, en attendant d'éventuellement lui trouver une belle image, on va alors la commenter } */ ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN ?> BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions] ************************************************************************ */ ?>
BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END ?> BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?>
display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW); ?>
[SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions]:{ - 1/ on va plus joliment styliser cet endroit afin d'afficher un entête (non triable) des colonnes, initialement non prévue - 2/ déjà on structure une nouvelle ligne dans le tableau () et on la rempli de 3 cellules (à l'exactitude) du nombre de colonnes de contenus (après ce premier ) (voir CODETAG [EXACT_COLUMNS_NUMBER_INITIALLY_HERE]) - 3/ maintenant pour chacune des cellules ajoutées (BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([1])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END /* [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions] ************************************************************************/ ?> [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions]:{ - 1/ on va plus joliment styliser cet endroit afin d'afficher le tableau de listing, avec beaucoup plus de style et proprement - 2/ déjà on restructure le code (et on le reformate, car franchement le merdier d'avant était imbuvable) - 3/ ensuite on fixe un problème d'encodage très étrange, en effet, ici se trouvait un ' du tableau en cours.. la classe utilisée ici sera dépendante du contenu de l'index hasCSSRowClass défini en [5] - 7/ on intègre un code concernant un test d'existence des images des produits, on reseigne un index de la variable déclarée en [4] - 8/ on utilise un index précis ici de la variable déclarée en [4], cela nous permettra d'avoir la bonne image à afficher - 9/ maintenant pour chacune des cellules ajoutées ( VD : suppression du nom du fournisseur dans la liste des nouveautés, ajout des prix par pallier ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN ?> BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([1])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END /* [SI-LINDER-PARTNER-2][OSC][MultiTaskDescriptions] ************************************************************************/ ?>
) on va leur donner un tout nouvel attribut design-element-target ce nouvel attribut nous permettra d'identifier la colonne d'entête, ça ne servira qu'à ça, pas de ciblage via Javascript, rien de ça! en plus de cela, on ajoute une classe afin de pouvoir cibler via CSS la cellule de manière moins filtrée, donc globalement la définir comme un entête et on écrit un petit texte d'entête [VTAB-TEAM-LINDER-PARTNER-1][OSC][MultiTaskDescriptions] - Revue de la charte Graphique: - 1/ retrait du saut de ligne HTML par mise en commentaire } */ // ([1])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN // ([2])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN ?>
Visuel Réduit Informations Ajouter au Panier
' au lieu de '', ce qui est désormais fixé - 4/ on va créér une nouvelle variable de référence une simple variable de type tableau à index nommés, on ajoute un index mustRowCSSChange afin de pouvoir garder une trace de la classe -even ou -odd à afficher cela servira plus tard afin de permettre la dissociation des cellules (une sur deux) on ajoute un index hasCSSRowClass afin de pouvoir garder une trace de la classe -even ou -odd à afficher cela servira plus tard afin de permettre la dissociation des cellules (une sur deux), a besoin de mustRowCSSChange pour que sa logique soit correctement appliquée on ajoute un index productsNewImage afin de pouvoir garder en mémoire l'image cela servira plus tard afin d'afficher l'image du produit ou une image placeholder (en cas que l'image est absente du serveur), on n'obtiendra cette information que plus tard dans la boucle donc, on valorise à vide '.notfound' - 5/ on va instaurer ici le système de dissociation de cellule -even et -odd pour cela, on se basera sur un procédé simple, on vérifie l'index mustRowCSSChange (voir étape [4]) si c'est égal à true = alors on changera la valeur de hasCSSRowClass pour EVEN sinon ce sera ODD évidemment, le mustRowCSSChange changera aussi de valeur booléenne sinon, ça resterait toujours identique.. - 6/ initialement, ici, il n'y avait pas de classe CSS, mais on va en ajouter une, car on souhaite dissocier une fois sur deux la couleur de la ligne
) on va leur donner un tout nouvel attribut design-element-target ce nouvel attribut nous permettra d'identifier la colonne d'entête, ça ne servira qu'à ça, pas de ciblage via Javascript, rien de ça! en plus de cela, on ajoute une classe afin de pouvoir cibler via CSS la cellule de manière moins filtrée, donc globalement la définir comme un contenu (une donnée/une valeur dynamique) - 10/ remplacement de l'ancien bouton (lien) ou (soumission), pour l'avoir désormais géré par UI Kit, mais aussi, avec une classe précise - 11/ on reformate le lien : retrait des éléments HTML , inutile, ajout de classes au lien, et d'une structure HTML amusante, pour l'avoir désormais géré par UI Kit, mais aussi, avec une classe précise, oh, et on précède le lien d'une icone UI Kit et on ajoute un saut de ligne juste avant la fin - 12/ on reformate le bloc de la date d'ajout au catalogue de produits, on lui donne un et une classe à ce span, pour le cibler plus tard via CSS oh, et on précède le lien d'une icone UI Kit et on ajoute une ligne horizontale
juste avant la fin pour séparer le contenu informatif du prix - 13/ on ajoute juste un petit attribut à l'image du produit, cet attribut est un ID, utilisé par CSS pour cibler CES images - 14/ on commente l'ancien système de prix du fait qu'on l'a complètement revu (cf: étape [15] à [18]) (voir CODETAG [NEW_PRICE_DIPLAYER_HERE]) - 15/ on va revoir les éléments de grilles tarifaires, et aussi la structure (du code), ainsi que les conditions afin de mieux filtrer les cas d'affichage (tableau ou prix direct) utiliser les nouvelles versions de méthodes de PriceFormatter ici (getPricePartnerVersion2), (getPriceStringVersion2), est très utile, dans le sens où le tableau est très chargé, on a que très peu d'espace, et le peu que l'on a en terme d'espace nécéssite absolument de fonctionner en responsive et pour le reste des cas, gérés par (getPriceString) et (getPricePartner) nous allons uniquement remplacer les termes "EUR" par le symbole € spécialement créé pour la nouvelle version du design - 16/ gestion du cas professionnel, qui n'était pas géré avant, on avait que le cas partenaire... ATTENTION si cela pose problème, supprimer cette sous-tâche. (ou la commenter, le reste fonctionnera comme avant, sans autres modifications!) - 17/ usage de (getPricePartnerVersion2) à la place de (getPricePartner) usage de (getPriceStringVersion2) à la place de (getPriceString) - 18/ revue des conditions (cas) d'affichage, partenaire, professionnel ou client particulier remplacement du symbole monétaire EUR par € (et plus précisemment son entité HTML: € pour un affichage impeccable) différenciation des cas d'affichage des prix (palier/prix direct) revue des prix barrés en EUROS, afin d'éviter les prix barrés barrant le symbole € (ce qui fait pas joli) pour les prix directs, on ajoutera une classe directPriceStringHT ou directPriceStringTTC selon le type de prix, afin de le styliser plus tard - 19/ on reformate le bloc du prix de produits, on lui donne un
et une classe à ce section, pour le cibler plus tard via CSS oh, et on ne précède pas ici l'élément d'un icone UI Kit, on le fait plutôt ailleurs (voir CODETAG [UIKIT_ICON_IS_DEFINED_HERE]) [VTAB-TEAM-LINDER-PARTNER-1][OSC][MultiTaskDescriptions] - Revue de la charte Graphique: - 1/ suite à la révision du fichier /includes/classes/PriceFormatter.php qui implique le retrait de tout élément raturé/barré dans la sortie construite des prix barrés ! nous supprimons désormais à différents endroits du code la détection (qui symbolise une balise de fermeture de rature d'un élément (ex: 0.90 € = prix barré de 0.90 € !). ces changements opéreront dans des endroits spécifiques du code: les expressions régulières de remplacement/de recherche et de stockage - 2/ dans le but de davantage pouvoir avoir en [4] et valorisé en [3] un granularité beaucoup plus précise dans le ciblage CSS on ajoute un index spécial au tableau PHP qui nous aidera à délimiter le profil commercial du client - 3/ on va valoriser l'index déclaré en [2] selon si le client est un partenaire ou bien si le client est un professionnel à travers une petite vérification qui trouvera le profil du client si le client est un partenaire : Partenaire si le client est un professionnel : Professionnel si le client n'est ni l'un ni l'autre : Standard l'instruction (else if) évite le cas où le client est en même temps un Professionnel qui est un Partenaire: si le client est un Partenaire, la vérification sera résultante en Partenaire, peu importe si il est Professionnel. - 4/ on injecte la nouvelle donnée dynamique renseignée en [3] de manière à donner à chaque colonne un ciblage bien plus précis du profil client cela pourra ensuite servir dans une règle CSS pour cibler l'élément généré - 5/ retrait de la barre
, ne va plus avec le nouveau design. - 6/ ajout de classes CSS ici - 7/ ajout d'une petite structure HTML à cet endroit - 8/ mise en commentaire HTML d'une cellule séparatrice propre à OSCommerce en natif - 9/ ajout d'une
pour permettre le centrage de deux éléments au sein de la page nouveaux produits. - 10/ ajout d'une classe pour styliser le nom du produit - 11/ on a besoin de filtrer davantage plus précisemment les groupes de clients, on avait initialement 3 groupes de clients: particulier, professionnel et partenaire de nos jours, il n'y a pas grand chose qui change par rapport à ce qu'on voulait, mais, une terminologie a changé: les Partenaires sont devenus des VIP en théorie on souhaite qu'un compte client soit : - particulier (connecté ou non) - pro - VIP précisons qu'en théorie il ne peut pas être à la fois pro et VIP, ça n’a pas de sens donc introduction de cette étape, on va filtrer ça dans ce sens sachant qu'en pratique, comme configurable depuis l'administration du site, un compte client peut être: - Particulier (connecté ou non) - Professionnel - VIP + Particulier - VIP + Professionnel (la faute à un ensemble de bouton-radio pour le groupe de client "Particulier" et "Professionnel") (et usage d'une case-à-cocher pour le groupe de client "VIP" (encore configuré comme Partenaire dans la base de données et administration) donc, ce qui en théorie devrait être appliqué ne peut pas être appliqué tel quel.. du coup, on doit ruser: on va vérifier si un compte (identifié ou non) n'est PAS VIP mais est Professionnel, SINON SI un compte est juste VIP OU Particulier initialement on vérifiait comme suit: si un compte était Professionnel alors: si un compte était Professionnel ET VIP alors (on appellait ça le double-check, mais de nos jours, il n'est plus viable de se servir de cette condition, on la supprimera): sinon si un compte était juste VIP (ce qui n'arrivait jamais donc à cause de la logique développée du système des boutons-radios et des anciennes conditions) ou sinon si un compte était juste Particulier (ça, en revanche, ça pouvait arriver) on va aussi ajouter une logique bien spéciale aux VIP: les VIP auront toujours une mention au-dessus de leur prix (ou à côté/en-dessous): Prix VIP les VIP auront par extension le statut Professionnel en plus d'être VIP, mais la condition d'être Professionnel quand on est VIP ne doit pas exister les VIP n'ont jamais de promotions (ils ont toujours le même prix, donc, on n'affichera pas l'étiquette de 'PROMOTION' pour les VIP les VIP n'ont jamais de prix degressifs (donc pas de palier/de tableaux de prix!), ça c'est déjà fonctionnel pas d'étapes supplémentaires à ajouter ici } */ // ([1])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN // ([2])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN // [EXACT_COLUMNS_NUMBER_INITIALLY_HERE] if ($products_new_split->number_of_rows > 0) { // ([4])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN $pageProductsNew__referencers = array( 'mustRowCSSChange' => false, 'hasCSSRowClass' => '-', 'productsNewImage' => '.notfound', // ([2])-->BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END 'customerProfile' => 'Standard' ); // ([4])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([3])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::BEGIN if ($is_partner == true) { $pageProductsNew__referencers['customerProfile'] = 'Partenaire'; } else if (is_pro_customer() == true) { $pageProductsNew__referencers['customerProfile'] = 'Professionnel'; } // ([3])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END $products_new_query = tep_db_query($products_new_split->sql_query); while ($products_new = tep_db_fetch_array($products_new_query)) { // ([14])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN /* if ($new_price = tep_get_products_special_price($products_new['products_id'])) { $products_price = '' . $currencies->display_price($products_new['products_price'], tep_get_tax_rate($products_new['products_tax_class_id'])) . ' ' . $currencies->display_price($new_price, tep_get_tax_rate($products_new['products_tax_class_id'])) . ''; } else { $products_price = $currencies->display_price($products_new['products_price'], tep_get_tax_rate($products_new['products_tax_class_id'])); } */ // ([14])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([5])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN switch ($pageProductsNew__referencers['mustRowCSSChange']) { default: case false: $pageProductsNew__referencers['hasCSSRowClass'] = 'productsNew-odd'; $pageProductsNew__referencers['mustRowCSSChange'] = true; break; case true: $pageProductsNew__referencers['hasCSSRowClass'] = 'productsNew-even'; $pageProductsNew__referencers['mustRowCSSChange'] = false; break; } // ([5])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([7])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN if (!file_exists(DIR_WS_IMAGES . $products_new['products_image'])) { $pageProductsNew__referencers['productsNewImage'] = DIR_WS_DESIGN . 'SI_DesignV2/placeholder__products.jpg'; } else { $pageProductsNew__referencers['productsNewImage'] = DIR_WS_IMAGES . $products_new['products_image']; } // ([7])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?>
[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN ?> design-element-target="PRODUCTS_NEW_IMAGE_DATA" BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END ?> design-customer-profile="" class="main productsNew-data"> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> ' . tep_image( // ([8])-->BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END $pageProductsNew__referencers['productsNewImage'], $products_new['products_name'], SMALL_IMAGE_WIDTH, SMALL_IMAGE_HEIGHT, // ([13])-->BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END 'id="thumbnail"' ) . ''; ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN ?> design-element-target="PRODUCTS_NEW_NAME_AND_PRICE_AND_DATE_ADDED_DATA" BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END ?> design-customer-profile="" class="main productsNew-data"> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> loadProduct( (int)$products_new['products_id'], (int)$languages_id ); // ([14])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN /* $products_price = $pf->getPriceString( 'productPriceInBox', 'left' ); if ( !$pf->hasQuantityPrice() ) { $products_price = TEXT_PRICE . $products_price; }; */ // ([14])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([15])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN // [NEW_PRICE_DIPLAYER_HERE] if ($is_partner == true) { // ([17])-->BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END $products_price = $pf->getPricePartnerVersion2(); // ([16])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN } elseif (is_pro_customer() == true) { // ([17])-->BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END $products_price = $pf->getPriceStringVersion2('productPriceInBox', 'right', 'Standard', 'Non!'); // ([16])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END } else { // ([17])-->BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END $products_price = $pf->getPriceStringVersion2('productPriceInBox', 'right', 'Standard', 'Oui!'); } // ([18])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN // > [start]{"si le prix dispose de paliers, on affiche un tableau de palier"} if ( !empty($products_price) && preg_match('/infobox/', $products_price) ) { $products_price = str_replace( 'EUR', '', $products_price ); $products_price = preg_replace( // ([1])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::BEGIN '/()(€)(<\/span>)/m', '\1\2\3', // ([1])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END $products_price ); // < [stop]{"si le prix dispose de paliers, on affiche un tableau de palier"} // > [start]{"si le prix ne dispose pas de paliers, on affiche un prix direct"} } else { // ([11])-->BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END // > [start]{"si le client n'est pas un partenaire mais est un client pro, on affiche en HT"} if ($is_partner != true AND is_pro_customer() == true) { // si il y a des soucis avec le getPriceStringVersion2() ci-dessous, changer en getPriceString() $products_price = $pf->getPriceStringVersion2(); $products_price = str_replace( 'EUR', '', $products_price ) . '
HT'; $products_price = preg_replace( // ([1])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::BEGIN '/()(€)(<\/span>)/m', '\1\2\3', // ([1])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END $products_price ); // [UIKIT_ICON_IS_DEFINED_HERE] $products_price = '
' . $products_price . '
'; // < [stop]{"si le client n'est pas un partenaire mais est un client pro, on affiche en HT"} } // > [start]{"si le client est un client partenaire, on affiche en HT"} else if ($is_partner == true) { // si il y a des soucis avec le getPricePartnerVersion2() ci-dessous, changer en getPricePartner() $products_price = $pf->getPricePartnerVersion2(); $products_price = str_replace( 'EUR', '', $products_price // ([11])-->BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END ); $products_price = preg_replace( // ([1])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::BEGIN '/()(€)(<\/span>)/m', '\1\2\3', // ([1])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END $products_price ); // [UIKIT_ICON_IS_DEFINED_HERE] $products_price = '
' . $products_price . '
'; // < [stop]{"si le client est un client partenaire, on affiche en HT"} // > [start]{"si le client n'est pas un client pro ni partenaire, on affiche en TTC"} } else { $products_price = $currencies->afficher_prix_ttc($products_new['products_price'], tep_get_tax_rate($products_new['products_tax_class_id'])); $products_price = str_replace( 'EUR', '', $products_price ) . '
TTC'; $products_price = preg_replace( // ([1])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::BEGIN '/()(€)(<\/span>)/m', '\1\2\3', // ([1])-->[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END $products_price ); // [UIKIT_ICON_IS_DEFINED_HERE] $products_price = '
' . $products_price . '
'; } // < [stop]{"si le client n'est pas un client pro ni partenaire, on affiche en TTC"} } // > [stop]{"si le prix ne dispose pas de paliers, on affiche un prix direct"} // ([18])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([15])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([11])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN echo ' ' // ([10])-->BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END . ' ' . $products_new['products_name'] . '

'; // ([11])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([12])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN echo '
' . '' // ([9])-->BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::BEGIN . '
' . '' . TEXT_DATE_ADDED .' ' . '' . ' ' . '' . tep_date_long( $products_new['products_date_added'] ) // ([5])-->BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END . '' . '
'; // ([9])-->BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END // ([12])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END // ([19])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN echo '
' . '
' . $products_price . '
'; // ([19])-->[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?>
BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END ?> design-customer-profile="" class="main productsNew-data" [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> align="center" valign="middle"> BEGIN[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::END ?>
[VTAB-TEAM-LINDER-PARTNER-1][OSC][SubTaskDescription]::BEGIN ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::BEGIN // ([4])-->BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> BEGIN[SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?> [SI-LINDER-PARTNER-2][OSC][SubTaskDescription]::END ?>
display_count(TEXT_DISPLAY_NUMBER_OF_PRODUCTS_NEW); ?>
[SI-LINDER-PARTNER-2][OSC][SimpleTaskDescription]:{" on ajoute un élément HTML et une classe pour pouvoir cibler cette zone afin de la styliser en responsive ou autres ! "} ?>