larasoft / jam
Requires
- kalnoy/nestedset: 3.1 - 4.1
This package is not auto-updated.
Last update: 2017-08-01 19:24:39 UTC
README
内容
1. 安装
- 在Composer中通过运行
composer require bozboz/jam
来要求该软件包 - 将
Larasoft\Jam\Providers\JamServiceProvider::class
添加到config/app.php中的providers数组 - 运行
php artisan vendor:publish && php artisan migrate
2. 数据设置
2.1. 类型
实体类型是jam架构的最高级别。它们基本上可以被视为模型,或者模型的逻辑分组,因为模板实际上具有字段。类型在服务提供者中定义。Jam自带“页面”类型,因为大多数应用程序都需要一个。
当您注册一个类型时,您可以给它一个报告、链接生成器、菜单生成器、搜索处理程序和实体。如果任何一个是空的,将使用默认值。
如果您需要嵌套排序,应使用NestedType。
report
列表用的管理报告类。通常,除非您想要完全自定义,否则不需要更改。NestedType会自动将默认值切换为NestedReport。默认
Larasoft\Admin\Reports\Report
link_builder
这是一个负责知道它所负责的类型应该生成哪些路径/URLs的类。默认情况下,类型不会生成路径,因为它假设不是每个实体都是独立的页面。如果您需要您的类型生成路径,可以使用Larasoft\Jam\Entities\LinkBuilder
,它将根据当前实体的嵌套生成单个路径,并更新任何子实体的路径。对于需要存在于多个URL下的复杂实体,可以扩展LinkBuilder类并添加自己的路径生成逻辑。从实体嵌套生成的主体路径将被用作任何附加路径的规范路径。默认
Larasoft\Jam\Entities\LinksDisabled
menu_builder
处理在管理菜单中放置类型的位置。类型在没有基于其实体进行基础设置的模板之前不会显示在菜单中。Larasoft\Jam\Types\Menu\Hidden
不显示在菜单中Larasoft\Jam\Types\Menu\Content
显示在内容下拉菜单中Larasoft\Jam\Types\Menu\Standalone
显示为顶级菜单项
默认
Larasoft\Jam\Types\Menu\Content
search_handler
Jam内置了对Elastic Search的基本支持,但默认情况下是禁用的。请参阅4. 搜索索引
。entity
Jam中有几种不同的实体类,用于定义排序选项。普通的Larasoft\Jam\Entities\Entity
不可排序,将按名称排序。Larasoft\Jam\Entities\SortableEntity
可手动排序,但单独使用时仅允许兄弟排序。如果需要嵌套排序,则必须与Larasoft\Jam\Types\NestedType
类型一起使用。最后,还有Larasoft\Jam\Entities\Post
实体,它将按发布日期排序实体。默认
Larasoft\Jam\Entities\Entity
2.2. 模板
一旦你拥有了一些类型,你需要为它们提供一些模板。模板决定了实体具有哪些数据。类型可以有任意数量的模板。要添加模板,请登录到管理员界面,点击“Jam”,然后选择一个类型进行编辑。
添加模板时,你必须为其提供名称
和视图
,但列表视图
和最大使用次数
是可选的。视图字段将在默认渲染方法中使用,以选择实际渲染的视图。列表视图的实现主要取决于需求,但其目的是你可以在同一类型中拥有多个模板,这些模板在列表中需要不同的视图。一旦创建了模板,管理员菜单将识别该类型,并在配置的菜单构建器指定的菜单中显示它。最大使用次数
允许你限制模板可能使用的次数,例如将其设置为1将在创建一个后隐藏使用该模板创建新实体的选项。
2.3. 字段
模板由一系列字段组成。Jam包含以下字段类型
文本
标准单行文本输入。文本区域
标准多行文本输入,带有复选框选项,使其成为WYSIWYG HTML编辑器。图片
单个媒体库字段。画廊
多选媒体库字段。日期
日期和时间
切换
用于切换布尔值的复选框。实体列表
允许创建多个子实体。适用于重复的内容结构,如幻灯片、呼出框等。
为了使用此字段类型,你必须首先设置另一个实体类型,该字段可以使用Larasoft\Jam\Types\EntityList
类型链接到。
例如:php <?php $mapper = $this->app['EntityMapper'];
$mapper->register([
'callout-boxes' => new \Larasoft\Jam\Types\EntityList('Callout Boxes'),
]);
`
Belongs To
允许你将一个实体链接到另一个实体。在创建/编辑表单中,所有创建的实体都将具有所选的父级。仅选择类型或模板将允许用户从所选类型/模板的实体中选择父级实体。
您还可以选择具有此字段的实体是否作为子页面嵌套在相关实体之下。
注意:不应与在同一列表中不显示的可排序实体一起使用,因为重新排序可能导致意外的树操作。
Belongs To Many
为实体表单提供选择多个相关实体的选项。与Belongs To
类似,下拉列表中的选项将限于在将字段添加到模板时所选的类型和模板。Inverse Belongs To Many (只读)
是Belongs To Many
字段中定义的关系的逆关系,提供了一个只读视图来查看相关实体。隐藏
允许你在实体的创建/编辑表单中添加一个隐藏字段,当创建字段时会保存输入的值。
如果您需要上述未列出的任何功能(例如,定义实体模板与未存储在Jam中的应用程序自定义模型之间的关系),您可以通过扩展Larasoft\Jam\Fields\Field
类并使用服务容器中注册的FieldMapper
在服务提供商中注册字段类型来创建任意数量的自定义字段类型。
2.4. 实体
通常您不需要包中的更多默认功能,并且您不应直接与实体类本身交互。有关如何使用不同的实体类的信息,请参阅2.4. 实体,有关如何获取实体信息,请参阅3.2. 实体存储库。
2.5. 修订
每次保存实体时,它都会在entity_revisions表中创建一个修订版本,并设置一组新值。这允许您跟踪实体之间的更改或恢复到之前的状态。
3. 使用
3.1. 通配符路由
默认情况下,Jam没有设置任何前端路由,但它确实有一个控制器,您的应用可以将一些路由指向该控制器。
通常,您希望在路由文件末尾添加一个通配路由,以处理大多数实体路由。这将使用路径表根据请求路径查找实体,并使用其配置的模板在视图中提供。
<?php
Route::get('{entityPath}', [
'as' => 'entity',
'uses' => '\Larasoft\Jam\Http\Controllers\EntityController@forPath'
])->where('entityPath', '(.+)?');
3.2. EntityRepository
应使用Larasoft\Jam\Repositories\EntityRepository
类的forType
方法手动检索实体。这将返回一个针对正确注册到类型的实体类的新查询构建器,并限制为该类型的实体。
3.3. 列表及其他数据
某些页面可能需要比实体更多的数据,因此您需要为当前视图创建一个视图构建器。这些应该添加到app/Http/ViewComposers
中,并在ComposerServiceProvider服务提供者的boot方法中注册。
3.4. 标准路径
每个具有链接构建器的实体都将有一个规范路径,这通常是在从其他页面/菜单链接到它时希望使用的路径。在查询实体时,应使用withCanonicalPath
范围来预加载它,或者在处理集合时使用loadCanonicalPath
方法来懒加载它。使用$entity->canonical_path
来输出它。
3.5. 值检索
仅查询实体只会提供实体表中的数据,为了加载值,必须在单个或实体集合上调用loadValues
方法。该方法接受要加载的字段列表,如果没有提供参数,则加载所有字段。
例如:
<?php
$pages = $entityRepository->forType('page')->get()->loadFields('content', 'image');
4. 搜索索引
Jam支持通过Elasticsearch索引实体,但每种类型都需要设置搜索处理器,见2.1. 类型。如果您只需要索引实体的名称,则可以仅使用基础的Larasoft\Jam\Entities\Indexer
类。在可能需要更多的情况中,每种类型都需要为其编写处理器。在设置实体类型的搜索处理器类时,它应该扩展基础Indexer类并覆盖getPreviewData
和getSearchableData
方法。
getPreviewData
的目的是将实体转换为适合您搜索结果视图的合适格式,而getSearchableData
则是返回所有想要可搜索的值作为一个长的字符串。
例如:
<?php
protected function getPreviewData($page)
{
return [
'preview' => str_limit(strip_tags(
$page->intro_text ?: $page->content
), 200),
'image' => Media::getFilenameOrFallback($page->image, null, 'search-result'),
];
}
protected function getSearchableData($page)
{
return strip_tags(implode(' ', [
$page->intro_text,
$page->content,
]));
}