界面

代码

<?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('&nbsp;', 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-

results matching ""

    No results matching ""