一个功能丰富的扁平文件博客和CMS,适用于任何网站。

v1.4.1 2024-07-18 00:31 UTC

This package is not auto-updated.

Last update: 2024-09-26 01:35:36 UTC


README

Packagist License MIT HHVM Tested PHP 7 Supported Build Status Code Climate Test Coverage

一个功能丰富的扁平文件博客和CMS,适用于任何网站。

安装

将以下内容添加到您的 composer.json 文件中。

{
    "require": {
        "bootpress/blog": "^1.0"
    }
}

在您的网站公共根目录中创建一个 .htaccess 文件,以便将所有不存在的文件重定向到 index.php 文件。

# Prevent directory browsing
Options All -Indexes

# Turn on URL re-writing (remove 'example.com/' if not on localhost)
RewriteEngine On
RewriteBase /example.com/

# If the file exists, then that's all folks
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule .+ - [L]

# For everything else, there's BootPress
RewriteRule ^(.*)$ index.php [L]

您的 index.php 文件应类似于以下内容

<?php

use BootPress\Page\Component as Page;
use BootPress\Blog\Component as Blog;
use BootPress\Asset\Component as Asset;
use BootPress\Sitemap\Component as Sitemap;

$autoloader = require '../vendor/autoload.php';

// Setup the page
$page = Page::html(array(
    'dir' => '../page', // a private (root) directory
    'base' => 'https:///example.com',
    'suffix' => '.html',
));
$html = '';

// Deliver sitemap and assets first
if ($asset = Asset::cached('assets')) {
    $page->send($asset);
} elseif ($xml = Sitemap::page()) {
    $page->send($xml);
}

// Implement a blog
$blog = new Blog();
if (false !== $file = $blog->page()) {
    if (is_array($file)) { // An 'index.html.twig' file
        $html = $blog->theme->renderTwig($file);
    } else { // A 'txt', 'json', 'xml', 'rdf', 'rss', or 'atom' page
        $page->send(Asset::dispatch($page->url['format'], $file));
    }
} else {
    $page->send(404);
}

// Create the layout
$html = $page->display($blog->theme->layout($html));

// Send to user
$page->send(Asset::dispatch('html', $html));

设置博客

创建一个包含以下信息的 ../page/blog/config.yml 文件

blog:
    name: Example # The name of your website
    image: logo.png # The main image relative to this directory
    listings: blog # The url base for all your listing pages - authors, archives, tags, etc.
    breadcrumb: Blog # How to reference the listings in your breadcrumbs array
    theme: default # The main theme for your site

您可以在您的Twig模板中访问这些信息,例如 {{ blog.name }},包括您所在的 {{ blog.page }}。最终,这个文件将充满作者、分类和标签,您可以轻松地进行管理。您可以通过以下方式创建一个 Bootstrap列表组 的分类:

