Jump to content

Forcer La Majuscule.


Recommended Posts

Bonjour. 

 

Je relance un sujet vu et revu, mais je vous explique les petits plus. 

 

Je souhaite forcer les majuscules pour :

- tout le nom de famille.

- la première lettre du prénom. 

- les premières lettres pour les adresses. 

 

J'utilise un système de facture avec des étiquettes intégrées. Donc je souhaite avoir un truc clean, car en ce moment ça sort comme le client le rentre... donc n'importe comment. 

 

J'ai trouvé des solutions pour presta 1.4 ou 1.5 mais pas pour 1.6. 

 

Du coup je visualise deux solutions, mais je ne suis pas du tout développeur, donc je rame dur.

 

1- Forcer le format dans la database en direct. Est ce que c'est faisable?

Est ce que c'est faisable en faisant une tache dans le panneaux de config > Paramètres avancées > Gestionnaire SQL?

 

Ce serait l'idéal, car la modification ne serait pas écrasée lors des mises à jour. 

 

2- Modifier le fichier Classes > Customer.php. 

J'ai trouvé un ancien forum qui donne des modifs, mais la version 1.6 est différente et comme je ne suis pas dev... ben je rame encore. 

 

 

J'ai enfin trouvé et je vous le fait partager.

Il faut faire fi de tous les Uppercase précédemment cités, ils ne produisent pas de résultats optimums dans la BDD.

Il faut tout simplement modifier dans le fichier : /classes/Customer.php

dans : public function getFields() ligne 95 environ

$fields['lastname'] = pSQL($this->lastname);

par

$fields['lastname'] = pSQL(Tools::strtoupper($this->lastname));

et refaire la même chose avec tous les champs que l'on veut uppercaser ;-P

Et pour les adresses, c'est dans : /classes/Address.php

Voila c'est tout

 

De plus, cette pratique me pose un problème, car j'utilise des marketplace pour vendre mes produits (ex ebay et Amazon). 

Quand j'ai une commande sur l'un de ses sites, les coordonnées et les commandent s'implementent dans ma base de données et donc dans mon site. Et je suppose que cela se fait sans passer par le module d'inscription. Du coup la solution 1 serait je pense meilleure. 

 

Pouvez vous m'aider svp?

 

Link to comment
Share on other sites

Bonsoir,

 

Attention il y a plusieurs problèmes ici. Concernant les marketsplace, cela veut dire que les données déjà existantes en base doivent avoir cette casse particulière. Donc effectivement la solution en PHP ne fonctionnera que sur les nouvelles inscriptions (qui est nécessaire de toute façon pour le futur...)

 

Pour les données existantes, tu dois faire des requêtes en base directement mais attention tu manipules les données !!! donc il vaut mieux savoir ce que l'on fait.

- Premièrement, il faut faire une sauvegarde de ta base de données en local sur ton ordinateur pour commencer par tester le résultat sur un environnement de test.

 

- Ensuite, si tu veux mettre le nom en majuscules pour tous les clients:

UPDATE PS_CUSTOMER SET lastname=upper(lastname)

- Pour la première lettre en majuscule tu peux faire:

UPDATE ps_customer SET firstname= CONCAT(UCASE(LEFT(firstname, 1)), SUBSTRING(firstname, 2))

Attention, cela met la première lettre de la chaîne en majuscules, autrement dit si il y a plusieurs mots, seul le premier se retrouve avec une majuscule.

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

Merci Franck. 

 

Du coup, je te remercie de valider ma théorie. Par contre, j'ai tous les jours des commandes. Du coup chaque nouvel inscrit aura le format brut et je devrais faire une raquette à chaque fois. 

 

N'existe t'il pas un champs à remplir au niveau de ma base de donnée qui dit : blablabl toutes les données de cette colonne seront systématiquement en Maj?

 

D'une sa m'évite de me les taper à la main avant chaque export papier. 

De deux, ça m'évite de planter ma base si je suis un peu dans la précipitation. 

 

Sinon je souhaite également les lignes de manip pour la modif dans classe php. 

Comme ça j'ai déjà une partie qui rentrera dans la base sous forme de Majuscules. 

 

Merci beaucoup.

Link to comment
Share on other sites

 

faire une raquette à chaque fois.

 

MySql est assez capricieux des fois, mais un coup de raquette n'arrangera rien :)

 

 

N'existe t'il pas un champs à remplir au niveau de ma base de donnée qui dit : blablabl toutes les données de cette colonne seront systématiquement en Maj?

 

Non MySql permet de définir des types de champs (par exemple ici un VARCHAR pour chaîne de caractères) mais il n'est pas capable d'aller plus loin.

