jhorlima/wp-mocabonita

WordPress插件开发框架

安装: 366

依赖: 6

建议: 0

安全: 0

星标: 1

关注者: 2

分支: 0

开放问题: 2

类型:wordpress-framework-plugin

3.3.6.10 2018-05-28 20:01 UTC

README

#MocaBonita - MocaBonita 是一个用于辅助创建 WordPress 插件的框架。

优点

  • MVC模式
  • Composer
  • 验证
  • ORM
  • 面向对象
  • 模板和视图
  • 事件
  • 仅在需要时才完全加载资源
  • 不会干扰 WordPress 的生命周期,除非存在相关事件
  • 易于学习
Antes de começar, é recomendado que você faça uma leitura desse artigo:
https://codex.wordpress.org/pt-br:Escrevendo_um_Plugin#Nomes.2C_arquivos_e_Locais

示例应用

PHP 文档

1. 创建插件

2. 导入 MocaBonita

3. 配置插件

4. 页面配置

####1. 创建插件#### 访问 WordPress 安装目录下的 wp-content/plugins 文件夹,然后创建一个以插件名称命名的新的文件夹,例如:exemplo-plugin

####2. 导入 MocaBonita#### 首先需要在电脑上安装 Composer。

安装完成后,在插件目录下通过终端执行以下代码。

$ composer require jhorlima/wp-mocabonita --update-no-dev

####3. 配置插件#### 安装 MocaBonita 及其 Composer 依赖后,在插件目录中创建一个名为 index.php 的文件,并在其中添加以下代码

<?php
/**
 * Plugin Name: Exemplo de Plugin
 * Plugin URI: http://exemplo.plugin.com
 * Description: Um exemplo de Plugin WordPress com MocaBonita
 * Version: 1.0.0
 * Author: Fulando
 * Author URI: http://www.github.com/fulando
 * License: GLPU
 * 
 * @doc: https://developer.wordpress.org/plugins/the-basics/header-requirements/
*/

/**
 * Namespace base do Plugin
 * @doc: https://php.ac.cn/manual/pt_BR/language.namespaces.php
*/
namespace ExemploPlugin;

use MocaBonita\MocaBonita;
use MocaBonita\tools\MbPage;
use MocaBonita\tools\MbPath;
use MocaBonita\tools\MbRequest;
use ExemploPlugin\controller\ExemploController;

/**
 * Impedir que o plugin seja carregado fora do Wordpress
 * @doc: https://codex.wordpress.org/pt-br:Escrevendo_um_Plugin#Arquivos_de_Plugin
*/
if (!defined('ABSPATH')) {
    die('Acesso negado!' . PHP_EOL);
}

/**
 * Carregar o autoload do composer
 * Adicionar o namespace atual para ser interpretado pelo autoload do composer
*/
$pluginPath = plugin_dir_path(__FILE__);
$loader = require $pluginPath . "vendor/autoload.php";
$loader->addPsr4(__NAMESPACE__ . '\\', $pluginPath);

/**
 * Callback que será chamado ao ativar o plugin (Opicional)
 * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.MocaBonita.html#method_active
*/
MocaBonita::active(function (MocaBonita $mocabonita){
    //
});

/**
 * Callback que será chamado ao desativar o plugin (Opicional)
 * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.MocaBonita.html#method_deactive
*/
MocaBonita::deactive(function (MocaBonita $mocabonita){
    //
});

