ginger-tek / jerpy
小型、平面文件 PHP CMS
Requires
- php: >=8.2.0
README
jerpy
小型 | 无依赖 | 平面文件
Jerpy是一个小型、无依赖、平面文件内容管理系统(CMS),专为控制、简洁而构建,易于安装、自定义和维护。
该系统尽可能精简和简化,因此建议直接通过文件管理,没有管理网页面板。
入门指南
Composer
Jerpy的配置非常简单。只需运行以下命令即可开始
composer create-project ginger-tek/jerpy <directory>
文件/文件夹结构
config.php
所有网站设置都在 config.php
文件中设置,包括时区、选定的布局、启用的插件和页面路由。
布局
layouts
目录存储布局模板,每个模板都有自己的 .php
文件。默认的全局主题在 config.php
中通过 $layout
属性设置。
🗀 layouts
🗋 default.php
$layout = 'default';
资产
这是一个全局资产目录,您可以在其中组织CSS、JavaScript、字体和图像,并通过绝对URI在布局和页面中使用。
🗀 assets
🗀 css
🗋 styles.css
<head> ... <link href="/assets/css/styles.css" rel="stylesheet"> ... </head>
页面和路由
pages
目录存储网站的页面内容,并在 config.php
中为每个路由进行配置。
🗀 pages
🗋 home.php
$routes = [ '/' => 'pages/home.php' ];
您可以将路由定义为键,键为一个指向文件的字符串,或一个具有 page
键和其他选项的关联数组,以更改页面渲染方式。
要使用不同于默认的布局,设置 layout
选项
$routes = [ '/about' => [ 'page' => 'pages/about.php', 'layout' => 'layouts/layout2.php' ] ];
如果您不想使用任何布局,将 layout
选项设置为 false
,这将仅通过自身渲染页面。
还可以设置其他附加的任意属性,用于元数据/SEO目的
$routes = [ '/about' => [ 'page' => 'pages/about.php', 'title' => 'About', 'thumbnail' => '/assets/my_thumbnail.png' ] ];
然后您可以在布局中实现这些附加属性,例如用于社交媒体SEO标签。使用 @
警告抑制语法,当某些路由未指定属性时使用
<head> ... <meta name="og:title" content="<?= $title ?>"> <meta name="og:description" content="<?= @$description ?>"> <meta name="og:image" content="<?= @$thumbnail ?>"> ... </head>
动态路由
您还可以指定非静态匹配路由的键字符串。使用 :param
语法动态匹配路由,并设置其参数为从传入的URI解析的值
$routes = [ '/products/:id' => 'pages/product.php' ];
<p>ID: <?= $req->params->id ?></p>
模板
如今,PHP内置的模板功能对于大多数用户场景来说已经足够了。因此,只需像通常一样使用 include
和 require
进行模板化,按需解析内容(请参阅下面的插件)。
全局变量
有几个全局变量您可以在布局或页面文件中始终引用: $req
和 $page
插件
可以通过插件扩展或添加Jerpy的功能。插件不需要任何特定框架,也不遵循任何特定的设计模式。插件的要求是入口点是一个与插件文件夹同名的 .php
文件。从那里,您可以使用任何首选的工具和包管理器创建插件代码。
🗀 plugins
🗀 myPlugin <-- plugin dir
🗋 composer.json
🗋 myPlugin.php <-- entrypoint (same as plugin dir)
🗀 vendor
🗋 someSupportingFile.php
插件全局加载,其顶级对象、函数和/或类可以从所有布局和页面中访问。
要添加插件,只需将插件的文件夹复制/上传到 plugins
目录。
要启用插件,将其文件夹名称添加到 config.php
中的 $plugins
数组。
下面是一个使用包装方法的Parsedown插件的示例
插件/md/md.php
<?php require 'vendor/Parsedown.php'; function md(string $path): string { return (new Parsedown)->text(file_get_contents($path)); }
config.php
$plugins = [ 'md' ];
页面/some-page.php
<?= md('path/to/markdown-file.md') ?>