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:
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:
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:
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:
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:
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.
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:
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:
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:
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:
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:
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:
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.