Système de filtres de produits

VaN
Mammouth du PHP | 1107 Messages

13 mai 2010, 16:59

Bonjour,

j'ai une application e-commerce. Mes rayons sont composés de produits, et ces produits sont composés de références. En gros, une référence est une occurence d'un produit, à laquelle sont liées des options de produit. Par option, j'entends tout ce qui peux différer d'une référence à l'autre, comme la taille, la couleur, etc.

J'ai donc par exemple un produit A, avec 2 références. 1 référence avec les options Couleur : Rouge et Taille : S, et 1 référence avec les options Couleur : Noir et Taille : M.

Sur ma fiche produit, j'affiche les différentes options liées au produit, avec un menu déroulant pou chacune listant les choix possibles, et qui vont me permettre de savoir quelle référence du produit le client veut acheter.

Ce que je cherche à faire, c'est lorsque l'utilisateur choisit une valeur pour l'une des options, cela rafraîchit automatiquement les autres menus déroulants, avec seulement les choix possibles restant en fonction du choix fait à l'instant.

Exemple : L'utilisateur affiche le produit T-shirt #1. Sur ce produit, 3 options, taille, couleur et manches.
La référence R1 possède les options Taille S, couleur rouge, manche longues,
La référence R2 possède les options Taille M, couleur noire, manches courtes.
La référence R3 possède les options Taille S, couleur rouge, manche courtes.
Si l'utilisateur choisit S dans le menu déroulant de l'option Taille, j'aimerai que le menu déroulant Couleur se mette à jour automatiquement, et ne contienne que le choix "rouge", puisque les seules références possibles pour la taille S sont les références R1 et R3.

Et évidemment, j'aimerai que cela fonctionne également lorsque l'on cumule les choix.
Si l'utilisateur choisit Taille S et manches courtes, le menu déroulant Couleur ne doit proposer que "rouge".

Voici la structure de ma base de données :
--
-- Structure de la table `echope_links_products_options`
--

