grafite/cms

该包已被废弃,不再维护。未建议替代包。

为任何Laravel应用/网站添加CMS,以控制页面、博客、画廊、活动、自定义模块、图片等。

安装: 14,381

依赖者: 3

建议者: 0

安全: 0

星标: 499

关注者: 32

分叉: 104

开放问题: 15

语言:CSS

v3.3.0 2019-09-04 07:03 UTC

README

Grafite已归档此项目,不再支持或开发此代码。我们建议仅将其作为您自己代码灵感的来源。

CMS - 为任何Laravel应用添加CMS,以控制页面、博客、画廊、活动、自定义模块、图片等。

Build Status Packagist license

Grafite CMS是一个功能齐全的CMS,可添加到任何Laravel应用程序中。它为您提供对页面、菜单、链接、小部件、博客、事件、常见问题解答等内容的全面控制。Grafite CMS包含一个模块构建器,以满足您所有的自定义CMS需求,以及模块发布工具。因此,如果您决定在未来的项目中重用某些模块,可以轻松无缝地发布它们的资产。如果您希望将Grafite CMS模块制作成PHP包,那么您需要将其资产发布到cms/modules目录。

简单设置与复杂设置有何区别?

简单设置使用Grafite Builder作为Laravel应用的骨干,一旦运行设置命令,您将拥有一个完整的CMS作为应用。复杂设置专门针对想要将其添加到现有应用的开发者。

作者

一般要求

  1. PHP 7.1.3+
  2. MySQL 5.7+
  3. OpenSSL

兼容性和支持

Laravel版本 包标签 支持
5.8.x 3.3.x
5.7.x 3.x.x
5.6.x 3.0.x
5.5.x 2.4.x
5.4.x 2.3.x

文档

安装

创建一个新的Laravel应用,创建一个数据库,并更新.env文件。

  • 运行以下命令
composer require grafite/cms
  • 然后运行vendor发布
php artisan vendor:publish --provider="Grafite\Cms\GrafiteCmsProvider"

!!! 提示 "如果您希望使用发布日期时间选择器 - 将您应用的时间区配置设置为与您的位置对应"

简单设置

!!! 警告 "简单设置需要一个新的Laravel应用。"

如果您想创建一个具有强大CMS的简单网站,并且只有CMS管理员登录到应用。然后您可以运行设置命令,它将安装所有需要的组件,运行其迁移,并提供登录以开始。在几秒钟内控制您的网站。

php artisan grafite:cms-setup

现在您已完成设置。登录,开始构建您令人惊叹的新网站!

您可以使用以下凭据登录管理员

U: [email protected]
P: admin

复杂配置

!!! 警告:"对于已经包含登录/注销设置的现有应用程序,需要进行复杂配置。"

如果您只想将 Grafite CMS 添加到现有应用程序中,并且已有应用程序正在运行,请按照以下说明操作

  • 将以下内容添加到您的路由提供者中
require base_path('routes/cms.php');
  • 将以下内容添加到您的 app.scss 文件中,您可能需要根据您选择的主题进行修改。
@import "resources/themes/default/assets/sass/_theme.scss";
  • 然后进行迁移
php artisan migrate
  • 然后添加到内核路由中间件
'cms' => \App\Http\Middleware\GrafiteCms::class,
'cms-api' => \App\Http\Middleware\GrafiteCmsApi::class,
'cms-language' => \App\Http\Middleware\GrafiteCmsLanguage::class,
'cms-analytics' => \Grafite\Cms\Middleware\GrafiteCmsAnalytics::class,

为了使模块也能加载,请编辑 composer 文件中的 autoload psr-4 部分

"autoload": {
    ...
    "psr-4": {
        "App\\": "app/",
        ...
        "Cms\\": "cms/"
        }
}

CMS 访问

管理仪表板的路由是 "/cms/dashboard"。

