IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Odoo (ex-OpenERP) Discussion :

Fonction javascript onkeypress pour tous les champs OpenERP


Sujet :

Odoo (ex-OpenERP)

  1. #1
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut Fonction javascript onkeypress pour tous les champs OpenERP
    Bonjour, je suis développeur OpenERP. Je vous suis depuis un bon moment et j'avoue que vos tutos m'ont souvent bien servi, je vous remercie pour ça d'abord. Ensuite ça fait 15 jours que je me suis planté pour ajouter une fonction javascript onkeypress à mes champs openerp. EN effet la fonction en tant que telle est un séparateur de milliers, meme si OpenERP dispose de cette fonctionnalité en configuration elle n'est pas visible à la saisie seulement à l'affichage, moi je voudrais que celle ci soit faite de façon instantanée à la saisie. j'ai déja la fonction javascript, je voudrais une description un peu détaillée de la démarche à adopter pour faire marcher celle ci.
    Merci d'avance

  2. #2
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Bonjour,

    As tu commencé quelque chose ? As tu un bout de code à montrer?
    Eventuellement si tu as commencé quelque chose, as tu un message d'erreur ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci N1Bus pour ta réponse, non je n'ai pas quelque chose j'ai juste la fonction javascript, je ne sais pas par où commencer l'intégration

  4. #4
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Bon, mais ce n'est pas simple du tout.

    Tout d'abord, il faut que tu mettes le script JS dans un répertoire ton_module\static\src\js\ton_script.js et que tu le déclares dans le _openerp_.py

    Ensuite ça devient vraiment compliqué. Il faut que tu écrives un script qui va surcharger les fonctions d'origine d'openERP.

    Par exemple, si tu veux modifier un formulaire (le code JS) , il faut que tu surcharges le script JS du module Web d'OpenERP.
    C'est à dire, de mémoire, le script web\static\src\js\view_form.js

    Là dedans, il y a des tas de fonctions/modules qui servent à traiter ou afficher les vues formulaires. dans le même dossier tu trouveras les autres vues (list + list_editable, etc). c'est la base de l'application Web d'openERP.

    Par exemple, je suis en train de créer un forum interne à openERP.
    Pour cela, je crée un module qui sera une instance de web.widget.
    Ce qui me permettra de récupérer les fonctions initiales , éventuellement les modifier + ajouter les miennes

    Pour faire ça, je crée un fichier JS dans lequel je mets :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    function vapo_forum_basewidget(instance, module){
     
        module.ForumBaseWidget = instance.web.Widget.extend({
            init:function(parent,options){
                this._super(parent);
                options = options || {};
                this.vapo = this;
            },
            show: function(){
                this.$el.show();
            },
            hide: function(){
                this.$el.hide();
            },
        });
    }

    Mon module s'appelle "vapo_forum". ici je viens de créer le module ForumbaseWidget qui me servira de base pour les autres modules du forum.

    C'est un peu compliqué à expliquer.
    Lorsque j'aurai fini le forum, je le mettrai ici et je ferai un tuto pour vous expliquer 2 ou 3 trucs.

    Donc, bref.

    Dans mon forum, j'ai un module d'édition de message :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
        module.EditMessageForm = module.ForumBaseWidget.extend({
            template: "EditMessageForm",
     
            start: function() {   
                var self = this;
                this._super();      
                $('#edit_form_div').on('show', function(){
                    self.show_div();
                });
            },
     
            show_div: function(){
                var self = this;
                ...
                ...
            },
        });

    Evidemment, le module correspond à un Template (EditMessageForm) qui affichera les champs, les boutons, etc.

    Disons, que j'ai un champ "text_input" et que je veux effectuer une action onkeypress() . je vais rajouter dans la fonction start() :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $('#text_input').keypress(function(){
         // ici ma fonction JS 
    });

    J'essaierai de te montrer un bout de code concret demain (j'ai ça au bureau).

    Dans tous les cas, je te suggère d'utiliser Firebug pour pouvoir afficher la console et tracer les fonction ou débugger.

    Je te dirais bien que pour t'aider tu pourrais étudier le POS, mais c'est une usine à gaz et en plus le JS et scindé dans plusieurs fichiers, donc pour s'y retrouver c'est un peu chaud.

    Mais pour résumer , si tu ne connais pas javascript/JQuery ni le fonctionnement d'OpenERP, ça se présente pas bien...

    Pour pouvoir t'aider, il faudrait que tu nous dises précisément ce que tu veux faire. Dans quel module, quelle vue, etc...

  5. #5
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci encore une fois pour ta réponse N1bus. je vais décrire le problème.
    En effet j'ai créé un module de saisie des états financiers. Maintenant comme c'est des nombres qui peuvent sur plus de 12 caractères, je dois mettre un séparateur de milliers sur les champs de saisie à afficher de manière instantanée, le nombre saisie de manière plus lisible. Par exemple lorsqu'on saisit 1000000, il sera affiché 1 000 000.
    Voilà en gros mon problème. je sais comment fonctionne OpenERP mais je ne suis pas un expert en javascript/jquery.
    Merci

  6. #6
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Bon, mais pourquoi coder ?

    As tu essayé de modifier le séparateur de milliers dans OpenERP ?

    C'est dans Configuration > Traduction > Langues > et ensuite tu cliques sur la langue voulue. Là tu peux paramétrer les formats (monnaie, date, etc)

  7. #7
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Oui j'ai vu cette fonctionnalité mais celle là, ne se fait pas à la saisie, elle s'effectue juste à l'affichage, moi la fonctionnalité que je veux, c'est de séprare les milliers en meme temps qu'on saisisse. Sinon c'est sources d'erreurs pour les utilisateurs.
    Merci

  8. #8
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Je reviens vers vous N1bus, pour vous rappeler que j'ai la fonction javascript qui le fait, je veux juste la manière de l'intégrer dans mon module de telle sorte que quand l'utilisateur commence à saisir la fonction se charge.
    Merci d'avance

  9. #9
    Expert confirmé
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    Janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 827
    Points : 5 673
    Points
    5 673
    Par défaut
    Dans les fichiers JS du module web, il y a le code pour le séparateur de milliers :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /**
     * Insert "thousands" separators in the provided number (which is actually
     * a string)
     *
     * @param {String} num
     * @returns {String}
     */
    instance.web.insert_thousand_seps = function (num) {
        var negative = num[0] === '-';
        num = (negative ? num.slice(1) : num);
        return (negative ? '-' : '') + instance.web.intersperse(
            num, _t.database.parameters.grouping, _t.database.parameters.thousands_sep);
    };

    Comme c'est dit dans le commentaire, c'est au départ un champ string
    Donc je pense qu'il faut surcharger le module FieldChar dans la fonction render_value :

    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    instance.web.form.FieldChar = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeFieldMixin, {
        template: 'FieldChar',
        widget_class: 'oe_form_field_char',
        events: {
            'change input': 'store_dom_value',
        },
        init: function (field_manager, node) {
            this._super(field_manager, node);
            this.password = this.node.attrs.password === 'True' || this.node.attrs.password === '1';
        },
        initialize_content: function() {
            this.setupFocus(this.$('input'));
        },
        store_dom_value: function () {
            if (!this.get('effective_readonly')
                    && this.$('input').length
                    && this.is_syntax_valid()) {
                this.internal_set_value(
                    this.parse_value(
                        this.$('input').val()));
            }
        },
        commit_value: function () {
            this.store_dom_value();
            return this._super();
        },
        render_value: function() {
            var show_value = this.format_value(this.get('value'), '');
            if (!this.get("effective_readonly")) {
                this.$el.find('input').val(show_value);
            } else {
                if (this.password) {
                    show_value = new Array(show_value.length + 1).join('*');
                }
                this.$(".oe_form_char_content").text(show_value);
            }
        },
        is_syntax_valid: function() {
            if (!this.get("effective_readonly") && this.$("input").size() > 0) {
                try {
                    this.parse_value(this.$('input').val(), '');
                    return true;
                } catch(e) {
                    return false;
                }
            }
            return true;
        },
        parse_value: function(val, def) {
            return instance.web.parse_value(val, this, def);
        },
        format_value: function(val, def) {
            return instance.web.format_value(val, this, def);
        },
        is_false: function() {
            return this.get('value') === '' || this._super();
        },
        focus: function() {
            var input = this.$('input:first')[0];
            return input ? input.focus() : false;
        },
        set_dimensions: function (height, width) {
            this._super(height, width);
            this.$('input').css({
                height: height,
                width: width
            });
        }
    });

    C'est un peu un labyrinthe, ça ne va pas être possible d'expliquer ça comme ça, mais en gros, il faut que tu fasses un module JS qui surcharge le module formulaire (instance.web.form ) en te servant des fonctions d'origine qui sont dans addons\web\static\src\js\ = view_form.js et format.js

    Ça peut prendre un peu de temps et il faut penser que ta modif sera ok pour tous les formulaires, à moins que tu mettes une restriction en fonction du model chargé (self.dataset.model; )

  10. #10
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Janvier 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2014
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    D'accord N1Bus, je m'y mets et je vous reviens dés que j'ai quelque chose.
    Merci encore pour votre patience et vos réponses.

Discussions similaires

  1. [XL-2010] Envoi mail par excel avec boucle pour tous les champs
    Par jul2012 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/11/2012, 14h54
  2. [AC-2007] Cadre dépendant/ mais l'image se répéte pour tous les champs
    Par laure2788 dans le forum IHM
    Réponses: 2
    Dernier message: 16/06/2011, 11h02
  3. [1.x] Comment activer le trim pour tous les champs
    Par lr dans le forum Symfony
    Réponses: 4
    Dernier message: 21/01/2010, 12h42
  4. VARCHAR2(2000) pour tous les champs ?
    Par DevTeam_ dans le forum Débuter
    Réponses: 2
    Dernier message: 12/02/2009, 12h04
  5. [Rave 6 BE]Valeur "Invalid" pour tous les champs !
    Par Giovanny Temgoua dans le forum Rave
    Réponses: 4
    Dernier message: 19/10/2006, 22h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo