超简单的HTML表单生成器。

v2.5.0 2024-03-31 19:22 UTC

README

Latest Stable Version Total Downloads Latest Unstable Version License
build status Code Coverage Scrutinizer Code Quality
一个超简单的PHP Bootstrap HTML表单生成器

An example generated form

v2.0.0已升级支持PHP 7.1+,并新增了'字段转换器'功能。您可以为字段添加数据转换器,以便将对象转换为表单数据,反之亦然。请参阅此readme的转换器部分。

安装

通过composer安装

composer require delboy1978uk/form

用法

首先,"使用"您表单所需的全部类。然后创建您的表单和字段。

<?php

use Del\Form\Form;
use Del\Form\Field\Text;
use Del\Form\Field\CheckBox;
use Del\Form\Field\Submit;

// Create a form
$form = new Form('registration');

// Create a username, email, spamlist checkbox, and submit button.
$userName = new Text('username');
$email = new Text('email');
$spamMe = new CheckBox('spam');
$submit = new Submit('submit');

// Set labels
$userName->setLabel('User Name');
$email->setLabel('Email Address');
$spamMe->setLabel('Join our (and 3rd parties) email list(s)');

// Add the fields to the form
$form->addField($userName)
      ->addField($email)
      ->addField($spamMe)
      ->addField($submit);

// Render the form
echo $form->render();

创建自定义表单

当然,创建自己的表单比每次都构建一个更方便,因此只需创建一个类并扩展Del\Form\AbstractForm,然后在init()函数中添加您的字段。

<?php
namespace My\Cool;

use Del\Form\AbstractForm;
use Del\Form\Field\Text\EmailAddress;
use Del\Form\Field\Text\Password;
use Del\Form\Field\Submit;

class LoginForm extends AbstractForm
{
    public function init() 
    {
        $email = new EmailAddress('email');   
        $password = new Password('passord');
        $submit = new Submit('submit');
        $this->addField($email);
        $this->addField($password);
        $this->addField($submit);
    }
}

然后使用表单就像这样简单

<?php
use My\Cool\LoginForm;

$form = new LoginForm('login');
$form->render();

过滤和验证输入

对于过滤输入,将Del\Form\Filter\Interface添加到字段对象中。对于验证过滤后的输入,添加Del\Form\Validator\ValidatorInterface。目前有一个适配器用于Laminas\Filter and Laminas\Validate,但您也可以为喜欢的库编写适配器。设置必填字段会添加一个Del\Form\Validator\NotEmpty验证器。

<?php

// A text field, and an adapter for the filters and the validators
use Del\Form\Field\Text;
use Del\Form\Filter\Adapter\FilterAdapterZf;
use Del\Form\Validator\Adapter\ValidatorAdapterZf;

// Some sensible default string filters for username/email fields 
use Laminas\Filter\StripTags;
use Laminas\Filter\StringTrim;
use Laminas\Filter\StringToLower;

// Validation rules
use Laminas\Validator\CreditCard;;

// Create the field
$creditCard = new Text('credit-card');

// Create the filters
$stripTags = new FilterAdapterZf(new StripTags());
$trim = new FilterAdapterZf(new StringTrim());
$lowerCase = new FilterAdapterZf(new StringToLower());

// Create the validators
$emailAddress = new ValidatorAdapterZf(new CreditCard());

// Add them to the field
$creditCard->addFilter($stripTags)
      ->addFilter($trim)
      ->addFilter($lowerCase)
      ->addValidator($emailAddress);

设置和获取值

Del\Form\FormInterface有一个populate方法,它接受一个数组(通常是post数据,但不一定是这样)。

<?php
if (isset($_POST['submit'])) { // or ask your request object ;-) 
    $data = $_POST;
    $form->populate($data);
    if ($form->isValid()) {
        $filteredData = $form->getValues();
    }
}

在populate被调用后,如果您调用Form::render(),它将显示任何验证错误消息。

字段类型

文本

Del\Form\Field\Text字段是最基本的字段,自带StripTags和StringTrim过滤器。

Del\Form\Field\Text\EmailAddress扩展了Text,并添加了一个Email Address验证器,以便于使用。

Del\Form\Field\Text\Password是一个密码字段,它也扩展了Text。

<?php
use Del\Form\Field\Text;

$text = new Text('text');
$text->setLabel('Needed Details');
$text->setRequired(true);
$text->setPlaceholder('type some text..');
$text->setValue('Blah');