<ul class="list-group">
{% for category in blog.query('categories') %}
    <li class="list-group-item">
        <span class="badge">{{ category.count }}</span>
        <a href="{{ category.url }}">{{ category.name }}</a>
        {# if category.subs #}
    </li>
{% endfor %}
</ul>

其他 {{ blog.query(...) }} 包括 '标签', '作者', '存档', '近期', '特色', '相似', '帖子' 和各种列表,通常称为 "循环"。

创建内容

BootPress博客是一个扁平文件CMS,这意味着您不需要任何复杂的后台界面来管理散布在数据库中的所有内容。您只需创建文件。您博客的所有帖子和页面都将驻留在 ../page/blog/content/ 目录中,如果您查看URL,您将能够直接找到您的 index.html.twig 文件。例如

为什么不将 '/about-me.html' URL文件放在 'content/about-me.html.twig' 而不是 'content/about-me/index.html.twig' 呢?这样,您就可以将所有想要使用的资产直接放在您想要使用它们的地方。链接到它们甚至更容易。在 'content/about-me/' 文件夹中放置一个 'image.jpg',并在 'index.html.twig' 文件中链接到 {{ 'image.jpg'|asset }}。您想要调整大小吗?尝试 {{ 'image.jpg?w=300'|asset }}。要查看所有选项,请查看 快速参考 "Glide"

非HTML文件根据上述 /feed.rss URL示例进行访问。

Twig模板

每个 index.html.twig 文件都是一个接收 BootPress页面组件 的Twig模板,这样您就可以与您的HTML页面进行交互。您可用的方法包括

  • {{ page.set() }} - 设置HTML页面属性。例如标题、关键词(标签)、作者等。
  • {{ page.url() }} - 创建或操作URL的查询字符串和片段。
  • {{ page.get() }} - 访问 $_GET 参数。
  • {{ page.post() }} - 访问 $_POST 参数。
  • {{ page.tag() }} - 以编程方式生成HTML标签。
  • {{ page.meta() }} - 在页面的 <head> 部分插入 <meta> 标签。
  • {{ page.link() }} - 在您的页面中包含js、css、ico等链接。
  • {{ page.style() }} - 将CSS <style> 格式化添加到页面的 <head>
  • {{ page.script() }} - 将Java <script> 代码添加到页面的底部。
  • {{ page.jquery() }} - 在您的 $(document).ready(function(){...}) 中添加一些 jQuery。
  • {{ page.id() }} - 获取一个唯一的 id,以便在 CSS 或 JavaScript 中引用。

您每次都会使用的主要方法是 {{ page.set() }},如下所示

{{ page.set({
    title: 'A Flowery Post',
    description: 'Aren\'t they beautiful?',
    keywords: 'flowers, nature',
    image: 'flowers.jpg',
    published: 'January 1, 2015'
}) }}

您可以设置(和检索)的页面属性包括

  • 'title' - 页面的 <title>
  • 'description' - 页面的 meta 描述。
  • 'keywords' - 逗号分隔的关键字列表,用于标记您的博客文章。
  • 'robots' - 如果设置为 false,则不会将该页面添加到网站地图中,并且会告诉机器人离开。
  • 'theme' - 要使用不同的主题而不是默认主题。
  • 'image' - 该页面的主要图像(如果有)。
  • 'author' - 文章作者的姓名。
  • 'featured' - 如果设置为 true,则将在所有其他文章之前显示。否则称为“粘性帖子”。
  • 'published' - 如果这是一个文章,则是一个日期(例如 'Jan 1, 2015'),或者如果它是一个页面,则返回 true。如果 false(默认值)则我们将其视为未发布,并且不会告诉任何人。如果日期在未来,我们将等待到那时再发布。
  • ... 以及您想要稍后设置和检索的任何其他值。上面只是对我们有特殊含义。

为了让事情更加简单,您可以将所有这些信息放入 YAML 格式,并在页面的顶部使用 Twig 注释。例如

{#
title: A Flowery Post
description: Aren't they beautiful?
keywords: flowers, nature
image: flowers.jpg
published: January 1, 2015
#}

{% markdown %}

These are my flowers:

<img src="{{ 'flowers.jpg'|asset }}">

Aren't they ***beautiful***?

{% endmarkdown %}

当您检查 if ($file = $blog->page()) { ... } 我们将寻找相应的 Twig 模板,如果存在,则您的 $file 将是一个字符串,如果 $page->url['format'] != 'html',或者是一个适合传递给 $blog->theme->renderTwig($file) 的数组,具有以下键

  • 'file' - 处理这些 'type' 的 'vars' 的适当 Twig 模板。
  • 'type' - 您正在处理的博客页面的类型。可以是 'page''post''category''index''archives''authors''tags'
  • 'vars' - 供 Twig 模板使用。
  • 'default' -> 如果您的主题中缺少该 'file',则使用备选 'file'。

我们不会自动 $page->send() 它,这样您就有机会在之前记录或缓存输出。现在您有了博客信息,您可以做任何事情。您可以将 BootPress 博客集成到任何项目中。它具有最大的灵活性,但如果您喜欢我们迄今为止的方式,那么我们继续,好吗?

主题

BootPress 主题位于您的 ../page/blog/themes/ 文件夹中。假设您已选择 'default',当您调用 $html = $blog->theme->renderTwig($template) 时,它将传递 $template['vars'] 到 '../page/blog/themes/default/' 文件夹中的 $template['file'],并返回您的 $html。如果 $template['file'] 不存在,则将为您提供一个默认主题。如果您想知道您必须处理哪些 $template['vars'],只需 {{ dump() }} 它们,并将全部列出给您。

当您调用 $blog->theme->layout($html) 时,它将传递 $html{{ content }} 到您的 '../page/blog/themes/default/index.html.twig' 文件中,该文件可能看起来像这样

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    
    <title>{{ page.title }}</title>
    
    <link rel="stylesheet" href="{{ 'css/bootstrap.css'|asset }}">
    <!--[if lte IE 8]><script src="{{ 'js/html5shiv.js'|asset }}"></script><![endif]-->
</head>
<body>

    <!-- Content -->
    <div id="content">
        {{ content }}
    </div>

    <!-- Sidebar -->
    <div id="sidebar">
        {% include '@theme/sidebar.html.twig' %} 
    </div>

    <!-- Scripts -->
    <script src="{{ 'js/jquery.js'|asset }}"></script>
    <script src="{{ 'js/bootstrap.js'|asset }}"></script>
</body>
</html>

插件

插件是存储在您的 ../page/blog/plugins/ 文件夹中的 Twig 宏,通过 {% import '@plugin/name' as name %} 可以在任何模板中轻松访问。我的建议是遵循 'vendor/package' 的 Packagist 命名规范,主文件名为 'macro.twig'。例如,如果您将以下内容放置在 ../page/blog/plugins/kylob/mailto/macro.twig

{% macro eval(string) %}

    {% set js = '' %}
    {% set string = 'document.write(' ~ json_encode(string) ~ ');' %}
    {% for i in range(0, string|length - 1) %}
        {% set js = js ~ '%' ~ bin2hex(string|slice(i, 1)) %}
    {% endfor %}
    <script type="text/javascript">eval(unescape('{{ js }}'))</script>
    
{% endmacro eval %}

您可以这样隐藏电子邮件地址以防止垃圾邮件机器人

{% import '@plugin/kylob/mailto/macro.twig' as mailto %}

{{ mailto.eval('<a href="mailto:me@example.com">Contact Me</a>') }}

这将产生以下结果

<script type="text/javascript">eval(unescape('%64%6f%63%75%6d%65%6e%74%2e%77%72%69%74%65%28%22%3c%61%20%68%72%65%66%3d%5c%22%6d%61%69%6c%74%6f%3a%6d%65%40%65%78%61%6d%70%6c%65%2e%63%6f%6d%5c%22%3e%43%6f%6e%74%61%63%74%20%4d%65%3c%5c%2f%61%3e%22%29%3b'))</script>

您可以在同一命名空间(同一页面)的宏之间传递变量,通过在一个宏中设置 {{ this(_self, 'key', 'value') }},并在另一个宏中访问 {{ this(_self, 'key') }}。这允许您创建“属性”,使您的宏插件表现得更像“类”。您还可以使用几乎所有的原生 PHP 函数,这些函数被认为是可以安全使用的。

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件