THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline


Bonjour,

Je réalise actuellement un site visant à vendre des bouteilles de vin en ligne. La livraison du vin ne se fera que par cartons de 6 bouteilles.

Au niveau du panier, je souhaite donc mettre en place une fonction qui précise que "si le nombre de bouteilles sélectionnées n'est pas un multiple de 6 (6 - 12 - 18 - 24...), le panier ne peut être validé".
Au contraire, si le nombre de bouteilles correspond à un multiple de 6, le panier sera validable.

J'ai bien avancé sur la mise en place du site, mais bloque à ce niveau là...

En espérant que vous pourrez m'aider,

Merci

Offline


Bonjour,

Ce n'est pas une fonctionnalité native De Thélia : il va falloir passer par un bout de code.

Une proposition :

-- Interviens au niveau de la validation du panier : celle-ci est réalisée par l'appel de la page adresse.php.
-- Au début de la page adresse.php du template, tu vas coder une instruction php qui dit ceci au serveur : si dans la variable de session $_SESSION['navig'] le nombre d'articles multipliés par leurs quantités respectives est un multiple de 6, tu continues. Sinon tu rediriges ce client vers la page panier.php (avec éventuellement un petit message explicatif)
-- Est-ce que tu parles un peu le php ?

jb

Last edited by ottoroots (06-05-2009 11:24:13)

Offline


Salut,

Je m'incruste un peu pour mieux comprendre l'idée...

1/ Un produit se vend par 6 ?
2/ Ou le panier doit avoir une quantité multiple de 6 ?

Si c'est le premier cas, pourquoi ne pas dire que 1 quantité = 1 lot de 6 ?


Aide les autres, ils t'aideront en retour.

Offline


Avant tout, merci pour vos réponses.

jb :
Oui, je parle le php, mais pas couramment..!
J'avais eu l'idée d'une instruction php de ce type, mis à part que je travaillais sur panier.php... Je vais donc tenter ce que tu me suggères.

Elyos :
Un produit se vend seul, mais il faut en avoir 6 pour pouvoir livrer (basé sur les cartons). Le panier doit donc avoir une quantité multiple de 6.

Je tente l'idée de jb et dirai où j'en suis en milieu d'après-midi.
D'ici là, si d'autres ont des idées nouvelles ou complétant celle déjà émise, elles sont clairement les bienvenues ^^

Merci à tous

Offline


Ok ok.

Donc la solution de jb est la mieux à priori ^^

Tu fais un modulo 6 pour vérifier et hop le tour est joué wink


Aide les autres, ils t'aideront en retour.

Offline


Hum...

Je suis perdu.

L'idée de jb me semble bonne, mais je ne sais pas comment la mettre en place, tout simplement.
Et surtout, je me demande s'il faut intégrer le code dans adresse.php ou ailleurs.

Je demande donc votre aide (très précieuse !)

Offline


Je vais tenter de t'aider comme je peux car moi j'ai modifier thelia à ma sauce pour n'avoir qu'un seul fichier php qui gère toutes mes pages en chargeant le bon template central big_smile

Donc si on part du fait que tu as le fichier adresse.php.

dans adresse.php ajouter :

$panier=1;//ça force à vérifier qu'un panier existe avant de choisir son adresse de livraison

dans moteur.php ligne 232 :

// Vérif panier
if($panier && ! $_SESSION["navig"]->panier->nbart) { header("Location: index.php"); exit; }
//ajout
if($fond && $fond=="adresse.php"){
	if(!verifPanier(6)){ header("Location: panier.php"); exit; }
}

dans divers.php ajouter (à la fin par exemple) :

function verifPanier($qte){
	if(($_SESSION["navig"]->panier->nbart % $qte) == 0){
		return 1;
	}else{
		return 0;
	}
}

dans l'un des fichiers du dossier filtre (filtreegalite.php par exemple) ajouter :

function filtrepasmultiple($texte){

	preg_match_all("`\#FILTRE_pasmultiple\(([^\|]*)\|\|([^\)]*)\|\|([^\)]*)\)`", $texte, $cut);

	$tab1 = "";
	$tab2 = "";

	for($i=0; $i<count($cut[2]); $i++){
	        if((trim($cut[1][$i]) % trim($cut[2][$i]))!=0){
	                $tab1[$i] = "#FILTRE_pasmultiple(" . $cut[1][$i] . "||" . $cut[2][$i] . "||" . $cut[3][$i] . ")";
	                $tab2[$i] = $cut[3][$i];
	        }
	
			else{
                $tab1[$i] = "#FILTRE_pasmultiple(" . $cut[1][$i] . "||" . $cut[2][$i] . "||" . $cut[3][$i] . ")";
                $tab2[$i] = "";
			}

	}

	$texte = str_replace($tab1, $tab2, $texte);

	return $texte;
}

