spindogs / wp-platform
平台,允许开发者以MVC和OOP的方式构建定制功能
Requires
- php: >=5.6.4
README
通过composer安装
composer require spindogs/wp-platform
确保您将以下PSR-4自动加载位置添加到您的 composer.json 文件中
"autoload": {
"psr-4": {
"App\\": "app/"
}
}
假设您的 vendor 目录位于主题根目录中,将以下行添加到 functions.php 以将composer自动加载连接到您的主题
require('vendor/autoload.php');
平台
所有平台类都可以通过命名空间 Platform 访问。
要将平台设置为Wordpress,请将以下行添加到您的 functions.php
Platform\Setup::setupWordpress();
如果您在Wordpress之外使用此平台,必须调用以下方法来运行一些核心设置程序
Platform\Setup::setup();
文章类型
要创建Wordpress自定义文章类型,在命名空间 App\PostType 中创建一个新类,并扩展 Platform\PostType.php
<?php
namespace App\PostType;
use Platform\PostType;
class Event extends PostType {
protected static $custom_type = 'event';
/**
* @return void
*/
public static function setup()
{
parent::setup();
self::registerPostType();
}
/**
* @return void
*/
public static function registerPostType()
{
$labels = array(
'name' => 'Events',
'singular_name' => 'Event',
'add_new' => 'Add event',
'add_new_item' => 'Add event',
'edit_item' => 'Edit event',
'new_item' => 'New event',
'view_item' => 'View event',
'search_items' => 'Search events',
'not_found' => 'No events found',
'all_items' => 'List events',
'menu_name' => 'Events',
'name_admin_bar' => 'Event'
);
$args = array(
'labels' => $labels,
'public' => true,
'show_ui' => true,
'capability_type' => 'post',
'menu_icon' => 'dashicons-calendar-alt',
'hierarchical' => false,
'supports' => ['title', 'editor', 'author', 'thumbnail'],
'taxonomies' => [],
'has_archive' => true,
'rewrite' => ['slug' => 'events', 'with_front' => false]
);
register_post_type(self::$custom_type, $args);
}
}
然后您可以通过调用 setup() 方法在 functions.php 中注册此新文章类型
App\PostType\Event::setup();
当您以这种方式注册自定义文章类型时,幕后有一些有用的功能。特别是,这意味着如果使用匹配的重写别名创建CMS页面URL,那么在查看文章类型存档时,Wordpress将自动将CMS页面加载到全局 $post 变量中。
例如,如果您的文章类型具有重写别名 /events/,并且访客访问此文章类型的存档页面,则平台将尝试加载一个具有匹配URL /events/ 的CMS页面。
这允许编辑在无法使用核心Wordpress的情况下管理存档页面上的内容管理字段。
路由
对于更定制化的开发需求,您可以创建自己的自定义URL并绕过核心Wordpress模板加载器。创建一个名为 App\Routes.php 的类,并扩展 Platform\Route.php。所有规则都应该放置在下面的 Routes::register() 方法中,如下所示
<?php
namespace App;
use Platform\Route;
class Routes extends Route {
/**
* @return void
*/
public static function register()
{
self::match('basket/add/([0-9]+)')->call('BasketController', 'add');
}
}
控制器
在 App\Controller 命名空间中创建控制器,并扩展类 Platform\Controller.php。
<?php
namespace App\Controller;
use Platform\Controller;
class BasketController extends Controller {
/**
* @param int $product_id
* @return void
*/
public function add($product_id)
{
$this->data('product_id', $product_id); //pass data to view
$this->render('basket'); //render the view
}
}
控制器中包含许多有用的方法
-
渲染模板 - 模板路径默认为主题根目录
$this->render('template_name') -
将数据传递到视图
$this->data('key', 'value') -
获取已传递到视图的任何数据
$this->getData('product_id') -
从不同的控制器调用方法并将数据合并到视图中
$this->uses('AnotherController', 'methodName') -
编码数据并以JSON内容类型头渲染
$this->json($data) -
返回一个预先填充了控制器数据的视图对象,以便进行渲染
$this->getView($template_name)
模型
对于模型,扩展 Platform\Model.php 类。将 protected static $table 属性设置为与模型数据库表匹配,并定义此模型可用的公共属性
<?php
namespace App;
use Platform\Model;
class Order extends Model {
protected static $table = 'Orders';
public $id;
public $date_created;
public $subtotal;
public $discount;
public $shipping;
public $tax;
public $total;
public $status;
}
每个模型都必须有一个 query() 方法,该方法返回一个查询字符串
/**
* @return string
*/
public function query()
{
$q = 'SELECT o.*
FROM Orders AS o
WHERE 1
{where_id}
ORDER BY
o.date_created DESC
{limit}';
return $q;
}
您还可以使用此方法设置模型的架构,通过传递一个数组到 fields() 方法
$this->fields([
'id' => [
'column' => 'o.id',
'type' => self::INTEGER
],
'date_created' => [
'column' => 'o.date_created',
'type' => self::DATETIME
],
]);
这做两件事 - 首先使用 {where_*} 标签在查询字符串中映射到 column 以使用户能够搜索字段来定义可以搜索的字段。
其次,它允许将数据库值转换为特定数据类型,使用 type 键。
内置了多种数据类型
Model::INTEGERModel::STRINGModel::FLOATModel::DATETIMEModel::DATE
集合
要从模型中访问数据,请使用 Platform\Collection.php 并将模型的名称作为字符串传递给构造函数
$collection = new Collection('App\Order');
或者,您可以在模型上调用 collection() 方法
$collection = Order::collection();
然后您可以使用在模型中先前设置的字段来过滤查询
$collection->where('id', 9999);
默认情况下,where() 方法将产生一个 = 子句,但您可以通过传递一个操作符作为第三个参数来覆盖此操作
$collection->where('id', 9999, '>=');
以下操作符被识别
=<,>,<=,>=,<>LIKE
调用 getAll() 方法来检索对象数组
$orders = $collection->getAll();
或者,您可以使用以下方法获取单个对象
$order = $collection->getSingle();
在集合上您可以使用许多有用的方法
-
自定义查询返回的字段
$collection->select('field_name') -
执行 DISTINCT 选择查询
$collection->distinct() -
对一个字段执行 COUNT 聚合查询
$collection->count('field_name') -
获取集合生成的 SQL
$collection->getSql() -
获取集合的原始结果(不严格转换为对象)
$collection->getRaw() -
从查询结果中获取单个值(对于聚合很有用)
$collection->getVal()
翻译
该平台提供了内置接口,允许翻译模板中使用的静态字符串。此机制假定一个多站点设置,其中每个站点安装对应于不同的语言(例如,英语、威尔士语)。
要使用此功能,首先通过调用以下方法一次来创建翻译数据库表
Platform\Translation::install();
要激活管理界面,只需将以下行添加到您的 functions.php 中,以将默认语言设置为您的首要多站点安装
Platform\Setup::defaultLang(1);
Platform\Translation::setup();
最后,确保将所有模板中的静态字符串用 Translation::_() 方法包裹起来。为了使您的代码更具可读性,您可以始终为翻译类分配一个更短的别名
<?php
use Platform\Translation as T;
echo '<h1>'.T::_('Hello world').'</h1>';
如果您想在新数据库中自动创建新的翻译,请将以下行添加到 functions.php
Platform\Setup::debug();
管理
有时您可能想在 WordPress 后台添加自定义界面。您可以通过在 App\Routes.php 中设置路由来实现,使用 Routes::admin() 方法
注意 - 使用
Routes::admin()方法添加的所有路由都将自动以wp-admin/前缀
<?php
namespace App;
use Platform\Route;
class Routes extends Route {
/**
* @return void
*/
public static function register()
{
self::admin('orders')->call('AdminController', 'listOrders');
}
}
然后您可以使用以下 WordPress 函数注册一个新的管理菜单项
add_menu_page(
'Orders',
'Orders',
'publish_pages',
'orders',
null,
'dashicons-products',
50
);
助手
有多个不同的助手函数可供使用
日期
- humanTime
- timeAgo
- timeToSecs
- fromMysqlTime
- fromUnixTime
- mysqltime
- datetime
过滤器
- clean
- yesno
- unconcat
- extension
- remove
- numeric
- nullify
- coalesce
- titleCase
- snakeCase
- arraySimplify
- arrayCondense
- arrayFlatkeys
- arrayRearrange
- arrayShuffle
HTML
- entities
- number
- currency
- abbreviate
- purify
- percentage
- nl2br
- pluralise
请求
- method
- scheme
- host
- path
- query
- fragment
- httpHost
- get
- url
- param
SQL
- tick
- quote
- ascdesc
- concat
- autoCreate
- autoUpdate
- autoQuery
- updateOptions
- condense
- getColumns
- addColumn
- tableExists
- columnExists
URL
- addVar
- removeVar
- http
- stripHttp
- tokenise
- checkToken
验证
- 包含
- 以...开始
- 过去的日期
- 未来的日期