bwebi/datatables

适用于 Laravel 4 的 DataTables Jquery 插件的服务器端处理器

v1.5.0-alpha 2015-02-12 17:47 UTC

This package is auto-updated.

Last update: 2024-09-13 00:12:16 UTC


README

该项目目前没有活跃维护。

你很可能会在这里找到一个更好、更活跃的分支 https://github.com/yajra/laravel-datatables

如果你有问题,请尝试修复它们,如果我们能验证它们能工作,我们将拉取更改。话虽如此,这个项目缺乏自动测试,因此它已经变得难以维护。如果你对这个项目感兴趣并希望采用和维护它,它仍然非常有用。60% 的时间,它都能正常工作。

Laravel 4 的 DataTables 扩展包

关于

此扩展包是为了使用 Eloquent ORM 或 Fluent Query Builder 处理 DataTables Jquery 插件(https://datatables.net.cn)的服务器端处理而创建的。

功能概述

  • 支持 Eloquent ORM 和 Fluent Query Builder
  • 添加或编辑列内容以及删除列
  • 通过 Blade 模板引擎模板化新列或当前列
  • 列的可定制搜索

安装

在 composer.json 中要求 bllim/datatables 并运行 composer update

{
    "require": {
        "laravel/framework": "4.0.*",
        ...
        "bllim/datatables": "*"
    }
    ...
}

Composer 会下载此包。下载完成后,打开 app/config/app.php 并添加以下服务提供者和别名

'providers' => array(
    ...
    'Bllim\Datatables\DatatablesServiceProvider',
),



'aliases' => array(
    ...
    'Datatables'      => 'Bllim\Datatables\Facade\Datatables',
),

最后,你需要运行以下 Artisan 命令来发布配置文件。

$ php artisan config:publish bllim/datatables

用法

使用此扩展包非常简单。只需创建自己的 fluent 查询对象或 eloquent 对象(不获取结果,即不使用 get()、all() 或类似方法)并将其传递给 DataTables。你可以自由使用所有 Eloquent ORM 和 Fluent Query Builder 功能。

一些你应该知道的事情

  • 当你对 Eloquent 或 Fluenty Query 调用 select 方法时,你选择列。
  • 修改列
    • 你可以使用 edit_column($column, $content) 轻松编辑列
    • 你可以使用 remove_column($column) 删除任何列
    • 你可以使用 add_column($column_name, $content, $order) 添加列
    • 你可以在 $content 值中使用 Blade 模板引擎。
    • 你可以将函数作为 $content 传递给 add_columnedit_column 调用。该函数接收单个参数:查询行/模型记录。(参见示例 2)
  • 列标识符由返回的数组设置。
    • 这意味着,对于 posts.id 相关的标识符是 id,而对于 owner.name as ownernameownername
  • 你可以使用 set_index_column($name) 使用 set_index_column($name) 设置“索引”列(https://datatables.net.cn/reference/api/row().index()
  • 你可以使用 set_row_class($content) 函数为每一行添加类(DT_RowClass)。
  • 你可以使用 set_row_data($name,$content) 函数为每一行添加 jquery 的数据(DT_RowData)。
  • 你可以为每个列添加自定义搜索过滤器,以覆盖默认的搜索功能
  • 你可以调用 make(true) 来返回对象数组而不是数组数组。(参见示例 4)

示例

示例 1:简单使用

$posts = Post::select(array('posts.id','posts.name','posts.created_at','posts.status'));

return Datatables::of($posts)->make();

示例 2:添加和编辑列

$place = Place::left_join('owner','places.author_id','=','owner.id')
   ->select(array('places.id','places.name','places.created_at','owner.name as ownername','places.status'));


return Datatables::of($place)
    ->add_column('operations', '<a href="{{ URL::route( \'admin.post\', array( \'edit\',$id )) }}">edit</a>
                    <a href="{{ URL::route( \'admin.post\', array( \'delete\',$id )) }}">delete</a>
                ')
    ->edit_column('status', '{{ $status ? 'Active' : 'Passive' }}')
    ->edit_column('ownername', function($row) {
        return "The author of this post is {$row->ownername}";
    })
    ->remove_column('id')
    ->make();

注意:如果你在 add_columnedit_column 调用中分配 $content 时使用双引号,你应该使用反斜杠(\)转义变量,以防止错误。例如

edit_column('id', "{{ \$id }}") .

示例 3:使用 filter_column

$clients = Client::select(array(
		'Client.id',
		DB::raw('CONCAT(Client.firstname," ",Client.lastname) as ClientName'),
		'Client.email',
		'Client.code',
		'Client.updated_at',
		'Client.isActive',
		'Language.name as LanguageName',
	))
	->leftJoin('Language', 'Client.Language_id', '=', 'Language.id')
	->where('isDeleted', '!=', '1');

return Datatables::of($clients)
		->filter_column('id', 'where', 'Client.id', '=', '$1')
		->filter_column('code', 'where', 'Client.code', '=', DB::raw('UPPER($1)'))
		->filter_column('LanguageName', 'whereIn', 'Language.name', function($value) { return explode(',',$value); })
		->filter_column('updated_at', 'whereBetween', 'Client.updated_at', function($value) { return explode(',',$value); }, 'and')
		->edit_column('isActive', '@if($isActive) <span class="label label-success">Active</span> @else <span class="label label-danger">Inactive</span> @endif')
		->make();

关于filter_column的说明

用法:filter_column ( $column_name, $method, $param_1, $param_2, ..., $param_n )

  • $column_name - 应用搜索过滤器的列名
  • $method - 可以是QueryBuilder的任何方法(where, whereIn, whereBetween, having等)。
    • 注意:对于全局搜索,这些方法会自动转换为它们的"or"等效方法(如果适用,如果不适用,则不搜索该列)。
    • 如果您不希望在全局搜索中搜索某些列,将最后一个参数设置为"and"(参见上面示例中的第17行)。这样做,过滤器不能切换为其"or"等效方法,因此不会在全局搜索中搜索。
  • $param_1 ... $param_n - 这些是传递给所选where函数($method)的参数。可能类型
    • 字符串
    • DB::raw() - DB::raw()可以将 literally 任何内容输出到查询中。例如,子查询或分支,如果您需要一些非常复杂的where。
    • 函数 - 或任何其他可调用项
    • 上述任一类型的数组
  • 搜索值通过在参数中放置字符串 $1 传递给查询。如果使用可调用项(函数),则搜索值作为第一个参数传递给可调用项(再次参见第17行)。
    • 可调用项必须返回一个值,该值将传递给QueryBuilder的函数。

示例4:返回对象数组

$posts = Post::select(array('posts.id','posts.name','posts.created_at','posts.status'));

return Datatables::of($posts)->make(true);

这返回一个包含如下数据的JSON数组

data: {
    {
        id: 12,
        name: 'Dummy Post',
        created_at: '1974-06-20 13:09:51'
        status: true
    }
    {
        id: 15,
        name: 'Test post please ignore',
        created_at: '1974-06-20 13:15:51',
        status: true
    }
}

示例5:DT_RowID,DT_RowClass和DT_RowData

$todo = ToDoList::select(array('todo.id','todo.name','todo.created_at','todo.status'));

return Datatables::of($todo)
    ->set_index_column('id')
    ->set_row_class('@if($status=="done") success @endif')
    ->set_row_data('created_at','{{$created_at}}')
    ->make();

示例6:dataFullSupport的高级用法

为了更好地利用dataTables的mData(1.9)和columns.data(1.10)功能,您可以通过在配置文件中将dataFullSupport设置为true或通过将true传递给第二个初始化参数Datatables::of($query, true)来启用它

创建一个具有可搜索和可排序的联合表的表

//html
<table id="user-list"></table>
//script.js
$("#users-list").dataTable({
        "processing": true,
        "serverSide": true,
        "ajax": "/api/user/datatables",
        "order": [[1,'desc']],
		"columnDefs": [ { //this prevents errors if the data is null
			"targets": "_all",
			"defaultContent": ""
		} ],
        "columns": [
            //title will auto-generate th columns
            { "data" : "id",               "title" : "Id", "orderable": true, "searchable": false },
            { "data" : "profile.last_name","title" : "Name", "orderable": true, "searchable": true },
            { "data" : "username",         "title" : "Username", "orderable": true, "searchable": true },
            { "data" : "email",            "title" : "Email", "orderable": true, "searchable": true },
            { "data" : "created_date",     "title" : "Created", "orderable": true, "searchable": true },
        ]
    });
$users = Models\User::select()->ModelJoin('profile');
        return $dataTables = Datatables::of($users)
            ->filter_column('profile.last_name','where',\DB::raw('CONCAT(profile.last_name,\' \',profile.first_name)'),'LIKE','$1')
            ->filter_column('created_at','where','users.created_at','LIKE','$1')
            //for the blade template only the array data results is provided, it is `extracted` into the template
            ->edit_column('profile.last_name', '{{ $profile["first_name"]." ".$profile["last_name"] }}')
            ->edit_column('created_at', function($result_obj) {
                //in a callback, the Eloquent object is returned so carbon may be used
                return $result_obj->created_at->format('d/m/Y - h:ia');
            })
            ->add_column('manage', '<a href="/user/edit/{{$id}}" >Edit</a>', 3)
            ->remove_column('profile.photo_id')
            ->set_index_column('row-{{ $id }}')
            ->make();
//helper scope method in base Model class
    public function scopeModelJoin($query, $relation_name, $operator = '=', $type = 'left', $where = false) {
        $relation = $this->$relation_name();
        $table = $relation->getRelated()->getTable();
        $one = $relation->getQualifiedParentKeyName();
        $two = $relation->getForeignKey();

        if (empty($query->columns)) {
            $query->select($this->getTable().".*");
        }

        //$join_alias = $table;
        $prefix = $query->getQuery()->getGrammar()->getTablePrefix();
        $join_alias = $relation_name;
        foreach (\Schema::getColumnListing($table) as $related_column) {
            $query->addSelect(\DB::raw("`$prefix$join_alias`.`$related_column` AS `$join_alias.$related_column`"));
        }
        $two = str_replace($table . ".", $join_alias . ".", $two);
        return $query->join("$table AS $prefix$relation_name", $one, $operator, $two, $type, $where); //->with($relation_name);
    }

关于columns.data的说明

  • 当使用columns.data选项时,返回数据的顺序并不重要。
  • 您可以返回一些额外的行,您可以在某些表中使用它们,而不必担心忽略它们。
  • 当数据在嵌套数组中返回时,datatables允许您使用点符号访问它。这允许columns.data元素访问您表中的项目。数据项的值应与表的列(或别名)匹配。例如,如果您按"profile.last_name"排序,它将使用该值按"profiles"表中的last_name列排序,因此请确保该表已联合,以便引用存在。
  • 如果您不进行直接联合,则无法对那些列进行排序或搜索,因此请确保在列数组中将这些选项设置为false
  • 如果您通过Eloquent预先加载数据,您仍然会得到这些项,并且它们可以通过edit_column进行编辑,无需使用别名。

许可证:根据MIT许可证授权