/**
 * Callback que terão as configurações do plugin
 * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.MocaBonita.html#method_plugin
*/
MocaBonita::plugin(function (MocaBonita $mocabonita){
    
    /**
    * Criando uma página para o Plugin
    */    
    $paginaExemplo = MbPage::create('Exemplo');
    
     /**
     * Aqui podemos configurar alguns ajustes da página
     * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.tools.MbPage.html
     */  
    $paginaExemplo->setMenuPosition(1)
        ->setDashicon('dashicons-admin-site')
        ->setRemovePageSubmenu();
 
    /**
    * Criando outra página para o Plugin
    * É possível inúmeras páginas ao plugin
    */ 
    $paginaOutra = MbPage::create('Outra');
 
    /**
    * Para que cada página funcione corretamente, é necessário criar uma Class que extenda de MbController 
    * e depois adiciona-la à página, através de seu nome.
    * @doc: https://php.ac.cn/manual/en/language.oop5.basic.php#language.oop5.basic.class.class 
    */ 
    $paginaOutra->setController(ExemploController::class);
 
    /**
    * Cada método da controller pode ser representado por uma action na página, 
    * entretanto o método na Controller deve ter o sufixo "Action", Ex: cadastrarAction(MbRequest $mbRequest, MbResponse $mbResponse).
    * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.tools.MbAction.html 
    */ 
    $paginaOutra->addMbAction('cadastrar', function (MbRequest $mbRequest){
        try{            
            return ModelExemplo::create($mbRequest->inputSource());
        } catch (\Exception $e){
            throw new \Exception("Não foi possível realizar o cadastro", 400, $e);
        }
    });
 
    /**
    * Por padrão, ao ser criado uma página, uma action chamada index é criada, contudo é possível ajustar 
    * suas configurações, assim como de qualquer outra action. 
    * Assim como as páginas, as actions tem suas próprias configurações. 
    */
    $paginaOutra->getMbAction('index')
                 ->setRequiresAjax(true)
                 ->setRequiresMethod('GET')
                 ->setRequiresLogin(false);
 
    $paginaOutra->addMbAction('apagar')
                 ->setRequiresMethod('DELETE')
                 ->setRequiredParam('id');
 
    $paginaOutra->addMbAction('atualizar')
                 ->setRequiresMethod('PUT')
                 ->setRequiredParams(['id', 'usuario_id']);
 
    /**
    * Cada página pode ter suas capacidades alteradas, contudo elas só terão efeitos se for necessário o login do Wordpress
    * @doc: https://codex.wordpress.org/Roles_and_Capabilities#Capability_vs._Role_Table
    */
    $paginaOutra->setCapability('read');
 
    /**
    * Caso seu plugin precise de um shortcode, você pdoe adiciona-lo associando à página.
    * Seu comportamento é semelhante a de uma action, contudo seu sufixo deve ser "Shortcode", Ex: exemploShortcode(array $attributes, $content, $tags).
    * @doc: https://codex.wordpress.org/Shortcode_API
    * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.MocaBonita.html#method_addMbShortcode
    */
    $mocabonita->addMbShortcode('exemplo_shortcode', $paginaOutra, 'exemplo');
 
    /**
    * Vamos criar uma terceira página que será uma subpágina da página Outra 
    */
    $paginaTeste = MbPage::create('Teste');
  
    /**
    * É possível tornar uma página como subpágina de outra. 
    * A única diferença entre uma página e uma subpágina é que no menu administrativo, a subpágina passa a ser um submenu
    * da página principal. Além disso, ao adicionar uma subpágina, você não precisa adiciona-la ao MocaBonita, 
    * como vamos fazer nas próximas linhas com as outras duas páginas.
    * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.tools.MbPage.html#method_setSubPage
    */
    $paginaOutra->setSubPage($paginaTeste);
    
    /**
     * Após finalizar todas as configurações da página, podemos adiciona-las ao MocaBonita para que elas possam ser 
     * usadas pelo Wordpress. Caso uma página não seja adicionada, apenas os shortcodes relacionados a ela serão 
     * executados.
     */
    $mocabonita->addMbPage($paginaExemplo);
    $mocabonita->addMbPage($paginaOutra);
 
    /**
    * É possível também definir assets ao plugin, wordpress ou página, basta obter seu MbAsset.
    * Nos assets é possível adicionar css e javascript ao Wordpress.
    * A class MbPath também pode ser utilizada para auxiliar nos diretórios do wordpress.
    * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.tools.MbAsset.html
    * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.tools.MbPath.html
    * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.MocaBonita.html#method_getAssetsPlugin
    * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.MocaBonita.html#method_getAssetsWordpress
    * @doc: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.tools.MbPage.html#method_getMbAsset
    */
    $mocabonita->getAssetsPlugin()
               ->setCss(MbPath::pBwDir('bootstrap/dist/css/bootstrap.min.css'))
               ->setCss(MbPath::pCssDir('app.css'));
    
}, true);
//O ultimo parâmetro de MocaBonita::plugin é opcional e define se o plugin está em desenvolvimento.

请记住编辑页面开头的注释以识别插件。建议插件命名空间与文件夹名称相同,使用 UpperCamelCase 格式。

建议内部页面结构如下

controller:在此文件夹中放置插件的控制层。

model:在此文件夹中放置插件的模型。

view:在此文件夹中放置插件的视图和模板。

event:在此文件夹中放置插件的事件。

public:在此文件夹中放置插件的图像、CSS 和 JavaScript 文件。

同时,在 public 文件夹内创建 imagescssjs 文件夹,它们可以通过 MbPath 获取。

*请注意,在 controllermodelservice 文件夹中,您需要在 PHP 类中定义命名空间。

配置文档:[https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.MocaBonita.html](https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.MocaBonita.html)

####4. 页面####

MocaBonita 框架的页面负责传递插件信息。它们可以通过 WordPress 管理菜单访问,默认情况下,也可以通过 URL 的 "page" 参数访问,参数值为 slug。例如:?page=exemplo。