Grafite CMS 需要 Grafite Builder 来运行(仅适用于 FormMaker),但 Grafite CMS 不要求您使用 Grafite Builder 的角色版本。但是,您仍然需要确保对 Grafite CMS 访问的某种程度控制。这是在 Grafite CMS 中间件中完成的,使用 gate 和 Grafite CMS 策略。如果您选择使用 Grafite Builder 提供的角色系统,则可以将 'cms' 替换为 admin 来处理 Grafite CMS 授权,否则,您将需要为 Grafite CMS 访问设置自己的安全策略。为此,只需将 Grafite CMS 策略添加到您的 app/Providers/AuthServiceProvider.php 文件中,并确保任何希望它在策略方法中使用的规则都在策略方法内。我们建议使用以下类似策略。

可能的 CMS 访问策略

Gate::define('cms', function ($user) {
    return (bool) $user;
});

Gate::define('cms-api', function ($user) {
    return true;
});

或使用 Grafite Builder

Gate::define('cms', function ($user) {
    return ($user->roles->first()->name === 'admin');
});

有趣的路由技巧

如果您正在寻找不需要在 URL 前加上 pagep 的干净 URL 页面,则可以将此内容添加到您的路由中。

确保将其放在路由的底部,否则可能会与其他内容冲突。

Route::get('{url}', function ($url) {
    return app(App\Http\Controllers\Cms\PagesController::class)->show($url);
})->where('url', '([A-z\d-\/_.]+)?');

角色 & 权限(仅简单配置)

使用角色中间件,您可以指定哪些角色适用,用管道分隔:['middleware' => ['roles:admin|moderator|member']]

Grafite CMS 中间件使用角色来确保用户是 'admin'。但是,您可以对其进行大量扩展,可以创建多个角色,然后在您的应用程序中使用角色中间件设置它们的访问权限。但是,当您想允许多个角色访问 CMS 但只允许管理员访问您的自定义模块时,怎么办?您可以使用权限来实现这一点。类似于角色中间件,您可以将权限设置为 ['middleware' => ['permissions:admin|cms']]。您可以在 config/permissions.php 中设置自定义权限。这意味着您可以为 CMS 的不同部分设置不同的角色权限,从而获得更多控制。

API 端点

Grafite CMS 附带了一些有用的 API 端点,如果您想使用它们,您可以定义自己的访问策略并按需自定义中间件。

令牌

基本的 Grafite CMS API 端点必须携带在应用配置中定义的 Grafite CMS apiToken。这可以通过向任何请求添加以下内容来实现

?token={your token}

** 默认情况下,所有已发布和面向公众的数据将通过 API 提供。

/cms/api/blog
/cms/api/blog/{id}
/cms/api/events
/cms/api/events/{id}
/cms/api/faqs
/cms/api/faqs/{id}
/cms/api/files
/cms/api/files/{id}
/cms/api/images
/cms/api/images/{id}
/cms/api/pages
/cms/api/pages/{id}
/cms/api/widgets
/cms/api/widgets/{id}

图片

图片在上传时会被调整大小以获得更好的质量响应时间。它们遵循在 config 中指定的 cms.max-image-size 指引。

S3

关于S3存储桶的使用。您需要相应地设置权限以允许图片保存到您的存储桶中。然后您需要将存储桶设置为允许公共查看访问。这是一个这样的策略示例。

{
    "Version":"2008-10-17",
    "Statement":[{
        "Sid":"AllowPublicRead",
        "Effect":"Allow",
        "Principal": {
            "AWS": "*"
        },
        "Action":["s3:GetObject"],
        "Resource":["arn:aws:s3:::MY_BUCKET/public/images/*"]
    }]
}

MY_BUCKET 替换为您的存储桶名称。

文件系统配置

如果您使用S3,您需要在您的文件系统配置中添加以下行: 'visibility' => 'public',

也提供

Graphite CMS软件包还提供了以下软件包

  • DevFactory/Minify
  • Grafte/Builder

