在Laravel 5中用AJAX提交表单

Submitting Form in AJAX in Laravel 5

本文关键字:提交 表单 AJAX 中用 Laravel      更新时间:2023-09-26
 <p style="padding:10px">Add your Facebook Account</p>
    {!! Form::open(['route'=>array('agencyNewPlatform',$influencer->getUser()->user_type_id, '1')]) !!}                        
      <input type="text" name="handle" placeholder="Profile Name" />
      <p style="padding-top:25px;padding-bottom:5px">
        <button type="submit" class="btn btn-success plat_add">Save</button>
      </p>
    {!! Form::close() !!}

我试图通过AJAX提交此表单,但我不知道如何定义myurl。下面的源代码也可能包含其他错误。请帮帮我。

$('.plat_add').click(function(event) {
   event.preventDefault();
   var myurl = ?????????????;
   var date = new Date();
   myurl = myurl+"?noche="+date.getTime();
   mydata = $(this).closest('form').serialize();
   var jqxhr = $.ajax({
     url: myurl,
     type:'GET',
     dataType:'json',
     data: mydata,
   }).done(function() {
     var response = JSON.parse(jqxhr.responseText);
     $("#table3").append("<tr id=" + response.platform_id + "plat><td>" + response.plat_name + "</td><td>" + response.handle + "</td><td><a class='plat_remove' href=" + response.link + ">Remove</a></td></tr>");
   }).fail(function() {
     alert("Add platform fail!" + jqxhr.responseText);
   });
});
这是我的routecontroller函数:

路线:

Route::get('influencer/update/{user_type_id}/add_plat/{platform_id}', ['as'=>'agencyNewPlatform','uses'=>'AgentController@postPlatform']);

和控制器:

  public function postPlatform(InfluencerAddPlatformRequest $request, $user_type_id, $platform_id)
  {
      $user = Auth::user();
      $agent = $user->getTypeModel();
      $influencer = $this->influencer->findById($user_type_id);
      $handle = $request->input('handle');
      $result = DB::table('influencers_platforms')->insert(['influencer_id'=>$user_type_id, 'platform_id'=>$platform_id, 'platform_handle'=>$handle]);
      $plat_name = DB::table('platforms')->where('id', $platform_id)->first()->name;

     if($request->ajax()) 
     {   
        return response()->json(array('responsecode'=>'1','action'=>'add', 'plat_name'=>$plat_name, 'handle'=>$handle, 'link'=>route('agencyDeletePlatform',[$influencer->getUser()->user_type_id, $platform->id]), 'result'=>$result,'platform_id'=>$platform_id));
     }
 }

我真的被困在这里了;提前感谢大家!

首先将id放到form中,这比尝试从提交按钮捕获事件要好,记住,在任何字段上按下enter将在不按提交按钮的情况下提交表单。

<<p> 视图/strong>
 {!! Form::open(['route'=>array('agencyNewPlatform',$influencer->getUser()->user_type_id, '1'), 'method' => 'get' 'id' => 'form']) !!}
       <input type="text" name="handle" placeholder="Profile Name" />
        <p style="padding-top:25px;padding-bottom:5px">
            <button type="submit" class="btn btn-success plat_add">Save</button>
        </p>
{!! Form::close() !!}

下面是我经常用来发送ajax请求的脚本:

javascript

$("#form").submit( function (event) {
    event.preventdefault();
    var url = $(this).attr('action'); //here you have to options
    //get the url from the action on the form
    //or declare an <a href="{{route(your.route)}}"> and get it from the href
    var data = $(this).serialize();
    $.get(url, data, function(result) {
         //do if result is ok
    }).fail(function (){
         //do if fails
    });;
});
编辑:

如果你有一个var date = new Date();,你想把它放在你的变量,首先,url即使是一个get请求不包含你的数据信息。你需要把它传递给你的数据变量。

让我们学习默认get url:

myurl.com?var=value&var2=value2

当您执行ajax请求时,此url分为两部分urldata

var url = "myurl.com";
var data = "var=value&var2=value2";

