Laravel 的一个可编写和灵活的自定义帖子类型管理器,带有自定义字段。可扩展,可根据您的需求动态化。


README

Latest Stable Version Latest Unstable Version License Monthly Downloads

一个基于 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

如果您运行以下 vendor publish,您将收到一组示例帖子类型以供使用

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 许可协议