jossuer/handler

PHP核心MVC用于构建Web项目

dev-master 2024-09-16 22:05 UTC

This package is auto-updated.

Last update: 2024-09-16 22:05:36 UTC


README

Handlers是一个用PHP开发的MVC(模型-视图-控制器)框架,旨在简化并加速Web应用程序的创建过程。通过多种特性和组件,Handlers提供了访问数据库、管理权限、生成视觉元素和管理控制器的工具。

这是一个轻量级但功能强大的微框架。它旨在易于学习和使用,同时也提供了广泛的功能来创建健壮的Web应用程序。

主要特性

  1. 数据库访问和操作层:Handlers包含一个简化数据库交互的层。这允许开发者以更高效和结构化的方式执行查询、插入、更新和删除数据的操作。

  2. 权限、用户和角色方案:该框架包含一个可启用或禁用的权限和角色管理系统,可通过数据库中的配置进行操作。这提供了对应用程序中谁可以访问哪些资源的细粒度控制。

  3. 控制器和方法简单映射:Handlers提供了一种简单的方法来映射控制器到类方法。这允许以更易于理解的方式组织代码,并随着应用程序的增长而简化维护。

  4. 视觉元素生成:Handlers简化了HTML、CSS和JavaScript中的视觉元素创建。可视化块包括表单生成器、按钮、表格、报告和容器,可以容纳其他块。这加速了用户界面设计和布局的过程。

  5. 控制器层:Handlers提供了一个可用于创建API和Web系统的控制器层。控制器可以是安全的或非安全的,这取决于它们是否需要授权。这为创建不同类型的应用程序提供了灵活性。

  6. 使用Composer安装:该框架可以通过Composer(PHP依赖关系管理器)轻松安装。安装通过命令composer require jossuer/handler完成。

Handlers推荐目录结构

要使用它,建议遵循以下目录结构

src
├── private
│   ├── config.php
│   ├── controllers
│   │   └── HomeController.php
│   ├── models
│   │   └── UserModel.php
│   └── views
│       └── home.php
└── public
├── .htaccess
└── index.php

说明

  • “src”文件夹包含项目的所有源文件,包括控制器、模型、逻辑和配置。
  • “private”文件夹包含所有敏感文件,如控制器、模型和配置。此文件夹应通过一个拒绝所有用户访问的.htaccess文件进行保护。
  • “public”文件夹包含所有公共文件,如视图和index.php文件。此文件夹应配置为Web服务器的根文档。

详情

  • 文件config.php包含框架的配置,包括数据库连接和其他选项。
  • 控制器负责处理用户请求。
  • 模型提供对数据库数据的访问。
  • 视图负责向用户显示数据。
  • 文件index.php是框架的入口点。

Handlers配置

文件 config.php 包含了 Handlers 框架的配置。此配置用于根据项目需求调整框架的行为和外观。

类和属性

文件 config.php 使用 Environment 类来存储配置变量。该类具有以下属性

  • APP_DATE_FORMAT:应用程序的日期格式。
  • DB_DATE_FORMAT:数据库的日期格式。
  • PATH_PRIVATE:私有文件夹的路径。
  • APP_ENABLE_BD_FUNCTION:指示是否应使用数据库的序列函数。
  • APP_CONTENT_BODY:应用程序主要内容的容器。
  • APP_DEFAULT_LIMIT_PER_PAGE:每页默认记录数限制。
  • PATH_ROOT:应用程序的根路径。
  • APP_LANG:应用程序的默认语言。
  • PATH_HANDLERS:控制器的路径。
  • APP_CONTENT_TITLE:用于显示内容标题的元素。
  • APP_HIDDEN_CONTENT:隐藏的内容。
  • NAMESPACE_HANDLERS:控制器的命名空间。
  • NAMESPACE_MODELS:模型的命名空间。
  • ACCESS_PERMISSION:私有区域的主要访问权限。
  • CONFIG_VAR_REPORT_TAG:用于映射配置变量的报告标签。
  • DB_DISPLAY_DATE_FORMAT:数据库显示的日期格式。
  • ACCESS_HANDLER:访问控制器。
  • START_HANDLER:起始控制器。
  • PATH_UPLOAD:文件上传的路径。

配置示例

以下是一个 config.php 文件配置的示例

PHP

Environment::$APP_CONTENT_TITLE = "Mi aplicación";
Environment::$APP_CONTENT_BODY = "Este es el contenido principal de mi aplicación";
Environment::$APP_HIDDEN_CONTENT = "Este contenido no se mostrará al usuario";
Environment::$APP_DATE_FORMAT = "d/m/Y";
Environment::$DB_DATE_FORMAT = "Y-m-d";
Environment::$PATH_PRIVATE = "/private";
Environment::$PATH_ROOT = "/public";
Environment::$PATH_UPLOAD = "/uploads";
Environment::$APP_DEFAULT_LIMIT_PER_PAGE = 10;
Environment::$NAMESPACE_HANDLERS = "\\App\\components\\handlers\\";
Environment::$NAMESPACE_MODELS = "\\App\\models\\dao\\";

