I am trying to pass data from Javascript code to a Controller but I cant get the variables data in the Controller Code.
I have a view that has a Js file associated that checks when the submit button is clicked and creates some arrays with data to be sent to the server.
I have tried a lot of solutions (commenting the form and defining a attribute to the button with the URL, using the form post action , using $.post in javascript) but i cant seem to get it working.
I have included code to better illustrate what I am trying to do.
Import View code:
<form id="importar" class="form-horizontal" role="form" method="POST" action="{{ url('/importarLista1') }}">
{{ csrf_field() }}
<input type="text" class="form-control" name="startFrom" id="startFrom" value="">
<div class="col-md-4">
<button class="btn btn-primary" id="importar" data-href="{{ url('/importarLista1') }}">
<i class="fa fa-btn fa-sign-in"></i>Importar
</button>
</div>
</form>
JavaScript Code:
var fdata= "startFrom="+ startFrom;
fdata+= "&idList="+ idList;
fdata+= "&nomeCampos="+ nomeCampos;
fdata+= "&posicaoCampos="+ posicaoCampos;
$.ajax({
type:'POST',
url: $( this ).attr( 'data-href' ) /*$( this ).prop( 'action' ) $( this ).attr( 'data-href' )*/,
data:fdata,
dataType:'json',
cache:false,
success:function (data){
alert(data);
}
});
nomeCampos and posicaoCampos are arrays created using javascript and have values assigned to them so they are not empty
JavaScript Code Edit1 Updated code from answer
$('#importar').submit(function() {
if($('#startFrom').val()=='') {
var startFrom = 0;
}else{
var startFrom = $('#startFrom').val();
}
var nomeCampos = new Array();
var posicaoCampos = new Array();
$('tbody tr').each( function(){
$('td', this).each(function(e){
posicaoCampos[e] = $(this).attr('idc');
});
return false;
});
var idList = $('#idList').val();
var fdata= "_token="+ $( this ).find( 'input[name=_token]' ).val();
fdata+= "&startFrom="+ startFrom;
fdata+= "&idList="+ idList;
fdata+= "&nomeCampos="+ nomeCampos;
fdata+= "&posicaoCampos="+ posicaoCampos;
e.preventDefault();
$.post( // short hand for $.ajax({ type:'POST'
$(this).attr('action'), // url, from form
$(this).serialize(), // form data, name and value
function(data) {
// on success...
alert(data);
}
);
}); // end form.submit
Controller Code
protected function importList1(Request $request){
echo $_POST['startFrom'];
exit();
if($request->ajax()) {
$data = Input::all();
print_r($data);die;
}
print_r($request->all());
}
Route
Route::post('/importarLista1','ContactsList\ContactListController@importList1');
Example Solution This is what my final code looks like
JavaScript
function preparePostData(){
var token = $( '#importar' ).find('input[name=_token]').val();
var startFrom = 0;
var idList = $('#idList').val();
var nomeCampos = new Array(); // not sure where this is getting used?
var posicaoCampos = new Array();
if($('#startFrom').val()=='' || $('#startFrom').val()<=0 ) {
var startFrom = 0;
}else{
var startFrom = $('#startFrom').val()-1;
}
var nomeCampos = new Array();
var posicaoCampos = new Array();
$('thead tr th').each(function(e){
for(var i = 0; i < nomeCampos.length; i++){
if(nomeCampos[i]==$('select', this).val()){
$.Notification.autoHideNotify('error', 'top right', 'STATUS', 'Não pode selecionar Campos Iguais');
exit();
}
}
nomeCampos[e] = $('select', this).val();
});
$('tbody tr').each( function(){
$('td', this).each(function(e){
posicaoCampos[e] = $(this).attr('idc');
});
return false;
});
var file_data=$('input:file')[0].files;
var postdata=new FormData();
postdata.append('_token',token);
postdata.append('startFrom',startFrom);
postdata.append('idList',idList);
postdata.append('nomeCampos',nomeCampos);
postdata.append('posicaoCampos',posicaoCampos);
postdata.append('file',file_data[0]);
return postdata;
}
$('#importar').submit(function(e) {
e.preventDefault();
fdata=preparePostData();
$.ajax({
type:'POST',
url: $(this).prop('action'), // url, from form
data:fdata,
processData: false,
contentType: false,
success:function(data) {
window.location.replace(data.url);
}
});
}); // end form.submit
Controller
if ($request->session()->token() !== $request->get('_token')) {
return Response::json(array(
'status' => 'error',
'msg' => 'Invalid token'
));
}
$idCompany = $request->session()->get('current_company');
$skipValue = $request->get('startFrom');
$idList = $request->get('idList');
$arrayPos = $request->get('posicaoCampos');
$arrayCampos = $request->get('nomeCampos');
And do what you need to do