之后jquery会合并这两个变量

那么,让我们学习.serialize()是如何工作的,当你调用这个方法时,结果将是数据格式。

所以如果你想添加另一个变量它很简单:

data+="&newvar="+var;

现在数据包含:

data = "var=value&var2=value2&newvar=valuefromvar"

所以你的代码会是这样的:

$("#form").submit( function (event) {
    event.preventdefault();
    var date = new Date();
    var url = $(this).attr('action'); //here you have to options
    //get the url from the action on the form
    //or declare an <a href="{{route(your.route)}}"> and get it from the href
    var data = $(this).serialize();
    data+="&noche="+date.getTime(); //here the change
    $.get(url, data, function(result) {
         //do if result is ok
    }).fail(function (){
         //do if fails
    });;
});

另一个建议,如果你使用路由名,正确的形式是用.分隔单词,而不是骆驼大小写格式,并在和动作(如果有必要)之后构建一个主题,如:

user.show
user.update
agency.create.platform

控制器中,我知道可能对你的应用程序进行大的更改已经太晚了,但是在另一个项目中,为什么你不尝试使用流利的形式关系而不是流畅的DB,这将使你的代码更灵活,你的控制器逻辑可能不会超过10行。

我可能没有完全理解你的问题,所以如果我没有正确地解决问题,请发表评论。

作为旁注,格式化你的代码(缩进)并在你的代码中使用一致性(比如声明一个数组,即使用array()[],而不是两者都使用)将大大有助于使你的代码在你或其他人返回时可读,参见我在格式化方面所做的更改。

<<p> 视图/strong>

我在这里添加了一个id myForm到表单,参见表单open()函数的第二个参数。你的路径是get,所以我把form方法也改成了get。表单的默认值是post,当然你可以根据自己的需要修改。

<p style="padding:10px">Add your Facebook Account</p>
{!! Form::open(['route' => ['agencyNewPlatform', $influencer->getUser()->user_type_id, '1'], 'method' => 'get',  'id' => 'myForm']) !!}
    <input type="text" name="handle" placeholder="Profile Name" />
    <!-- this looks much easier to read on three lines -->
    <p style="padding-top:25px;padding-bottom:5px">
        <button type="submit" class="btn btn-success plat_add">Save</button>
    </p>
{!! Form::close() !!}
javascript

监听表单提交事件,然后你可以从表单动作属性

获取url
$('#myForm').submit(function(event) {
  event.preventDefault();
  var $myForm = $(this);
  $.get($myForm.attr('action'),
    $myForm.serialize,
    function(data) {
      // your success code
    }
  ).fail(function(data) {
    var errors = data.responseJSON;
    // show the errors to user
  });
});

routes.php

这看起来更容易阅读四行,有缩进。控制器函数是getPlatform,我改变了,因为路由类型是get,它不必是,但你应该使它们相同,这样你的代码容易理解。

Route::get('influencer/update/{user_type_id}/add_plat/{platform_id}', [
    'as'   =>'agencyNewPlatform',
    'uses' =>'AgentController@getPlatform'
]);
控制器

public function getPlatform(InfluencerAddPlatformRequest $request, $user_type_id, $platform_id) 
{
    $user       = Auth::user();
    $agent      = $user->getTypeModel();
    $influencer = $this->influencer->findById($user_type_id);
    $handle     = $request->input('handle');
    $result = DB::table('influencers_platforms')
        ->insert([
            'influencer_id'=>$user_type_id, 
            'platform_id'=>$platform_id, 
            'platform_handle'=>$handle
        ]);
    $plat_name = DB::table('platforms')
        ->where('id', $platform_id)
        ->first()
        ->name;
   if($request->ajax()) {
    return response()
        ->json([
            'responsecode' => '1',
            'action'       => 'add',
            'plat_name'    => $plat_name,
            'handle'       => $handle,
            'link'         => route('agencyDeletePlatform', [$influencer->getUser()->user_type_id, $platform->id]),
            'result'       => $result,
            'platform_id'  => $platform_id
        ]);
    }
}