此配置设置了以下值

  • 主要内容的标题将是 "我的应用程序"。
  • 应用程序的主要内容将是 "这是我的应用程序的主要内容"。
  • 隐藏的内容将是 "此内容不会显示给用户"。
  • 应用程序的日期格式将是 "d/m/Y"。
  • 数据库的日期格式将是 "Y-m-d"。
  • 私有文件夹位于 /private
  • 应用程序的根路径位于 /public
  • 文件上传的路径位于 /uploads
  • 每页默认记录数限制为 10。
  • 控制器的命名空间为 \\App\\components\\handlers\\
  • 模型的命名空间为 \\App\\models\\dao\\

其他配置

除了上述属性之外,文件 config.php 还包含其他可自定义的配置值。这些值包括

  • APP_ENABLE_SESSION:指示是否应使用会话。
  • APP_SESSION_NAME:会话名称。
  • APP_SESSION_LIFETIME:会话的持续时间(以秒为单位)。
  • APP_SESSION_PATH:存储会话的路径。
  • APP_SESSION_DOMAIN:存储会话的域名。
  • APP_SESSION_SECURE:指示会话是否应为安全会话。
  • APP_SESSION_HTTPONLY:指示会话是否应为仅 HTTP 会话。
  • APP_DEBUG:指示是否应启用调试模式。
  • APP_ENV:应用程序的执行环境。

index.php 文件

index.php 文件是 Handlers 框架的入口点。此文件负责加载配置、创建 Handler 实例并执行它。

要求

index.php 文件需要以下文件

  • vendor/autoload.php:此文件是 Composer 的自动加载器。它用于加载 Handlers 框架的类。

代码

以下为 index.php 文件的代码

PHP

<?php
require __DIR__ . '/../../vendor/autoload.php';

use HandlerCore\components\Handler;
include('../config.php');

if(!Handler::excec()){
header("location:" . APP_DEFAULT_HANDLER);
}
#EOF

此代码执行以下操作

  1. 导入 Composer 的自动加载器。
  2. 创建 Handler 类的实例。
  3. 包含 config.php 文件以加载配置。
  4. 调用 Handler 类的 exec() 方法。此方法负责执行应用程序。
  5. 如果 exec() 方法返回 false,则重定向到默认控制器。

其他注意事项

文件 index.php 可以根据应用程序的具体需求进行自定义。例如,可以添加代码来初始化其他 Handler 框架组件,或者在进行应用程序执行之前执行额外的任务。

有关 index.php 的更多信息,请参阅 Handlers 文档。

数据库连接配置

Handlers 框架使用 SimpleDAO 类来建立数据库的连接或连接。 SimpleDAO 类提供了访问和操作数据库的方法。

连接配置

数据库连接配置在文件 config.php 中设置。以下是一个连接配置示例

// Estos valores no deben ser almacenados en la clase Environment por motivos de seguridad
$APP_DB_HOST = "localhost";
$APP_DB_DATABASE = "my_database";
$APP_DB_USERNAME = "root";
$APP_DB_PASSWORD = "";

// Se recomienda guardar estos valores en un archivo externo y cargarlos en el archivo config.php

默认连接

默认连接是在未指定数据库连接时使用的连接。默认连接在 config.php 文件的 APP_DB_DEFAULT_CONNECTION 变量中设置。

额外连接

可以建立额外的数据库连接。要建立额外的连接,必须在 config.php 文件的 APP_DB_CONNECTION_NAME 变量中指定连接名称。

额外连接示例

以下是一个数据库额外连接的示例

// Estos valores no deben ser almacenados en la clase Environment por motivos de seguridad
$APP_DB_CONNECTION_NAME_2 = "db_2";
$APP_DB_HOST_2 = "localhost";
$APP_DB_DATABASE_2 = "my_other_database";
$APP_DB_USERNAME_2 = "other_user";
$APP_DB_PASSWORD_2 = "other_password";

// Se recomienda guardar estos valores en un archivo externo y cargarlos en el archivo config.php

此配置设置了一个名为 db_2 的额外连接。 db_2 连接具有以下主机、数据库名称、用户名和密码

  • 主机: localhost
  • 数据库名称: my_other_database
  • 用户名: other_user
  • 密码: other_password

连接使用

数据库连接可以使用静态或实例化方式使用。为了静态使用连接,可以使用 SimpleDAO 类的 connect() 方法。 connect() 方法返回 Connection 类的实例。

以下是如何静态使用连接的示例

// Se recomienda cargar los valores de conexion desde un archivo externo
$connection = SimpleDAO::connect($APP_DB_HOST, $APP_DB_DATABASE, $APP_DB_USERNAME, $APP_DB_PASSWORD);

此代码使用在 config.php 文件中设置的配置值建立到数据库的连接。连接存储在变量 connection 中。

连接也可以以实例化方式使用。为了实例化连接,需要创建 Connection 类的实例。以下是如何创建 Connection 类实例的示例

// Se recomienda cargar los valores de conexion desde un archivo externo
$connection = new Connection($APP_DB_HOST, $APP_DB_DATABASE, $APP_DB_USERNAME, $APP_DB_PASSWORD);

