Astolpho
Messages postés73Date d'inscriptionvendredi 8 avril 2022StatutMembreDernière intervention12 juin 2024
-
Modifié le 6 janv. 2024 à 17:06
Astolpho
Messages postés73Date d'inscriptionvendredi 8 avril 2022StatutMembreDernière intervention12 juin 2024
-
8 janv. 2024 à 18:33
Bonjour,
Je n'arrive pas à faire fonctionner l'autocomplétion depuis que j'ai déplacer la requête qui était dans /fetch/items.php:
if (isset($_POST['search'])) {
$search = $_POST['search'];
$query = "SELECT item as label, id_items, price, item, designation as value
FROM items
LEFT JOIN customers ON (items.id=customers.id)
LEFT JOIN users ON (items.id = users.id)
WHERE item like'%" . $search . "%' AND users.id = :user_id GROUP by item ";
try {
$requete = $bdd->prepare($query);
$requete->bindParam(':user_id', $_SESSION['user_id'], PDO::PARAM_INT);
$requete->execute();
//var_dump($requete);
$response = $requete->fetchAll(); // on stocke le resultat dans un array
/* foreach($response as $row){
$response[] = array("value"=>$row['id_customers'],"label"=>$row['lastname']);
}
*/
} catch (Exception $e) {
// en cas d'erreur :
$response = " Erreur ! " . $e->getMessage();
}
echo json_encode($response);
// var_dump($response);
exit;
}
dans la classe :
class AutoCompleteHandler
{
private $db;
public function __construct()
{
$this->db = $this->getDB();
}
private function getDB()
{
// Utilisez la fonction getDB existante pour obtenir l'instance PDO
return getDB();
}
public function handleAutoComplete()
{
if (isset($_POST['search'])) {
$search = $_POST['search'];
$query = "SELECT item as label, id_items, price, item, designation as value
FROM items
LEFT JOIN customers ON (items.id = customers.id)
LEFT JOIN users ON (items.id = users.id)
WHERE item LIKE '%" . $search . "%' AND users.id = :user_id GROUP BY item";
try {
$requete = $this->db->prepare($query);
$requete->bindParam(':user_id', $_SESSION['user_id'], PDO::PARAM_INT);
$requete->execute();
$response = $requete->fetchAll();
} catch (Exception $e) {
$response = "Erreur ! " . $e->getMessage();
}
echo json_encode($response);
exit;
}
}
public function generateAutoCompleteItemScript()
{
$this->handleAutoComplete();
ob_start();
?>
<script>
$(function() {
$("#autocomplete_item").autocomplete({
source: function(request, response) {
$.ajax({
url: "",
type: 'post',
dataType: "json",
data: {
search: request.term
},
success: function(data) {
response(data);
}
});
},
select: function(event, ui) {
$('#autocomplete_item').val(ui.item.label);
$('#id_items').val(ui.item.id_items);
$('#item').val(ui.item.item);
$('#designation').val(ui.item.value);
$('#price').val(ui.item.price);
return false;
}
});
});
</script>
<?php
return ob_get_clean();
}
sur cette ligne :
url: "",
quand je met le chemin qui pointe vers le fichier ou il y à la requête ça fonctionne :
jordane45
Messages postés38289Date d'inscriptionmercredi 22 octobre 2003StatutModérateurDernière intervention17 novembre 20244 703 Modifié le 6 janv. 2024 à 20:52
Bonjour,
Lorsque tu appeles la page ( l'url = "" ) .. ton code ne retourne pas seulement le résultat du echo json_encode... l'entièreté de ta page.
(il suffit d'ouvrir la console de ton navigateur (de préférence FIREFOX dès qu'on fait de l'ajax...), de bien cocher la case de debug XHR et de regarder ce qui s'affiche... )
Pour contourner ton souci, je pense qu'en modifiant le constructeur de ta class ainsi ça devrait marcher
public function __construct()
{
$this->db = $this->getDB();
if(!empty($_POST['search'])){
$this->handleAutoComplete();
}
}
Par contre, à titre perso, je préfère largement laisser mes appels ajax (les fichiers appelés via la variable URL ) séparés du reste du code et je fais UN fichier spécifique par ajax... mais chacun ses gouts.