配置

Graphite CMS具有相当复杂的配置,提供了许多选项。您可以扩展核心模块,启用/禁用功能,并配置更多内容。

描述
analytics 为仪表板选择一个分析引擎(内部或谷歌)
pixabay 您的pixabay API代码
db-prefix 为Grafite CMS内容表添加前缀
live-preview 在编辑视图中预览您的网站
frontend-namespace 为前端代码设置默认命名空间
frontend-theme 前端主题
load-modules 您是否希望加载外部模块
module-directory 自定义Graphite CMS模块的目录
active-core-modules 哪些核心Graphite CMS模块是激活的
rss 为RSS源设置一系列属性
site-mapped-modules 构建网站地图XML的模块URL及其存储库
auto-translate 使用谷歌翻译自动将内容翻译成其他语言
default-language 您的网站的默认语言
languages 您的网站中可用的语言(在编辑器中启用它们的选项卡)
storage-location 文件/图像的存储(s3或本地)
max-file-upload-size 上传的最大文件大小(必须在php.ini中设置)
preview-image-size 在上传图片时,我们缓存小尺寸的克隆(默认:800)
cloudfront 设置用于替换S3存储桶链接的cloudfront URL
backend-title CMS的标题(默认:cms)
backend-route-prefix CMS后端的路由前缀(默认:cms)
backend-theme 后端主题(标准)
registration-available 启用或禁用注册
pagination 后端每包的结果数
api-key Redactor图片和文件注入的API密钥
api-token Redactor图片和文件注入的API令牌,以及通用的外部API调用
forms 核心模块的表单配置

API

Graphite的CMS API非常简单,并且它有一个非常简单的使用单个令牌的认证系统,该令牌可以在您的环境变量中定义。您可以轻松使用它来管理与各种平台的集成等。所有API请求的通用基本路由是

/cms/api/{resource-url}?token={CMS_API_TOKEN}
URL 资源
blog 博客
events 事件
endorsements 背书
faqs 常见问题解答
files 文件
图片 图片
页面 页面
小部件 小部件

这些路由中的每一个都可以调用,或者你也可以使用ID获取特定资源实例

示例

/cms/api/blog/1?token=9a78sd6f9as6df9

多语言

翻译

在网站甚至应用中,我们经常需要翻译。Grafite CMS 有一个非常简单的处理多语言的方法。翻译设置为在配置中添加任何语言到 languages 数组,你将能够为这些语言定义自定义条目。

自动翻译

auto-translate: false

为了启用自动翻译,确保在配置中将它设置为 true。

可翻译模块

只需将可翻译特性添加到你的模块模型中,然后更新你的模块以遵循与 Grafite CMS 页面结构相似的格式,参考以下文件

Grafite\Cms\Controllers\PagesController
Grafite\Cms\Repositories\PageRepository
Grafite\Cms\Models\Page

存档和清理

你需要扩展 CmsModel 而不是默认的 Model。它还需要使用 Translatable 特性。

use Grafite\Cms\Models\CmsModel;
use Grafite\Cms\Traits\Translatable;

class Books extends CmsModel
{
    use Translatable;
}

你还需要在你的模块事件提供者中设置类似的绑定。

'eloquent.saved: Grafite\Cms\Models\Page' => [
    'Grafite\Cms\Models\Page@afterSaved',
],
'eloquent.created: Grafite\Cms\Models\Page' => [
    'Grafite\Cms\Models\Page@afterCreate',
],
'eloquent.deleting: Grafite\Cms\Models\Page' => [
    'Grafite\Cms\Models\Page@beingDeleted',
],

这些绑定确保当你保存时创建前一个条目的存档,并在删除项目时系统清除任何翻译和留下的存档。创建的绑定允许自动翻译,这样你就可以利用 Google Translate 的功能。

语言链接