此代码使用在 config.php 文件中设置的配置值建立到数据库的连接。连接存储在变量 connection 中。

Handlers 中的控制器和视图

控制器和视图是构建 Handlers 中 Web 应用程序的基本元素。控制器负责处理用户请求并生成响应,而视图负责将响应显示给用户。

控制器和 API 是构建 Handlers 中 Web 应用程序的基本组件。

控制器

控制器必须从 Handler 类扩展并具有 Handler 后缀。例如,名为 MiControlador 的控制器应命名为 MiControladorHandler

控制器有动作,动作是具有 Action 后缀的方法。动作负责处理用户请求。

默认情况下,如果存在,控制器将显示 indexAction() 动作。如果不存在,则不显示任何内容。

以下是一个简单控制器的示例

PHP

class MiControladorHandler extends Handler
{
    public function indexAction()
    {
        echo "Este es el controlador MiControlador";
    }
}

此控制器有一个名为 indexAction() 的单一动作。当通过 URL miurlejemplo.com/MiControlador 访问控制器时,将显示消息 "这是 MiControlador 控制器"。

视图

视图是简单的PHP文件,通过控制器中的display()方法加载。

display()方法接受三个参数

  • $script: 视图脚本的路径。
  • $args: 一个数组,包含传递给视图的参数。
  • $autoshoy: 一个布尔值,指示视图是否应自动显示或返回为字符串。

以下是一个简单视图的示例

<!DOCTYPE html>
<html lang="es">
<head>
    <title>Mi vista</title>
</head>
<body>
    <h1>Este es el título de la vista</h1>
</body>
</html>

可以通过以下代码在控制器中加载此视图

class MiControladorHandler extends Handler
{
    public function indexAction()
    {
        $this->display("views/mi_vista.php");
    }
}

此代码将在MiControlador控制器中加载视图views/mi_vista.php

工作示例

为了说明控制器和视图的工作原理,考虑以下示例

class MiControladorHandler extends Handler
{
    public function indexAction()
    {
        $this->display("views/mi_vista.php", array(
            "titulo" => "Este es el título de la vista"
        ));
    }

    public function usuariosAction()
    {
        echo "Esta es la acción usuarios";
    }
}

此控制器有两个操作:indexAction()usuariosAction()

indexAction()操作显示一个名为views/mi_vista.php的视图,标题为"这是视图的标题"。

usuariosAction()操作显示消息"这是用户操作"。

要访问indexAction()操作,可以使用以下URL

miurlejemplo.com/MiControlador

要访问usuariosAction()操作,可以使用以下URL

miurlejemplo.com/MiControlador?do=usuarios

在这种情况下,参数do用于指定要执行的操作。

控制器行为

控制器作为扩展Handler类的一个类实现。控制器有操作,这些是带有后缀Action的方法。操作负责处理用户请求。

默认情况下,所有控制器都是安全的,这意味着它们需要使用访问令牌进行预先认证。不需要访问的控制器是标记有UnsecureHandler接口和API控制器的控制器。

API控制器

API控制器扩展了ResponseHandler类。类ResponseHandler提供了管理响应和错误的功能。

安全的API控制器扩展了SecureResponseHandler类。类SecureResponseHandler提供了额外的认证和安全功能。

如何构建API

要在Handlers中构建API,必须创建一个扩展ResponseHandlerSecureResponseHandler类的控制器。

控制器必须具有实现通过API公开的操作的动作。

操作必须返回一个具有以下格式的JSON对象

JSON

{
    "status": "success",
    "status_code": 200,
    "data": [...]
}

status字段必须指示响应状态。可能的值是successerror

status_code字段必须指示响应的HTTP状态代码。

data字段必须包含响应数据。

API示例

以下是一个提供订单状态的API控制器的示例

PHP

class OrderHandler extends ResponseHandler {

    public function getOrderStatusAction()
    {
        $tracking = $this->getRequestAttr("tracking");

        $this->setVar("tk", $tracking);

        $publish_data = $this->getPublishData($tracking);

        if ($publish_data) {
            $this->setVar("order", $publish_data);
        } else {
            $this->addError("No se encontró la guía");
        }

        $this->toJSON();
    }
}

此控制器有一个名为getOrderStatusAction()的单个操作。此操作接收订单跟踪号码作为参数。

操作使用getPublishData()函数来获取订单的发布数据。如果发布数据可用,操作将订单数据设置到变量order中。

如果发布数据不可用,操作将错误添加到响应中。

操作的响应具有以下格式

JSON

{
    "status": "success",
    "status_code": 200,
    "data": {
        "id": 1234,
        "status": "en tránsito",
        ...
    }
}

在这种情况下,字段data包含订单数据,包括订单ID、订单状态和其他数据。

AbstractBaseDAO和AutoImplementedDAO:在Handlers中访问数据

AbstractBaseDAO 和 AutoImplementedDAO 类提供创建与数据库表交互的数据访问对象(DAO)的基础。

AbstractBaseDAO

