Site e-commerce

Recherche d'un "prof particulié" pour conseils/questions

a marqué ce sujet comme résolu.

Salut !

J'ai essayé de regarder comment c'est géré dans Prestashop, mais c'est assez complexe. Cependant, il semble que les promotions sont liées à diverses choses, mais surtout à un produit.
OpenCart ne lie apparemment qu'à un produit.
J'aurais bien regardé dans Magento, mais il faut s'enregistrer pour la version communautaire, sinon payer…

En conséquence, je pense que lier ta table MPL_Promo à un article pourrait probablement te suffire  ;)

+1 -0

Merci de m'avoir répondu !

Oui j'avais regardé prestashop, c'est assez impressionnant le nombre de tables d'ailleurs :o

J'ai essayé de relier à catégorie, au pire je changerais sur produit. J'aimerais pouvoir soldé toute une catégorie entière en faite :p

Au pire je peux la relié au deux (produit et catégorie) ? Ça se fait ça ? Comme ça si jamais je change d'avis et que je veux soldé seulement quelques produits, je serais pas embêté..

Merci encore !

surtout que si tu lie à une catégorie, ça oblige à faire des promos sur un rayon entier ou rien, c'est comme si à Auchan tout le rayon informatique étais en promo…ça va à l'encontre même du principe de la promotion. La promotion à 2 but (pour le commerçant):

  • Faire venir le consommateur en proposant un ou plusieurs "produit d'appel" à prix plus ou moins réduit (et donc la marge aussi). Le commerçant espère que le client, une fois sur place, complétera son ou ses achats, ce qui permettra au commerçant de "rattraper" sa marge.

  • Réduire ou liquider un stock trop important sur un produit (à l'instar des soldes ;) ). Avoir du stock (contrairement aux idées reçus), n'est pas forcément une bonne chose pour un commerçant car le commerçant (pour la faire courte, on va sqwisé la partie compta) à déjà réglé le stock à son fournisseur, donc tant que le stock n'est pas écouler, on peut considérer qu'il est en "perte" sur le produit. Pire encore, il en perd deux fois parce que tant que le stock n'est pas écoulé, il ne peut pas mettre à sa place un autre produit…

Bon, ok, on pourrais se dire en me lisant que je suis un peu passé à coté de ta question…mais pas trop finalement, car si tu à eu le courage de lire jusqu'au bout, tu comprendra que mettre un rayon entier en promo n'à pas de sens (en tant que commerçant ;) )

Bon, sinon, pour en revenir, oui, je penche aussi pour une table promo lié aux articles via l'ID. J'en rajouterais même une autre de table, pour contenir les information propre à la campagne de promo (nom de la promo ("Saint-Valentin" par ex ;) ), date de début et fin de la promo, si les articles en promotion doivent afficher le taux de réduction ou non (Mention obligatoire pour les soldes par ex)....). et ensuite une table contenant les articles qui seront en promotion

Grace à ce système, on évite la redondance des infos, et au niveau des performance, une requête lié à trois tables ne consomme pas beaucoup plus qu'une liaison à deux tables (bon, là, c'est surtout en fonction de comment c'est codé ;) )

+0 -0

Si tu la relies aux deux, essaie de faire une table intermédiaire pour enregistrer la liaison. Une table MPL_Produit_has_MPL_Promo et une autre MPL_Categorie_has_MPL_Promo

[…] Bon, sinon, pour en revenir, oui, je penche aussi pour une table promo lié aux articles via l'ID. J'en rajouterais même une autre de table, pour contenir les information propre à la campagne de promo (nom de la promo ("Saint-Valentin" par ex ;) ), date de début et fin de la promo, si les articles en promotion doivent afficher le taux de réduction ou non (Mention obligatoire pour les soldes par ex)....). et ensuite une table contenant les articles qui seront en promotion

Grace à ce système, on évite la redondance des infos, et au niveau des performance, une requête lié à trois tables ne consomme pas beaucoup plus qu'une liaison à deux tables (bon, là, c'est surtout en fonction de comment c'est codé ;) )

babas

