tristars Posted May 30, 2013 Share Posted May 30, 2013 (edited) 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 June 23, 2013 by tristars (see edit history) Link to comment Share on other sites More sharing options...
jeckyl Posted May 30, 2013 Share Posted May 30, 2013 Bonjour, vous voulez une tâche cron pour automatiser une tâche manuelle ? Link to comment Share on other sites More sharing options...
passicool Posted May 31, 2013 Share Posted May 31, 2013 Oui c'est bien ce qu'il demande Link to comment Share on other sites More sharing options...
tristars Posted May 31, 2013 Author Share Posted May 31, 2013 Bonjour, vous voulez une tâche cron pour automatiser une tâche manuelle ? Bonjour, Oui c'est ça ! Je ne veux plus faire cette action moi même tous les 15 jours. Une idée ? Merci Link to comment Share on other sites More sharing options...
Broceliande Posted May 31, 2013 Share Posted May 31, 2013 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 More sharing options...
tristars Posted June 15, 2013 Author Share Posted June 15, 2013 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 More sharing options...
leeloo Posted June 16, 2013 Share Posted June 16, 2013 (edited) 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 June 16, 2013 by leeloo (see edit history) Link to comment Share on other sites More sharing options...
tristars Posted June 21, 2013 Author Share Posted June 21, 2013 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 More sharing options...
leeloo Posted June 21, 2013 Share Posted June 21, 2013 (edited) 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 June 21, 2013 by leeloo (see edit history) Link to comment Share on other sites More sharing options...
tristars Posted June 21, 2013 Author Share Posted June 21, 2013 Ok c'est bon ça fonctionne ! Tant pis pour le clé de sécurité.. Merci encore pour ton aide ! + Link to comment Share on other sites More sharing options...
leeloo Posted June 21, 2013 Share Posted June 21, 2013 Je ne veux pas en rajouter, mais c'est trop facile de contourner la problématique en virant du code. Content d'avoir pu t'aider. Reste à passer ton post en résolu. Link to comment Share on other sites More sharing options...
tristars Posted June 23, 2013 Author Share Posted June 23, 2013 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 More sharing options...
leeloo Posted June 23, 2013 Share Posted June 23, 2013 Dans l'idée oui puisque cela protège l'accès au seul détenteur de la clé dans le lien. Dans ton cas même s'il n'y a pas de clé cela ne t'impacte pas si quelqu'un utilise ton lien. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now