界面
代码
<?php
namespace App\Admin\Controllers\Demo;
use App\Models\Post;
use App\Models\Tag;
use App\Models\User;
use Encore\Admin\Form;
use Encore\Admin\Grid;
use Encore\Admin\Facades\Admin;
use Encore\Admin\Layout\Content;
use App\Http\Controllers\Controller;
use Encore\Admin\Controllers\ModelForm;
use Encore\Admin\Widgets\Box;
use Encore\Admin\Widgets\Tab;
use Illuminate\Http\Request;
class PostController extends Controller
{
use ModelForm;
...
protected function grid()
{
return Admin::grid(Post::class, function (Grid $grid) {
if (request('trashed') == 1) {
$grid->model()->onlyTrashed();
}
$grid->id('ID')->sortable();
$grid->title()->ucfirst()->limit(30);
$grid->tags()->pluck('name')->label();
$states = [
'on' => ['text' => 'YES'],
'off' => ['text' => 'NO'],
];
$grid->released()->switch($states);
$grid->rate()->display(function ($rate) {
$html = "<i class='fa fa-star' style='color:#ff8913'></i>";
return join(' ', array_fill(0, min(5, $rate), $html));
});
$grid->column('float_bar')->floatBar();
$grid->created_at();
$grid->filter(function ($filter) {
$filter->between('created_at')->datetime();
$filter->where(function ($query) {
$query->whereHas('tags', function ($query) {
$query->where('name', $this->input);
});
}, 'Has tag');
});
$grid->tools(function ($tools) {
$tools->append(new Trashed());
$tools->batch(function (Grid\Tools\BatchActions $batch) {
$batch->add('Restore', new RestorePost());
$batch->add('Release', new ReleasePost(1));
$batch->add('Unrelease', new ReleasePost(0));
$batch->add('Show selected', new ShowSelected());
});
});
});
}
protected function form()
{
return Admin::form(Post::class, function (Form $form) {
$form->display('id', 'ID');
$form->text('title');
// load options by ajax
$form->select('author_id')->options(function ($id) {
$user = User::find($id);
if ($user) {
return [$user->id => $user->name];
}
})->ajax('/admin/api/users');
$form->textarea('content');
$form->number('rate');
$form->switch('released');
$form->multipleSelect('tags')->options(Tag::all()->pluck('name', 'id'));
$form->display('created_at', 'Created At');
$form->display('updated_at', 'Updated At');
});
}
/**
* Load options for select.
*
* GET /admin/api/users?q=xxx
*
* @param Request $request
* @return mixed
*/
public function users(Request $request)
{
$q = $request->get('q');
return User::where('name', 'like', "%$q%")->paginate(null, ['id', 'name as text']);
}
/**
* POST /admin/demo/posts/release
*
* @param Request $request
* @return void
*/
public function release(Request $request)
{
foreach (Post::find($request->get('ids')) as $post) {
$post->released = $request->get('action');
$post->save();
}
}
/**
* POST /admin/demo/posts/restore
*
* @param Request $request
* @return void
*/
public function restore(Request $request)
{
return Post::onlyTrashed()->find($request->get('ids'))->each(function ($post) {
$post->restore();
});
}
...
}
模型
app/Models/Post.php
<?php
namespace App\Models;
use Encore\Admin\Traits\AdminBuilder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use SoftDeletes, AdminBuilder;
protected $table = 'demo_posts';
protected $casts = [
'extra' => 'json',
];
public function author()
{
return $this->belongsTo(User::class, 'author_id');
}
public function tags()
{
return $this->morphToMany(Tag::class, 'taggable', 'demo_taggables');
}
public function comments()
{
return $this->hasMany(PostComments::class);
}
public function getContentAttribute($content)
{
return json_decode($content, true);
}
public function setContentAttribute($content)
{
$this->attributes['content'] = json_encode($content);
}
protected static function boot()
{
parent::boot();
static::saving(function ($model) {
if ($model->author_id == 0) {
$model->author_id = null;
}
});
}
}
app/Models/Tag.php
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Tag extends Model
{
protected $table = 'demo_tags';
public function setOptionsAttribute($options)
{
if (is_array($options)) {
$this->attributes['options'] = implode(',', $options);
}
}
public function getOptionsAttribute($options)
{
if (is_string($options)) {
return explode(',', $options);
}
return $options;
}
}
表结构
CREATE TABLE `demo_posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`author_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci NOT NULL,
`rate` int(11) NOT NULL,
`released` tinyint(1) DEFAULT '0',
`release_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `demo_tags` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE `demo_taggables` (
`tag_id` int(10) unsigned NOT NULL,
`taggable_id` int(10) unsigned NOT NULL,
`taggable_type` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
扩展
app/Admin/Extensions/Column/FloatBar.php
<?php
namespace App\Admin\Extensions\Column;
use Encore\Admin\Admin;
use Encore\Admin\Grid\Displayers\AbstractDisplayer;
class FloatBar extends AbstractDisplayer
{
protected function script()
{
return <<<EOT
$('.grid-float-bar').closest('tr').mouseover(function () {
$(this).find('.grid-float-bar').removeClass('hide');
});
$('.grid-float-bar').closest('tr').mouseout(function () {
$(this).find('.grid-float-bar').addClass('hide');
});
EOT;
}
public function display()
{
Admin::script($this->script());
return <<<EOT
<div style="width:220px;">
<div class="hide grid-float-bar">
<a class="btn btn-xs btn-default"><i class="fa fa-thumbs-up"></i> Up</a>
<a class="btn btn-xs btn-default"><i class="fa fa-thumbs-down"></i> Down</a>
<a class="btn btn-xs btn-default"><i class="fa fa-heart"></i> Like</a>
<a class="btn btn-xs btn-default"><i class="fa fa-share"></i> Share</a>
</div>
</div>
EOT;
}
}
app/Admin/Extensions/Tools/ReleasePost.php
<?php
namespace App\Admin\Extensions\Tools;
use Encore\Admin\Grid\Tools\BatchAction;
class ReleasePost extends BatchAction
{
protected $action;
public function __construct($action = 1)
{
$this->action = $action;
}
public function script()
{
return <<<EOT
$('{$this->getElementClass()}').on('click', function() {
$.ajax({
method: 'post',
url: '/{$this->resource}/release',
data: {
_token:'{$this->getToken()}',
ids: selectedRows(),
action: {$this->action}
},
success: function () {
$.pjax.reload('#pjax-container');
toastr.success('操作成功');
}
});
});
EOT;
}
}
app/Admin/Extensions/Tools/ShowSelected.php
<?php
namespace App\Admin\Extensions\Tools;
use Encore\Admin\Grid\Tools\BatchAction;
class ShowSelected extends BatchAction
{
public function script()
{
return <<<EOT
$('{$this->getElementClass()}').on('click', function() {
console.log(selectedRows());
alert(selectedRows().join());
});
EOT;
}
}
-END-