CREATE TABLE IF NOT EXISTS `echope_links_products_options` (
`link_id` int(11) NOT NULL AUTO_INCREMENT,
`link_product_id` int(11) NOT NULL,
`link_option_id` int(11) NOT NULL,
PRIMARY KEY (`link_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Contenu de la table `echope_links_products_options`
--

INSERT INTO `echope_links_products_options` (`link_id`, `link_product_id`, `link_option_id`) VALUES
(1, 1, 1),
(2, 1, 2);

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

--
-- Structure de la table `echope_links_references_options_choices`
--

CREATE TABLE IF NOT EXISTS `echope_links_references_options_choices` (
`link_id` int(11) NOT NULL AUTO_INCREMENT,
`link_reference_id` int(11) NOT NULL,
`link_option_id` int(11) NOT NULL,
`link_choice_id` int(11) NOT NULL,
PRIMARY KEY (`link_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=15 ;

--
-- Contenu de la table `echope_links_references_options_choices`
--

INSERT INTO `echope_links_references_options_choices` (`link_id`, `link_reference_id`, `link_option_id`, `link_choice_id`) VALUES
(14, 2, 2, 4),
(13, 2, 1, 1),
(7, 1, 1, 1),
(8, 1, 2, 4);

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

--
-- Structure de la table `echope_products`
--

CREATE TABLE IF NOT EXISTS `echope_products` (
`product_id` int(11) NOT NULL AUTO_INCREMENT,
`product_name` varchar(100) NOT NULL,
`product_price` float NOT NULL,
`product_family_id` int(11) NOT NULL,
`product_stock` int(11) NOT NULL,
`product_delivery_delay` smallint(6) NOT NULL,
`product_weight` float NOT NULL,
`product_description` text NOT NULL,
`product_rewrite` text NOT NULL,
`product_statut` tinyint(4) NOT NULL,
PRIMARY KEY (`product_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;

--
-- Contenu de la table `echope_products`
--

INSERT INTO `echope_products` (`product_id`, `product_name`, `product_price`, `product_family_id`, `product_stock`, `product_delivery_delay`, `product_weight`, `product_description`, `product_rewrite`, `product_statut`) VALUES
(1, 'Sac Lolita', 150, 1, 0, 12, 1.5, '<p>Tr&egrave;s beau sac rouge</p>', 'sac-lolita', 1),
(2, 'Sac marron', 145, 1, 5, 5, 2.2, '<p>Joli sac marron</p>', 'sac-marron', 1),
(3, 'Sac #3', 99, 1, 15, 4, 1.6, '', 'sac-3', 1);

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

--
-- Structure de la table `echope_products_options`
--

CREATE TABLE IF NOT EXISTS `echope_products_options` (
`option_id` int(11) NOT NULL AUTO_INCREMENT,
`option_name` varchar(100) NOT NULL,
`option_statut` tinyint(1) NOT NULL,
PRIMARY KEY (`option_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Contenu de la table `echope_products_options`
--

INSERT INTO `echope_products_options` (`option_id`, `option_name`, `option_statut`) VALUES
(1, 'Taille', 1),
(2, 'Couleur', 1);

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

--
-- Structure de la table `echope_products_options_choices`
--

CREATE TABLE IF NOT EXISTS `echope_products_options_choices` (
`choice_id` int(11) NOT NULL AUTO_INCREMENT,
`choice_option_id` int(11) NOT NULL,
`choice_name` varchar(100) NOT NULL,
`choice_statut` tinyint(1) NOT NULL,
PRIMARY KEY (`choice_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;

--
-- Contenu de la table `echope_products_options_choices`
--

INSERT INTO `echope_products_options_choices` (`choice_id`, `choice_option_id`, `choice_name`, `choice_statut`) VALUES
(1, 1, 'S', 1),
(2, 1, 'M', 1),
(3, 2, 'Rouge', 1),
(4, 2, 'Noir', 1);

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

--
-- Structure de la table `echope_products_references`
--

CREATE TABLE IF NOT EXISTS `echope_products_references` (
`reference_id` int(11) NOT NULL AUTO_INCREMENT,
`reference_product_id` int(11) NOT NULL,
`reference_name` varchar(100) NOT NULL,
`reference_price` float NOT NULL,
`reference_stock` int(11) NOT NULL,
`reference_delivery_delay` smallint(6) NOT NULL,
`reference_weight` float NOT NULL,
`reference_rewrite` text NOT NULL,
`reference_statut` tinyint(4) NOT NULL,
PRIMARY KEY (`reference_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;

--
-- Contenu de la table `echope_products_references`
--

INSERT INTO `echope_products_references` (`reference_id`, `reference_product_id`, `reference_name`, `reference_price`, `reference_stock`, `reference_delivery_delay`, `reference_weight`, `reference_rewrite`, `reference_statut`) VALUES
(2, 1, 'Sac Lolita', 150, 0, 12, 1.5, 'sac-lolita', 1);
Comment dois-je m'y prendre ?

Eléphant du PHP | 453 Messages

13 mai 2010, 22:54

Hello VaN,
Ce que je cherche à faire, c'est lorsque l'utilisateur choisit une valeur pour l'une des options, cela rafraîchit automatiquement les autres menus déroulants, avec seulement les choix possibles restant en fonction du choix fait à l'instant.
Je pense que l'Ajax devrait t'aider. ;)
La Tux attitude avec les kiw'z syou plait
Komodo Edit - Inkscape - Dia

Mammouth du PHP | 661 Messages

15 mai 2010, 11:48


VaN
Mammouth du PHP | 1107 Messages

26 mai 2010, 13:30

Je pense que l'Ajax devrait t'aider. ;)
Oui, ce n'est pas comment remplir mes select qui me pose problème, c'est la requête SQL qui va me permettre d'aller chercher les choix possibles restants, en fonction des autres select déjà remplis.
Ce n'est pas tout à fait la même chose. Lui fait à la base une sortie de tri par entonnoir. Moi tous mes choix sont au même niveau.

En gros, je n'arrive pas à écrire la requête SQL qui me permettra de récupérer, classés par menu déroulants, les choix possibles restants (car une référence matchant tous ces critères existe), lorsque qu'un ou plusieurs menus déroulants ont déjà été renseignés.

Mammouth du PHP | 672 Messages

27 mai 2010, 13:14

En gros, je n'arrive pas à écrire la requête SQL qui me permettra de récupérer, classés par menu déroulants, les choix possibles restants (car une référence matchant tous ces critères existe), lorsque qu'un ou plusieurs menus déroulants ont déjà été renseignés.
En gros :
$requete = 'SELECT * FROM MaTable WHERE ';
if (isset ($_POST['taille']) ) {
   $requete .= 'taille = '.$_POST['taille'];
}
Avec autant de IF que de critères (et gestion du cas où il n'y a pas de critère renseigné, sécurisation des $_POST, etc.)...

Mammouth du PHP | 661 Messages

27 mai 2010, 14:43

donc, une proposition de gascon ^^ :

- récupère les noms de champs et leur type (varchar | int | ...)

- parcours $_POST et vérifie tous les types des variables dont la clés correspond au nom du champs de la table

- ajoute automatiquement à ta requête ...