AbstractBaseDAO 类提供执行数据访问操作所需的方法和属性的基实现。这些方法包括

  • insert():在数据库表中插入新记录。
  • update():更新数据库表中的记录。
  • delete():从数据库表中删除记录。
  • exist():检查数据库表中是否存在记录。
  • get():获取上次查询结果的下一个记录。
  • fetchAll():获取上次查询结果的全部记录。
  • getBy():根据条件数组进行查询以获取记录。
  • getById():根据标识符进行查询以获取记录。
  • getFilledPrototype():获取一个包含从上次查询的最后一行中检索到的数据的完整原型。

AutoImplementedDAO

AutoImplementedDAO 类扩展了 AbstractBaseDAO 类,并提供与数据库表交互的自动功能。这些功能包括

  • 自动加载数据库表字段的配置。
  • 自动生成数据访问操作所需的 SQL 查询。

如何创建 DAO

要创建 DAO,需要扩展 AbstractBaseDAO 或 AutoImplementedDAO 类。

如果扩展 AbstractBaseDAO 类,则需要实现 getPrototype()getDBMap() 方法。这些方法提供有关正在使用的数据库表字段的详细信息。

如果扩展 AutoImplementedDAO 类,则不需要实现任何其他方法。AutoImplementedDAO 类将自动加载数据库表字段的配置并自动生成 SQL 查询。

示例

以下示例演示了如何为 package_type 表创建 DAO

PHP

class PackageTypeDAO extends AutoImplementedDAO {

	function __construct() {
		parent::__construct("package_type", array("id"));
	}

}

该 DAO 将使用 package_type 表的 idnamecalc_type 字段。

注意

  • AbstractBaseDAO 类提供执行数据访问操作所需的方法和属性的基实现。但是,可能需要实现额外的方法来自定义 DAO 的行为。
  • AutoImplementedDAO 类提供与数据库表交互的自动功能。但是,可能需要实现额外的方法来自定义 DAO 的行为。

通过配置数组生成查询过滤器

在处理器中,可以通过配置数组生成查询过滤器。这些数组包含要过滤的字段和值。

要生成查询过滤器,使用 SimpleDAO 类的 getSQLFilter() 方法。此方法接收配置数组和联合运算符以组合多个条件。

以下示例说明如何生成用于获取所有活动工作订单的查询过滤器

PHP

class WorkOrderDAO extends AbstractDAO {

    function __construct() {
        parent::__construct("work_order", array("id"));
    }

    function getActives(){
        $searchArray = array(
            "t1.active" => self::REG_ACTIVO_TX
        );

        $where = SimpleDAO::getSQLFilter($searchArray);

        $sql = $this->getBaseQuery() . $where;

        $this->find($sql);

    }

}

在此示例中,DAO 扩展了 AbstractDAO 类,后者又扩展了 SimpleDAO 类。这意味着 DAO 可以访问 SimpleDAO 类的 getSQLFilter() 方法。

DAO 的 getActives() 方法调用 getSQLFilter() 方法来生成获取所有活动工作订单的查询过滤器。配置数组 searchArray 包含单个元素:t1.active,指定工作订单必须处于活动状态。

SimpleDAO 类的 getSQLFilter() 方法返回一个 SQL 过滤器字符串。在这种情况下,过滤器字符串是

SQL

WHERE t1.active = '1'

默认的连接操作符是 AND。可以通过传递不同的值到 getSQLFilter() 方法的第二个参数来更改此操作符。

以下示例演示如何生成一个查询过滤器以获取特定驾驶员的所有活跃工作订单。

PHP

class WorkOrderDAO extends AbstractDAO {

    function __construct() {
        parent::__construct("work_order", array("id"));
    }

    function getByStatus($status, $username=null)
    {
        $searchArray = array(
            "t1.active" => self::REG_ACTIVO_TX,
            "t1.work_order_status_id" => $status
        );

        if($username){
            $searchArray["t1.driver"] = $username;
        }

        $where = SimpleDAO::getSQLFilter($searchArray);

        $sql = $this->getBaseQuery() . $where;

        $this->find($sql);
    }

}

在此示例中,DAO 的 getByStatus() 方法调用 getSQLFilter() 方法来生成一个查询过滤器,以获取特定驾驶员的所有活跃工作订单。配置数组 searchArray 包含两个元素:t1.activet1.work_order_status_id。第一个元素指定工作订单必须处于活跃状态,第二个元素指定工作订单必须分配到指定的工作订单状态。

如果用户提供了用户名,getByStatus() 方法会将第三个元素添加到配置数组 searchArray 中:t1.driver。此元素指定工作订单必须分配到指定的驾驶员。

生成的 SQL 过滤器字符串是

SQL

WHERE t1.active = '1' AND t1.work_order_status_id = 1

如果提供了用户名,SQL 过滤器字符串将变为

SQL

WHERE t1.active = '1' AND t1.work_order_status_id = 1 AND t1.driver = 'username'

生成器

