J'ai peut-être répondu trop vite dans mon dernier message car je ne suis finalement pas sûr de comprendre;
De toute manière si un module veut implanter son propre controller front l'url simplifiée aura TOUJOURS la forme /module/<nom-du-module>/<nom-du-controller> et c'est d'ailleurs case sensitive
Messages postés par doekia
-
RE: les routes sur mesures
-
RE: les routes sur mesures
En effet le hook d'injection des routes ne fonctionne que pour un module
Si le besoin est seulement de changer l'url simplifié, il suffit en 1.6.x de l'ajuster dans SEO & URL, en 1.7 c'est dans Paramètres de la boutique / Traffic et SEO.
Pas besoin de coder quoique ce soit -
RE: les routes sur mesures
Je ne suis pas sûr d'avoir exactement compris le use case.
Je note néanmoins que le nouveau controlleur s'appelle FormocontactContactController mais que la route stipule controller "contact", comment le Dispatcher sait qu'il doit lancer FormocontactContact ?
Mais je persiste je n'ai pas compris l'objectif
-
RE: Des modules et des hacks - liste non exhaustive des modules présentant un risque
Encore une serie:
/modules/wdoptionpanel/wdoptionpanel_ajax.php
/modules/wg24themeadministration/wg24_ajax.php -
RE: Des modules et des hacks - liste non exhaustive des modules présentant un risque
De nouveaux arrivants dans le "game":
/modules/marketplace/libs/filemanager/dialog.php
/modules/ec_import/upload.php -
RE: Des modules et des hacks - liste non exhaustive des modules présentant un risque
@mediacom87
Comme spécifier en début de topic:
"Si vous possédez l'un de ces modules et ne savez pas si votre version est corrigé, supprimez le immédiatement. Ne le renommez pas, supprimez le. Peu importe qu'il soit activé ou non, supprimez le." -
Patch de sécurité thèmes warehouse / iqit (Versions 1.5 & 1.6)
Comme certains l'on oublié ou perdu ...
C'est ici https://bb.enter-solutions.net/uploads/files/security%20hotfix%20-%20important.zip -
Créer un contrôleur front (indépendant)
Il arrive de devoir créer un contrôleur front office pour y implémenter une logique particulière.
Ici nous allons faire juste cela, totalement indépendant d'un module.pré-requis
accès FTP
notepad++
5 minutes
le contrôleur
Nous allons créer le contrôleur. Nous pouvons le mettre directement dans le répertoire /controllers/front mais au cas où demain ne devions écraser notre prestashop, nous allons préférer le mettre dans /override/controllers/front. En plus de cette manière il est plus simple d'identifier à posteriori quel code a été ajouté.
Nous devons impérativement dériver d'un FrontController, mais il est tout a fait possible de dériver un contrôleur qui en dérive. Supposons ici ContactController.
/override/controllers/front/ContactControllerExtra.php<?php class ContactControllerExtra extends ContactController { public $php_self = 'contact-extra'; }
Vidons le cache (avec la gomme) ou supprimons le fichier /cache/class_index.php
Oui c'est tout faire un contrôleur n'est pas compliqué. Mais bon soyons clair c'est pour l'instant une coquille vide.Avant d'aller plus loin nous allons le configurer coté back-office afin que nous puissions lui donner une belle url et un minimum de décence coté SEO.
SEO & URL
Dans le BO, rendons nous dans Préférences > SEO&URL
Cliquer ajouter, et remplir- page: choisir contact-extra
- titre: Contact étendu
- description: Page de contact avancée
- mots clé: vide
- url: contact-avance
Enregistrer
Voila, vous pouvez/devez customiser les paramètres en fonction des langues afin qu'ils correspondent à vos besoins
Le code utile
Jusque maintenant nous n'avons qu'une coquille vide qui se contente de faire en tout point ce que fait le formulaire de contact. Écrivons un peu de code utile. Nous allons mettre en place un captcha très simple.
Reprenons notre fichier contrôleur
/override/controllers/front/ContactControllerExtra.php<?php class ContactControllerExtra extends ContactController { public $php_self = 'contact-extra'; private function trivial_captcha() { return (int)($this->context->cookie->id_guest); } public function postProcess() { if (Tools::isSubmit('submitMessage')) { $captcha = Tools::getValue('captcha',0); if (!$captcha || $captcha != $this->trivial_captcha()) { $this->errors[] = Tools::displayError('Invalid captcha.'); return; } } return parent::postProcess(); } }
Nous venons de créer un contrôle lors de la réception du formulaire et de vérifier que ce formulaire contient un captcha et que celui-ci est valide.
Si nous essayons notre contrôleur maintenant nous obtenons systématiquement une erreur "Invalid captcha" lors de l'envoi du formulaire.
la vue
Nous devons bien sûr construire un template permettant la saisie du captcha. Pour cela nous allons "bêtement" copier le template normal, puis nous ajouterons notre code à l'intérieur
Copions /themes/<votre-theme>/contact-form.tpl => /themes/<votre-theme>/contact-form-extra.tpl
Éditons maintenant ce fichier et identifions où mettre notre code<div class="col-xs-12 col-md-9"> <div class="form-group"> <label for="message">{l s='Message'}</label> <textarea class="form-control" id="message" name="message">{if isset($message)}{$message|escape:'html':'UTF-8'|stripslashes}{/if}</textarea> </div> {* ***** Nous allons mettre notre code ICI ***** *} {hook h='displayGDPRConsent' moduleName='contactform'} </div> </div> <div class="submit"> <input type="text" name="url" value="" class="hidden" /> <input type="hidden" name="contactKey" value="{$contactKey}" /> <button type="submit" name="submitMessage" id="submitMessage" class="button btn btn-default button-medium"><span>{l s='Send'}<i class="icon-chevron-right right"></i></span></button> </div>
Voici le code à mettre:
<div class="form-group"> <label for="captcha">{l s='Captcha'}</label> <input name="captcha" type="text" /> <span class="captcha-help">{l s='Please enter this number in the captcha field'}: {$captval}</span> </div>
Pour l'instant cette étape ne change rien.
En effet nous devons maintenant câbler la vue pour que le contrôleur l'appelle.
On air
Enfin la dernière étape.
Nous devons simplement appeler notre vue (le template) et nous aurons un contrôleur complet.Revenons dans le contrôleur.
/override/controllers/front/ContactControllerExtra.php<?php class ContactControllerExtra extends ContactController { public $php_self = 'contact-extra'; private function trivial_captcha() { return (int)($this->context->cookie->id_guest); } public function postProcess() { if (Tools::isSubmit('submitMessage')) { $captcha = Tools::getValue('captcha',0); if (!$captcha || $captcha != $this->trivial_captcha()) { $this->errors[] = Tools::displayError('Invalid captcha.'); return; } } return parent::postProcess(); } public function initContent() { parent::initContent(); $this->context->smarty->assign(array( 'captval' => $this->trivial_captcha(), )); $this->setTemplate(_PS_THEME_DIR_.'contact-form-extra.tpl'); } }
Il ne vous reste plus qu'a faire quelques réglages css, les traductions et vous avez terminé.
Bien joué
-
RE: Fourre-tout de trucs et astuces
@Thierry
Bien sûr, sans aucun problème. N'oublie pas d'enlever aussi le </IfModule> du premier snippet -
Fourre-tout de trucs et astuces
J'ai mis à dispositions de nombreux petits snippets qui peuvent servir.
C'est ici: https://area51.enter-solutions.com/snippets
Ci-dessous un petit inventaire (incomplet):
.htaccess (sauf indication contraire, avant le code prestashop)
- forcer de manière saine le HSTS: https://area51.enter-solutions.com/snippets/100
- redirection produit après suppression link-rewrite catégorie SEO&URL: https://area51.enter-solutions.com/snippets/44
- redirection après suppression multi-langue: https://area51.enter-solutions.com/snippets/45
- redirection url historiques après migration anciennes versions: https://area51.enter-solutions.com/snippets/48
Sécurité
- générer les index.php manquant: https://area51.enter-solutions.com/snippets/21
- Rafraîchir et distribuer les signatures de virus pour clamav: https://area51.enter-solutions.com/snippets/71
- Filtre fail2ban spécialisé anti-hack PrestaShop: https://area51.enter-solutions.com/snippets/81
- Filtrage des noeuds TOR avec ipset et iptable: https://area51.enter-solutions.com/snippets/76
- Mise en place recaptchav2 pour Presatshop: https://area51.enter-solutions.com/snippets/74
- Bookmarklet pour vérifier l'implémentation du recaptcha: https://area51.enter-solutions.com/snippets/74
Divers
- Corriger le SSL d'OVH (déconnexion BO): https://area51.enter-solutions.com/snippets/98
- Vérifier le support TLS1.2 du serveur: https://area51.enter-solutions.com/snippets/99
- Générer les meta absentes après migrations: https://area51.enter-solutions.com/snippets/79
- Description catégorie en HTML avec "voir plus" (pur CSS): https://area51.enter-solutions.com/snippets/73
- Une page maintenance quand tout doit être détruit: https://area51.enter-solutions.com/snippets/46
- Outil de backup filesystem d'urgence (mod): https://area51.enter-solutions.com/snippets/94
-
Copieurs-Colleurs
L'humanité a évolué au fil du temps, de chasseurs-cueilleurs, nomades, inquisiteurs, esclavagistes, ... à nos jours où nous sommes réseauteurs sociaux et copieurs-colleurs.
Tout comme vous n'iriez pas non préparé chasser le Mesosaure ou cueillir un essaim d'abeille - l'issue serait funeste (Je sais l'un ne vit pas dans la bonne section de la frise chronologique, l'autre n'est pas un fruit - C'est une métaphore) -, vous devez éviter les pièges de la méthode. Voici une liste non exhaustive de ces pièges et comment les éviter:
Connaître son ennemi
Ai-je suffisamment de connaissance pour comprendre ce que fait ce code ? A défaut, se documenter, interroger des experts. Copier un code hermétique à votre compréhension et le meilleur moyen d'injecter une porte dérobée dans votre solution.
Date de fraicheur
De quand date ce snippet? Cette question simple vous évitera d'utiliser du code deprecated ou une solution obsolète.
Est-ce comestible
En raison de typos, malveillance, maladresses l'extrait peut être dangereux. Assurez-vous d'avoir compris les risques.
Allergies
Contrôlez vos versions. Vérifiez toujours que la solution est en adéquation avec votre environnement
Tests clinique
Toujours passer la solution au banc d'essai. Toujours. Même une seule ligne!
Testisnulus
Exactement comme la citation romaine. Ne tester qu'une fois, c'est comme n'avoir rien testé
Protections
Toujours, 10x si besoin, faites des backups
La pierre de rosette
Copier-coller depuis certaines sources mène à des déformations de contenu (apostrophes, guillemets, backquotes, ...).
Intelligence
Faites honneur à votre cerveau et sa capacité d'analyse.
Obésité
Si votre copier-coller ressemble à une recette de Maïté vous risquez l'indigestion. De la même manière si vous accumulez les composants, c'est probablement qu'il existe une solution plus simple et élégante.
Agence tous-risque
Partir sans plan d'ensemble c'est obtenir une usine à gaz dans le meilleur des cas, un réacteur RBMK hors de contrôle dans le pire.
Un petit pas pour l'homme
Faites des petits pas, simple. Vous pourrez alors réaliser de grandes choses.
Houston nous avons un problème
Prenez des notes communiquez, expliquez, documentez, écoutez les experts. Seul moyen d'avoir un réponse adaptée en cas de problème.
Dilettantisme
Toujours être attentif. L'esprit en alerte à l'écoute du moindre bruit suspect. A surveiller, le lait, la purée de carotte tout en langeant le petit dernier, on termine dans les fais divers d'une revue criminelle, ou on gagne un Darwin Awards.
Ces bonnes pratiques exprimées, n’empêcheront pas les aventuriers intrépide de faire preuve de témérité paresseuse. Pour cette raison nous essayons lorsque le code est dangereux de le rendre inactif. La solution est sous vos yeux mais si vous vous contentez de la copier telle quelle, elle sera sans effet ou générera une message d'erreur anodin. Lisez l'erreur, googlez là et vous pourrez alors transformer ce plomb en or.
-
[1.3] Implanter des classes overrides
Le mécanisme des overrides est très pratique pour maintenir le coeur propre tout en ayant la capacité de faire des changements dans le code natif.
Ce mécanisme n'est apparu qu'a partir de la version 1.4 de PrestaShop.Voici une implantation de ce mécanisme sur version antérieure.
Il suffit d'injecter une fonction autoloader modifié en début du fichier config.inc.php
/* Autoload */ function __autoload($className) { if (function_exists('smartyAutoload') AND smartyAutoload($className)) return true; $className = str_replace(chr(0), '', $className); $classDir = dirname(__FILE__).'/../classes/'; $overrideDir = dirname(__FILE__).'/../override/classes/'; $file_in_override = file_exists($overrideDir.$className.'.php'); $file_in_classes = file_exists($classDir.$className.'.php'); // This is a Core class and its name is the same as its declared name if (substr($className, -4) == 'Core') require_once($classDir.substr($className, 0, -4).'.php'); else { if ($file_in_override && $file_in_classes) { require_once($classDir.str_replace(chr(0), '', $className).'.php'); require_once($overrideDir.$className.'.php'); } elseif (!$file_in_override && $file_in_classes) { require_once($classDir.str_replace(chr(0), '', $className).'.php'); $classInfos = new ReflectionClass($className.((interface_exists($className, false) or class_exists($className, false)) ? '' : 'Core')); if (!$classInfos->isInterface() && substr($classInfos->name, -4) == 'Core') eval(($classInfos->isAbstract() ? 'abstract ' : '').'class '.$className.' extends '.$className.'Core {}'); } elseif ($file_in_override && !$file_in_classes) require_once($overrideDir.$className.'.php'); } } spl_autoload_register('__autoload');
Créer ensuite votre répertoire /override/classes
Pour toute classe que vous souhaitez modifier, changez le nom de la classe native dans son fichier pour la renommer en <class>Core
Exemple pour la classe "Order":class OrderCore extends ObjectModel
Puis créer votre fichier override comme dans les version ultérieures.
Pratique pour normaliser tranquillement votre code en prévision d'une future migration
NOTE: Lors de votre upgrade, prenez garde à la structure du répertoire classes (ex: Order.php => order/Order.php) -
[1.6.0.5 - 1.6.1.18] Fatal error lors de la suppression d'image du themeconfigurator
Lors de la suppression d'image du themeconfigurator vous obtenez l'erreur:
Call to a member function rowCount() on boolean
ou
Table 'presta16.ps_ps_themeconfigurator' doesn't exist avec le mode debug activé
Modifiez le fichier modules/themeconfigurator/themeconfigurator.php @397
RemplacerDb::getInstance()->delete(_DB_PREFIX_.'themeconfigurator', 'id_item = '.(int)$id_item);
par
Db::getInstance()->delete('themeconfigurator', 'id_item = '.(int)$id_item);
-
RE: Comment offrir frais de port à partir d'un certain montant MAIS avec transport facturé au poids ?
Réponse courte:
règle panierRéponse longue:
Suis les recommandations de la solution numéro 2 - ici
https://bb.enter-solutions.net/topic/35/je-veux-offrir-les-frais-de-port-a-partir-d-un-montant-mais-seulement-pour-la-france -
[1.7.x] Impossible de gérer le menu du BO, même en SuperAdmin
Les auteurs de la 1.7 pensent que vous êtes des idiots incompétents, aussi ont-ils totalement supprimé la possibilité pour vous de gérer le menu du BO. (pratique quand un module buggué à pollué ce dernier)
Même si vous connaissez le contrôleur et tentez de l'appeler vous obtiendrez un "accès interdit" même en SuperAdmin
https://domain.com/admin-lab17/index.php?controller=AdminTabsVous pouvez reprendre le contrôle de votre BO avec l'override suivante:
/override/controllers/admin/AdminTabsController.php
<?php class AdminTabsController extends AdminTabsControllerCore { public function access($action, $disable = false) { return Profile::getProfileAccess($this->context->employee->id_profile, Tab::getCurrentTabId()); } }
Videz votre cache, vous pouvez a nouveau piloter votre menu du BO, en saisissant l'url directe et acceptant l'alerte de sécurité.
TIP: Insérer le contrôleur( ajouter menu) avec comme parent Configure afin d'avoir l'entrée directe dans le menu
-
RE: [1.5.x],[1.6.x],[1.7.x] Pas de redirection canonical pour page manufacturer & supplier
Attention il y a eu une grosse coquille dans le code publié plus tôt.
Il est maintenant corrigé mais pensez à le vérifier si vous avez appliqué le patch précédemment -
RE: [1.5.x],[1.6.x],[1.7.x] Pas de redirection canonical pour page manufacturer & supplier
@eolia au temps pour moi je pensais que le titre était suffisamment clair (manufacturer et supplier)
-
RE: [1.6.0.5]+ Reference error: $ is undefined dans le BackOffice
Le code à corriger a été changé afin de ne pas interférer avec certains contrôleurs (Category avec les scènes activés par exemple), qui implémentent du code dans setMedia() pour lequel init() doit avoir été exécuté au préalable (Product::initPricesComputation())
-
[1.5.x],[1.6.x],[1.7.x] Pas de redirection canonical pour page manufacturer & supplier
Lorsque vous effectuez une redirection /index.php?controller=manufactuer|supplier (sans id), aucune redirection canonique n'est prise en compte.
Ex:
https://domain.tld/marques => mène à la liste des manufacturer (marques)
https://domain.tld/index.php?controller=manufacturer => mène à la liste des manufacturer (marques)Aucun redirection canonique n'intervient dans le second cas
Seul le cas lorsqu'un id est fourni est implanté dans les contrôleurs.
Remplacer dans ManufacturerController.php:public function canonicalRedirection($canonicalURL = '') { if (Tools::getValue('live_edit')) { return; } if (Validate::isLoadedObject($this->manufacturer)) { parent::canonicalRedirection($this->context->link->getManufacturerLink($this->manufacturer)); } }
par
public function canonicalRedirection($canonicalURL = '') { if (Tools::getValue('live_edit')) { return; } if (!Validate::isLoadedObject($this->manufacturer) && (int)Tools::getValue('id_manufacturer')) { $this->manufacturer = new Manufacturer((int)Tools::getValue('id_manufacturer'), $this->context->language->id); } if (Validate::isLoadedObject($this->manufacturer)) { return parent::canonicalRedirection($this->context->link->getManufacturerLink($this->manufacturer)); } parent::canonicalRedirection($canonicalURL); }
-
Des modules et des hacks - liste non exhaustive des modules présentant un risque
Ci-dessous une liste de modules régulièrement testé par les hackeurs - ces modules contiennent ou ont contenu des failles de sécurité.
Si vous possédez l'un de ces modules et ne savez pas si votre version est corrigé, supprimez le immédiatement. Ne le renommez pas, supprimez le. Peu importe qu'il soit activé ou non, supprimez le. Il vaut mieux perdre une fonctionnalité que de perdre sa boutique. Contactez alors le développeur pour obtenir une version saine.
Si vous n'avez aucun de ces modules et avez un dédié, vous pouvez également créer un filtre fail2ban afin d'expulser le bot dès la première tentative - ceci vous éloignera des nuisances de ces parasites.
Une impléméntation fail2ban ici: https://area51.enter-solutions.com/snippets/81La liste (non exhaustive):
yuzu/yuzuCheck.php
yuzu/yuzuApi.php
columnadverts/uploadimage.php
columnadverts/slides/error.php
vtemslideshow/uploadimage.php
vtemslideshow/slides/error.php
realty/include/uploadimage.php
realty/include/slides/error.php
realty/evogallery/uploadimage.php
realty/evogallery/slides/error.php
realty/evogallery2/uploadimage.php
realty/evogallery2/slides/error.php
resaleform/upload.php
filesupload/error.php
megaproduct/
megaproduct/error.php
soopamobile/uploadimage.php
soopamobile/slides/error.php
soopamobile2/uploadimage.php
soopamobile2/slides/error.php
soopamobile2/uploadproduct.php
soopabanners/uploadimage.php
soopabanners/slides/error.php
vtermslideshow/uploadimage.php
vtermslideshow/slides/error.php
simpleslideshow/uploadimage.php
simpleslideshow/slides/error.php
productpageadverts/uploadimage.php
productpageadverts/slides/error.php
homepageadvertise/uploadimage.php
homepageadvertise/slides/error.php
homepageadvertise2/uploadimage.php
homepageadvertise2/slides/error.php
columnadverts2/uploadimage.php
columnadverts2/slides/error.php
filesupload/upload.php
filesupload/uploads/error.php
jro_homepageadvertise/uploadimage.php
jro_homepageadvertise/slides/error.php
jro_homepageadvertise2/uploadimage.php
jro_homepageadvertise2/slides/error.php
leosliderlayer/uploadimage.php
leosliderlayer/slides/error.php
leosliderlayer/upload_images.php
vtemskitter/uploadimage.php
vtemskitter/img/error.php
additionalproductstabs/file_upload.php
additionalproductstabs/file_uploads/error.php
addthisplugin/file_upload.php
addthisplugin/file_uploads/error.php
attributewizardpro/file_upload.php
attributewizardpro/file_uploads/error.php
attributewizardpro.OLD/file_upload.php
attributewizardpro.OLD/file_uploads/error.php
1attributewizardpro/file_upload.php
1attributewizardpro/file_uploads/error.php
attributewizardpro_x/file_upload.php
attributewizardpro_x/file_uploads/error.php
advancedslider/ajax_advancedsliderUpload.php?action=submitUploadImage%252526id_slide=php
advancedslider/uploads/error.php
bamegamenu/ajax_phpcode.php
cartabandonmentpro/upload.php
cartabandonmentpro/uploads/error.php
cartabandonmentproOld/upload.php
cartabandonmentproOld/uploads/error.php
videostab/ajax_videostab.php?action=submitUploadVideo%252526id_product=upload
videostab/uploads/error.php
fieldvmegamenu/ajax/upload.php
fieldvmegamenu/uploads/error.php
orderfiles/ajax/upload.php
orderfiles/files/error.php
pk_flexmenu/ajax/upload.php
pk_flexmenu/uploads/error.php
pk_flexmenu_old/ajax/upload.php
pk_flexmenu_old/uploads/error.php
pk_vertflexmenu/ajax/upload.php
pk_vertflexmenu/uploads/error.php
nvn_export_orders/upload.php
nvn_export_orders/error.php
tdpsthemeoptionpanel/tdpsthemeoptionpanelAjax.php
tdpsthemeoptionpanel/upload/error.php
psmodthemeoptionpanel/psmodthemeoptionpanel_ajax.php
psmodthemeoptionpanel/upload/error.php
lib/redactor/file_upload.php
blocktestimonial/addtestimonial.php
colorpictures
explorerpro
sampledatainstall
vm_advancedconfigurator
marketplace/libs/filemanager/dialog.php
ec_import/upload.php
vtemskitter/uploadimage.php
blocktestimonial/addtestimonial.php
/index.php?fc=module&module=orderfiles&controller=filesmanager
/index.php?fc=module&module=supercheckout&controller=supercheckout&ajax=1&method=SaveFilesCustomField
smartprestashopthemeadmin/ajax_smartprestashopthemeadmin.php
Injection possible depuis plusieurs fichiers du module infobia_properso:
infobia_properso/admin/upload.php
infobia_properso/admin/upload_motif.php
infobia_properso/maquetteajax.php
infobia_properso/transfert.php
infobia_properso/transfert2.php
infobia_properso/transfertjson.php
infobia_properso/upload.php
infobia_properso/uploadfile.php
nvn_excel_import/hayageekupload/php/upload.php
nvn_excel_import/upload.php
nvn_excel_import/uploadify.php
pkfacebookLe lien vers l'un de ces bots scanner afin de vous faire prendre conscience de la réalité du risque.
ici