2
votes

Comment publier des données de formulaire laravel sur le contrôleur à l'aide d'Ajax dans l'API

J'ai un formulaire, qui est ouvert dans la vue Web Android, je veux enregistrer des données dans la base de données, mais lorsque je passe un appel ajax et que j'essaye d'imprimer des données, un tableau vide s'affiche, voici mon code:

https://subdomain.xyz.com/savecampaigndata

Maintenant appel ajax

public function SaveCampaignData(Request $request)
{
    return response()->json($request->all());
    $data = $request->all();
    $attribute_id = [];
    $attribute_value = [];
    $campaign_id = $data['campaign_id'];
    $user_id = Auth::user()->id;

    foreach ($data as $key => $value) {
        if ($key == "attribute_id") {
            foreach ($value as $attrkey) {
                $attribute_id[] = $attrkey;
            }
        } else {
            if ($key == "attribute_value") {
                foreach ($value as $attrvalue) {
                    $attribute_value[] = $attrvalue;
                }
            }
        }
    }

    $mainArray = array_combine($attribute_id, $attribute_value);
    $currentdate = Carbon::now();
    foreach ($mainArray as $key => $value) {
        DB::table('campaign_attribute_values')->insert(
            [
                'campaign_id'              => $campaign_id,
                'campaign_attribute_id'    => $key,
                'user_id'                  => $user_id,
                'campaign_attribute_value' => $value,
                'created_at'               => $currentdate,
                'updated_at'               => $currentdate,
            ]
        );
    }

    if ($this->CheckSmsLimit() > 0) {
        $this->checkAutoReply($campaign_id, $user_id);
    }

    return redirect()->back()->with('success', 'Request Registered');
//        return response()->json(['status' => true, 'message' => 'Record saved succesfully', 'code' => 200]);
}

Et c'est la méthode du contrôleur où je veux obtenir toutes mes données,

$("#submitbtn").click(function (event) {
    event.preventDefault();
    var data = $("#submitdataform").serialize();
    $.ajax({
        type: "post",
        url: "savecampaigndata",
        data: {data: data},
        contentType: 'application/x-www-form-urlencoded',
        dataType: 'json',
        success: function (data) {
            // Android.passParams('dashboard');
        },
        error: function (data) {
            // Android.passParams(url);
        }
    });
});

Ceci est l'URL de la route du facteur:

<div class="card-body card-padding">
    <form id="submitdataform">
        @csrf
        @foreach($formfields as $key=>$value)
            <input type="hidden" name="campaign_id" value="{{$key}}"/>
            @foreach($value as $attrkey)
                <input type="hidden" name="attribute_id[]" value="{{$attrkey->id}}"/>
                <div class="row">
                    <div class="col-md-12">
                        <div class="form-group">
                            <label class="pure-material-textfield-outlined w-100">
                                {{--<input placeholder=" " type="text" required>--}}
                                <?php
                                if ($attrkey->attribute_type == 'alpha') {
                                    echo "<input placeholder=' ' type='text' name='attribute_value[]' required>";
                                } elseif ($attrkey->attribute_type == 'date') {
                                    echo "<input placeholder=' ' type='date' name='attribute_value[]' required>";
                                } elseif ($attrkey->attribute_type == 'numberic') {
                                    echo "<input placeholder=' ' type='number' name='attribute_value[]' required>";
                                }
                                ?>
                                <span>{{$attrkey->attribute_name}}</span>
                            </label>
                        </div>
                    </div>

                </div>
            @endforeach
        @endforeach
        <button type="button" id="submitbtn">Submit</button>
    </form>
</div>

Mais cela donne un tableau vide en sortie dans mon contrôleur.


10 commentaires

Il semble que vous ayez oublié d'ajouter le champ _token dans le formulaire, pour csrf, ou simplement d'ajouter cette route aux exceptions, mais c'est une mauvaise pratique


@csrf est déjà ajouté et également la configuration ajax dans mon fichier d'application


supprimer contentType: 'application / x-www-form-urlencoded', de la requête ajax


J'ai déjà essayé toutes ces choses, mais je ne peux pas envoyer de données au contrôleur


Une chose importante que ce fichier de vue ouvre dans ** Android Webview **


essayez un journal de console sur la fonction de réussite et d'erreur de la réponse, voyez ce que cela vous donne, regardez le code d'état http. Est-ce 500? Est-ce 404? Est-ce 302? Est-ce 200?


Sir @ lessan, j'appelle cette URL par facteur


Pouvez-vous essayer d'appeler l'url comme suit: url: "/ savecampaigndata",


oui j'ai aussi essayé ça


Pouvez-vous afficher les données pour $ formfields ?


3 Réponses :


0
votes

Essayez d'ajouter '/' dans l'attribut url de l'appel ajax et ajoutez l'attribut d'en-tête également dans l'appel ajax.


0 commentaires

1
votes
$.ajaxSetup({
    headers: {
        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
    }
});

0 commentaires

0
votes

Il semble que la raison pour laquelle vous obtenez une réponse vide est à cause de csrf . Je vois que vous l'avez inclus dans votre formulaire, cependant, parce que vous utilisez sérialiser cela ne fonctionnera pas comme vous l'attendiez.

Il existe plusieurs façons d'ajouter le csrf:

  1. Si votre script se trouve dans votre fichier lame, vous pouvez simplement l'ajouter à l'objet de données:

    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    

    Ou

  2. selon la documentation , vous pouvez ajoutez ce qui suit dans le de votre page:

    <meta name="csrf-token" content="{{ csrf_token() }}">
    

    et ensuite inclus les éléments suivants après avoir extrait jQuery:

    data: {
        data: data,
        _token: "{{ csrf_token() }}",
    },
    


0 commentaires