Grafite CMS 内置了一个 blade 指令,可以生成支持语言的链接,并提供了一种简单的方法,在保持同一 URL 的情况下在单个页面或博客条目的语言之间切换。

支持语言 URL 前缀

默认情况下,我们支持使用 cookie 来处理语言和切换。由于每个页面/博客/事件等都可以有与语言相关的特定 URL,在这个当前构建中,语言的前缀并没有太大的意义。但话虽如此,有时它很有用,所以这里有一个简单的方法来添加对它的支持。

只需将此代码添加到 RouteServiceProvider.php 中的 map() 方法。

$segments = request()->segments();
$supportedLanguages = array_keys(config('cms.languages'));

if (isset($segments[0]) && in_array($segments[0], $supportedLanguages)) {
    $language = $segments[0];
    unset($segments[0]);
    return redirect(implode('/', $segments))->withCookie('language', encrypt($language))->send();
}

促销

正如术语所暗示的,促销就像广告。它们旨在像小部件一样处理,主要区别在于它们有时间范围。这意味着你可以组合促销材料和内容,并设置它们的发布日期和时间,以及完成日期和时间以使促销消失。这使得安排活动等的启动变得非常容易。

@promotion('slug')

你可以在任何主题文件上设置这些。我们建议你将它们保留在主题文件中,并在需要时更改内容和日期。

主题

Grafite CMS 内置了完整的主题工具。你可以轻松生成基本主题,可以在视图之外构建和保持清晰。所有带有星号的列表模板都是可选的——否则其他所有内容都是基本支持所必需的。

基本主题结构

  • assets
    • js
      • theme.js
    • sass
      • _basic.scss
      • _theme.scss
  • blog
    • all.blade.php
    • featured-template.blade.php
    • show.blade.php
  • events
    • all.blade.php
    • date.blade.php
    • calendar.blade.php
    • featured-template.blade.php
    • show.blade.php
  • faqs
    • all.blade.php
  • gallery
    • all.blade.php
    • show.blade.php
  • layout
    • master.blade.php
  • 页面
    • all.blade.php
    • featured-template.blade.php
    • home.blade.php
    • show.blade.php
  • partials
    • navigation.blade.php
  • public
    • img

您可以使用 Blade 的 @theme('path') 指令将其他主题视图包含到您的视图中。否则,基本上是 Blade 可以做的任何事情,包括您希望扩展的任何指令。

Blade 指令

Grafite CMS 为 Blade 添加了一些自定义指令,这使得您能够轻松地将文件从主题中包含进来,以及其他部分。

@theme('path.to.view')

您总是可以在 @include('path') 中添加 cms-frontend:: 命名空间,或者使用 @theme('path') 代替。

@block('slug')

使用模板中的块指令创建独特且优雅的设计,适用于页面和博客。

!!! 警告:使用块 Blade 指令时,您不需要指定需要加载的模块,它将根据请求 URL 的第一个字符串来确定。如果没有匹配的模块名称与 URL 相匹配,它将默认为页面。对于像 events 这样的内容,它期望模板中的变量是 $event。它被包装在 optional 方法中,以保护视图不会破坏应用程序。

@menu('slug')

使用菜单 Blade 指令轻松将菜单添加到您的视图中。

@modules(['modules-to-ignore'], 'link-class', 'list-item-class')

自动生成指向模块的链接(默认为 Bootstrap 4)。

@widget('slug')

使用菜单 Blade 指令将小部件添加到您的视图中,只需指定 SLUG 即可。

@image('id', 'class')

提供带有 HTML 标签和额外类名的图像 URL。

@image_link('ID')

提供图像 URL。

@images('tag')

图像将作为数组提供,如果您省略了标签,则该方法将返回所有图像,否则它将遵循标签。

@edit('module', 'id')

还有 Grafite CMS 服务可以在您的 Blade 视图中运行。它就像 {{ Cms::method() }} 一样简单。

@markdown('content')

