Valider f851f2fa rédigé par cedric@yterium.com's avatar cedric@yterium.com
Parcourir les fichiers

Eviter de trop morceler le code : le plugin panier est naturellement...

Eviter de trop morceler le code : le plugin panier est naturellement predispose pour fonctionner avec les commandes du plugin commandes, sans plugin intermediaire
Aucune rupture de compatibilite :
* Cela n'empeche pas de l'utiliser avec autre chose si c'etait le cas avant
* Si le plugin panier2commande reste actif, pas de collision, tout continue de fonctionner, mais il n'est plus utile, donc
parent f80b26aa
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
* text=auto !eol
action/commandes_paniers.php -text
action/remplir_panier.php -text
action/supprimer_element_panier.php -text
action/supprimer_panier.php -text
+179 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?php

/**
 * Fonction du plugin Commandes de paniers
 *
 * @plugin     Commandes de Paniers
 * @copyright  2014
 * @author     Les Développements Durables
 * @licence    GNU/GPL
 * @package    SPIP\Panier2commande\Action
 */
// Sécurité
if (!defined("_ECRIRE_INC_VERSION"))
	return;

include_spip('inc/base');

/**
 * Créer une commande et remplir ses détails d'après le panier en cours du visiteur (ou d'après un panier donné).
 *
 * Pour créer une commande d'après le panier présent dans la session:
 *   #URL_ACTION{commandes_paniers,'',#SELF}
 * Pour créer une commande d'après un panier précis :
 *   #URL_ACTION{commandes_paniers,#ID_PANIER,#SELF}
 * Sans redirection explicite, la fonction redirige vers la page de la commande
 *
 * @param string $arg
 *     id_panier pour creer la commande et le detruire
 *     id_panier-1 pour creer la commande et le conserver
 * @return void
 * */
function action_commandes_paniers_dist($arg = null) {

	// Si $arg n'est pas donné directement, le récupérer via _POST ou _GET
	if (is_null($arg)) {
		$securiser_action = charger_fonction('securiser_action', 'inc');
		$arg = $securiser_action();
	}

	$arg = explode("-", $arg);
	$id_panier = 0;
	if (count($arg))
		$id_panier = intval(array_shift($arg));
	$keep = false;
	if (count($arg))
		$keep = intval(array_shift($arg));


	// Sans paramètre, récupérer $id_panier dans la session du visiteur actuel
	if (!$id_panier) {
		include_spip('inc/paniers');
		$id_panier = paniers_id_panier_encours();
	}

	// Si aucun panier ne pas agir
	if (!$id_panier)
		return;

	$id_auteur = sql_getfetsel("id_auteur", "spip_paniers", "id_panier=" . intval($id_panier));


	include_spip('inc/commandes');
	include_spip('inc/config');
	// si une commande recente est encours (statut et dans la session de l'utilisateur), on la reutilise
	// plutot que de recreer N commandes pour un meme panier
	// (cas de l'utilisateur qui revient en arriere puis retourne a la commande)
	include_spip('inc/session');
	$id_commande = sql_getfetsel("id_commande", "spip_commandes", $w = "statut=" . sql_quote('encours') . " AND date>" . sql_quote(date('Y-m-d H:i:s', strtotime('-' . lire_config('paniers/limite_ephemere', 24) . ' hour'))) . " AND source=" . sql_quote("panier#$id_panier") . " AND id_commande=" . session_get('id_commande'));

	// sinon on cree une commande "en cours"
	if (!$id_commande) {
		$id_commande = creer_commande_encours();
	}

	// et la remplir les details de la commande d'après le panier en session
	if ($id_commande) {
		panier2commande_remplir_commande($id_commande, $id_panier, false);
	}

	// Supprimer le panier ?
	if (!$keep) {
		$supprimer_panier = charger_fonction('supprimer_panier_encours', 'action/');
		$supprimer_panier();
	}

	// Sans redirection donnée, proposer une redirection par defaut vers la page de la commande créée
	if (is_null(_request('redirect'))) {
		$GLOBALS['redirect'] = generer_url_public('commande', 'id_commande=' . $id_commande, true);
	}
}

