Bonjour,

J'essaye d'implémenter dans mon application ce système d'autocomplete : http://demo.smarttutorials.net/jquery-autocomplete-mutiple-fields-ajax-php-mysql. J'ai enlevé tout le code qui ne m'intéressait pas et garder l'autocomplétion de la liste et sur un champ.

Voici mon code de Template/Produits/index.ctp

<script>

$('#produits').autocomplete({
    source: function( request, response ) {
        $.ajax({
            url: "<?= $this->Url->build(['controller'=>'produits','action'=>'autocomplete'])?>",
            dataType: "json",
            method: 'post',
            data: {
               nom_startsWith: request.term,
               type: 'produits',
               row_num : 1
            },
             success: function( data ) {
                 response( $.map( data, function( item ) {
                    var code = item.split("|");
                    return {
                        label: code[0],
                        value: code[0],
                        data : item
                    }
                }));
            }
        });
    },
    autoFocus: true,
    minLength: 0,
    select: function( event, ui ) {
        var names = ui.item.data.split("|");
        $('#prix').val(names[1]);
    }
});

</script>

<?= $this->Form->create(NULL); ?>
<?= $this->Form->input('nom') ?>
<?= $this->Form->input('prix') ?>
<?= $this->Form->end() ?>

Voici mon code de Controller/ProduitsController.php

Je mets le code du tutorial, car étant débutante sur Cakephp, je n'arrive pas à bien écrire les requêtes en CakephpStyle, pour que cela s'affiche correctement.

public function autocomplete()
    {

        if ($_POST['type'] == 'produits') {
            $row_num = $_POST['row_num'];
            $name = $_POST['nom_startsWith'];
            $query = "SELECT nom, prix FROM produits where nom LIKE '" . strtoupper($name) . "%'";
            $result = mysqli_query($con, $query);
            $data = array();
            while ($row = mysqli_fetch_assoc($result)) {
                $name = $row['nom'] . '|' . $row['prix'] . '|' . $row_num;
                array_push($data, $name);
            }
            echo json_encode($data);
        }
    }

En fait rien ne se passe lorsque je tape une lettre.

J'ai vu aussi dans un autre tutorial qu'il fallait que je mette Router::extensions(['json', 'xml']); dans mon fichier routes.php. C'est ce que j'ai fait.

Merci par avance de toute l'aide que vous pourriez m'apporter.

2 réponses


Bonsoir.
Pour information, ton code avec CakePHP 3, devrait par exemple ressembler à ceci :

public function autocomplete() {
    if ($this->request->data('type') == 'produits') {
        $row_nums = $this->request->data('row_num');
        $name = $this->request->data('nom_startsWith');
        $produits = $this->Produits->find()
            ->select(['nom', 'prix'])
            ->where(['nom LIKE' => strtoupper($name) . '%'])
            ->all();
        $data = array();
        foreach($produits as $produit) {
            $row = $produit->nom . '|' . $produit->prix . '|' . $row_num;
            array_push($data, $row);
         }
         echo json_encode($data);
    }
}

Par contre, si tu utilises CakePHP pour ton application, tu devrais te familiariser un peu avec.

Merci beaucoup pour ton aide. J'ai utilisé le code que tu as écrit mais pareil rien ne se passe lorsque je tape une lettre.
Je me demande alors si ce n'est pas un problème de js ou d'encodage json.

Je vais continuer à chercher. Encore merci.