larasoft / admin-finecut
Requires
- php: >=5.4.0
- doctrine/dbal: ^2.5
- guzzlehttp/guzzle: 6.*
- illuminate/support: 5.*
- intervention/image: ^2.3
- intervention/imagecache: ^2.3
- laravelcollective/html: ~5.2
Requires (Dev)
- mockery/mockery: 0.9.*@dev
- phpunit/phpunit: ~4.0.7
This package is not auto-updated.
Last update: 2017-07-31 17:36:35 UTC
README
安装
- 在Composer中通过运行
composer require bozboz/admin
来要求此包 - 将
Larasoft\Admin\AdminServiceProvider
添加到app/config/app.php中的providers数组 - 可选地,将
Larasoft\MediaLibrary\Models\Media
添加到app/config/app.php中的aliases数组
控制器
Controllers\ModelAdminController
和Controllers\BulkAdminController
是包含模型标准CRUD功能的抽象类。子类 - 至少 - 必须定义一个构造函数,该构造函数传递一个Decorators\ModelAdminDecorator
或Decorators\BulkAdminDecorator
实例。例如:
use Larasoft\Admin\Decorators\FooAdminDecorator;
class FooAdminController extends ModelAdminController
{
public function __construct(FooAdminDecorator $foo)
{
parent::__construct($foo);
}
}
Laravel将智能地从IoC容器中解析依赖,以实例化控制器,所以剩下的唯一要做的事情就是将此控制器作为资源在路由文件中注册,如下所示
Route::resource('admin/foo', 'FooAdminController');
这将在Decorators\ModelAdminDecorator
依赖中定义的模型上启用整个CRUD功能。
装饰器
装饰器包含有关模型在管理员区域如何显示的信息。如果您有一个应在管理员区域访问的模型,它需要一个关联的装饰器。抽象类Decorators\ModelAdminDecorator
包含几个必须定义在子类中的抽象方法
getLabel
应返回模型的合适字符串表示,通常是实体的标题getFields
应返回一个Fields\Field
实例数组,用于在相关屏幕上创建/编辑实体。
有一些可选方法可以重写
getColumns
应返回要显示在管理员概览页上的键/值数组列getHeading
应返回整体模型的字符串表示(而不是如getLabel
中那样的特定实例)。此方法接受一个布尔参数(默认为false),允许调用脚本请求复数或单数形式。modifyListingQuery
允许修改列表查询,例如,预加载关系或应用自定义排序或条件。
类似于Controllers\ModelAdminController
的子类,装饰器必须在构造函数中传递一个依赖。这应该是装饰器在管理员中代表的实体。此类必须实现Models\BaseInterface
类。
例如:
use Larasoft\Admin\Models\Page;
class PageAdminDecorator extends ModelAdminDecorator
{
public function __construct(Page $page)
{
parent::__construct($page);
}
}
表示多对多关系
多对多关系也可以以同步和列表关系的形式表示在管理员中。这两种类型都使用Select2字段,并允许您管理两个实例之间的多对多关系。
同步关系是更常见的关系,允许从列表中选择相关模型,并在保存时创建正在编辑的模型和相关模型之间的映射。要定义同步关系,请向装饰器中添加一个getSyncRelations
方法,并返回要同步的关系数组,例如:
public function getSyncRelations()
{
return ['categories'];
}
列表关系在相关模型可以用简单字符串表示时很有用(例如标签)。列表关系类似于同步关系,不同之处在于它们可以在编辑/创建屏幕中组合。使用select2的“tags”选项,您可以从select2输入中添加新选项。任何创建的新实例都将与父模型一起保存。
列表关系与同步关系的定义方式类似,但必须明确指定用于保存新字符串的字段,例如:
public function getListRelations()
{
return [
'tags' => 'name'
];
}
在上面的例子中,Tag模型必须包含一个“name”属性。
一旦定义了任何同步/列表关系,为了在编辑模型的表单中表示它们,您必须在装饰器的getFields
方法中添加一个BelongsToManyField
实例。
public function getFields($instance)
{
return [
..
new BelongsToManyField(new FooDecorator(new Foo), $instance->foos());
];
}
此外,对于列表关系,为了启用Select2的“标签”功能,您必须在BelongsToManyField参数中设置一个data-tags
属性。
public function getFields($instance)
{
return [
..
new BelongsToManyField(new TagDecorator(new Tag), $instance->tags(), [
'data-tags' => true
]);
];
}
列表过滤
可以将列表过滤器指定在装饰器中,以便在管理后台提供选项以过滤管理概述屏幕上返回的结果。它们应在相应的装饰器上的getListingFilters
方法中定义。此方法应返回一个Reports\Filters\ListingFilter
子类的数组。
开箱即用的两种列表过滤器:ArrayListingFilter
和SearchListingFilter
。
数组列表过滤器
此过滤器接受一个选项数组并渲染一个选择框。它接受一个可选的第三个参数,允许自定义过滤逻辑。如果省略,则根据所选选项在该模型上执行基于过滤名称的查找。如果传递一个字符串作为第三个参数,则此字段将用于where条件。如果参数是一个回调,则将运行此回调以过滤列表查询。
如果默认选项不是0/空,则可以指定第四个“默认”值。
例如:
public function getListingFilters()
{
return [
new ArrayListingFilter('state',
['All', 'New', 'Completed', 'Failed']
, 'state_id', 2)
];
}
搜索列表过滤器
此过滤器为每个输入的单词提供对指定列的相对简单的LIKE搜索。它使用的搜索字段默认为过滤器的名称(第一个参数),但可以通过传递一个数组作为第二个参数来可选地指定这些字段。
默认查询将在构造过滤器时定义的每个列上执行查询词的通配符LIKE搜索。例如,在“name”和“description”列上搜索“foo”将产生以下SQL where条件:
WHERE `name` LIKE '%foo%' OR `description` LIKE '%foo%'
要覆盖此默认实现,您可以传递一个闭包作为构造函数的第三个参数,它接受一个查询构建器对象,并允许您按照任何方式查询。
模型
本包中的所有模型都扩展了Models\Base
(Models\BaseInterface
的实现)。
验证器
模型的验证规则存储在单独的验证器服务类中。验证子类应扩展Services\Validators\Validator
类。希望被验证的模型的责任是定义自己的验证器子类,以在其中定义验证规则来验证模型的数据。
"rules"属性
这些都是应在所有验证实例中应用的规则。
"storeRules"属性
仅在存储新的模型实例时应应用的规则。将与“rules”属性合并。
"updateRules"属性
仅在更新现有的模型实例时应应用的规则。将与“rules”属性合并。
唯一规则
Laravel的唯一规则在更新时将失败,因为正在保存的模型上要验证的值将与数据库中已存在的条目上的值冲突。为了解决这个问题,Laravel提供了以下更详尽的语法来定义唯一验证规则:'unique:<table>,<field>,<id>'
。
可以在规则中硬编码表和字段,但ID是动态值。您可以在验证服务中使用花括号占位符来表示它,例如'unique:pages,slug,{id}'
。
占位符语法适用于模型上的任何属性,因此它可以用于Laravel的扩展唯一功能,例如'unique:users,email_address,{id},id,account_id,{account_id}'
特质
DynamicSlugTrait
自动为模型生成slug值。在相应模型上使用
该特性,并定义一个getSlugSourceField
方法,该方法返回从中派生slug的属性名称。
字段
DateTimeField
使用datetimepicker插件,该插件扩展了jQuery UI DatePicker的功能。文档可以在这里找到。
实例化DateTimeField
对象时,可以通过传递一个映射到'选项'键的数组来覆盖默认的datetimepicker配置。
这将进行json编码,并在DOM渲染时与默认值合并。当在datetimepicker文档中定义JS Date对象时,请将这些定义为epoch值(例如,time()
或$dateTime->format('U')
)。
URLField
URLField可以从其他字段自动生成slug。为了使用此功能,您必须将data-auto-slug-from
属性设置为要目标的字段的名称属性。
例如:
<?php
new URLField('slug', [
'route' => '...',
'data-auto-slug-from' => 'name',
]);
辅助工具
asset_version
将最后修改时间追加到资产文件名末尾,用于缓存破坏。
用法
{{ asset_version('assets/css/min/style.css') }}
为了让它正常工作,您必须在
.htaccess
文件中添加以下内容:# Rewrite cachebusted assets RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_URI} ^.*\.(css|js)$ RewriteRule ^(.+)--\d+\.([^\.]+)$ $1.$2 [L]