默认情况下,一个页面配置如下

<?php

use MocaBonita\tools\MbPage;
use MocaBonita\tools\MbAsset;

/**
* Criando uma página para o Plugin
*/    
$paginaExemplo = MbPage::create('Exemplo');

/**
* Configuração Padrão ao criar uma página do MocaBonita
* O Slug da página, por padrão, é criado ao definir o nome. Ele utiliza a função do 
* Wordpress sanitize_title no nome para gerar o slug.
* @doc: https://codex.wordpress.org/Function_Reference/sanitize_title
*/
$paginaExemplo->setName("Exemplo");
$paginaExemplo->setSlug("exemplo");
$paginaExemplo->setCapability("manage_options");
$paginaExemplo->setDashicon("dashicons-editor-code");
$paginaExemplo->setHideMenu(false);
$paginaExemplo->setMbAsset(new MbAsset());
$paginaExemplo->setMainMenu(true);
$paginaExemplo->setSubMenu(false);
$paginaExemplo->setMenuPosition(1);
$paginaExemplo->addMbAction('index');

可以在插件中添加大量页面,但它们需要在插件配置或 MocaBonita 事件的配置中创建,该事件在 WordPress 启动后初始化,称为 START_WORDPRESS。

*请注意:所有页面都需要在配置后添加到 MocaBonita。

<?php

/**
 * Após finalizar todas as configurações da página, podemos adiciona-las ao MocaBonita para que elas possam ser 
 * usadas pelo Wordpress. Caso uma página não seja adicionada, apenas os shortcodes relacionados a ela serão 
 * executados.
 */
$mocabonita->addMbPage($paginaExemplo);
    

一个页面也可以有其他子页面。页面和子页面的唯一区别在于,在管理菜单中,子页面将成为主页面的子菜单。此外,添加子页面时,您不需要将其添加到 MocaBonita,因为这将成为页面的责任。

子页面可以像主页面一样创建,然后作为子页面添加,例如

<?php

use MocaBonita\tools\MbPage;

$paginaTeste = MbPage::create('Teste');
$paginaExemplo->setSubPage($paginaTeste);

或直接在现有页面中添加,只需提供新子页面的名称和 slug。

<?php

$paginaExempo->addSubPage('Teste', 'teste');

有关 MocaBonita 页面类的完整文档,请参阅[完整文档](#)

https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.tools.MbPage.html

####5º 动作 ####

MocaBonita 的动作是页面的组件。系统需要执行的每个活动都通过动作来完成。一个页面可以有无数个动作,并且默认情况下,它已经带有动作 "index"。

如何添加动作的示例

<?php

use MocaBonita\tools\MbPage;

$paginaTeste = MbPage::create('Teste');
$paginaTeste->addMbAction("index");

默认情况下,动作已经配置了

<?php

use MocaBonita\tools\MbPage;
use MocaBonita\tools\MbRequest;
use ExemploPlugin\model\Exemplo;

$paginaTeste = MbPage::create('Teste');
$indexAction = $paginaTeste->addMbAction("buscar-todos");

/**
 * Configuração padrão ao criar uma action
*/
$indexAction->setMbPage($paginaTeste);
$indexAction->setName("buscar-todos");
$indexAction->setFunctionName("buscarTodos");
$indexAction->setRequiresLogin(true);
$indexAction->setRequiresAjax(false);
$indexAction->setRequiresMethod(null);
$indexAction->setFunctionComplement('Action');
$indexAction->setShortcode(false);
$indexAction->setCapability(null);

/**
 * Outros Exemplos
*/

$paginaTeste->addMbAction("create")
            ->setCallback(function (MbRequest $mbRequest){
                return Exemplo::create($mbRequest->inputSource());
            });


$paginaTeste->addMbAction("update", function (MbRequest $mbRequest){
                return Exemplo::updateOrCreate(['id' => $mbRequest->query('id')], $mbRequest->inputSource());
            })->setRequiredParam('id');


$paginaTeste->addMbAction("all")->setData(Exemplo::all());

更多信息请参考: https://jhorlima.github.io/wp-mocabonita/classes/MocaBonita.tools.MbAction.html

动作通过 URL 的 actions 参数来调用。例如:wp-admin/admin.php?page=teste&action=index, wp-admin/admin-post.php?page=teste&action=index 和 wp-admin/admin-ajax.php?page=teste&action=index

当一个动作没有 setCallback() 或 setData() 时,需要在页面上添加一个控制器来调用具有相应动作名称的 camelCase 格式并附加 Action 的方法。例如:action buscar-todos => buscarTodosAction()。

####6º 控制器 ####

建设中