Handlers 框架附带了一些有用的生成器,它们可以加快 Web 应用程序的创建速度。其中主要的有

  • Formkaker 用于创建表单
  • ButtonMaker 用于生成按钮组
  • DashViewer 用于生成格式化的 HTML,以在块中显示信息
  • DataViewer 用于生成显示表格形式的 HTML 块
  • TableGenerator 用于生成基于在 AbstractDAO 对象上执行的最后一个查询的可过滤、可排序和可分页的 HTML 表格
  • WrapperViewer 用于生成可以包含其他可显示对象的容器

如何使用 FormMaker 和 FormMakerFieldConf

FormMaker 生成器和 FormMakerFieldConf 类用于生成动态和可定制的 HTML 表单。

要使用 FormMaker,首先需要创建 FormMaker 类的一个实例

PHP

$form = new FormMaker();

实例创建后,可以开始定义表单字段。可以通过使用 defineField() 方法来实现。该方法接收一个配置数组,用于定义字段的属性。

字段属性如下

  • 字段:字段的唯一名称。
  • 标签:字段的标签。 类型:字段的类型。可用的字段类型有
    • FormMakerFieldConf::FIELD_TYPE_TEXT:文本字段。
    • FormMakerFieldConf::FIELD_TYPE_HIDDEN:隐藏字段。
    • FormMakerFieldConf::FIELD_TYPE_LABEL:文本标签。
    • FormMakerFieldConf::FIELD_TYPE_PASSWORD:密码字段。
    • FormMakerFieldConf::FIELD_TYPE_TEXTAREA:文本区域。
    • FormMakerFieldConf::FIELD_TYPE_RADIO:单选按钮。
    • FormMakerFieldConf::FIELD_TYPE_CHECK:复选框。
    • FormMakerFieldConf::FIELD_TYPE_SELECT:下拉菜单。
    • FormMakerFieldConf::FIELD_TYPE_SELECT_I18N:国际化下拉菜单。
    • FormMakerFieldConf::FIELD_TYPE_SELECT_ARRAY:从数组生成的下拉菜单。
    • FormMakerFieldConf::FIELD_TYPE_DIV:div 容器。
    • FormMakerFieldConf::FIELD_TYPE_SEARCH_SELECT:带搜索的下拉菜单。
    • FormMakerFieldConf::FIELD_TYPE_MULTIPLE_SELECT:多选下拉菜单。
    • FormMakerFieldConf::FIELD_TYPE_DATE:日期选择字段。
    • FormMakerFieldConf::FIELD_TYPE_DATETIME:日期和时间选择字段。
    • FormMakerFieldConf::FIELD_TYPE_EMAIL:电子邮件输入字段。
    • FormMakerFieldConf::FIELD_TYPE_FILE:文件上传字段。
    • FormMakerFieldConf::FIELD_TYPE_TIME:时间选择字段。
    • FormMakerFieldConf::FIELD_TYPE_CHECK_ARRAY:复选框组。
    • FormMakerFieldConf::FIELD_TYPE_TEXT_SEARCH:带搜索的文本字段。
  • 数据源: 选择字段的数据源。可以是 AbstractBaseDAO 对象或数组。
  • 动作: 在选择字段中执行搜索时调用的动作。
  • 参数: 搜索动作的参数。
  • 显示动作: 在选择字段中显示结果时调用的动作。
  • 显示参数: 显示动作的参数。
  • HTML: 字段的 HTML 属性数组。
  • 包装器: 包裹生成的字段的 HTML 标签 ID 名称。
  • 必填: 指示字段是否必填。

FormMaker 默认生成通过 AJAX 使用 POST 方法发送的表单。 此外,它们必须配置以下属性以正确运行

  • $form->name: 表单的唯一名称。将是 HTML 标签 form 的 ID。
  • $form->action: 发送表单时调用的动作。
  • $form->actionDO: 将发送数据的接收方法。

FormMaker 还会生成一个包含在 prototype 属性中定义的所有字段的表单。这是代表字段 ID 和默认值的键值对关联数组。 FormMaker 将为配置原型数组中的每个键生成一个文本输入,除非使用 defineField 方法定义其他配置。

例如,以下代码定义了一个包含两个字段(一个文本字段和一个选择字段)的表单

PHP

$form = new FormMaker();

$form->prototype = [
    "username" => "",
    "customer_id" => ""
];

$form->defineField(array(
    "campo"=>'username',
    "tipo" =>FormMaker::FIELD_TYPE_TEXT
));

$form->defineField(array(
    "campo"=>'customer_id',
    "tipo" =>FormMaker::FIELD_TYPE_SELECT,
    "source"=>[]
));

$form->show();

此代码生成以下表单

HTML

<form action="" method="post" id="form-example">
    <label for="username">Nombre de usuario</label>
    <input type="text" id="username" name="username" value="">
    <label for="customer_id">Cliente</label>
    <input type="text" id="customer_id" name="customer_id" value="">
    <input type="submit" value="Enviar">
</form>

action 属性指示将数据发送到哪个处理器。

PHP

$form->action = "Customer";

actionDO 属性指示将数据收集后发送到前一个处理器中的哪个确切方法。

PHP

$form->actionDO = "storeUser";

如何使用 ButtonMaker 生成器

ButtonMaker 类用于根据特定方案生成按钮组。可以配置为单个按钮或多个按钮。