Je ne comprends pas totalement pourquoi séparer la promotion en elle-même de ses informations comme le nom et les dates de fin/début, tu pourrais développer ?

Edit

Ah, pour des groupes de promotions, donc, OK.

+0 -0

Merci d'avoir développé ! C'est vrai que ça n'a pas trop de sens :/

Bon du coup tu m'as convaincu :p

Pour résumé, si je suis ton exemple, ça me fait une table produit (déjà crée), avec une table promo qui pointe son id sur la table produit. Dans cette table promo j'ai une colonne float pour la valeur de la promo. Tu me propose ensuite de créer une autre table pour contenir les informations propre à la campagne avec date et tout mais pourquoi pas mettre dans la même table (Promo) ?

Et encore une autre table pour afficher les articles en promo ? Dans ce cas là, ne serait-ce pas mieux de faire une liaison n-m de ma table promo vers ma table produit ?

Je crois que je pose des questions débile mais j'ai pas bien saisie encore ^^

Edit :

Des groupes de promotions ok mais la colonne "valeur de la promotion" (FLOAT) tu la mettrai où du coup ? Dans la même table que ton groupe de promo ? Ca me semble logique du coup mais je préfère demander toujours

+0 -0

alors, Voici comment je procéderais :

Une table GLOBAL_PROMO :

  • ID_CAMPAGNE_PROMO
  • NAME_PROMO (ex saint-valentin)
  • DATE_START_PROMO
  • DATE_END_PROMO …

Une table ARTICLE_PROMO :

  • ID_ARTICLE_PROMO (ID tiré de ta table d'article)
  • ID_CMP_PROMO (ID tiré de GLOBAL_PROMO)
  • VAL_PROMO (soit le % de réduction, soit le prix de ton article le temps de la promo)

Lors de l'affichage de ta page article, commence par faire une p'tite requête à ta table GLOBAL_PROMO pour savoir si tu à une promo en ce moment (ça évite de faire une jonction de table inutilement gourmande ;) ). si y en à une, récupère l'ID.

ensuite, tu à ta requête classique pour afficher ton article, tu aura donc l'ID de ton article également.

avec tes deux ID il ne te reste plus qu'à faire un appel à la table ARTICLE_PROMO, pour savoir si tu à une concordance sur les 2 ID, et récupérer la VAL_PROMO si oui.

Je t'ai tout décomposé en 3 requêtes, mais sache qu'il est tout à fait possible de tout faire en une seule requête avec les jonctions ;)

+0 -0

Ah ouai d'accord !! :)

Super, j'te remercie vraiment beaucoup de m'avoir décortiqué le problème ! Je devrais réussir à m'en sortir avec les requêtes :p

Dernier petit détail, c'est quoi la meilleure solution pour les dates ? Le timestamp, ou un datetime ?

Bonjour à vous !

Cette fois-ci, c'est un "petit" soucis de conception général qui me pose problème au niveau du back-office. Pour que vous compreniez au mieux le problème, je vais vous rappeler l'architecture global de mon site :

J'ai une architecture MVC très simple avec un dispatcher principal (index à la racine):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php 
session_start();

// Vérification de session en cours
if(!isset($_SESSION["MPL_Pseudo"])){
    // Vérification du cookie de connexion automatique
    if(isset($_COOKIE["ident"])){
        // Récupération du login et du mot de passe
        $log_pwd = explode(" | ",$_COOKIE["ident"]);
        // Identification
        include_once("modele/user/connexion.php");
        if(!identification($log_pwd[0], $log_pwd[1])){
            // Si incorrect -> Suppression du cookie de connexion automatique
            setcookie("ident","");
            unset($_COOKIE["ident"]);
            // header('location:?module=user&action=inscription_connexion&erreur=login');
        }
    }
}

include_once("config/config.inc.php");
include_once("modele/param.inc.php"); 

if (!isset($_GET["module"])) {
    $module = "page";
} else {
    $module = $_GET["module"];
}

if (!isset($_GET["action"])) {
    $action = "index";
} else {
    $action = $_GET["action"];
}

$url = "controleur/". $module ."/". $action .".php";