将您的 markdown 博客或页面条目转换为 HTML。

@languages('link-class', 'list-item-class')

为您网站支持的每种语言生成链接。

可用的辅助方法

  • menu('slug', 'optional-view-path')
  • images('tag')
  • widget('slug')
  • editBtn('module', 'id')

页面和块

有一些专为页面提供的特殊功能,这些功能在网站的其他部分不可用。

页面是特殊的,通常需要复杂的设计。如果您的应用程序需要一些更抽象的设计,您仍然可以使用Grafite CMS进行页面管理,通过使用块系统。

{!! $page->block('main') !!}

或者

{{ block('main') }}

将此类代码放置在您的模板中,如果Grafite CMS尚未生成main块,则将生成该块。如果已存在且包含内容,它将渲染内容。这真的很简单。

发布

命令

php artisan theme:publish {name}

Grafite CMS主题发布者将只发布公共目录。如果您想集成资源,您需要使用您的webpackgulp文件来实现,具体取决于您使用的设置。

Laravel版本 资源构建器
5.4+ webpack.mix.js
5.3 gulpfile.js

基本主题(顶级)

  • assets
  • blog
  • events
  • faqs
  • gallery
  • layout
  • 页面
  • partials
  • public
    • img

符号链接

命令

php artisan theme:link {name}

Grafite CMS主题链接工具将在您的公共文件夹和名为theme的文件夹之间创建符号链接。这可以使得管理主题内的资源变得更容易。

Laravel版本 资源构建器
5.4+ webpack.mix.js
5.3 gulpfile.js

基本主题(顶级)

  • assets
  • blog
  • events
  • faqs
  • gallery
  • layout
  • 页面
  • partials
  • public -> {app_directory}/public/theme
    • img

模块

Grafite CMS附带了一些模块,用于处理基本的应用程序/网站,包括:图片、文件、博客、页面、常见问题解答等。以下将列出Grafite CMS预包装的所有模块的完整列表。为了创建自己的模块并确保它们被加载,您必须在composer.json文件中的PSR-4组中添加"Cms\\": "cms/"

预包装模块

  • 博客
  • 页面
  • 菜单
  • 小部件
  • 常见问题解答
  • 图片
  • 文件
  • 事件

您有制作任何模块的自由。您可以使用artisan module:makeartisan module:crud来生成它们,然后使用artisan module:publish来发布它们的 内容。

资源

Grafite CMS模块有一个Assets目录,该目录旨在包含所有您的JS和SASS或CSS。为了在模块中加载资源,您可以使用Cms外观。

Grafite CMS附带了一个压缩包,因此您可以使用类似以下的调用轻松加载模块资源。您不需要设置内容类型。但是,根据您加载的内容,您可能希望覆盖Cms服务确定的内容类型。

因此,如果您想在示例模块的资产中加载CSS文件,可以这样做

Assets/css/styles.css是我们正在获取的文件。

<link rel="stylesheet" type="text/css" href="{{ Cms::moduleAsset('sample', 'css/styles.css', 'text/css') }}">

或者我们可以加载一些JavaScript,是的,jQuery已经包含在Grafite CMS中。

Assets/js/module.js是我们正在获取的文件。

<script type="text/javascript" src="{{ Cms::moduleAsset('sample', 'js/module.js', 'application/javascript') }}"></script>

Composer

现在你已经制作了一个CMS模块,并且它在你的应用程序中运行良好。但现在你决定,最好将其作为一个Composer包,这样你可以在任何应用程序中运行它,以便于维护。这也为你提供了更大的自由度,以便决定如何将模块集成到你的应用程序中。

module:composer {name} {namespace}

这将生成一个composer文件,同时将你的模块命名空间设置为一个新的包命名空间。

配置

配置会自动加载,并添加到cms配置中。

config('cms.modules.sample') // would retrieve the sample modules internal config.php contents