dans filtres.php ajouter dans la fonction filtres :

if(strstr($texte, "#FILTRE_pasmultiple")) $texte = filtrepasmultiple($texte);

dans panier.html ajouter où tu veux :

#FILTRE_pasmultiple(#PANIER_NBART||6||C'est pas un multiple de 6)

Les 3 derniers ajout de code te permettent d'afficher sur ta page panier si le nombre de produits est bien multiple de 6 ou non.
Tu peux même utiliser si tu le souhaite #FILTRE_multiple (qu'il faudra créer comme le filtre #FILTRE_pasmultiple) pour afficher ou non le lien vers adresse.php depuis la page panier.

wink

NB : Je viens de pondre ça à l'arrache donc pas sur que ça marche du premier coup mais l'idée est là ^^.

Last edited by Elyos (06-05-2009 14:45:21)


Aide les autres, ils t'aideront en retour.

  • manu
  • faï tot petar miladiu

Offline


le mieux c'est de faire tout ca dans un plugins pour pas péter le moteur smile

En utilisant les points d'entrée on peut faire ce que tu as donné.


http://doc.thelia.net/
http://thelia.net/modules
http://raynaud.io
PGP public Key : 0xC6E546A6

Offline


Blblblblbllblbbl.
2min, je sors la tête de l'eau...

Moi qui me disais qu'en 2/3 lignes de code ce serait dans la poche...

Elyos merci, mais même en suivant ce que tu m'indiques, je ne m'en sors pas.
Je comprends les grandes lignes, mais entre comprendre et appliquer, il y a un grand pas...

Et je ne vais pas vous demander de me créer un plugin quand même (cf manu)... Quoi que... ^^

Elyos, j'ai rigoureusement suivi ce que tu m'as donné, puis j'ai essayé d'adapter pour faire en sorte que cela fonctionne, en vain.

Je sollicite toujours votre aide pour arriver à mon objectif, en espérant qu'une méthode détaillée vienne soutenir un vieil amoindri comme moi...

Merci

Offline


mdb : je pourrais pas trop te créer un plugin dans l'immédiat car je viens à peine de comprendre au dixième comment ça marchait big_smile

Dis moi ce qui cloche dans ce que je t'ai filé pour que j'ajuste ^^


Aide les autres, ils t'aideront en retour.

Offline


Hello,

Quelques détails sur le sujet en cours :

- 1°) Je crois si ma mémoire est bonne que adresse.php est l'url de redirection suite à une modif ou une création d'adresse de livraison depuis le compte du client (hors d'un procéssus de commande) : il faudra modifier cette redirection car avec ma proposition et la tienne, le client n'accède plus à cette page si le panier n'est pas conforme.

-- 2°) Je pensais faire beaucoup plus simple mais peut-être que ça n'aurait pas marché. Vu ton niveau tu vas pouvoir dissiper mes doutes : est-ce que je peux manipuler un variable de session avant le sessionstart() du moteur ? Si oui j'aurais fortement simplifier en codant simplement l'instruction correspondant grosso modo à ta fonction verifpanier() sur adresse.php directement. Ca évite de toucher au moteur et galérer avec le temps et les versions qui s'enchaînent.

--3°) sur la fonction verfipanier() justement : elle n'ira pas : j'ai pensé comme ça au début mais il ne faut pas calculer sur $nbart mais sur l'addition de la quantité de chaque article.

$qteprod=0;
for($compt = 0; $compt<$_SESSION[‘navig’]->panier->nbart; $compt++){
$qteprod += $_SESSION[‘navig’]->panier->tabarticle[$compt]->quantite;

}
if(($qteprod % $qte) == 0) {header(«Location: panier.php»);exit;}

3°) Sinon il y a peut-être plus simple en passant par javascript l'url de validation sur panier.html serait activée si et seulement si le calcul précédent est bon.... Je pense que je réfléchirais par là.

jb

Last edited by ottoroots (06-05-2009 15:28:31)

Offline


ottoroots wrote:

--3°) sur la fonction verfipanier() justement : elle n'ira pas : j'ai pensé comme ça au début mais il ne faut pas calculer sur $nbart mais sur l'addition de la quantité de chaque article.

Ah oui en effet...

En plus j'avais fait un truc similaire sur ma première boutique Thelia...


Aide les autres, ils t'aideront en retour.

Offline


Voici mes interrogations (quitte à passer pour une chaussette...)

-- adresse.php : OK

-- moteur.php :
A quoi correspond $fond ?
Le reste, ok.

-- divers.php :
A quoi correspondent 1 et 0 ?
Le reste, ok.

