Jump to content

csid

Members
  • Posts

    128
  • Joined

  • Last visited

Everything posted by csid

  1. hi, had same issue with PS 1.6 and PHP 7.4 Solved changing to PHP 7.1 J'avais le même pb avec un PS 1.6 chez OVH et PHP 7.4 Résolu en redescendant PHP en 7.1
  2. Bonjour, c'est bien ce qui a été fait plusieurs fois... mais le hook n'etait pas visible dans la liste des points d'accroche. Ce matin je me suis dit qu'à tête reposée cela irait mieux. Et comme par enchantement mon hook était disponible dans le backoffice ! Et me parlez pas de vider le cache je l'ai fait de nombreuses fois aussi! Bref! ca marche ! Méthode plus détaillée que dans mon premier post : - Modif du module (ps_specials.php) ou override pour être plus propre, ajout du hook dans la fonction install : public function install() { $this->_clearCache('*'); Configuration::updateValue('BLOCKSPECIALS_SPECIALS_NBR', 8); return parent::install() && $this->registerHook('actionProductAdd') && $this->registerHook('actionProductUpdate') && $this->registerHook('actionProductDelete') && $this->registerHook('actionObjectSpecificPriceCoreDeleteAfter') && $this->registerHook('actionObjectSpecificPriceCoreAddAfter') && $this->registerHook('actionObjectSpecificPriceCoreUpdateAfter') && $this->registerHook('displayHome') && $this->registerHook('displayPromosCms'); } - ajout du hook dans le template des pages cms (/themes/monthemechild/templates/cms/page.tpl) ... {if $cms.id==44} <!-- promos cms --> {hook h='displayPromosCms'} {/if} ... - réinitialisation du module - vidage du cache - allumage d'un cierge - attendre une bonne nuit de sommeil - croiser les doigts - aller dans "apparence->positions->greffer un module" - choisir son module (ici ps_specials donc bloc promotions) - dans la liste des hooks le nouveau hook doit apparaitre et c'est là que moi il n'apparaissait pas. - greffer le module - ensuite on peut greffer ou dégreffer le module de là ou on veut. Prestashop = PS = Pas Science = Patience.........................
  3. Ben.... n'est ce pas un peu ce que j'ai fait... en version sauvage sans override vu que j'ai modifié direct dans le module... Au moins ca me confirme que je suis sur la bonne piste.
  4. Bonjour, je bataille depuis un moment sur un truc qui me semblait simple sur un PS 1.7.4.2 : => Positionner le module ps_specials en dessous du contenu de la page CMS d'id 44. Je sais déterminer dans le template d'une page CMS quand je suis sur la page 44. Je pensais créer un hook dans le template cms/page.tpl Puis ajouter un registerhook dans le module ps_specials. Puis greffer le module sur le nouveau hook Sauf que je ne voyais pas mon nouveau hook dans le BO. J'ai trouvé des articles expliquant que pour creer un nouveau hook il fallait ajouter le hook dans la table ps_hook. Chose faite. Mais ca ne marche pas mieux. Pas de plantage mais pas de rendu de mes promos sur ma page CMS 44. Promos qui s'affichent toujours bien sur la page d'accueil. Comment feriez vous ? Qu'est-ce que je fais mal ?
  5. ben dans mon cas je n'arrive pas à comprendre la logique car les transporteurs limités à 30kg apparaissent pour des colis de 51kg et inversement. Sans logique apparente. Sauf que mon client aimerait bien pouvoir "choisir librement". Donc si quelqu'un connait la logique appliquée... Je vais essayer de me plonger dans le code si je trouve 7 minutes 35.
  6. Bonjour, j'ai un client qui souhaite pouvoir modifier le transporteur au moment de la saisie du numéro de suivi. Sauf si c'est absolument nécessaire, ce n'est pas un module que je cherche. Je souhaite comprendre cela : Lors de la saisie du numéro de suivi colis il est possible de choisir un transporteur dans un menu déroulant. Sauf que les transporteurs qui apparaissent ne sont pas ceux que souhaite mon client. Je n'arrive pas à trouver la logique de ce menu. En effet les transporteurs présentés ne sont pas toujours les mêmes. J'ai pensé que c'était fonction du pays de livraison et du poids des produits mais non! Car pour des produits de plus de 50kg j'ai des transporteurs conçus pour moins de 30kg ! Quelqu'un peut-il m'expliquer les règles qui déterminent les transporteurs affichés dans ce menu déroulant ??? D'avance un grand merci !
  7. Fonctionne parfaitement en prestashop 1.7.4.2 et suivants je présume ! Grand merci ! Pour ceux qui posent la question la modification pour mettre la date dans le panier c'est dans le template /checkout/partials/cart-detailed-product-line.tpl Encore merci!
  8. Bonjour, avez-vous trouvé une solution à ce problème, nous avons le même et nous ne trouvons pas de solution... Cordialement
  9. Bonjour, Avec le module navigation à facette nous avons activé le filtre sur les prix. (Slider ou glissière) Seulement la fourchette de prix affichée l'est avec 6 chiffres après la virgule ... Comment maîtriser cet affichage des décimales ???
  10. module activé sur la colonne de gauche finalement... Obligé d'activer cette colonne qui n'était pas souhaitée. Surement qu'avec d'autres modules cela fonctionne.
  11. Bonjour, Sur une prestashop 1.7.6.3 le module de navigation à facette n'affiche pas les filtres. (module natif PS) Ce qui a été fait : - produits saisis, actif, dont certains ont des attributs (finition,couleur et forme) - le module a ensuite été activé - un modèle été créé avec 4 filtre activés (attribut finition, couleur, forme et prix) - toutes les catéggories sont cochées : 3 niveaux avec l'accueil (accueil->boucles d'oreilles->Cerclées. pas plus) - tout a été réindexé (les boutons en haut du module) et le cache vidé - une réindexation globale de tous les produits a aussi été tentée (menu recherche) - Le module s'affiche car on a "Filtres actifs" qui s'affiche mais visiblement aucun filtre n'est affiché J'ai modifié le template pour enlever le if qui teste si il y a des filtres et dans ce cas j'ai bien un "<ul></ul>" qui est généré en plus. C'est donc bien que le module s'exécute mais ne remonte aucun filtres. Le site n'a qu'une colonne centrale (pas de gauche/droite) Le thème utilise jxmegalayout pour gérer la mise en page et donc le module facette a été greffé par ce biais sur le hook displayTopColumn. Est-il possible que le module s'affiche mais ne remonte pas de filtres à cause de ce hook peut être pas prévu dans le module?...? On a tout essayé dans tous les sens mais rien n'y fait. Une idée ? (le but est à terme d'afficher les filtres en haut à l'horizontal) Merci d'avance pour vos lumières
  12. Bonjour, je viens mettre ma solution à mon problème qui était : Prestashop 1.7.4.2 Permettre à un client de se logger avec un identifiant client unique. Le client pouvant avoir plusieurs comptes prestashop mais UNE SEULE adresse email (la même pour tous ses comptes). Je tiens une table customer_cptes contenant id_customer (celui de prestashop) et num_compte (numéro du compte client chez mon client) - je modifie la classe /classes/Customer.php (ou override si certains y arrivent, mais pour moi ça ne veut pas marcher...) => dans la fonction getByEmail je rajoute un else : if (Validate::isEmail($email)){ //----------- code original de la fonction if (!Validate::isEmail($email) || ($plaintextPassword && !Validate::isPasswd($plaintextPassword))) { die(Tools::displayError()); } $shopGroup = Shop::getGroupFromShop(Shop::getContextShopID(), false); $sql = new DbQuery(); $sql->select('c.`passwd`'); $sql->from('customer', 'c'); $sql->where('c.`email` = \''.pSQL($email).'\''); if (Shop::getContext() == Shop::CONTEXT_SHOP && $shopGroup['share_customer']) { $sql->where('c.`id_shop_group` = '.(int) Shop::getContextShopGroupID()); } else { $sql->where('c.`id_shop` IN ('.implode(', ', Shop::getContextListShopID(Shop::SHARE_CUSTOMER)).')'); } if ($ignoreGuest) { $sql->where('c.`is_guest` = 0'); } $sql->where('c.`deleted` = 0'); $passwordHash = Db::getInstance()->getValue($sql); try { // @var \PrestaShop\PrestaShop\Core\Crypto\Hashing $crypto $crypto = ServiceLocator::get('\\PrestaShop\\PrestaShop\\Core\\Crypto\\Hashing'); } catch (CoreException $e) { return false; } $shouldCheckPassword = !is_null($plaintextPassword); if ($shouldCheckPassword && !$crypto->checkHash($plaintextPassword, $passwordHash)) { return false; } $sql = new DbQuery(); $sql->select('c.*'); $sql->from('customer', 'c'); $sql->where('c.`email` = \''.pSQL($email).'\''); if (Shop::getContext() == Shop::CONTEXT_SHOP && $shopGroup['share_customer']) { $sql->where('c.`id_shop_group` = '.(int) Shop::getContextShopGroupID()); } else { $sql->where('c.`id_shop` IN ('.implode(', ', Shop::getContextListShopID(Shop::SHARE_CUSTOMER)).')'); } if ($ignoreGuest) { $sql->where('c.`is_guest` = 0'); } $sql->where('c.`deleted` = 0'); $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); if (!$result) { return false; } $this->id = $result['id_customer']; foreach ($result as $key => $value) { if (property_exists($this, $key)) { $this->{$key} = $value; } } if ($shouldCheckPassword && !$crypto->isFirstHash($plaintextPassword, $passwordHash)) { $this->passwd = $crypto->hash($plaintextPassword); $this->update(); } return $this; }else{ //-------------------------------------------------------------------------- //-- complement par CSID //-- ce n'est pas un email qui a été saisi on presume que c'est un id client //-- on va lire l'id du client pour recupérer l'id PS correspondant //-- puis on va traiter comme normal en changeant les select pour les faire //-- sur l'id customer et non sur l'email if ($plaintextPassword && !Validate::isPasswd($plaintextPassword)) { die(Tools::displayError()); } $shopGroup = Shop::getGroupFromShop(Shop::getContextShopID(), false); //-- recherche l'id_customer dans ps_customer_cptes à partir de l'identifiant saisi if ($cust = Db::getInstance()->getRow("select * from "._DB_PREFIX_."customer_cptes a,"._DB_PREFIX_."customer c where a.num_compte='".pSQL($email)."' and c.id_customer=a.id_customer") ){ $id_customer=$cust['id_customer']; $email=$cust['email']; }else{ return false; } //-- lecture et vérification du password $sql = new DbQuery(); $sql->select('c.`passwd`'); $sql->from('customer', 'c'); $sql->where('c.`id_customer` = \''.pSQL($id_customer).'\''); if (Shop::getContext() == Shop::CONTEXT_SHOP && $shopGroup['share_customer']) { $sql->where('c.`id_shop_group` = '.(int) Shop::getContextShopGroupID()); } else { $sql->where('c.`id_shop` IN ('.implode(', ', Shop::getContextListShopID(Shop::SHARE_CUSTOMER)).')'); } if ($ignoreGuest) { $sql->where('c.`is_guest` = 0'); } $sql->where('c.`deleted` = 0'); $passwordHash = Db::getInstance()->getValue($sql); try { // @var \PrestaShop\PrestaShop\Core\Crypto\Hashing $crypto $crypto = ServiceLocator::get('\\PrestaShop\\PrestaShop\\Core\\Crypto\\Hashing'); } catch (CoreException $e) { return false; } $shouldCheckPassword = !is_null($plaintextPassword); if ($shouldCheckPassword && !$crypto->checkHash($plaintextPassword, $passwordHash)) { return false; } //-- lecture du customer $sql = new DbQuery(); $sql->select('c.*'); $sql->from('customer', 'c'); $sql->where('c.`id_customer` = \''.pSQL($id_customer).'\''); if (Shop::getContext() == Shop::CONTEXT_SHOP && $shopGroup['share_customer']) { $sql->where('c.`id_shop_group` = '.(int) Shop::getContextShopGroupID()); } else { $sql->where('c.`id_shop` IN ('.implode(', ', Shop::getContextListShopID(Shop::SHARE_CUSTOMER)).')'); } if ($ignoreGuest) { $sql->where('c.`is_guest` = 0'); } $sql->where('c.`deleted` = 0'); $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->getRow($sql); if (!$result) { return false; } $this->id = $result['id_customer']; foreach ($result as $key => $value) { if (property_exists($this, $key)) { $this->{$key} = $value; } } if ($shouldCheckPassword && !$crypto->isFirstHash($plaintextPassword, $passwordHash)) { $this->passwd = $crypto->hash($plaintextPassword); $this->update(); } return $this; } - puis j'ai besoin que le formulaire ne me bloque pas si on saisi autre chose qu'un email. => je modifie la classe /classes/form/CustomerLoginFormatter.php (même remarque que précédemment : ou override pour être propre) je change le type obligatoire du champ email et j'enleve la contrainte "isEmail" public function getFormat() { return [ 'back' => (new FormField) ->setName('back') ->setType('hidden'), 'email' => (new FormField) ->setName('email') // ->setType('email') ->setType('text') ->setRequired(true) ->setLabel($this->translator->trans( 'Email', [], 'Shop.Forms.Labels' )) // ->addConstraint('isEmail'), , 'password' => (new FormField) ->setName('password') ->setType('password') ->setRequired(true) ->setLabel($this->translator->trans( 'Password', [], 'Shop.Forms.Labels' )) ->addConstraint('isPasswd'), ]; } !!! Attention !!! je reste persuadé que ce genre de manip peut être problématique. En effet dans mon cas il sous entend qu'on peut avoir plusieurs lignes dans ps_customer avec la même adresse email. Or j'ai vu à plusieurs reprises des modules et des fonctions de PS qui utilisent l'adresse email comme identifiant unique. Le risque est donc grand que dans certains cas le compte client lu ne soit pas le bon... Et il n'est pas bon de modifier les classes directement. Faut-il le rappeler? A vous de voir si c'est jouable ou pas. Si ce post vous permet au moins d'avoir des pistes c'est déjà ça !
  13. Bonjour, Pour enrichir ce topic j'ai eu le même pb sur une 1.7.4 lors de la connexion client dans le panneau latéral de login du thème eveprest. Le problème venait simplement du fait que j'avais affiché des traces pour le suivi d'une modification. Ces traces perturbaient le retour json d'un appel ajax. Là encore c'est le debug de Firefox qui m'a permi de voir que la réponse http contenait mes traces puis le json en réponse.
  14. Et oui c'etait bien les mécaniques simples... Aujourd'hui on ne voit même plus les durites
  15. Merci Eolia, suis passé à coté sans voir !! La fatigue je présume puis l'énervement. Ca devrait le faire avec un override sur le filtre à air Grand merci!
  16. Bonjour, je vais essayer d'être clair. j'ai un client B2B dont certains clients ont plusieurs comptes. Chacun de ces comptes a le même email et même password ........ ! Il souhaite que ces clients s'identifient avec leur numéro de compte client. Pour corser le tout il va aussi avoir des clients particuliers qui eux se loggueront avec leur email. Mon idée est donc d'avoir une table avec la correspondance id_customer<->numéro de compte. (ça c'est ma sauce ) j'ai déjà vérifié PS permet d'avoir plusieurs customers avec le meme email(pas de contrainte unique sur email) Il me suffirait donc de modifier le test de login en cherchant l'id_customer à partir du compte puis en vérifiant le password pour logger le bon id_customer. Sauf que je n'arrive pas à trouver ou se trouve cette vérification email/password... je cherche désespérément et même la bière chaude ne m'aide pas ! Quelle classe? Quel controler ? Idéalement : Ou se fait le select ... where email=xxx and password=yyy ??????? A la limite modifier le coeur de PS ne me dérange pas si je peux m'insérer ou je veux ! Merci d'avance
  17. Bonjour, L'aventure continue... En fait dans le principe tout est bon. Sauf une chose : Mon tableau $subProducts[lacateg_voulue] remonte un produit mais qui n'a pas la structure de celui remonté de base par CategoryController. Donc il me manque plein de trucs et les noms des indices dans le tableau changent. Quelqu'un peut il me dire comment l'objet "product" traité par product.tpl est généré car je ne trouve pas dans le code... Mon idée serait, dans CategoryController, d'intégrer dans ma boucle sur les sous categories une boucle sur les produits de chaque sous categorie qui génére l'objet produit selon la meme structure que celui généré par prestashop de base pour la categorie courante. Je ne trouve pas comment cette structure produit est générée... et vu mon grand age la POO a tendance à me faire vomir au bout de qq heures
  18. le problème vient du (int)($this->n) dans le getProducts. Il était à zéro... J'arrive à quelque chose... je suis dans les templates mais apparemment les images ne sont pas remontées....
  19. bonjour, oui en suivant la logique du lien mis juste avant j'ai modifié la fonction init() dans CategoryController.php en faisant ainsi : //--- hg $subProducts = array(); $subCategories=$this->category->getSubCategories($this->context->language->id); foreach($subCategories as $subCat) { $tmp_cat_obj = new Category($subCat['id_category'], $this->context->language->id); $subProducts[$subCat['id_category']] = $tmp_cat_obj->getProducts($this->context->language->id,(int)($this->p), (int)($this->n), $this->orderBy, $this->orderWay,false); } //-- fin hg $this->context->smarty->assign(array( 'category' => $categoryVar, 'subcategories' => $this->getTemplateVarSubCategories(), 'subProducts' => $subProducts, //-- hg )); $subProducts remonte bien dans le template category.tpl mais vide !!! Alors que si j'appel getProducts avec True au lieu de false dans le parametre getTotal le nombre de produits est bien remonté ! Dans mon template j'ai mis : {foreach from=$subcategories item=subcat name=subcategories} <h2>{$subcat.name|upper}</h2> =>{$subProducts[$subcat.id_category]|print_r} {if isset($subProducts[$subcat.id_category][0]['name'])} {include file="$tpl_dir./product-list.tpl" products=$subProducts[$subcat.id_category]} {include file="$tpl_dir./pagination.tpl"} {elseif !isset($subProducts[$subcat.id_category][0]['name'])} <p class="warning">{l s='There are no products in this category.'}</p> {/if} {/foreach} Et j'obtiens : =>19 si je demande getTotal=true => Array() si getTotal=false Je suis à deux doigts d'y arriver mais là je ne comprends encore pas pourquoi...
  20. ben non.... vide... Je me remet dessus demain . J'ai trouvé ça qui peut être intéressant même si c'est pour un 1.4 :
  21. Bonjour, je m'arrache toujours les cheveux... Je n'arrive toujours pas à faire remonter les catégories d'un produit dans smarty... j'ai fait un override dans /override/controllers/front/ProductController.php J'y ai mis : ?php class ProductController extends ProductControllerCore { public function initContent() { parent::initContent(); if (!$this->errors) { $hg_categs = 'toto'; $this->context->smarty->assign('hg_categs', $hg_categs); } } } Ensuite dans /themes/beeperchild/templates/catalog/_partials/miniatures/product.tpl j'ai mis " =>{$product.hg_categs} " : ..... {block name='product_miniature_item'} =>{$product.hg_categs} <article class="product-miniature js-product-miniature" data-id-product="{$product.id_product}" data-id-product-attribute="{$product.id_product_attribute}" itemscope itemtype="http://schema.org/Product"> <div class="product-miniature-container"> ..... Mais toujours rien ne remonte... Ya un truc que je ne dois pas comprendre... Je devrais bien avoir un "toto" qui s'affiche non? sachant que je dois remplacer mon "toto" par $this->getCategories(); .......... enfin... je ne suis plus sûr de rien ! 🤬
  22. Je prends quand même ca m'aidera surement ou ca me donnera une piste
  23. bonjour, oups... c'est un prestashop 1.7.4.2 désolé de l'oubli de la version...
  24. Bonjour, dans le cadre d'une modif dans le template et sous templates qui affichent une catégorie (et donc les produits dans cette categorie) je cherche, au niveau du template à connaitre les catégories d'un produit. J'aurai donc besoin de faire remonter à smarty les categories de chaque produit. Au point où j'en suis arrivé , ca serait dans product.tpl qu'il me faudrait un array des numéro de categorie du produit. On a déjà un $product, il me faudrait pouvoir exploiter un $product.current_categories ........ Je cherche désespérément à faire remonter ça... Quelqu'un aurait une piste? D'avance merci.
×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More