要使用 ButtonMaker,首先必须创建该类的实例

PHP

$btn = new ButtonMaker("excel");

第一个参数是按钮组的名称。 第二个参数是可选的,可以用来设置调用 ButtonMaker 的对象的引用。

一旦创建了实例,就可以开始向组中添加按钮。 为此,可以使用 addButton() 方法。addButton() 方法接受两个参数

  • 按钮的名称。
  • 按钮的配置。

按钮配置是一个包含以下字段的数组

  • icon: 在按钮中显示的图标。
  • label: 按钮的标签。
  • link: 按钮的链接。
  • type: 按钮的类型。

例如,以下代码向组中添加了一个按钮

PHP

$btn->addButton("k_excel", array(
    "icon" => "fa-plus-circle",
    "label" => "Exportar a Excel",
    "link" => "window.open('$url' + $('#year').val(), '_blank');",
    "type" => "btn-xs btn-success"
));

要显示按钮组,可以使用 show() 方法。 show() 方法使用配置的方案显示按钮组。

以下代码显示了按钮组

PHP

$btn->show();

除了 addButton()show() 方法外,ButtonMaker 类还提供以下方法

  • **addManyButtons()**: 使用提供的配置将多个按钮添加到按钮组。
  • **showInGroup()**: 指示按钮组将在更大的组内显示。
  • **addPostScript()**: 添加一个在显示按钮后执行的 JavaScript 脚本。
  • **putPostScripts()**: 打印后来添加的 JavaScript 脚本。
  • **setParamsData()**: 设置按钮组的参数数据。
  • **setName()**: 设置按钮组的名称。
  • **setShowLabel()**: 设置是否在按钮中显示标签。

使用示例

以下代码展示了ButtonMaker的使用示例

PHP

$btn = new ButtonMaker("excel");

$btn->addButton("k_excel", array(
    "icon" => "fa-plus-circle",
    "label" => "Exportar a Excel",
    "link" => "window.open('$url' + $('#year').val(), '_blank');",
    "type" => "btn-xs btn-success"
));

$btn->addButton("k_pdf", array(
    "icon" => "fa-file-pdf",
    "label" => "Exportar a PDF",
    "link" => "window.open('$url' + $('#year').val() + '.pdf', '_blank');",
    "type" => "btn-xs btn-info"
));

$btn->show();

此代码生成以下按钮组

HTML

<div class="btn-group">
    <button type="button" class="btn btn-xs btn-success">
        <i class="fa fa-plus-circle"></i> Exportar a Excel
    </button>
    <button type="button" class="btn btn-xs btn-info">
        <i class="fa fa-file-pdf"></i> Exportar a PDF
    </button>
</div>

如何使用DashViewer生成器

DashViewer类用于在具有配置和自定义选项的块中显示信息,包括显示特定内容并在显示内容后执行脚本的选项。

要使用DashViewer,首先需要创建该类的实例

PHP

$viewer = new DashViewer();

第一个参数是可选的,可用于设置调用DashViewer的对象的引用。

一旦创建了实例,就可以开始配置块。为此,可以使用以下方法

  • setTitle($title): 设置DashViewer块的标题。
  • setGeneralSchema(string $generalSchema): 设置所有DashViewer块的一般方案。
  • loadName(): 如果尚未设置,则加载块的名称。
  • addPostScript($script, $have_script_tag=false): 添加一个在块的主要内容之后执行的js脚本。
  • OnlyShowContent(): 启用仅显示块特定内容的选项。
  • setVar($name, $value): 为DashViewer块设置一个变量。

要显示块的内容,可以使用show()方法。 show()方法根据安全和配置条件显示DashViewer块的内容。

以下代码展示了DashViewer的使用示例

PHP

$viewer = new DashViewer();
$viewer->setTitle("Mi bloque");
$viewer->addPostScript('$(document).ready(function() { console.log("Hola!"); });');
$viewer->setVar("f", $this->getView("my-view"));
$viewer->show();

此代码生成以下DashViewer块

HTML

<div class="card">
    <div class="card-header">
        Mi bloque
    </div>
    <div class="card-body">
        <p>Este es el contenido de la vista.</p>
    </div>
    <div class="card-footer">
        <script>
            $(document).ready(function() {
                console.log("Hola!");
            });
        </script>
    </div>
</div>

块的内容可以是实现ShowableInterface接口的任何对象。以下代码展示了使用视图与DashViewer的示例。

PHP

$viewer = new DashViewer();
$viewer->setTitle("Mi bloque");
$viewer->addPostScript('$(document).ready(function() { console.log("Hola!"); });');
$viewer->setVar("f", $this->getView("my-view"));
$viewer->show();

此代码生成与前面相同的DashViewer块。

要仅显示块的具体内容,可以使用OnlyShowContent()方法。 OnlyShowContent()方法启用仅显示块特定内容的选项。

以下代码展示了OnlyShowContent()的使用示例

PHP

$viewer = new DashViewer();
$viewer->setTitle("Mi bloque");
$viewer->addPostScript('$(document).ready(function() { console.log("Hola!"); });');
$viewer->setVar("f", $this->getView("my-view"));
$viewer->OnlyShowContent();
$viewer->show();

