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

jQuery Discussion :

Passer le nom d'une fonction à exécuter en PHP [AJAX]


Sujet :

jQuery

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    student
    Inscrit en
    Janvier 2019
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : student

    Informations forums :
    Inscription : Janvier 2019
    Messages : 66
    Points : 34
    Points
    34
    Par défaut Passer le nom d'une fonction à exécuter en PHP
    Bonjour,

    je suis débutante alors je galère pas mal. J'ai une appli développée avec le framework slim, jusque là ça va.

    Voilà ma problématique :

    je dois lors de la perte de focus d'un input, faire une requête ajax qui utilise une fonction php (qui vérifie que le nom présent dans l'input n'est pas déjà utilisé).

    le fichier twig possède en fin ce script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <script>
        document.querySelector('#nom').onfocus = function() {
            checkNameAuto();
        }
    </script>
    qui fait donc appel à la fonction checkNameAuto qui est dans formChecker.js
    Code : 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
    /**
     * Permet le controle du nom de l'automate dans l'input
     */
    function checkNameAuto() {
        // Recupération de l'input id=nom
        var inputName = document.getElementById('nom');
     
        // On attend que l'input perde le focus
        inputName.onblur = function (e) {
     
            //on récupère la valeur de l'input
            var name = inputName.value;
            console.log(name);
     
            //on effectue la requête ajax
            $.ajax({
                type: "GET",
                url: "/administration/table/automates/form/" + name,
                data: {
                    myFunction: "ckeckNameNotDuplicated",
                    myParams: {nom: name}
                },
                datatype: "html",
                success: function (data) {
                    // on utiliser la méthode du controller
     
                    console.log(data);
     
     
     
     
                },
                error: function () {
                    // en cas de problème
                    alert("problème de connection avec la base de donnée");
                }
     
            })
     
     
     
        }
    ** J'aurai besoin d'un coup de main ou au moins d'explication pour faire ma requête ajax, je n'arrive jamais à les monter correctement.

    Donc, j'ai la fonction checkNameAuto qui est dans formChecker.js (voir au dessus)

    Qui doit appeler mon Controller qui possède la méthode :
    Code PHP : 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
    /**
     * Controle que le nom de l'automate n'est pas déjà présent dans la table
     * @param Request $request
     * @param Response $response
     * @param $args
     * @return Response
     */
    public function ckeckNameNotDuplicated(Request $request, Response $response, $args)
    {
     
     
        // Recherche combien de fois le nom affiché dans le champs est présent dans la base de donnée
        $doublons = $this->modelAutomates->getCheckNameAutoDoublon($_GET['nom']);
     
        // S'il est déjà présent
        if (count($doublons)>0) {
            // afficher message d'erreur
            $message = array();
     
            $message['etat'] = 'ko';
            $message['retour'] = "Enregistrement de l'automate échoué - Nom déjà utilisé ";
            $this->logger->error($message['retour']);
     
     
            // rafraichissement de la page en cas d'erreur
            // Récupération des données
            $ordis = $this->modelAutomates->getOrdiListForForm();
            $saufAutos = $this->modelAutomates->getAutoListeCanUseFiles();
            $paramLibelleIE = $this->modelAutomates->getParamLib();
            // Rendu
            $this->view->render($response, "autoFormAdd.twig", array(
                "ordis" => $ordis,
                "libelleIE" => $paramLibelleIE,
                "autosSauf" => $saufAutos,
                "message" => $message
            ));
            return $response;
        }
     
        // sinon on ne fait rien
        return $response;
    }


    J'ai également dans routes.php la route suivante
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Controle de la non duplication du nom de l'automate
    $this->get('/form/{nom}', 'App\Controller\AdministrationController:ckeckNameNotDuplicated')
        ->setName('administration-table-automates-check-name');


    Et la fonction de recherche dans mon model
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
     * Vérifie combien il y a d'automate portant ce nom
     * @param $autoNom
     * @return mixed
     */
    public function getCheckNameAutoDoublon($autoNom){
        $this->bddAutomates->query("SELECT count(auto_nom) FROM automates WHERE auto_nom = :nom");
        $this->bddAutomates->bindParam(':nom', $autoNom);
        return $this->bddAutomates->fetch();
    }

    L''appli est développée par les stagiaires qui passent (ce n'est pas une critique juste une explication de pourquoi la requête sql se fait dans le model, alors qu'elle devrait être faite dans un repository comme sous symfony).

    Comment monter la requête ajax pour qu'elle envoie la valeur de l'input à la méthode du controller (et donc affiche un message si le nom est déjà utilisé).

    Le controller utilise lui la requête sql qui est dans le model.

    Merci d'avance parce que là, je sèche, j'ai déjà utilisé plein de chose rien ne marche.

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 413
    Points : 4 856
    Points
    4 856
    Par défaut
    Salut,

    La première question à poser est : est-ce que le retour d'ajax est exécuté dans le callback success ou bien dans error ? (qu'il faut déjà les remplacer par done et fail)

    Pour mieux identifier l'erreur, tu peux ajouter un paramètre dans error :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    error: function (Err) {
          // en cas de problème
          alert("Erreur Ajax :"+Err);
    }
    Ton Routeur est $this->get('/form/{nom}',...) donc j'imagines qu'il faut que l'url d'ajax soit : url:"/form/" puis la variable {nom}
    sera envoyée par le data d'ajax : data:{nom:name,myFunction:"ckeckNameNotDuplicated"}.

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    student
    Inscrit en
    Janvier 2019
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : student

    Informations forums :
    Inscription : Janvier 2019
    Messages : 66
    Points : 34
    Points
    34
    Par défaut Ce que j'ai fait actuellement
    Bonjour,

    Je te remercie pour ton intérêt. Alors, j'ai quand même réussi à avancer un peu depuis mon message.

    J'arrive à effectuer la requête ajax, lors de la perte de focus. Malheureusement, lors du rafraichissement de la page, je n'arrive pas à garder ce qui a été mis dans l'input. J'aimerai utiliser les sessions, mais j'ai pas bien compris comment elles fonctionnent avec Slim (est-ce que je dois avoir systématiquement un middleware ?).


    Au cas où ça pourrait servir, je remet ce que j'ai fait.

    ****
    routes.php
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                // Controle de la non duplication du nom de l'automate
                $this->get('/form/checkName', 'App\Controller\AdministrationController:ckeckNameNotDuplicated')
                    ->setName('administration-table-automates-check-name');

    ****
    automateModel.php
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        /**
         * Vérifie s'il y a d'automate portant ce nom
         * @param $autoNom
         * @return mixed
         */
        public function getCheckNameAutoDoublon($autoName){
            $this->bddAutomates->query("SELECT auto_nom FROM automates WHERE auto_nom = :nom");
            $this->bddAutomates->bindParam(':nom', $autoName);
            return $this->bddAutomates->fetch();
    //        var_dump($this->bddAutomates->fetch());
    //        echo $this->bddAutomates->fetch();
        }

    ****
    AdministrationController.php
    Code PHP : 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
        /**
         * Controle que le nom de l'automate n'est pas déjà présent dans la table
         * @param Request $request
         * @param Response $response
         * @param $args
         * @return Response
         */
        public function ckeckNameNotDuplicated(Request $request, Response $response, $args)
        {
            //var_dump($request->getQueryParams());
     
            $name = urldecode($_GET["nom"]);
            //var_dump($name);
     
            // Recherche combien de fois le nom affiché dans le champs est présent dans la base de donnée
            $double = $this->modelAutomates->getCheckNameAutoDoublon($name);
            //var_dump($double);
     
            // S'il est déjà présent
            if ($double !== false) {
                // afficher message d'erreur
                $message = array();
     
                $message['etat'] = 'ko';
                $message['retour'] = "Enregistrement de l'automate échoué - Nom déjà utilisé ";
                $this->logger->error($message['retour']);
     
     
                // rafraichissement de la page en cas d'erreur
                // Récupération des données
                $ordis = $this->modelAutomates->getOrdiListForForm();
                $saufAutos = $this->modelAutomates->getAutoListeCanUseFiles();
                $paramLibelleIE = $this->modelAutomates->getParamLib();
                // Rendu
                $this->view->render($response, "autoFormForAdd.twig", array(
                    "ordis" => $ordis,
                    "libelleIE" => $paramLibelleIE,
                    "autosSauf" => $saufAutos,
                    "message" => $message
                ));
     
                return $response;
            }
            //rafraichissement de la page en cas d'erreur
            // Récupération des données
            $ordis = $this->modelAutomates->getOrdiListForForm();
            $saufAutos = $this->modelAutomates->getAutoListeCanUseFiles();
            $paramLibelleIE = $this->modelAutomates->getParamLib();
            // Rendu
            $this->view->render($response, "autoFormForAdd.twig", array(
                "ordis" => $ordis,
                "libelleIE" => $paramLibelleIE,
                "autosSauf" => $saufAutos
            ));
     
     
            // sinon on ne fait rien
            return $response;
        }

    ****
    formChecker.js
    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
    /**
     * Permet le controle du nom de l'automate dans l'input
     */
    function checkNameAuto() {
     
        // Recupération de l'input id=nom
        var inputName = document.getElementById('nom');
     
        // On attend que l'input perde le focus
        inputName.onblur = function (e) {
     
            //on récupère la valeur de l'input
            var name = inputName.value;
            //console.log(name);
     
            //on effectue la requête ajax
            $.ajax({
                type: "GET",
                url: "/administration/table/automates/form/checkName",
                data: {
                    nom: name
                },
                success: function (data) {
                    //console.log(data);
                    $('#message').html(data);
                }
            })
     
        }
     
    }

    ****
    autoFormAdd.twig
    (pour pouvoir avoir l'insertion du formulaire uniquement, j'ai sorti tout le block contenu dans le {% block content %}, pour le mettre dans un autoFormForAdd.twig)

    ici, j'ai du code pour une barre de navigation

    Code Twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {% block content %}
     
    {{ include("autoFormForAdd.twig") }}
     
    {% endblock %}

    ****
    autoFormForAdd.twig
    ici j'ai tout le code de mon formulaire, avec un id="message" là où je souhaite afficher le formulaire après la requête ajax

    Code Twig : 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
    70
    71
    72
    73
    74
    75
    {% block script %}
     
     
            <script>
                document.querySelector('#add1').addEventListener('click', function(event) {
     
                    var last = document.querySelector('#Libelle tbody tr:last-child');
                    last.parentNode.appendChild(last.cloneNode(true));
     
                });
            </script>
     
            <script>
                document.querySelector('#add2').addEventListener('click', function(event) {
     
                    var last = document.querySelector('#Fichier tbody tr:last-child');
                    last.parentNode.appendChild(last.cloneNode(true));
     
                });
            </script>
     
            <script>
                function remplir(){
                    exp =/[a-zA-Z0-9_]\.[a-z]{3,4}$/;
                    exp1=/[&ïöîôâäûü\+\(\)\{\}\[\]é"'èçà=€@à$£ù%*§¤\*²;\?\!,<>^¨]/;
     
     
                    var elem = document.getElementsByClassName('auto_param1');
     
                    for (var i = 0; i < elem.length; i++) {
                        //remplace chaque espace par "_"
                        while(elem[i].value.includes(' ')){
                            elem[i].value = elem[i].value.replace(" ","_");
                        }
                        if (!exp.test(elem[i].value)){
                            alert('Le nom du fichier '+ (i+1) + ' est incorrect');
                        }
                        if (exp1.test(elem[i].value)){
                            alert('Le nom du fichier '+ (i+100) + ' est incorrect');
                        }
                    }
     
                }
     
     
            </script>
     
     
            <script>
                $(document).ready(function() {
                    $('select').material_select();
                });
            </script>
            <script type="text/javascript" src="{{ base_url() }}/js/formChecker.js"></script>
            <script src="{{ base_url() }}/js/selectAll-None.js"></script>
            <script src="{{ base_url() }}/js/infobulle.js"></script>
            <script>
                window.onload = function() {
                    sauvegardeCheck();
                    typeCheck();
                    eventListenerSelect();
     
                }
            </script>
     
     
     
     
            <script>
                document.querySelector('#nom').onfocus = function() {
                    checkNameAuto();
                }
            </script>
     
        {% endblock %}

    ****

    Il me reste plus qu'à régler le problème qu'il ne garde pas la valeur du champ de l'input quand il rafraichit la page après la requête ajax.


    J'ai aussi une autre bricole, mais c'est pas très important par rapport.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 06/09/2019, 14h32
  2. passer le nom d'une fonction comme paramètre d'une autre fonction?
    Par med_alpa dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 11/03/2010, 12h57
  3. [Tableaux] Oubli du nom d'une fonction
    Par Ekimasu dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2006, 10h50
  4. [c#] passer un textbox dans une fonction
    Par damn dans le forum ASP.NET
    Réponses: 5
    Dernier message: 08/09/2005, 16h54
  5. Passer en paramètre d'une fonction (...)
    Par Captain_JS dans le forum C++
    Réponses: 5
    Dernier message: 03/11/2004, 07h18

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