Page 1 sur 1

Système de filtres de produits

Posté : 13 mai 2010, 16:59
par VaN
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 ?

Re: Système de filtres de produits

Posté : 13 mai 2010, 22:54
par niuxe
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. ;)

Re: Système de filtres de produits

Posté : 15 mai 2010, 11:48
par Nours312

Re: Système de filtres de produits

Posté : 26 mai 2010, 13:30
par VaN
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.

Re: Système de filtres de produits

Posté : 27 mai 2010, 13:14
par macgawel
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.)...

Re: Système de filtres de produits

Posté : 27 mai 2010, 14:43
par Nours312
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 ...