一个可编码且灵活的自定义购物车管理器,用于Laravel,并支持自定义字段。可扩展,满足您的一切需求。

0.0.34 2018-04-18 07:51 UTC

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

如果您运行以下供应商发布,您将收到一组示例文章类型以使用

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许可证