vanrijs / niku-solutions-cms-laravel-6
适用于Laravel的可编码和灵活的自定义文章类型管理器,具有自定义字段。可扩展,可根据需要动态调整。
Requires
- php: ^7.3|^8.0
This package is not auto-updated.
Last update: 2024-09-21 00:14:22 UTC
README
一个基于API的可编码文章管理器,适用于Laravel,具有自定义字段。可根据需要扩展。基于API请求,您将以可构建前端的方式接收文章类型配置。我们将负责CRUD功能,支持分类、媒体管理和文章元数据。
我们已在项目中使用我们的包来删除基本文章管理的需求。我们现在可以为所有类型的文章数据(如页面、文章、产品等)设置高级仪表板功能。您可以在不接触数据库的情况下立即添加或删除自定义字段,因为该包会自动为您执行此操作并保存数据,在显示编辑表单时显示数据。
我们正在开发一个基于Vue.js和Axios的解耦前端包,这使得在Laravel项目或单页应用程序中与API交互成为可能。
功能
- 自定义文章类型
- 配置页面
- 分类等分类法
- 具有上传功能和管理的媒体管理器
- 可重复的自定义字段组
- 自定义字段
- 自定义字段的验证规则
- 基于模板选择的条件自定义字段
- 基于用户是否登录的简单默认用户身份验证
- 允许用户仅查看自己的文章
- 菜单管理支持,您需要我们的前端包来实现。
安装
使用Composer安装此包
composer require niku-solutions/cms
将以下类注册到config/app.php中的'providers'数组中
Niku\Cms\CmsServiceProvider::class,
将以下中间件注册到路由文件中以白名单您的文章类型和配置组。您不需要对此做任何事情,因为我们使用此提供者来保护文章管理器的API路由。
use Niku\Cms\Http\Middlewares\WhitelistPostTypesMiddleware; use Niku\Cms\Http\Middlewares\WhitelistConfigGroupsMiddleware; protected $routeMiddleware = [ ... 'posttypes' => WhitelistPostTypesMiddleware::class, 'groups' => WhitelistConfigGroupsMiddleware::class, ... ];
您需要运行以下Artisan命令以发布所需的配置文件以注册您的文章类型。
php artisan vendor:publish --tag=niku-config
如果您运行以下供应商发布,您将收到一组示例文章类型以使用
php artisan vendor:publish --tag=niku-posttypes
通过运行以下命令迁移数据库表
php artisan migrate
使用方法
在您能够使用文章类型之前,您需要在config/niku-cms.php文件中白名单和设置所需的自定义字段和模板。
return [ 'post_types' => [ // Default 'attachment' => App\Cms\PostTypes\Attachment::class, // CMS 'page' => App\Cms\PostTypes\Pages::class, 'posts' => App\Cms\PostTypes\Pages::class, 'posts-category' => App\Cms\PostTypes\PostsCategory::class, ], 'config_types' => [ // Registering the single config page 'defaultsettings' => App\Cms\ConfigTypes\DefaultSettings::class, ];
您可以通过在路由文件中粘贴以下方法来注册路由。您可以根据需要添加中间件,如通常所做的,以通过身份验证等保护路由。注册的路由中的post_type是变量,但由方法中的参数保护,因此默认情况下没有启用API请求。
要启用API路由,您需要注册您希望使用的文章类型的名称,如下面的register_post_types数组键所示。在注册文章类型时,您在config/niku-cms.php文件中填写数组键的名称。有关配置的更多信息,请继续阅读。
例如,如果您有两个用户角色需要与同一文章类型通信但需要不同的权限,您可以创建两个配置文件,其中普通用户账户只能查看自己的文章,而超级管理员可以查看所有用户的文章。您可以通过命名config/niku-cms.php的数组键唯一来做到这一点,并创建两个配置文件,其中'$ identifier'指向相同的'post_type'。
Niku\Cms\Cms::postTypeRoutes([ 'register_post_types' => [ 'posts', 'superadminposts', ], ]); // Registering the routes for config pages Niku\Cms\Cms::postTypeRoutes([ 'register_groups' => [ 'defaultsettings', ], ]);
对于每个已注册的帖子类型,您可以设置默认数据和自定义字段。您可以在插入的自定义字段的验证数组键中添加验证。因为它只会将其传递到验证器类,所以将支持所有Laravel验证规则。
namespace App\Cms\PostTypes; use Niku\Cms\Http\NikuPosts; class Pages extends NikuPosts { // The label of the custom post type public $label = 'Pages'; // Custom post type identifer public $identifier = 'page'; // Users can only view their own posts when this is set to true public $userCanOnlySeeHisOwnPosts = false; public $config = [ ]; // Setting up the template structure public $templates = [ 'default' => [ 'customFields' => [ 'post_content' => [ 'component' => 'niku-cms-text-customfield', 'label' => 'Text', 'value' => '', 'validation' => 'required', ], 'author' => [ 'component' => 'niku-cms-text-customfield', 'label' => 'Author', 'validation' => 'required', ], // more custom fields ], ], ]; }
您想根据模板更改显示的自定义字段吗?您可以为前端用户添加多个可选择的视图,并更改可见的自定义字段。
public $templates = [ 'default' => [ 'label' => 'Default page', 'template' => 'default', 'customFields' => [ 'text' => [ 'component' => 'niku-cms-text-customfield', 'label' => 'Text', 'value' => '', 'validation' => 'required', ] ] ], 'sidebar' => [ 'label' => 'Sidebar layout', 'template' => 'sidebar-layout', 'customFields' => [ 'text' => [ 'component' => 'niku-cms-text-customfield', 'label' => 'Text', 'value' => '', 'validation' => 'required', ] ] ], ];
博客
如果您想有一个类似博客的方法,可以执行以下操作。
在您的 routes/web.php 中启用以下类型。
Route::get('blog', 'BlogController@blog'); Route::get('blog/{slug}', 'BlogController@singleBlog');
接下来,在控制器中启用所需的方法。
public function blog() { $posts = Posts::where([ ['status', '=', '1'], ['post_type', '=', 'post'] ])->with('postmeta')->get(); return view('static.blog', compact('posts')); }
然后在您的视图中,执行以下操作。这个语法将在未来被重新创建以使其更加流畅,但现在它有效。
@foreach($posts as $post) <div class="row"> @if(!empty($post->getMeta('image'))) <?php $image = json_decode($post->getMeta('image')); $image = $image->url; ?> <div class="col-md-3"> <img src="{{ $image }}" class="img-responsive"> </div> @endif <div class="col-md-8"> <h2>{{ $post->post_title }}</h2> <p>{!! $post->getMeta('excerpt') !!}</p> <br/> <a class="btn btn-default" href="/blog/{{ $post->post_name }}">Read more</a> </div> </div> @endforeach
切换模板
如果您在 config/niku-cms.php 中启用了多个帖子类型模板,您将在后端看到一个选项来切换模板。当您选择了一个模板后,您可以像这样在前端切换视图。
@extends('static.layouts.' . $posts->template)
API
要获取您的帖子类型的基础结构,您可以请求以下帖子API,其中值为0。这意味着我们正在创建一个新的帖子。此请求的结果将给出您在配置文件中插入的结构。使用这些数据,您可以构建页面的前端以自动创建创建表单的输入字段。
您将在创建新帖子项的页面初始化时触发此API。(/superadmin/pages/create)。
POST /your-prefix/{post_type}/show/0
{
"post": {
"template": "default"
},
"postmeta": [],
"templates": {
"default": {
"customFields": {
"text": {
"component": "niku-cms-text-customfield",
"label": "Text",
"value": "",
"validation": "required",
"id": "text"
},
"PostMultiselect": {
"component": "niku-cms-posttype-multiselect",
"label": "Post multiselect",
"post_type": [
"page"
],
"validation": "required",
"id": "PostMultiselect"
},
"periods": {
"component": "niku-cms-repeater-customfield",
"label": "Perioden",
"validation": "required",
"customFields": {
"label": {
"component": "niku-cms-text-customfield",
"label": "Label",
"value": "",
"validation": ""
},
"boolean": {
"component": "niku-cms-boolean-customfield",
"label": "Boolean button",
"value": "",
"validation": ""
}
},
"id": "periods"
}
}
}
},
"config": []
}
扩展自定义字段并定义自己的
您可以通过使用注册的组件标识符来创建自己的自定义字段,以标识您需要显示哪个Vue组件。此信息将在请求以下API时附加到API请求;
'text' => [ 'component' => 'niku-cms-text-customfield', 'label' => 'Text', 'value' => '', 'validation' => 'required', ],
使用在帖子类型配置中定义的键注册您的组件。
Vue.component('niku-cms-text-customfield', require('./components/customFields/text.vue'));
例如,可以使用以下代码结构
<template> <div class="form-group"> <label for="post_name" class="col-sm-3 control-label">{{ data.label }}:</label> <div class="col-sm-9"> <input type="text" name="{{ data.id }}" v-model="input" class="form-control" value="{{ data.value }}"> </div> </div> </template> <script> export default { data () { return { 'input': '', } }, props: { 'data': '' }, ready () { } } </script>
安全漏洞
如果您发现任何安全漏洞,请直接发送电子邮件至 Nick Kuijpers,邮箱地址为 n.kuijpers@niku-solutions.nl。
许可
MIT许可(MIT)。有关更多信息,请参阅MIT许可。