Pour lui, une chaîne de caractères est une chaîne de caractères. Il peut faire des opérations a posteriori dessus (comme indiqué plus haut) mais il n'est pas capable de modifier de façon aussi complexe la chaîne à l'entrée.

 

Donc ça revient à faire ce que j'ai dis en premier:

- Commencer par faire la modification en PHP pour faire en sorte que toute nouvelle commande applique la bonne casse.

- Faire un update de masse comme indiqué plus haut pour faire en sorte que les anciennes données soient mises à niveau.

Link to comment
Share on other sites

Merci Franckm1000.

 

Tu as beaucoup enrichi mon savoir ou plutot mon manque de savoir sur le sujet :-)

Donc, si l'on reprend par étape :

Est ce que tu peux m'indiquer, ce que je dois changer dans mon fichier classes/customer.php

(j'ai cru comprendre que c'est lui qui se charge de traiter les infos sur mes clients)

Pour qu'il intégré les majuscules à l'intégralité du nom et la première lettre en maj pour le prénom. 

 

Je suis preneur de tout coup de main... (attention pas de coup de pieds ;-) )

Link to comment
Share on other sites

Je ne suis plus trop Prestashop mais tu peux toujours essayer ça:

Dans la classe Customer.php trouves (pour moi ligne 204) :