if (file_exists($url)) {
    include_once($url);
} else {
    include_once("vue/404.php");
}

Pour le back-office, j'ai un dossier admin avec à l'intérieur une nouvelle architecture MVC. (Le dispatcher principal du back-office possède le même code que celui du front).

Ce que je voudrais, c'est qu'une fois qu'on tape dans l'url …admin/ , on arrive sur un formulaire de connexion lorsque la SESSION Admin est vide.

Jusque là pas trop de problème, mais le hic c'est si quelqu'un tape dans une bonne url du style ?module=page&action=index l'utilisateur ne sera pas renvoyé vers le formulaire… A moins que sur tout les pages je précise if(isset($_SESSION[MPL_Admin])) mais je trouve ça un peu lourd ! Est-ce que quelqu'un aurait une idée ? :) Je pense que tout doit se jouer dans le dispatcher principal du back-office mais je vois pas trop comment m'y prendre.

Salut ! je suis pas trop fan de ton système (ergonomie, architecture, sécurité…) mais le temps passe et je suppose qu'il est un peu tard pour rattraper le tir…

Si j'étais toi, je partirais sur une bête redirection vers le formulaire de connexion si SESSION_ADMIN (peut importe comment tu l'a appelé, mais ce nom est plus parlant pour moi ;) ) n'existe pas, est vide ou erroné.

Oui je suis conscient que le système ne soit pas optimal :(

C'est ce que j'ai fait ! Mais du coup si jamais l'utilisateur (mal intentionné) tape une url valide il peut accéder au back-office :/ Donc il faudrait que je test la session dans le dispatcher principal mais je sais pas comment faire avec le code actuel !

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?php 
session_start();

if(!isset($_SESSION["Admin"])){
 // Afficher le formulaire
} else {
 // Afficher le back-office
}


include_once("config/config.inc.php");
include_once("modele/param.inc.php"); 

if (!isset($_GET["module"])) {
    $module = "page";
} else {
    $module = $_GET["module"];
}

if (!isset($_GET["action"])) {
    $action = "index";
} else {
    $action = $_GET["action"];
}

$url = "controleur/". $module ."/". $action .".php";

if (file_exists($url)) {
    include_once($url);
} else {
    include_once("vue/404.php");
}

Après le session start j'ai un début de code pour te montrer mais je vois pas comment faire réellement, car il risque d'y avoir des bugs en faisant comme ça, nan ?


C'est vrai que j'ai pas énormément de temps devant moi, mais si vraiment tu me conseilles de rectifier le tire, je peux tenter :)

Hey !

Donc plutôt que d'organiser tous mes controlers de mon back-office avec des vérifications de SESSION[admin], vous n'avez pas d'autres solutions plus ergonomique ? En soit, ça fonctionne, mais c'est juste que ça m'embête de devoir répéter le même code sur plusieurs pages (ou fichier, vu qu'on parle de mes controlers).

Je vous remercie d'avance si vous avez une suggestion ! :)

Ergonomiques ? ^^

Je crois que PHP permet de créer des templates réutilisables (include, include_once, …) si je me rappelle bien.

Mais tous les frameworks récents utilisent plutôt des "intercepteurs" mais je ne sais pas dans quelle mesure PHP permet d'implémenter ce pattern.

En gros l'idée c'est que ta requête passe par tout un tas d'intercepteurs (des filtres en quelque sorte) les uns après les autres dans lesquels tu vérifies un certain nombre de choses et injecte un contexte (par exemple le nom de l'utilisateur, …) que tu "donnes" aux intercepteurs qui suivent. Et ce jusqu'à arriver au code qui gère la page en question.

Je laisse les experts PHP t'aiguiller sur la solution la plus adaptée, mais la question que tu poses est un "pattern" (motif de conception) qu'on retrouve dans toutes les applications web.

+1 -0