文本区域

Del\Form\Field\TextArea字段与Text字段非常相似

<?php
use Del\Form\Field\TextArea;

$textArea = new TextArea('message');;

选择

Del\Form\Field\Select需要通过setOptions()初始化

<?php
use Del\Form\Field\Select;

$select = new Select('choose');
$select->setOptions([
    'BK' => 'Burger King',
    'McD' => 'McDonalds',
    'Q' => 'Quick',
]);

多选

Del\Form\Field\MultiSelect也需要通过setOptions()初始化,并且与Select字段以相同的方式工作。

单选按钮

Del\Form|Field\Radio可以是内联(并排)显示,也可以不是,也需要通过setOptions()初始化

<?php
use Del\Form\Field\Radio;

$radio = new Radio('choose');
$radio->setRenderInline(true);
$radio->setOptions([
    'BK' => 'Burger King',
    'McD' => 'McDonalds',
    'Q' => 'Quick',
]);

复选框

Del\Form|Field\Checkbox可以是内联显示,也可以不是,也需要通过setOptions()初始化

<?php
use Del\Form\Field\CheckBox;

$check = new CheckBox('choose');
$check->setOptions([
    'BK' => 'Burger King',
    'McD' => 'McDonalds',
    'Q' => 'Quick',
]);

文件上传

Del\Form\Field\FileUpload字段自带一个漂亮的Bootstrap兼容渲染器,但使用了一些javascript。如果您不希望这样,只需调用setRenderer()并将默认的TextRender类实例传递给它。另外,别忘了将表单的加密类型设置为Form::ENC_TYPE_MULTIPART_FORM_DATA

<?php
use Del\Form\Field\FileUpload;

$form->setEncType(Form::ENC_TYPE_MULTIPART_FORM_DATA);
$fileUpload = new FileUpload('photo');
$fileUpload->setUploadDirectory('/path/to/destination');

提交

Del\Form|Field\Submit实际上不需要太多

<?php
use Del\Form\Field\Submit;

$submit = new Submit('submit');
$submit->setValue('Send');

动态表单

例如,您可以为单选按钮提供两个选项,每个选项都可以根据选中的值显示一个相关的表单。例如,一个关于食物或饮料的单选按钮,当点击饮料选项时,可以显示一个动态表单,并且饮料表单将显示出来。

An example generated form

<?php

$radio = new Radio('choice');
$radio->setLabel('Please choose..');
$radio->setRenderInline(true);
$radio->setRequired(true);
$radio->setOptions([
    1 => 'Food',
    2 => 'Drink',
]);

$foodForm = new Form('food');  // This form appears when radio choice 1 is selected
$foodRadio = new Radio('foodchoice');
$foodRadio->setLabel('Choose your food.');
$foodRadio->setRequired(true);
$foodRadio->setOptions([
    1 => 'Cheeseburger',
    2 => 'Pizza',
    3 => 'Steak',
]);
$foodForm->addField($foodRadio);
$radio->addDynamicForm($foodForm, 1);

$drinkForm = new Form('drink');  // This form appears when radio choice 2 is selected
$drinkRadio = new Radio('drinkchoice');
$drinkRadio->setRequired(true);
$drinkRadio->setLabel('Choose your drink.');
$drinkRadio->setOptions([
    1 => 'Beer',
    2 => 'Vodka',
    3 => 'Whisky',
]);
$moreText = new Text('moretext');
$moreText->setLabel('whatever');
$moreText->setPlaceholder('Another text field to fill in');
$drinkForm->addField($drinkRadio);
$drinkForm->addField($moreText);
$radio->addDynamicForm($drinkForm, 2);

转换器

您可以通过实现De\Form\Field\TransformerInterface接口来创建一个对象,该对象可以将输入值转换为表单值。在输出方法中做相反的操作,并返回对象的表示形式。Bone MVC为DateTime字段提供了一个内置的转换器。

<?php
 
$format = 'Y-m-d';
$form = new Form('some-form');
$date = new Text('date');
$date->setTransformer(new DateTimeTransformer($format));
$form->addField($date);

现在,您用来自填充表单的数组可以包含stringDateTime表示形式。在从表单获取值时,您可以通过传递true来使用转换器。

<?php

$values = $form->getValues(); // $values['date'] === '2014-09-18' (for instance)
$values = $form->getValues(true); // $values['date'] instanceof DateTime