此代码生成以下DashViewer块

HTML

<div class="card-body">
        <p>Este es el contenido de la vista.</p>
    </div>

如何使用DataViewer生成器

DataViewer类用于生成一个HTML块,该块以表格形式显示信息,无论是从AbstractBaseDAO对象还是关联数组获取。

要使用DataViewer,首先需要创建该类的实例

PHP

$viewer = new DataViewer();

第一个参数是可选的,可用于设置提供表格数据的AbstractBaseDAO对象。

一旦创建了实例,就可以开始配置块。为此,可以使用以下方法

  • setTitle($title): 设置DataViewer块的标题。
  • setGeneralSchema(string $generalSchema): 设置所有DataViewer块的一般方案。
  • setArrayData($row): 使用数组设置DataViewer块的数据。
  • setButtons(ButtonMaker $buttons): 为DataViewer分配一组按钮。
  • OnlyShowContent(): 启用仅显示块特定内容的选项。

要显示表格,可以使用show()方法。 show()方法显示DataViewer生成的表格,以行形式呈现提供的数据的键和值。

以下代码展示了DataViewer的使用示例

PHP

$viewer = new DataViewer();
$viewer->setTitle("Mi tabla");
$viewer->setButtons(new ButtonMaker("excel"));
$viewer->setArrayData([
    "nombre" => "Juan Pérez",
    "apellido" => "García",
    "edad" => 30
]);
$viewer->show();

此代码生成以下DataViewer块

HTML

<table class="table table-bordered">
    <tbody>
        <tr>
            <td>nombre</td>
            <td>Juan Pérez</td>
        </tr>
        <tr>
            <td>apellido</td>
            <td>García</td>
        </tr>
        <tr>
            <td>edad</td>
            <td>30</td>
        </tr>
    </tbody>
</table>

如何使用WrapperViewer生成器

WrapperViewer类为实现ShowableInterface接口或为视图的块生成视觉包装。

要使用WrapperViewer,首先需要创建该类的实例

PHP

$viewer = new WrapperViewer();

第一个参数是可选的,可用于设置用作包装方案视图的路由。

一旦创建了实例,就可以开始配置包装。为此,可以使用以下方法:

  • setTitle($title): 设置包装的标题。
  • setGeneralSchema(string $generalSchema): 设置包装方案的一般路径。
  • add(string|ShowableInterface $action, $type=null): 向包装器添加内容。
  • **show(): 显示包装器及其内容。

要向包装器添加内容,可以使用 add() 方法。 add() 方法接受两个参数

  • 第一个参数是要添加的内容。 可以是一个文本字符串,一个实现 ShowableInterface 接口的对象或一个视图路径。
  • 第二个参数是内容类型。 这是个可选参数,可以用来指定添加的内容类型。可能的值有 TYPE_RAWTYPE_OBJTYPE_PATH

以下代码展示了 WrapperViewer 的使用示例

PHP

$viewer = new WrapperViewer();
$viewer->setTitle("Mi envoltorio");

// Agrega contenido de texto
$viewer->add("Este es un contenido de texto.");

// Agrega contenido de una vista
$viewer->add("index.php", WrapperViewer::TYPE_PATH);

// Agrega contenido de un objeto
$viewer->add(new MyObject(), WrapperViewer::TYPE_OBJ);

$viewer->show();

此代码生成以下视觉包装器

HTML

<div class="wrapper-viewer">
    <h3>Mi envoltorio</h3>
    <p>Este es un contenido de texto.</p>
    <div class="wrapper-content">
        <p>Contenido de la vista index.php</p>
    </div>
    <div class="wrapper-content">
        <p>Contenido del objeto MyObject</p>
    </div>
</div>

WrapperViewer 还提供了一系列方法来自定义包装器的显示。 例如,以下代码展示了如何使用 setClass()setGeneralSchema() 方法

PHP

$viewer = new WrapperViewer();
$viewer->setTitle("Mi envoltorio");
$viewer->setClass("my-custom-class");
$viewer->setGeneralSchema("/views/wrappers/default.php");

// Agrega contenido de texto
$viewer->add("Este es un contenido de texto.");

// Agrega contenido de una vista
$viewer->add("index.php", WrapperViewer::TYPE_PATH);

// Agrega contenido de un objeto
$viewer->add(new MyObject(), WrapperViewer::TYPE_OBJ);

$viewer->show();

此代码生成以下视觉包装器

HTML

<div class="wrapper-viewer my-custom-class">
    <h3>Mi envoltorio</h3>
    <p>Este es un contenido de texto.</p>
    <div class="wrapper-content">
        <p>Contenido de la vista index.php</p>
    </div>
    <div class="wrapper-content">
        <p>Contenido del objeto MyObject</p>
    </div>
</div>

如何使用 TableGenerator 生成器

TableGenerator 类是一个 HTML 表格生成器,它允许以可筛选、可排序和可分页的方式显示 AbstractDAO 对象的数据。

