o-log/php-crud

此包的最新版本(9.17)没有提供许可证信息。

CRUD 表格 + 表单

维护者

详细信息

github.com/o-log/php-crud

源代码

问题

安装: 1,827

依赖项: 3

建议者: 0

安全: 0

星级: 9

关注者: 3

分支: 2

开放问题: 2

语言:CSS


README

该库能做两件事:输出对象列表和输出单个对象的编辑表单。它生成的是html表格或表单的代码,而不是完整的页面。生成的html代码与twitter bootstrap兼容。

其他,如权限检查,将表格或表单输出到页面中的指定位置,需要单独处理。可以使用现成的模块来完成。

  • php-auth: 用户认证和权限检查
  • php-bt: 包含页面模板

对象通过 \OLOG\Model\InterfaceFactory 方法从数据库加载,因此对象类必须实现此接口。

对象通过 \OLOG\Model\InterfaceSave 方法保存到数据库,因此对象类必须实现此接口以进行编辑。

安装演示项目

在要部署演示项目的文件夹中,在控制台中执行以下命令:

git clone https://github.com/o-log/php-crud.git
cd php-crud
composer update

之后需要创建一个空的数据库项目,并在 CRUDDemo/Config.php 文件中指定对其的访问参数。

现在创建数据库中的表格,为此执行数据库结构的迁移脚本。

php cli.php

选择第1项,然后回答脚本的提问。

创建表格后,启动本地服务器并检查其工作情况。

./run.sh

在浏览器中打开地址 localhost:8000

将库连接到项目

在 composer.json 项目中包含以下行

"require" : {
	"o-log/php-crud" : "dev-master"
}

输出对象列表

以下是一个生成html表格对象的代码示例

$html .= CRUDTable::html(
    DemoNode::class,
    \OLOG\CRUD\CRUDForm::html(
        new DemoNode(),
        [
            new CRUDFormRow(
                'Title',
                new CRUDFormWidgetInput('title')
            )
        ]
    ),
    [
        new CRUDTableColumn(
            'Edit',
            new CRUDTableWidgetText('{this->title}')
        ),
        new CRUDTableColumn(
            'Reverse title',
            new CRUDTableWidgetText('{this->getReverseTitle()}')
        ),
        new CRUDTableColumn(
            'Edit',
            new CRUDTableWidgetTextWithLink(
                '{this->title}',
                DemoNodeEditAction::getUrl('{this->id}')
            )
        ),
        new CRUDTableColumn(
            'Weight',
            new CRUDTableWidgetWeight(
                [
                    'parent_id' => '{this->parent_id}'
                ]
            )
        ),
        new CRUDTableColumn(
            'Delete',
            new CRUDTableWidgetDelete()
        ),
    ],
    [],
    'title'
);

在表格中输出数据

调用表格小部件时,我们传递给它一个字符串:要输出什么。在这个字符串中,可以访问当前表格行中显示的对象的字段和方法,也可以访问其他对象。

当前表格行中的对象可以通过关键词 this 访问。

输出字段和调用当前对象的方法的示例

new CRUDTableWidgetText('{this->title}') new CRUDTableWidgetText('{this->getReverseTitle()}') new CRUDTableWidgetHtml('{this->id}
{this->title}')

可以通过以下方式访问当前对象引用的其他对象

new CRUDTableWidgetText('{DemoTerm.{this->term_id}->title}')

这里我们输出与新闻相关的分类名称:创建一个具有标识符的 DemoTerm 类对象,该标识符是从当前对象的 term_id 字段中获取的,并输出其名称。

在实际应用中,建议使用自动常量而不是标量来指定类名,因此最终的记录将如下所示

new CRUDTableWidgetText('{' . DemoTerm::class . '.{this->term_id}->title}')

有时在权重小部件中需要考虑用于计算表格中对象权重的额外参数。为此,我们传递一个上下文字符串数组

例如

new CRUDTableWidgetWeight([ 'parent_id' => '{this->parent_id}' ])

在这种情况下,处理权重更改时,将使用与当前对象相同的 parent_id 计算记录的权重

输出对象编辑器

以下是一个生成html对象编辑器的代码示例

    $node_obj = DemoNode::factory($node_id);

    $html .= \OLOG\CRUD\CRUDForm::html(
        $node_obj,
        [
            new CRUDFormRow(
                'Id',
                new CRUDFormWidgetInput('id')
            ),
            new CRUDFormRow(
                'Title',
                new CRUDFormWidgetTextarea('title')
            ),
            new CRUDFormRow(
                'image_path_in_images nullable',
                new CRUDFormWidgetInput('image_path_in_images', true)
            ),
            new CRUDFormRow(
                'Date',
                new CRUDFormWidgetTimestamp('created_at_ts')
            ),
            new CRUDFormRow(
                'is_published',
                new CRUDFormWidgetRadios('is_published', [0 => 'no', 1 => 'yes'])
            ),
            new CRUDFormRow(
                'published_at_datetime_str',
                new CRUDFormWidgetDateTime('published_at_datetime_str')
            ),
            new CRUDFormRow(
                'expiration_date nullable',
                new CRUDFormWidgetDate('expiration_date')
            ),
            new CRUDFormRow(
                'State code',
                new CRUDFormWidgetOptions('state_code',
                    [
                        1 => 'announce',
                        2 => 'live',
                        3 => 'archive'
                    ]
                )
            ),
            new CRUDFormRow(
                'State code',
                new CRUDFormWidgetHtml('<ul><li>html widget - line 1</li><li>html widget - line 2</li></ul>')
            ),
            new CRUDFormVerticalRow(
                'Body',
                new CRUDFormWidgetAceTextarea('body')
            )
        ]
    );