-- filtreegalite.php :
Hum... Difficile de comprendre la logique.

--  filtres.php : OK

-- panier.html :
Ne fonctionne pas, cela me renvoie : filtrepasmultiple(||6||C'est pas un multiple de 6)

Voilà voilà...

Offline


mdb wrote:

-- moteur.php :
A quoi correspond $fond ?

$fond correspond au template à charger
Erreur : remplacer if($fond && $fond=="adresse.php"){
par if($fond && $fond=="adresse.html"){

mdb wrote:

-- divers.php :
A quoi correspondent 1 et 0 ?

on retourne la valeur 1 si c'est un multiple et 0 si ça n'en est pas un.
A corriger suivant la remarque de ottoroots

mdb wrote:

-- filtreegalite.php :
Hum... Difficile de comprendre la logique.

En fait je crée un filtre pour que dans ta page panier le client sait si son panier est valide ou pas.
En gros, je fais un peu comme la fonction verifPanier mais dans un filtre.
A corriger suivant la remarque de ottoroots

mdb wrote:

-- panier.html :
Ne fonctionne pas, cela me renvoie : filtrepasmultiple(||6||C'est pas un multiple de 6)

Tu as bien mis le #FILTRE_pasmultiple?

Last edited by Elyos (06-05-2009 15:50:29)


Aide les autres, ils t'aideront en retour.

Offline


-- panier.html :
Oui j'ai mis le #

Voilà où j'en suis :

moteur.php

// Vérif panier
	if($panier && ! $_SESSION["navig"]->panier->nbart) { header("Location: index.php"); exit; } 
	//ajout
	if($fond && $fond=="adresse.html"){
	$qteprod=0;
	for($compt = 0; $compt<$_SESSION[‘navig’]->panier->nbart; $compt++){
	$qteprod += $_SESSION[‘navig’]->panier->tabarticle[$compt]->quantite;
	}

divers.php

function verifPanier($qte){
	if(($_SESSION["navig"]->panier->$qteprod % $qte) == 0){
        return 1;
	}else{
        return 0;
    }

filtreegalite.php

function filtrepasmultiple($texte){

    preg_match_all("`\#FILTRE_pasmultiple\(([^\|]*)\|\|([^\)]*)\|\|([^\)]*)\)`", $texte, $cut);

    $tab1 = "";
    $tab2 = "";

    for($i=0; $i<count($cut[2]); $i++){
            if((trim($cut[1][$i]) % trim($cut[2][$i]))!=0){
                    $tab1[$i] = "#FILTRE_pasmultiple(" . $cut[1][$i] . "||" . $cut[2][$i] . "||" . $cut[3][$i] . ")";
                    $tab2[$i] = $cut[3][$i];
            }
    
            else{
                $tab1[$i] = "#FILTRE_pasmultiple(" . $cut[1][$i] . "||" . $cut[2][$i] . "||" . $cut[3][$i] . ")";
                $tab2[$i] = "";
            }

    }

    $texte = str_replace($tab1, $tab2, $texte);

    return $texte;
}

filtres.php

if(strstr($texte, "#FILTRE_pasmultiple")) $texte = filtrepasmultiple($texte);

panier.html

#FILTRE_pasmultiple(#PANIER_NBART||6||C'est pas un multiple de 6)

Mais pas de résultat viable

Last edited by mdb (06-05-2009 16:02:32)

Offline


On reprend...

moteur.php

// Vérif panier
	if($panier && ! $_SESSION["navig"]->panier->nbart) { header("Location: index.php"); exit; } 
	//ajout
	if($fond && $fond=="adresse.html"){
		if(!verifPanier(6)){ header("Location: panier.php"); exit; }
	}

divers.php

function verifPanier($qte){
	$qteprod=0;
	for($compt = 0; $compt<$_SESSION['navig']->panier->nbart; $compt++){
		$qteprod += $_SESSION['navig']->panier->tabarticle[$compt]->quantite;
	}
	if(($qteprod % $qte) == 0){
        return 1;
	}else{
        return 0;
    }
}

Je regarde pour le filtre car avec la remarque judicieuse de ottoroots ça "marchera pas"

Last edited by Elyos (06-05-2009 16:10:02)


Aide les autres, ils t'aideront en retour.

Offline


ottoroots wrote:

--3°) sur la fonction verfipanier() justement : elle n'ira pas : j'ai pensé comme ça au début mais il ne faut pas calculer sur $nbart mais sur l'addition de la quantité de chaque article.

Je viens de vérifier un truc et dans le fichier substitpanier on a ça :

$nb_article += $_SESSION['navig']->panier->tabarticle[$i]->quantite;
//...
$texte = str_replace("#PANIER_NBART", "" . $nb_article . "", $texte);

On a donc bien le nombre total de produit ?


Aide les autres, ils t'aideront en retour.

Offline


ok ok ..
Reprenons..
Coder directement dans adresse.php une instruction de haut vol ne fonctionne pas car la session n'est point initialisée.

Le plugin est à prévoir smile.

Allons-y gaiment c'est très rigolo.

Pour faire un bon plugin :

1°) Lui trouver un joli nom : par exemple : verifbouteille.
2°) Créer un fichier Verifbouteille.class.php et un dossier pour l'accueillir Verifbouteille.
3°) Mettre délicatement le fichier dans le dossier
4°) Coder les justes instructions sur le fichier...

4-1) les inclusions
include_once(realpath(dirname(__FILE__)) . "/../../../classes/PluginsClassiques.class.php");