/**
 * Remplir une commande d'apres un panier
 *
 * @param  int $id_commande
 * @param  int $id_panier
 * @param  bool $append
 *   true pour ajouter brutalement le panier a la commande, false pour verifier que commande==panier en ajoutant/supprimant uniquement les details necessaires
 */
function panier2commande_remplir_commande($id_commande, $id_panier, $append = true) {

	include_spip('action/editer_objet');
	include_spip('inc/filtres');
	include_spip('inc/paniers');

	// noter le panier source dans le champ source de la commande
	objet_modifier('commande', $id_commande, array('source' => "panier#$id_panier"));

	// recopier le contenu du panier dans la commande
	// On récupère le contenu du panier
	$panier = sql_allfetsel(
			'*', 'spip_paniers_liens', 'id_panier = ' . intval($id_panier)
	);

	// Pour chaque élément du panier, on va remplir la commande
	// (ou verifier que la ligne est deja dans la commande)
	if ($panier and is_array($panier)) {
		$details = array();
		include_spip('spip_bonux_fonctions');
		$fonction_prix = charger_fonction('prix', 'inc/');
		$fonction_prix_ht = charger_fonction('ht', 'inc/prix');
		foreach ($panier as $emplette) {
			$prix_ht = $fonction_prix_ht($emplette['objet'], $emplette['id_objet'], 4);
			$prix = $fonction_prix($emplette['objet'], $emplette['id_objet'], 4);

			// On déclenche un pipeline pour pouvoir éditer le prix avant la création de la commande
			// Utile par exemple pour appliquer une réduction automatique lorsque la commande est crée
			$prix_pipeline = pipeline(
				'panier2commande_prix',
				array(
					'args' => $emplette,
					'data' => array(
						'prix' => $prix,
						'prix_ht' => $prix_ht
					)
				)
			);

			// On ne récupère que le prix_ht dans le pipeline
			$prix_ht = $prix_pipeline['prix_ht'];
			$prix = $prix_pipeline['prix'];

			if ($prix_ht > 0)
				$taxe = round(($prix - $prix_ht) / $prix_ht, 4);
			else
				$taxe = 0;

			$set = array(
				'id_commande' => $id_commande,
				'objet' => $emplette['objet'],
				'id_objet' => $emplette['id_objet'],
				'descriptif' => generer_info_entite($emplette['id_objet'], $emplette['objet'], 'titre', '*'),
				'quantite' => $emplette['quantite'],
				'prix_unitaire_ht' => $prix_ht,
				'taxe' => $taxe,
				'statut' => 'attente'
			);
			$where = array();
			foreach ($set as $k => $w) {
				if (in_array($k, array('id_commande', 'objet', 'id_objet'))) {
					$where[] = "$k=" . sql_quote($w);
				}
			}
			// est-ce que cette ligne est deja la ?
			if ($append OR ! $id_commandes_detail = sql_getfetsel("id_commandes_detail", "spip_commandes_details", $where)) {
				// sinon création et renseignement du détail de la commande
				$id_commandes_detail = objet_inserer('commandes_detail');
			}
			if ($id_commandes_detail) {
				objet_modifier('commandes_detail', $id_commandes_detail, $set);
				$details[] = $id_commandes_detail;
			}
		}
		if (!$append) {
			// supprimer les details qui n'ont rien a voir avec ce panier
			sql_delete("spip_commandes_details", "id_commande=" . intval($id_commande) . " AND " . sql_in('id_commandes_detail', $details, "NOT"));
		}
	}
}
+45 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -15,6 +15,20 @@ if (isset($_COOKIE[$GLOBALS['cookie_prefix'].'_panier'])

}

// si on a une transformation panier=>commande en attente et qu'on est connecte,
// creer la commande
if (  isset($_COOKIE['spip_pwl']) AND $_COOKIE['spip_pwl']
	AND isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']){

	include_spip('inc/filtres');
	$contexte = decoder_contexte_ajax($_COOKIE['spip_pwl'],'spip_pwl');
	$arg = reset($contexte);
	$commandes_paniers = charger_fonction("commandes_paniers","action");
	$commandes_paniers($arg);
	include_spip('inc/cookie');
	spip_setcookie("spip_pwl",$_COOKIE['spip_pwl'] = '',0);
}


/**
 * Calculer rapidement le nombre de produits dans un panier
@@ -25,3 +39,34 @@ function paniers_nombre_produits($id_panier){
	$quantite = intval(sql_getfetsel("SUM(quantite)","spip_paniers_liens","id_panier=".intval($id_panier)));
	return $quantite;
}

// Eviter une collistion de fonction si le plugin deprecie panier2commande est encore actif
if (!defined('_DIR_PLUGIN_PANIER2COMMANDE')){
	/**
	 * Creer la commande si connecte ou renvoyer vers la page de login
	 * @param null $arg
	 */
	function action_commandes_paniers_if_loged_dist($arg = null){

		// Si $arg n'est pas donne directement, le recuperer via _POST ou _GET
		if (is_null($arg)){
			$securiser_action = charger_fonction('securiser_action', 'inc');
			$arg = $securiser_action();
		}

		// si on est identifie, on peut passer a la commande directement
		if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']){
			$commandes_paniers = charger_fonction("commandes_paniers", "action");
			$commandes_paniers($arg);
		}
		// sinon on note le arg pour creer la commande des qu'on est idenfie
		// et on redirige vers la page d'idendification
		else {
			include_spip('inc/cookie');
			include_spip('inc/filtres');
			spip_setcookie("spip_pwl", encoder_contexte_ajax(array($arg), 'spip_pwl'));

			$GLOBALS['redirect'] = parametre_url(generer_url_public('qui'), 'url', _request('redirect'));
		}
	}
}
 No newline at end of file
+32 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -48,4 +48,35 @@ function paniers_insert_head_css($flux){
	return $flux;
}

?>

/**
 * Sur une transformation de commande en attente
 * on supprime le panier source si besoin
 * @param $flux
 * @return @flux
 */
function paniers_post_edition($flux){

	// Si on est dans le cas d'une commande qui passe de attente/en cours=>paye/livre/erreur
	if ($flux['args']['table']=='spip_commandes'
	  AND $id_commande=$flux['args']['id_objet']
	  AND $flux['args']['action']=='instituer'
	  AND isset($flux['data']['statut'])
    AND !in_array($flux['data']['statut'],array('attente','encours'))
	  AND in_array($flux['args']['statut_ancien'],array('attente','encours'))
	  AND $commande = sql_fetsel('id_commande, source', 'spip_commandes', 'id_commande='.intval($id_commande))){

		if (preg_match(",^panier#(\d+)$,",$commande['source'],$m)){
			$id_panier = intval($m[1]);
			$supprimer_panier = charger_fonction('supprimer_panier', 'action/');
			$supprimer_panier($id_panier);

			// nettoyer une eventuelle double commande du meme panier
			sql_updateq("spip_commandes",array('source'=>''),"source=".sql_quote($commande['source']));
			#spip_log('suppression panier '.$id_panier,'paniers');
		}

	}

	return $flux;
}
+3 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<paquet
	prefix="paniers"
	categorie="divers"
	version="1.0.14"
	version="1.1.0"
	etat="test"
	compatibilite="[3.0.0;3.1.*]"
	logo="prive/themes/spip/images/paniers-32.png"
@@ -30,6 +30,8 @@
	<pipeline nom="autoriser" inclure="paniers_autorisations.php" /> <!-- autorisations -->
	<pipeline nom="optimiser_base_disparus" inclure="paniers_pipelines.php" /> <!-- suppression liens morts -->
	<pipeline nom="insert_head_css" inclure="paniers_pipelines.php" /> <!-- css pages publiques -->
	<pipeline nom="post_edition" inclure="paniers_pipelines.php" />
	<pipeline nom="panier2commande_prix" action="" />

	<menu nom="configurer_paniers" titre="paniers:nom_bouton_plugin" parent="menu_configuration" icone="images/paniers-16.png" />