如果你想访问一个可定制的配置,你可以发布一个

php artisan vendor:publish

CRUD

Grafite CMS可以为你的应用程序生成定制的CRUD模块,为你提供所需的所有功能,尽可能快地实现。只需运行命令:php artisan module:crud,并探索Grafite CMS中的众多隐藏功能。CRUD生成器将生成一个包含基本单元测试的模块。然后你需要设置你的迁移等,然后将模块发布到你的应用程序中。查看发布以获取更多详细信息。

表单

你可以使用由Grafite Builder提供的Form Maker工具。

Redactor

你可以在CRUD中使用redactor(所见即所得),只需将.redactor添加到任何textarea类中。

图片和文件

在redactor实例中,你可以轻松添加已经上传到Grafite CMS的图片和文件。这就像点击它们将其添加到条目中一样简单。

前端/主题

当你生成一个模块时,系统还会生成一个前端或主题组件,该组件位于Publishes目录中。这是访客将看到的代码部分。你需要使用php artisan module:publish {name}命令发布此代码。前提是你将模块保留在cms/modules目录中。然而,你也可以将你的模块制作成Composer包。

文件 & 图片

Grafite CMS始终关注你所提供内容的网络安全,以及你网站/应用程序中可能存在的潜在开放门户。因此,上传到CMS的文件都在公共访问点之外锁定。

这意味着什么?

这意味着当你的网站向访客提供这些内容时,他们实际上是通过API访问点获得的。这是为了确保文件不会泄露其位置。这意味着没有任何网络爬虫可以爬取你的目录并获取它们不应该获取的文件,包括尚未发布的文件。

存储位置

在配置中,你可以设置文件上传的存储位置。这可以是S3或本地。要正确配置S3,你需要像配置S3一样配置Laravel。Grafite CMS将接管剩下的工作。所以只需将你的详细信息添加到配置中,它就应该可以工作了。CMS加载了你需要的所有第三方包。

制作

格拉菲特CMS拥有强大的CRUD构建器。但是假设你想要一个与另一个服务集成的自定义模块或者完全不涉及CRUD。那么php artisan module:make命令将是你最好的工具。它将创建一个最小可行模块,包含一个非常基本的行政层和客户端层,你可以根据自己的需求进行定制。

红actor编辑器

你可以在模块中利用红actor编辑器,只需将.redactor添加到任何textarea类即可。

图片和文件

在红actor实例中,你可以轻松添加你上传到CMS的图片和文件。添加图片和文件就像点击它们,然后将其添加到条目中一样简单。

前端/主题

当你生成一个模块时,系统还会生成一个前端或主题组件,这些组件保存在Publishes目录中。这是你的访问者将看到的代码部分。你需要使用php artisan module:publish {name}命令来发布此代码。

发布

所有自定义模块都需要发布其Publishes文件夹,以便将它们的代码添加到你的应用程序中。我们将其封装到一个简单的命令中

php artisan module:publish

运行此命令将文件放置在你的应用程序中相应的文件夹中。所以,如果你想将文件放入迁移中,确保你的Publishes文件夹中有一个迁移文件,例如这样的目录

Publishes/database/migrations/migration_file.php

如果你在格拉菲特CMS中切换主题,你需要重新发布你的模块。视图直接添加到主题中。

许可证

格拉菲特CMS是开源软件,根据MIT许可证授权。

红actor许可证

格拉菲特对在格拉菲特CMS包中使用红actor拥有OEM许可证。你完全可以使用格拉菲特CMS包并将其集成到任何你构建的应用程序中,你可以提供这些应用程序作为SaaS或其他产品。但是,你无权剥离红actor的部分并重新销售,请参阅许可证了解更多信息

错误报告和功能请求

请尽可能详细地提供有关问题提交和功能请求的信息

免责声明

本软件“按原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些责任是基于合同、侵权或其他方式,以及与软件或软件的使用或其他交易有关。