Merci de ta réponse ! Oui d'accord je vois, j'ai déjà entendu parler des filtres PHP mais j'ai jamais eu l'occasion de tester encore (je vois pas comment m'y prendre réellement) et de la même manière que l'include je sais pas si ça règlera le problème : je peux pas faire un include d'un bout de coude sachant qu'à l'intérieur le code ne sera pas le même. Je m'explique :

Exemple d'un de mes controleurs :

1
2
3
4
5
6
<?php
if(!isset($_SESSION["Admin"])){
    include_once("vue/user/login.php"); // Je redirige vers le formulaire de connexion
} else{
    // Tout mon code nécessaire avec mes includes de modèles et mes includes de vue si nécessaire..
}

Comme tu vois, le code de test de SESSION que je vais devoir faire à chaque page par sécurité sera le même sur tous mes controleur. Je peux pas faire un include de ça :/

Si y'a pas de solution c'est pas grave je laisse comme ça, étant donné que ça fonctionne ;)

Par contre ça reste sécurisé ? Aucune personne ne pourra rentrer dans mes vues ?

+0 -0

Mon back-office commence à avoir de la gueule mais je remarque que lorsqu'on se balade via le menu, la classe active que j'ai mis par défaut à mon premier li n'est du coup pas gérer sur les autres.

J'ai regardé un peu sur le web, en PHP et avec un foreach on peut se débrouiller mais je vais avoir des problèmes avec le href="" étant donné que mes urls sont un peu spécials dû à l'architecture MVC.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
        <ul class="sidebar-menu" id="nav-accordion">        
            <li class="mt">
                <a class="active" href="?module=page&amp;action=index">
                    <i class="fa fa-dashboard"></i>
                    <span>Dashboard</span>
                </a>
            </li>
            <li class="sub-menu">
                <a href="javascript:;" >
                    <i class="fa fa-desktop"></i>
                    <span>Produits</span>
                </a>
                <ul class="sub">
                    <li><a  href="?module=product&amp;action=afficher">Afficher</a></li>
                    <li><a  href="?module=product&amp;action=ajouter">Ajouter</a></li>
                </ul>
            </li>
            <li class="sub-menu">
                <a href="javascript:;" >
                    <i class="fa fa-cogs"></i>
                    <span>Catégories</span>
                </a>
                <ul class="sub">
                    <li><a  href="?module=category&amp;action=afficher">Afficher</a></li>
                    <li><a  href="?module=category&amp;action=ajouter">Ajouter</a></li>
                </ul>
            </li>
        </ul>

Deuxième problème que j'ai rencontré : lorsque j'ai un sous menu, j'ai un active sur un li et un autre sur son enfant. Je vois pas comment m'y prendre, je me suis basé sur cette exemple.

Bonjour !

J'ai besoin d'aide pour une requête. Dans la page du back office où j'affiche la liste de tous les produits classés par ordre de catégorie, j'ai la possibilité de supprimer une ligne, ou de la modifier. Concernant la fonction supprimer, j'aurais besoin d'un petit coup de main :)

Pour l'affichage de la liste j'ai fais un foreach assez simple. Sur chaque ligne il y a le bouton supprimer (j'ai pas fais de checkbox car il n'y aura pas vraiment beaucoup de produits). Le problème c'est comment, lorsqu'on appuie sur supprimer je peux obtenir l'id de la ligne pour pouvoir la supprimer correctement sur ma base ?

Salut ! Tu as plusieurs solutions :

  • les checkbox, visiblement, tu ne souhaite pas les utiliser alors qu'elles sont faites pour ça :°
  • soit par l'attribut [ID] de tes multiples boutons submit, que tu remplira avec l'ID de ton produit.

Coté traitement, tu récupère le tableau GET (une fois fait les traitements de sécurités d'usages ;) ) et tu y trouvera l'ID de ton produit, reste plus qu'à faire ta requête DELETE :) (Si j'étais toi, je ferais pas de DELETE, mais un UPDATE qui met à jour un champs produit [Activé / Désactivé], ça évite de te retaper tout le boulot le jour ou tu veut remettre en vente le produit, et si tu as créé une table sur les stats de vente ou autres, tu retrouve l'historique. c'est important pour définir la stratégie marketing....sans compter qu'il me semble qu'au niveau légal, tu est tenu de conserver un historique de tes produits(achat, vente, tarifs, fournisseurs....) ;) )

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte