Jump to content

[RESOLU] Comment effacer régulièrement les paniers


tristars

Recommended Posts

Bonjour,

 

Je possède une boutique sous Prestashop 1.4.0.10

 

J'utilise le module "Nettoyage de paniers" v1.0 (dispo sur prestascope ici http://www.prestasco...de-paniers.html) pour effectuer mes recherches de paniers non liés à une commande. Je supprime manuellement ces paniers une fois tous les 15 jours environ.

 

J'aimerais pouvoir automatiser cette action, dans une tâche cron par exemple.

 

Avez-vous une idée ?

 

Merci beaucoup !

 

++

Edited by tristars (see edit history)
Link to comment
Share on other sites

Hello,

Une tâche cron pour une action deux fois par mois c'est pas un peu too much ?

J'ajoute que à moins d'être véritablement limité en espace BDD par l'hébergement, supprimer les paniers anciens n'a absolument aucun intérêt.

A contrario, si on prend la peine de l'exploiter, cette base de données est précieuse et peut révéler énormément sur les comportements utilisateurs, le produits qui marchent , ceux qui ne marchent pas, la cohérence des tarifs etc ...

Sinon en guise de réponse je dirais que le module de suppression semblant plutôt bien réalisé , il ne lui manque qu'un controller cron avec un token (par sécurité) , ce qui peut se faire par quelques lignes de code.

Encore faut-il être certain que tu puisses éxécuter ainsi des tâches planifiées.

Si c'est le cas, je veux bien prendre 10 mn pour écrire le controller dont je parle.

Link to comment
Share on other sites

  • 3 weeks later...

Bonjour Broceliande,

 

En réalité je souhaite supprimer mes paniers tous les jours (et non deux fois par mois comme indiqué plus haut). La raison ? Je reçois de nombreuse commandes fantômes liées à d'anciens paniers et la suppression quotidienne de ces derniers à fait disparaitre ces bugs..

 

Si l'écriture de ce controller ne prend que 10mn alors je suis preneur !

 

Merci encore.

 

+

Link to comment
Share on other sites

Bonjour,

 

Voici comment faire pour réaliser le nettoyage avec une tâche cron. Je te propose aussi d'ajouter une clé de sécurité au lien du cron pour que tu sois le seul à détenir ce lien.

 

Ajouter la clé de sécurité:

Dans pss_clearcarts.php, modifier :

 // normal install
 if(!parent::install() || !$this->_installTab() || !$this->_installConfig())

 

en

 // normal install
 if(!parent::install() || !$this->_installTab() || !$this->_installConfig() || !Configuration::updateValue('PSS_CLEARCARTS_SECURE_KEY', strtoupper(Tools::passwdGen(16))))

 

Suppression de la clé de sécurité lors de la désinstallation du module:

Dans pss_clearcarts.php, modifier :

if(!parent::uninstall() || !$this->_uninstallTab() || !$this->_uninstallConfig())

 

en

if(!parent::uninstall() || !$this->_uninstallTab() || !$this->_uninstallConfig() || !Configuration::deleteByName('PSS_CLEARCARTS_SECURE_KEY'))

 

 

Dans pss_clearcarts.php, ajouter la fonction de nettoyage par cron

public function cronTask()
{
 // Sql clause to build the customer display
 $sqlCustomer = 'CONCAT(LEFT(c.`firstname`, 1), \'. \', c.`lastname`)';
 // KenJProduction : For GetAll error
 $getAll ='';
 // Convert filters into a where clause
 $where = ' WHERE 1=1';

 // Always list carts not linked to orders
 $where .=' AND o.id_order IS NULL';

 $where .= ' ';

 // Get all carts main datas applying SQL filter
 $sql = 'SELECT a.`id_cart`, a.`id_currency`, c.`id_customer`, a.`date_upd`, '.$sqlCustomer.' AS `customer`, ca.name as carrier, cu.id_currency
  FROM `'._DB_PREFIX_.'cart` a
  LEFT JOIN '._DB_PREFIX_.'customer c on (c.id_customer = a.id_customer)
  LEFT JOIN '._DB_PREFIX_.'currency cu on (cu.id_currency = a.id_currency)
  LEFT JOIN '._DB_PREFIX_.'carrier ca on (ca.id_carrier = a.id_carrier)
  LEFT JOIN '._DB_PREFIX_.'orders o on (o.id_cart = a.id_cart)
  '.$where.'
  ORDER BY a.date_upd DESC
  ';
 //echo $sql.'<br />';
 $carts = Db::getInstance()->ExecuteS($sql);

 // Delete each cart
 for ($i=0;$i<count($carts);$i++)
  {
// Load cart object
$cart = new Cart(intval($carts[$i]['id_cart']));
if (!Validate::isLoadedObject($cart))
 {
  $this->_errors[] = $this->l('Unable to load cart').' '.$cart->id;
  continue;
 }
// Delete in cross-indexed tables (consume exceptions because these tables are not core tables for a cart) :
// TODO : check for finest warning for user information about troubles to delete the cross-indexed datas
// Have to delete some uploaded files linked to some cart customized products ?
$uploads = @Db::getInstance()->ExecuteS('SELECT cd.`index`,cd.`value`,c.`id_product` FROM `'._DB_PREFIX_.'customized_data` cd
		  INNER JOIN `'._DB_PREFIX_.'customization` c ON cd.`id_customization`=c.`id_customization`
		  WHERE cd.`type`=0 AND c.`id_cart`='.intval($cart->id));

foreach ($uploads as $upload)
 {
  // Upload dir constant has changed from 1.3.x and 1.4
  $uploadPath = $this->isPs13x() ? _PS_PROD_PIC_DIR_ : _PS_UPLOAD_DIR_;
  @unlink($uploadPath.$upload['value']);
  @unlink($uploadPath.$upload['value'].'_small');
 }

// `ps_customization` and `ps_customized_data`
@Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customized_data` WHERE `id_customization` IN (
	   SELECT `id_customization` FROM `'._DB_PREFIX_.'customization` WHERE `id_cart`='.intval($cart->id).')');
@Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'customization` WHERE `id_cart`='.intval($cart->id));
// `ps_message` and `ps_message_readed`
@Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'message_readed` WHERE `id_message` IN (
	   SELECT `id_message` FROM `'._DB_PREFIX_.'message` WHERE `id_cart`='.intval($cart->id).')');
@Db::getInstance()->Execute('DELETE FROM `'._DB_PREFIX_.'message` WHERE `id_cart`='.intval($cart->id));

// Delete the cart (this time, check for a valid delete to display an error if it's not the case)
if (!$cart->delete())
 $this->_errors[] = $this->l('Unable to delete cart').' '.$cart->id;

// DO NOT NEED TO CLEAN ANYTHING FROM COOKIE BECAUSE WE ARE IN BACK-OFFICE ROOM !
  }

  global $smarty, $cookie;
  $smarty->assign(array(
  'NbCartsToClean' => $i
  )
 );
}

 

Dans AdminPssClearCarts.php, ajouter un cadre montrant le lien cron :

modifier :

  	 $this->_html .= '
			<div class="margin-form" style="float:left; left:210px;">
				<input name="submitSimulation" type="submit" value="'.$this->l('List carts').'" class="button" />
			</div>
			<div class="margin-form" style="float:right;">
				<input name="submitSimulationForAll" type="submit" value="'.$this->l('List all carts').'" class="button" onclick="javascript:return confirm(\''.$this->l('This might take a long time. Please, confirm to process').'\');"/>
			</div>
		</fieldset>
		</form>
	<br />';

 

en :

 $this->_html .= '
<div class="margin-form" style="float:left; left:210px;">
 <input name="submitSimulation" type="submit" value="'.$this->l('List carts').'" class="button" />
</div>
<div class="margin-form" style="float:right;">
 <input name="submitSimulationForAll" type="submit" value="'.$this->l('List all carts').'" class="button" onclick="javascript:return confirm(\''.$this->l('This might take a long time. Please, confirm to process').'\');"/>
</div>
  </fieldset>
  <br />  
  <fieldset>
<legend>
 '.$this->l('Link For Cron Task').'
</legend>
<div>
 '.$this->l('Put this URL in crontab or call it manually daily:').'
</div>
<br />
<b style="font-size: 11px;">
 http://'.$_SERVER['HTTP_HOST'].__PS_BASE_URI__.'modules/pss_clearcarts/cron.php?secure_key='.Configuration::get('PSS_CLEARCARTS_SECURE_KEY').'
</b>
<br />
<span style="color: #FF0000; font-size: 10px;">
 '.$this->l('WARNING : The cron task will remove all carts that have not been processed in order !').'
</span>
  </fieldset>  
  </form>
 <br />';

 

 

Créer un fichier cron.php, dans le répertoir du module, et y mettre :

 

<?php

/*  Tu peux faire appel à un fichier pss_clearcarts.tpl
*  dans lequel tu fais une petite présentation expliquant que la tâche est en cours,
*  au lieu d'avoir une page blanche au centre .
*  Pour ce faire, décommenter la ligne $smarty (enveler le  //  )
*/
include(dirname(__FILE__).'/../../config/config.inc.php');
include(dirname(__FILE__).'/../../header.php');
include(dirname(__FILE__).'/pss_clearcarts.php');
if (isset($_GET['secure_key']))
 {
  $secureKey = Configuration::get('PSS_CLEARCARTS_SECURE_KEY');
  if (!empty($secureKey) AND $secureKey === $_GET['secure_key'])
{
 $pss_clearcarts = new PSS_Clearcarts();
 $pss_clearcarts->cronTask();
 // Appeler le fichier tpl
 //$smarty->display(_PS_MODULE_DIR_.'pss_clearcarts/pss_clearcarts.tpl');
}
  else
{
 $smarty->display(_PS_THEME_DIR_.'404.tpl');
}  
 }
include(dirname(__FILE__).'/../../footer.php');
?>

 

Il faut également traduire le module car tu as ajouté du texte (AdminPssClearCarts.php qui montre un cadre avec le lien cron).

 

Voila, le module peut à ce stade être géré par cron.

A toi maintenant de faire appel au lien cron soit par ton hébergeur, ou mieux avec le module Cron de prestashop.

 

Salutations.

Edited by leeloo (see edit history)
Link to comment
Share on other sites

Bonjour,

 

Merci beaucoup leeloo !! Ton script va me rendre un grand service :)

 

Il ne fonctionne pas encore, problème de droits, on y est presque !

 

Impossible d'accéder à l'url du cron

mondomaine.com/modules/pss_clearcarts/cron.php?secure_key=XXXXXXXXXXXXXX

car:

Forbidden

 

You don't have permission to access /modules/pss_clearcarts/cron.php on this server.

 

Afin d'éviter de toucher aux droits, n'y a-t-il pas un autre moyen d'appeler ce fichier cron.php ?

 

Comme par exemple une ligne comme celle-ci (exemple pioché parmis mes crons fonctionnels chez ovh):

/usr/local/bin/php5 -f /home/ovh/www/prestashop/modules/googleshopping/cron.php

 

Ceci ne marche pas:

/usr/local/bin/php5 -f /home/ovh/www/prestashop/modules/pss_clearcarts/cron.php?secure_key=XXXXXXXXXXXXXXXX

 

Une idée ?

 

++

Link to comment
Share on other sites

Bonjour,

Je suppose qu'il y a des spécificités pour ton hébergeur OVH que je ne connais pas.

Est-ce que ca fonctionne au moins en local chez toi ?

Au pire tu leur poses la question pour bien utiliser crontab sur le manager d'ovh.

 

Sinon, oui, tu peux appeler la tâche par un lien du style :

/usr/local/bin/php5 -f /home/ovh/www/prestashop/modules/googleshopping/cron.php

 

qui sera donc :

/usr/local/bin/php5 -f /home/ovh/www/prestashop/modules/pss_clearcarts/cron.php

 

Dans ce cas tu modifies le fichier /modules/pss_clearcarts/cron.php que tu avais crée, pour ne pas prendre en compte la clé de sécurité du lien, en commentant les IF et ELSE, les crochets { et } et l'appel du 404.tpl.

J'ai essayé de poster un code pour toi, mais ca marche pas (plus).

Du coup la clé perd tout son intérêt.

Edited by leeloo (see edit history)
Link to comment
Share on other sites

Je ne veux pas en rajouter, mais c'est trop facile de contourner la problématique en virant du code.

 

Je suis d'accord avec toi, mais dans mon cas, je n'appel pas d'url mais j’exécute une commande interne à mon serveur web, la clé de sécurité est-elle réellement utile ?

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...