4-2) l'affiliation
class Verifbouteille extends PluginsClassiques{

4-3) attributs et méthodes

4-3-1) attributs
Bo... pas grand chose à priori
var $qteprod =0;

4-3-2) méthodes
mmm...

function action (){
if($_REQUEST['action']='verifbouteille' ){

for($compt = 0; $compt<$_SESSION[‘navig’]->panier->nbart; $compt++){

$this->qteprod += $_SESSION[‘navig’]->panier->tabarticle[$compt]->quantite;

}
if(($this->qteprod % 6) !== 0) {
$this->qteprod=0;
header(«Location: panier.php»);exit;
}
$this->qteprod=0;
}

5°) Signaler au serveur à quel moment il faut exécuter cette fonction : ajouter &action=verifbouteille dans l'url de validation du panier sur le squelette panier.html.

6°) Bien se prendre la tête quelques heures smile

Je vais tester un peu pour voir

jb

Last edited by ottoroots (06-05-2009 16:35:06)

Offline


Je te laisse gérer ottoroots wink

Je retourne à mon apprentissage de création de plugin big_smile


Aide les autres, ils t'aideront en retour.

Offline


re

Elyos :
Le tag #PANIER_NBART et la valeur $_SESSION['navig']->panier->nbart sont 2 valeurs différentes wink D'ailleurs tu le constaste #PANIER_NBART est une valeur calculée à partir de la variable de session.

jb

Offline


Oui en effet.

dans moteur.php ce n'était pas correct mais pour mon filtre oui big_smile


Aide les autres, ils t'aideront en retour.

Offline


Si j'avais su que je provoquerais une telle vague d'"enthousiasme" !

Etant incapable de créer un plugin (ou ne serait-ce qu'aider à le créer!), je vais modestement laisser les choses évoluer.

Sachant que si les personnes motivées que vous êtes n'arrivent pas à mettre tout cela en place, je trouverai une solution logistique à mon problème, donnant à mes faibles capacités techniques l'ascendant sur mes besoins réels... mais bon, il faut faire avec ce qu'on a !

Je vais suivre l'évolution de ce post avec grande attention,

Merci à vous tous pour votre aide et à très vite

Last edited by mdb (06-05-2009 16:39:43)

Offline


mdb wrote:

Etant incapable de créer un plugin (ou ne serait-ce qu'aider à le créer!), je vais modestement laisser les choses évoluer.

Je t'avouerais que je pédale dans la semoule à ce niveau là...
J'essaye difficilement de faire un plugin en ce moment enfin le faire ça va... l'appeler c'est autre chose big_smile


Aide les autres, ils t'aideront en retour.

Offline


Hello,

tiens voilà ton pluugin.. testé et fonctionnel smile

<?php
	include_once(realpath(dirname(__FILE__)) . "/../../../classes/PluginsClassiques.class.php");
	
	class Verifbouteille extends PluginsClassiques{
	
	var $qteprod =0;
	
	function Verifbouteille(){
			$this->PluginsClassiques("verifbouteille");
		}
	
	function action (){
		if($_REQUEST['action']== "verifbouteille" ){

			for($compt = 0; $compt<$_SESSION['navig']->panier->nbart; $compt++){
				$this->qteprod += $_SESSION['navig']->panier->tabarticle[$compt]->quantite;
			}
			
			if($this->qteprod % 6 !==0) {
				
				header("Location: panier.php");

			}
		$this->qteprod=0;
		}
	}
}
?>

A copier coller dans un fichier strictement nommé Verifbouteille.class.php et son dossier homonyme.

Rajouter action=verifbouteille sur l'url du panier qui mène à adresse.


adresse.php?action=verifbouteille.


J'ai droit à un carton de 6 bouteilles ? big_smile

jb

Last edited by ottoroots (06-05-2009 17:47:05)

Offline


T'as oublié de faire son filtre (qui n'était pas demandé ^^)


Aide les autres, ils t'aideront en retour.