spindogs / wp-platform

此包的最新版本(v2.0.19)没有可用的许可证信息。

平台,允许开发者以MVC和OOP的方式构建定制功能

v2.0.19 2019-09-12 14:04 UTC

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::INTEGER
  • Model::STRING
  • Model::FLOAT
  • Model::DATETIME
  • Model::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

验证

  • 包含
  • 以...开始
  • 过去的日期
  • 未来的日期