marvin255/serviform

此包已被 弃用 并不再维护。作者建议使用 symfony/form 包。

PHP 表单构造器

v2.0.0 2020-01-17 16:03 UTC

README

Latest Stable Version Total Downloads License Build Status

PHP 表单构造器。

安装

通过 Composer

在项目文件夹中运行命令

composer require marvin255/serviform:~1.2

通用

下载库存档并解压到项目中。请确保包含 Autoloader.php

require_once 'src/Autoloader.php';

基本用法

使用 \marvin255\serviform\helpers\FactoryFields 创建表单。每个元素都必须指定一个包含必需的 type 键的数组,或者设置一个实现 \marvin255\serviform\interfaces\Field 接口的对象。对于每个规则,必须指定一个如下所示的数组。

use marvin255\serviform\helpers\FactoryFields;

$form = FactoryFields::initElement('form', [
    'name' => 'feedback',
    'elements' => [
        'name' => [
            'label' => 'Name',
            'type' => 'input',
            'attributes' => [
                'class' => 'class',
                'data-attribute' => 'some attribute',
            ],
        ],
        'email' => [
            'label' => 'Email',
            'type' => 'input',
        ],
        'message' => [
            'label' => 'Message',
            'type' => 'textarea',
        ],
        'send' => [
            'label' => 'Send',
            'type' => 'button',
        ],
    ],
    'rules' => [
        [['name', 'email', 'message'], 'required'],
        [['email'], 'regexp', 'regexp' => 'email'],
    ],
]);

将数据加载到表单中。验证表单字段。如果所有检查都通过,执行一些操作。

if ($form->loadData() && $form->validate()) {
    //get data form form
    $formData = $form->getValue();
    //here is some action if form's data is valid, e.g. mail() or redirect
}

渲染表单。

echo $form;

高级用法

要创建步骤式表单或在一个表单中插入另一个表单,将新的 form 元素设置为基本表单的一个元素。您可以将任何表单插入到任何其他表单中,没有嵌套限制。

use marvin255\serviform\helpers\FactoryField;

$form = FactoryFields::initElement('form', [
    'name' => 'feedback',
    'elements' => [
        'message' => [
            'type' => 'form',
            'elements' => [
                'name' => [
                    'label' => 'Name',
                    'type' => 'input',
                ],
                'email' => [
                    'label' => 'Email',
                    'type' => 'input',
                ],
                'message' => [
                    'label' => 'Message',
                    'type' => 'textarea',
                ],
            ],
            'rules' => [
                [['name', 'email', 'message'], 'required'],
                [['email'], 'regexp', 'regexp' => 'email'],
            ],
        ],
        'address' => [
            'type' => 'form',
            'elements' => [
                'country' => [
                    'label' => 'Country',
                    'type' => 'input',
                ],
                'city' => [
                    'label' => 'City',
                    'type' => 'input',
                ],
                'street' => [
                    'label' => 'Street',
                    'type' => 'input',
                ],
            ],
            'rules' => [
                [['country', 'city', 'street'], 'required'],
            ],
        ],
        'send' => [
            'type' => 'button',
            'label' => 'Send',
        ],
    ],
]);

if ($form->loadData() && $form->validate()) {
    //get data form form
    $formData = $form->getValue();
    //here is some action if form's data is valid, e.g. mail() or redirect
}

echo $form;

要创建具有重复字段的表单,无需重复所有描述。只需使用 multiple 字段类型。

use marvin255\serviform\helpers\FactoryField;

$form = FactoryFields::initElement('form', [
    'name' => 'feedback',
    'elements' => [
        'message' => [
            'type' => 'form',
            'elements' => [
                'name' => [
                    'label' => 'Name',
                    'type' => 'input',
                ],
                'email' => [
                    'label' => 'Email',
                    'type' => 'input',
                ],
                'message' => [
                    'label' => 'Message',
                    'type' => 'textarea',
                ],
            ],
            'rules' => [
                [['name', 'email', 'message'], 'required'],
                [['email'], 'regexp', 'regexp' => 'email'],
            ],
        ],
        'address' => [
            'type' => 'multiple',
            'min' => 3,
            'max' => 3,
            'multiplier' => [
                'type' => 'form',
                'elements' => [
                    'country' => [
                        'label' => 'Country',
                        'type' => 'input',
                    ],
                    'city' => [
                        'label' => 'City',
                        'type' => 'input',
                    ],
                    'street' => [
                        'label' => 'Street',
                        'type' => 'input',
                    ],
                ],
                'rules' => [
                    [['country', 'city', 'street'], 'required'],
                ],
            ],
        ],
        'send' => [
            'type' => 'button',
            'label' => 'Send',
        ],
    ],
]);

if ($form->loadData() && $form->validate()) {
    //get data form form
    $formData = $form->getValue();
    //here is some action if form's data is valid, e.g. mail() or redirect
}

echo $form;

在这种情况下,地址表单将渲染三次,具有不同的 name 参数。

字段

所有字段都必须实现 \marvin255\serviform\interfaces\Field。要将新字段类型添加到工厂或更改旧类型,请使用 \marvin255\serviform\helpers\FactoryFields::setDescription

添加新字段类型。

use serviform\helpers\FactoryFields;

FactoryFields::setDescription('new_field_type', [
    'type' => '\My\Awesome\Field', // required, string with the name of new type class that implements \marvin255\serviform\interfaces\Field
    'label' => 'Default label', // we can set any default setting for each of newly created fields
    'attributes' => [
        'class' => 'form-control',
    ],
]);

重新定义旧类型。

use serviform\helpers\FactoryFields;

FactoryFields::setDescription('input', [
    'type' => '\My\Awesome\Input', // we can set new class for builtin field types
    'label' => 'Default label', // we can set any default setting for each of newly created fields
]);

验证规则

所有验证规则都必须实现 \marvin255\serviform\interfaces\Validator。要将新验证规则添加到工厂或更改旧规则,请使用 \marvin255\serviform\helpers\FactoryValidators::setDescription

添加新规则。

use serviform\helpers\FactoryValidators;

FactoryValidators::setDescription('new_rule', [
    'type' => '\My\Awesome\Rule', // required, string with the name of new rule class that implements \marvin255\serviform\interfaces\Validator
    'skipOnError' => true, // we can set any default setting for each of newly created rule
]);

重新定义旧规则。

use serviform\helpers\FactoryValidators;

FactoryFields::setDescription('require', [
    'type' => '\My\Awesome\Require', // we can set new class for builtin rule
    'skipOnError' => true, // we can set any default setting for each of newly created rules
]);