web-dev-qa-db-fra.com

Action du contrôleur Ajax + dans Yii2

Je suis nouveau dans la programmation et j'essaie d'appeler une fonction lorsque l'utilisateur entre des données et clique sur le bouton Soumettre. J'utilise Yii2 et je ne connais pas Ajax. J'ai essayé de développer une fonction, mais mon action de contrôleur n'est pas appelée.

Voici l'exemple de code que j'essaie:

views/index.php:

<script>
    function myFunction()
    {
        $.ajax({
            url: '<?php echo Yii::$app->request->baseUrl. '/supermarkets/sample' ?>',
           type: 'post',
           data: {searchname: $("#searchname").val() , searchby:$("#searchby").val()},
           success: function (data) {
              alert(data);

           }

      });
    }
</script>

<?php
use yii\helpers\Html;
use yii\widgets\LinkPager;

?>
<h1>Supermarkets</h1>
<ul>

<select id="searchby">
    <option value="" disabled="disabled" selected="selected">Search by</option>
    <option value="Name">Name</option>
    <option value="Location">Location</option>
</select>

<input type="text" value ="" name="searchname", id="searchname">
<button onclick="myFunction()">Search</button>
<h3> </h3>

Manette:

public function actionSample(){         
     echo "ok";
}

Mon problème est que lorsque je clique sur le bouton Rechercher, rien ne se passe et lorsque j'essaie de le déboguer, le débogueur n'exécute aucun code!

15
user3640056

C'est un échantillon que vous pouvez modifier selon vos besoins

public function actionSample()
{
if (Yii::$app->request->isAjax) {
    $data = Yii::$app->request->post();
    $searchname= explode(":", $data['searchname']);
    $searchby= explode(":", $data['searchby']);
    $searchname= $searchname[0];
    $searchby= $searchby[0];
    $search = // your logic;
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    return [
        'search' => $search,
        'code' => 100,
    ];
  }
}

Si cela réussit, vous obtiendrez des données dans le bloc de réussite Ajax. Voir la console du navigateur.

  $.ajax({
       url: '<?php echo Yii::$app->request->baseUrl. '/supermarkets/sample' ?>',
       type: 'post',
       data: {
                 searchname: $("#searchname").val() , 
                 searchby:$("#searchby").val() , 
                 _csrf : '<?=Yii::$app->request->getCsrfToken()?>'
             },
       success: function (data) {
          console.log(data.search);
       }
  });
35
ankitr

vous devez passer _csrf tokin comme paramètre

_csrf: yii.getCsrfToken()

ou vous pouvez désactiver la validation csrf

La bonne façon d'obtenir le paramètre CSRF est la suivante:

data[yii.getCsrfParam()] = yii.getCsrfToken()
2
Danil Pervozdanniy