要使用 TableGenerator,首先需要创建该类的实例

PHP

$tabla = new TableGenerator($dao, __METHOD__);

第一个参数是提供表格数据的 DAO 对象。

第二个参数是生成表格的调用者。

实例创建后,就可以开始配置表格了。 可以使用以下方法进行配置:

  • reloadScript(string $name): 设置在需要更新表格时调用的脚本名称。
  • reloadDo(string $name): 设置在更新表格时调用的方法。
  • setName(string $name): 设置创建的表格实例的名称。
  • html(array $data): 设置表格的 HTML 属性。
  • fields(string $fields): 设置要显示在表格中的字段。
  • actions(array $actions): 设置要在表格中显示的操作。
  • rowClausure(callable $closure): 设置在为表格生成每一行时执行的函数。
  • colClausure(callable $closure): 设置在为表格生成每一列时执行的函数。
  • totalsClausure(callable $closure): 设置用于累加列总和的函数。

以下代码展示了 TableGenerator 的使用示例

PHP

$dao = new InvoiceDAO();
$dao->autoconfigurable=SimpleDAO::IS_AUTOCONFIGURABLE; $dao->disableExecFind();

$dao->getActives();

TableGenerator::defaultOrder('id', false);


$tabla = new TableGenerator($dao, __METHOD__);
$tabla->reloadScript = $this->getHandlerName(); //El nombre del controlador que se llamara cuando se requiere actualizar la tabla
$tabla->reloadDo = 'list'; //metodo que se llama al momento de actualizar la tabla
$tabla->setName($this->getRequestAttr('objName')); //nombre de la instancia de tabla creada, si es una actualizacion, se utiliza el ultimo nombre generado
$tabla->html = array(
	'class' => 'table table-striped'
);

$tabla->fields="id,fiscal_id,customer_name,tax,total,payment_total,balance";

//crea las acciones
$actions = new TableAcctions();

$actions->addAction("", Handler::asyncLoad(Handler::$handler, APP_CONTENT_BODY, array(
					'id'=>'#id#',
					'do'=>'inactivate'
				),true, true, showMessage("confirm_inactivate", array("field" => "#id#"))),
				array('class'=>'fa fa-trash-alt  fa-lg fa-fw'));

//asocia las acciones
$tabla->actions=$actions->getAllActions();

$tabla->rowClausure = function($row){
	$result = array();


	switch ($row["status"]) {


		case InvoiceDAO::STATUS_CANCELED:
			$result["style"] = "background: #f79e87";
		break;
	}


	return $result;
};

$tabla->colClausure = function($row, $field, $isTotal){

	switch ($field) {
		case 'id':
			$text = "<i class=\"fa fa-chevron-circle-right fa-fw\" aria-hidden=\"true\"></i> {$row[$field]}";

			$data = $this->make_link($text,
				Handler::asyncLoad("ShippingOrder", APP_CONTENT_BODY, array(
					"do"=>"dash",
					"id"=>$row[$field]
				),true),false);
		break;

		default:
			$data = $row[$field];
	}

	return array("data"

安全层

Handler 的安全层是数据层和控制器之间的中间层。它负责验证用户是否有访问数据和操作的必要权限。

权限

Handler 中的权限是简单的 id 和描述,表示一个操作。例如,权限 "ver_facturas" 允许用户查看发票。

用户、组和权限

在 Handler 中存在用户、组和权限。一个用户可以有多个权限,一个组也可以包含多个权限,而一个用户可以属于多个组。

安全访问

Handler 中的安全访问是动态和可配置的。每个标识了调用者的 Showable 对象都会生成一个访问规则,该规则在系统使用过程中自动学习。每个访问规则都可以包含一个权限。

访问验证

在显示 Showable 对象之前,会从调用者验证该对象的访问规则,如果有需要权限的规则,会检查用户是否有该权限后再显示。

DynamicSecurityAccess

DynamicSecurityAccess 类负责在 Showable 对象和 handlers 对象内部执行这些操作。

拒绝访问时的操作

动态安全访问类 DynamicSecurityAccess 包含以下方法,该方法可以在拒绝访问时执行一个操作

PHP

/**
     * Clausura que se ejecuta cuando se deniega un permiso.
     *
     * Esta propiedad permite configurar una clausura (closure) que se ejecutará
     * cuando un permiso es denegado por las reglas de acceso. La clausura recibe el
     * permiso denegado y puede utilizarse para definir una acción específica que se
     * realizará en caso de acceso no autorizado.
     *
     * @var Closure|null $onPermissionDenny Permiso denegado clausura.
     */
    public static ?Closure $onPermissionDenny;

此方法可用于在用户没有必要的权限访问 可显示 对象时执行自定义操作。

使用示例

以下示例展示了如何使用安全层来验证用户是否有权限“查看发票”来查看代表发票的 可显示 对象。

PHP

$dao = new InvoiceDAO();
$invoice = $dao->findById(1);

$showable = new InvoiceShowable($invoice);



// El usuario tiene el permiso, por lo que se muestra el objeto.
$showable->show();

在此示例中,show 的实现应验证是否满足安全访问条件。