Jump to content

csid

Members
  • Posts

    129
  • Joined

  • Last visited

About csid

  • Birthday 08/08/1966

Profile Information

  • Location
    lyon
  • Activity
    Freelancer

Recent Profile Visitors

3,308,580 profile views

csid's Achievements

  1. Bonjour, je cherche à récupérer l'ordre par défaut des produits enregistré par PS. Je souhaite l'utiliser dans la fonction init() de /controllers/front/listing/CategoryController.php J'ai déjà tout qui fonctionne avec ça : $tabtemp = $tmp_cat_obj->getProducts($this->context->language->id,(int)($this->p), (int)$hgnb, 'name', 'asc',false,true,false,1,false); Mais je souhaiterai remplacer le 'name' par la valeur paramétrée par le client dans "parametres boutique/Produits/pagination" J'ai quelques valeurs en dur qui fonctionnent : 'reference', 'position', 'price', 'name' Mais je veux que ce soit paramétrable via le back office... $this->orderBy et $this->orderWay ne remontent strictement rien (vide) D'avance merci pour vos réponses.
  2. 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
  3. 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.........................
  4. 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.
  5. 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 ?
  6. 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.
  7. 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 !
  8. 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!
  9. Bonjour, avez-vous trouvé une solution à ce problème, nous avons le même et nous ne trouvons pas de solution... Cordialement
  10. 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 ???
  11. 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.
  12. 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
  13. 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 !
  14. 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.
  15. Et oui c'etait bien les mécaniques simples... Aujourd'hui on ne voit même plus les durites
×
×
  • Create New...