public function add($autodate = true, $null_values = true)
{

Et juste après, ajoutes un truc du style:

$this->lastname = strtoupper($this->lastname);
$this->firstname = ucfirst($this->firstname);

Je pense que cette fonction add héritée de l'objet model sert pour les insertions en base mais c'est à tester...

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

Alors, moi j'ai cela :

 

 

public function add($autodate = true, $null_values = true)

    {
        $this->id_shop = ($this->id_shop) ? $this->id_shop : Context::getContext()->shop->id;
        $this->id_shop_group = ($this->id_shop_group) ? $this->id_shop_group : Context::getContext()->shop->id_shop_group;
        $this->id_lang = ($this->id_lang) ? $this->id_lang : Context::getContext()->language->id;
        $this->birthday = (empty($this->years) ? $this->birthday : (int)$this->years.'-'.(int)$this->months.'-'.(int)$this->days);
        $this->secure_key = md5(uniqid(rand(), true));
        $this->last_passwd_gen = date('Y-m-d H:i:s', strtotime('-'.Configuration::get('PS_PASSWD_TIME_FRONT').'minutes'));
 
        if ($this->newsletter && !Validate::isDate($this->newsletter_date_add)) {
            $this->newsletter_date_add = date('Y-m-d H:i:s');
        }
 
        if ($this->id_default_group == Configuration::get('PS_CUSTOMER_GROUP')) {
            if ($this->is_guest) {
                $this->id_default_group = (int)Configuration::get('PS_GUEST_GROUP');
            } else {
                $this->id_default_group = (int)Configuration::get('PS_CUSTOMER_GROUP');
            }
        }
 
        /* Can't create a guest customer, if this feature is disabled */
        if ($this->is_guest && !Configuration::get('PS_GUEST_CHECKOUT_ENABLED')) {
            return false;
        }
        $success = parent::add($autodate, $null_values);
        $this->updateGroup($this->groupBox);
        return $success;
    }
 
    public function update($nullValues = false)
    {
        $this->birthday = (empty($this->years) ? $this->birthday : (int)$this->years.'-'.(int)$this->months.'-'.(int)$this->days);
 
        if ($this->newsletter && !Validate::isDate($this->newsletter_date_add)) {
            $this->newsletter_date_add = date('Y-m-d H:i:s');
        }
        if (isset(Context::getContext()->controller) && Context::getContext()->controller->controller_type == 'admin') {
            $this->updateGroup($this->groupBox);
        }
 
        if ($this->deleted) {
            $addresses = $this->getAddresses((int)Configuration::get('PS_LANG_DEFAULT'));
            foreach ($addresses as $address) {
                $obj = new Address((int)$address['id_address']);
                $obj->delete();
            }
        }
 
        return parent::update(true);
    }
 
Du coup pas de traces de :
 
$this->lasname =
&
$this->firstname = 
 
Du coup,  si je rajoutes, est ce que ca va pas crée un mega bug d'avoir la fonction qui doit etre declarée à un autre endroit et faire doublon?
Link to comment
Share on other sites

Pas de panique, tu rajoutes simplement ces deux lignes ici:

public function add($autodate = true, $null_values = true)
    {
//Je commence mon ajout
$this->lastname = strtoupper($this->lastname);
$this->firstname = uccase($this->firstname);  
//Je finis mon ajout      
$this->id_shop = ($this->id_shop) ? $this->id_shop : Context::getContext()->shop->id;
        $this->id_shop_group = ($this->id_shop_group) ? $this->id_shop_group : Context::getContext()->shop->id_shop_group;

Dans cette classe, lastname et firstname sont des attributs de cette classe donc $this->lastname ne fait qu'appeler la valeur de cet attribut (qui peut très bien être nulle).

Derrière on ne fait qu'appliquer une petite fonction PHP pour mettre en majuscule.

L'intérêt est que l'on change la valeur de l'attribut juste avant sa mise en base.

 

La fonction add est une fonction de la classe ObjectModel. C'est cette méthode "générique" qui doit servir à faire les insert en base de tous les objets dédiés (produit, client, commande...).

Chaque classe ensuite (product, customer...) surcharge à sa façon cette méthode pour y mettre ses traitements spécifiques (comme nous ici la mise majuscules).

 

Aucun méga bug en perspective ;)

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

Bon.... Ca bug. 

 

J'ai fais la modif, j'ai tester en créant une nouvelle commande avec un nouveau compte. Quand je valide les infos, je me retrouve bloquer sur une page blanche. 

Je rafraichit et la page blanche persiste. ....

 

Donc j'ai modifier la fonction ailleurs :

 

 

$this->is_guest = 0;

        $this->passwd = Tools::encrypt($password);
        $this->cleanGroups();
        $this->addGroups(array(Configuration::get('PS_CUSTOMER_GROUP'))); // add default customer group
        if ($this->update()) {
            $vars = array(
                '{firstname}' => uccase($this->firstname),
                '{lastname}' => strtoupper($this->lastname),
                '{email}' => $this->email,
                '{passwd}' => $password

 

Et ça fonctionne pour le prénom mais pas pour le nom de famille.... du coup je pense que je dois chercher la bonne formule pour le Nom. 

 

Et aussi trouver ou je dois modifier la fonction pour l'adresse. 

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

As tu vraiment bien recopié sans aucune erreur ?

 

Tu as bien mis lastname (et pas lasname comme dans un message précédent ?)

tu as bien mis le code après le { ?

Il n' y avait aucune erreur de syntaxe ?

Pour moi une page blanche s'apparente ici plus à une erreur de syntaxe

 

C'est très bizarre que ça te fasse une page blanche pour ce que j'ai mis... mais bon

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

Bonjour,

 

Tente un ucfirst au lieu de uccase

( ucfirstMet le premier caractère en majuscule )

 

 

  $vars = array(

                '{firstname}' => ucfirst($this->firstname),
                '{lastname}' => strtoupper($this->lastname),
                '{email}' => $this->email,
                '{passwd}' => $password
Link to comment
Share on other sites

pourquoi se compliquer la vie... apparemment vous avez besoin d'imprimer en majuscule les informations du client pour avoir une étiquette propre.

 

Personnellement j'aurai agi sur l'impression, qui doit avoir des lignes css pour la mise en page, et rajouté ce genre de valeur aux champs que vous voulez voir imprimés en majuscule :

{
   text-transform: uppercase; 
}

et ceci pour la première lettre en majuscule :

{
  text-transform : capitalize;
}

Cordialement,

Tweb.

Link to comment
Share on other sites

Au temps pour moi, ucase n'est même pas une fonction PHP à ma connaissance, je ne sais même pas où j'ai bien pu imaginer ce truc, sûrement avec le UCASE de SQL ? :huh:

 

C'est bien ucfirst, c'est pour ça que tu avais une erreur page blanche, tu avais une erreur de syntaxe.

Par contre, essaies de le mettre où je t'avais dit au départ pour voir.

 

 

pourquoi se compliquer la vie

 

C'est une question de point de vue, personnellement je préfère enregistrer les données au bon format dès le départ en base plutôt que de devoir transformer en post-process (pire en css) les informations.
Mais les deux peuvent se concevoir.

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

Au temps pour moi, ucase n'est même pas une fonction PHP à ma connaissance, je ne sais même pas où j'ai bien pu imaginer ce truc, sûrement avec le UCASE de SQL ? :huh:

 

C'est bien ucfirst, c'est pour ça que tu avais une erreur page blanche, tu avais une erreur de syntaxe.

Par contre, essaies de le mettre où je t'avais dit au départ pour voir.

 

 

C'est une question de point de vue, personnellement je préfère enregistrer les données au bon format dès le départ en base plutôt que de devoir transformer en post-process (pire en css) les informations.

Mais les deux peuvent se concevoir.

 

 

Les données sont enregistrées au bon format sinon imaginez bien que cette demande aurait déjà été traitée depuis la version 1.0 de prestashop non ?

 

la seule chose qui pose "problème" à cet utilisateur c'est l'impression des étiquettes de livraison si j'ai bien compris, le système de gestion d'impression n'est tout simplement pas abouti puisque il ne formate pas le texte ou ne propose pas cette option qui me parait effectivement importante, par contre... lorsque le client va ouvrir son compte client il sera surpris de voir que les informations qu'ils a renseignées ont été transformées en majuscule.... cela peut poser plus de soucis que de modifier au dernier moment pour l'impression.

 

Celà reste cependant mon point de vue personnel, ça se discute bien sur.. mais entre 3 lignes de codes CSS.. qui agissent sur la génération du  pdf final et modifier le core de prestashop (en override, mais ça revient au même) ce n'est pas tout à fait la même façon de procéder.. ça me fait penser à utiliser une grue pour soulever une cuillère à café :)

 

qu'avez vous contre le CSS ? c'est son rôle de mettre en forme le texte non ?

avec votre méthode il n'y a pas de retour en arrière possible, ce que le client renseigne, vous ne le verrez jamais exactement comme tel.

 

Cordialement.

Link to comment
Share on other sites

Non non mais je n'ai absolument rien contre le CSS...

 

Tout est encore une fois question de point de vue et de l'attente du client (pour client ici je parle du e-commerçant).

 

Quand je parle de bon format je parle du format souhaité par ce même client, pas le format habituel qui je me doute bien est correct depuis la version1.0 (un VARCHAR de 32 c'est un VARCHAR 32...).

Il souhaite (ou peut-être pas ?) manifestement un système uniformisé pour les attributs des noms/prénoms de la classe customer à l'enregistrement (après effectivement pour le client lui même ça peut être gênant de mettre en forme directement à voir...).

 

C'est pour cette raison qu'il est parti sur une solution côté serveur pour mettre en forme les chaînes à leur entrée.

Remarquez qu'à mon sens côté serveur cela revient à insérer 2 lignes supplémentaires dans la méthode c'est pas non plus la fin du monde.

 

Mais bon, bref je suis pas là pour me justifier de quoi que ce soit il fera bien comme il l'entend...

Link to comment
Share on other sites

Bonjour. 

 

Désoler, mais je ne pouvais pas répondre plus tôt. Merci à tous pour vos réponses. Effectivement, comme le dit Franckm1000, je souhait uniformisé mes formats. Cela doit etre valable pour l'ensemble du site et non pas juste les impressions d'étiquettes. Je dois pouvoir le faire pour les e-mailings et le reste. 

 

J'ai fait les modifs au niveau des lignes :

779     '{firstname}' => $this->firstname,

780     '{lastname}' => $this->lastname,

 

que j'ai remplacé par :

 

779     '{firstname}' => uccase($this->firstname),

780     '{lastname}' => strtoupper($this->lastname),

 

J'ai fait un test en faisant une nouvelle inscription. 

J'obtient le résultat voulu pour le prénom (firstname) ou j'ai écrit alExANdrE qui devient Alexandre dans ma base de données et sur mes étiquettes. 

Par contre, la fonction "strtoupper" n'a pas l'aire de vouloir donner de bons resultats, car duPoNd reste duPoNd..... 

 

Et si j'applique :

780     '{lastname}' => uccase($this->lastname),

 

ce ne marche pas sur le nom de famille.  :(  :(  :(  :(

Link to comment
Share on other sites

Salut, tu dois faire ucfirst au lieu de uccase (remonte dans les sujets, je t'ai mis la solution)

 

Pour info :

ucfirst() retourne la chaîne str après avoir remplacé le premier caractère par sa majuscule, si le premier caractère est alphabétique.

strtoupper() retourne string, après avoir converti tous les caractères alphabétiques en majuscules.

Link to comment
Share on other sites

Y a un problème quelque part. Clairement, je pense que tu NE PASSES PAS à l'endroit où tu as fait des modifs (lignes 779 et 780).

J'aurais plutôt tendance à penser vu le code (if $this->update) qu'on passe ici en modification. Donc enlèves les modifs que tu as fais car à mon avis en modification de client tu te prendras encore une erreur de page blanche.

 

Car comme dit plus haut, je me suis trompé, uccase() n'existe pas comme fonction PHP.

Donc si tu passais là, crois-moi tu te prendrais une grosse erreur et une page blanche (comme tu avais eu plus haut).

Je pense que le code où tu modifies n'est pas le code pour l'enregistrement d'un nouveau client.

 

Encore une fois, essaies de remplacer:

public function add($autodate = true, $null_values = true)
    {
        $this->id_shop = ($this->id_shop) ? $this->id_shop : Context::getContext()->shop->id;

Par :

public function add($autodate = true, $null_values = true)
    {
//Je commence mon ajout
$this->lastname = strtoupper($this->lastname);
$this->firstname = ucwords(strtolower($this->firstname));   
//Je finis mon ajout      
$this->id_shop = ($this->id_shop) ? $this->id_shop : Context::getContext()->shop->id;

Et je pense que ça devrait aller (car l'erreur de la page blanche était dû justement à ce fameux uccase qui n'existe pas).

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

Je viens d'effacer le fichier pour repartir de la base sans modif. 

 

J'ai ajouter le code et c'est de tout mon coeur que je te dis un grand merci. Un grand succès. 

Le code de Franckm100 est bon. 

 

Et maintenant si vous voulles bien ... il faut nous attaquer à faire la même chose pour l'importation depuis le module Ebay :-) hahaha

Link to comment
Share on other sites

Par contre, pour plus de lisibilité et pour éviter de toucher au Core, je te conseille de faire ceci.

 

Remets ton fichier classes/customer.php en version d'origine.

Créé un fichier php que tu nommes Customer.php à cet endroit : /override/classes/Customer.php et mets le code suivant dedans:

<?php

class Customer extends CustomerCore{
     public function add($autodate = true, $null_values = true){
             $this->lastname = strtoupper($this->lastname);
             $this->firstname = ucwords(strtolower($this->firstname));   
             parent::add($autodate, $null_values);   
    }
}

?>

Testes pour voir, c'est mieux de ne pas toucher aux fichiers Core.

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

Je viens d'essayer et ça ne marche que pour le prénom. 

 

C'est étrange car ça marchait bien quand j'avais intégrer le code : Classes > Customer.php

 

J'ai vérifier, le fichier est au bon endroit et il n'y a pas de faute d'orthographe. 

 

Est ce que j'aurais du déclarer autre chose?

Link to comment
Share on other sites

Il semblerait qu'il faille d'abord aller dans le répertoire /cache depuis le racine et supprimer le fichier class_index.php

Il sera automatiquement régénéré et il mettra à jour ses tableaux pour renvoyer vers l'override de la classe Customer.

 

Car ici, je pense qu'en fait tu ne passes pas dans la surcharge. De ce fait, le fait que ça marche pour le prénom me fait dire que tu as du faire des modifs à un autre endroit pour impacter le prénom ?

Link to comment
Share on other sites

Ok, je viens d'effacer le cache/class_index.php

 

I'ai fermer mes fenêtre et redémarrer mon navigateur. 

Et quand je veux crée un nouveau compte j'ai un bug qui m'indique :

 

 

Il y a 1 erreur

  1. une erreur s'est produite pendant la création de votre compte

 

Tous mes champs sont bon et je n'arrive pas à aller plus loin. 

 

J'ai donc réimplanter le ficher class_index.php et ça re-fonctionne.

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

En attendant, je suis reparti sur la première formule que tu m'as proposer et qui fonctionne.

 

J'ai également trouvé les lignes qui m'importent les noms et prénoms de ebay dans Prestashop. 

Module/ebay/Classes/Ebay Orders.php

 

Ligne 170 :

 

Mais la syntaxe est légèrement différente. 

 

 

$format = new TotFormat();

 
        $address->id_country = (int) Country::getByIso($this->country_iso_code);
        $address->alias = 'eBay';
        $address->lastname = $format->formatName(EbayOrder::_formatFamilyName($this->familyname));
        $address->firstname = $format->formatName($this->firstname);
        $address->address1 = $format->formatAddress($this->address1);
        $address->address2 = $format->formatAddress($this->address2);
        $address->postcode = $format->formatPostCode(str_replace('.', '', $this->postalcode));
        $address->city = $format->formatCityName($this->city);
        $address->phone = $format->formatPhoneNumber($this->phone);
        $address->active = 1;
 

 

Je souhaite obtenir le même résultat que dans notre premier manip. 

 

Peux tu me donner un petit coup de main stp?

Link to comment
Share on other sites

Essaies de changer ces deux lignes:

$address->lastname = $format->formatName(EbayOrder::_formatFamilyName($this->familyname));
$address->firstname = $format->formatName($this->firstname);

En:

$address->lastname = strtoupper($format->formatName(EbayOrder::_formatFamilyName($this->familyname)));
$address->firstname = ucwords(strtolower($format->formatName($this->firstname)));
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...