6

我正在学习基于模型、视图、控制器范式的 Laravel PHP 框架。我一直在尝试将 AJAX 合并到我的简单入门应用程序中……一个电话记录器。这是我通常放弃的地方。但我拒绝!

所以我有我的电话模型:

class Phonecall extends Eloquent
{
// Creates an instance of the database object 
}

这是我的电话表:

mysql> desc phonecalls;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| who        | varchar(200)     | NO   |     | NULL    |                |
| what       | varchar(200)     | NO   |     | NULL    |                |
| created_at | datetime         | NO   |     | NULL    |                |
| updated_at | datetime         | NO   |     | NULL    |                |
| initiator  | varchar(200)     | NO   |     | NULL    |                |
| info       | text             | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

我的视图列出了数据库中当前的所有呼叫(由谁和什么):

<!doctype html>
<html>
<head>
  <title>Title</title>
  <script type="text/javascript" 
           src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js">
</script>
</head>
<body>
<h1>Welcome</h1>
<p>Here's a list of recent phonecalls</p>
    <ul class="call-list">
    @foreach($phonecalls as $call)
        <li>{{ $call->who }} - {{ $call->what }} - 

        <a href="phonecalls/show/{{ $call->id }}">Show</a> | 

        {{ HTML::link('phonecalls/delete/'.$call->id, 'Delete') }} | 
        {{ HTML::link('phonecalls/update/'.$call->id, 'Update') }}
        </li>
    </ul>

    {{-- Placeholder for AJAX content --}}
    <div id="call-info">
    </div>
</body>
</html>

这是我的简单控制器:

 class Phonecalls_Controller extends Base_Controller {    

// Use $this within a method the same way you
// would use the object name outside of the class

public function get_index()
    {
            $phonecalls = Phonecall::all();
            return View::make('phonecalls.index')->with('phonecalls', $phonecalls);
    }    
// ************************************
// DISPLAY CALL INFO
public function get_show($call_id)
{
    $call = Phonecall::find($call_id);

            // WHAT GOES HERE?

}

我希望用户能够单击视图中的“显示”并在...中显示呼叫信息

<div id="call-info">
</div>

视图中的标签。


更新:

这就是它的作用...

我的 get_show() 方法

// ************************************
// SHOW CALL INFO
public function get_show($call_id)
{
$call = Phonecall::find($call_id);
return $call->info;
}

我的 Javascript

//************************************
// Phonecall AJAX Example
//************************************
$(document).ready(function() {
  $('.call-list > li > a').click(function(e) {  // e=event
     e.preventDefault();
     var id = $(this).attr('id');
     $.get(BASE+'/phonecalls/show/'+id, function(data) {
     $("#call-info").html(data);
  })
});
4

3 回答 3

5

我花了一段时间才弄明白,因为 webz 中的示例有点令人困惑,因为它提到了更改headers为帐户csrf令牌等。这是一个例子,我希望它可以帮助别人。

第一:您认为的形式:

{{ Form::open(['id' => 'testForm']) }}

   <p>{{ Form::label('title', 'Title') }}
   {{ Form::text('title') }}</p>

   <p>{{ Form::label('description', 'Description') }}
   {{ Form::text('description') }}</p>

   <p>{{ Form::submit('Submit') }}</p>

{{ Form::close() }}

第二:写下你的路线route.php

Route::post('ad', 'AdController@store');

第三:控制器:

public function store()
{

if(Request::ajax()){

    $ad = new ad; 
    $ad -> title = Input::get('title');
    $ad -> description = Input::get('description');
    $ad -> save();

    $response = array(
        'status' => 'success',
        'msg' => 'Option created successfully',
    );

    return Response::json( $response );

    }

}

四:jquery ajax请求:

$('form#testForm').submit(function(e){
  e. preventDefault();


  var str1 = $('input[name="title"]').val();
  var str2 = $('input[name="description"]').val();
  var str3 = $('input[name="_token"]').val();
  var data = {title:str1,description:str2, token:str3};
  //console.log(data);
  var request = $.ajax({
    url: "ad",
    type: "POST",
    data: data ,
    dataType: "html"
  });

  request.done(function( msg ) {
    var response = JSON.parse(msg);
    console.log(response.msg);
  });

  request.fail(function( jqXHR, textStatus ) {
    console.log( "Request failed: " + textStatus );
  });

  });

而已。为了保护,您可以将Session::token() == Input::get('_token')控制器中的设置为 if 检查。这只是一个可以很好地帮助您入门的示例。http://www.pretty.url/ad如果www.pretty.url 是您的localhost或本地私有开发 url ,则可能需要使用绝对 URL(在这种情况下使用)。

于 2014-08-24T19:38:49.870 回答
5

这可以通过许多不同的方式来完成。

首先,您可以这样做:

public function get_show($call_id)
{
    $call = Phonecall::find($call_id);

    return View::make('phonecalls.single')->with('phonecal', $call);

}

在这种情况下,您需要为单个电话创建一个模板并将其放入电话文件夹中。

另一种选择是从 Laravel 应用程序返回 JSON 响应:

public function get_show($call_id)
{
    $call = Phonecall::find($call_id)->first();

    return Response::eloquent($call);

}

另一种选择是使用 javascript MVC 框架来使获取/更新 AJAX 数据之类的事情变得非常容易,例如 Backbone JS 或 Angular JS 可以做到这一点。

无论哪种方式,如果你想做 AJAX 数据,你需要构建一个 API 来区分常规站点和 AJAX 数据后端。

这是我的博客文章,其中详细介绍了如何完成此操作:http: //maxoffsky.com/code-blog/building-restful-api-in-laravel-start-here/

此外,Dayle Rees 的 Code Happy 是 Laravel 中 AJAX 的一个很好的介绍,章节 AJAX 内容:codehappy.daylerees.com/ajax-content

如果您有更多问题,请告诉我,如果您觉得我有帮助,请批准此评论。谢谢!

更新:

要从控制器(或 Laravel 路由)实际加载内容,您需要使用 jQuery ajax、GET(加载数据)或 POST(发布表单结果)这是一个示例:

 $('#get-info').click(function(e) {  // e=event
        e.preventDefault();
        var BASE = "<?php echo URL::base(); ?>";
        // attempt to GET the new content
        $.get(BASE+'phonecalls/show/2', function(data) {
            $('#content').html(data);
        });
于 2013-03-25T21:48:33.417 回答
0

您必须能够拦截对“显示”链接的点击。如果你让你的控制器变得安静,那么向你的控制器发出 ajax 请求应该很容易。

当用户单击Show 链接时,您必须发送一个ajax 请求。

我建议你将结果输出为 JSON,这样以后使用 js 输出结果就很容易了。

于 2013-03-25T20:39:11.827 回答