delboy1978uk / form
超简单的HTML表单生成器。
Requires
- php: ^8.2
- ext-dom: *
- ext-fileinfo: *
- laminas/laminas-filter: ^2.34
- laminas/laminas-validator: ^2.52
Requires (Dev)
- codeception/codeception: ^5.1
- codeception/module-asserts: ^3.0
- roave/security-advisories: dev-master
Suggests
- delboy1978uk/cdn: Handy class generating <head> links to popular CDN libraries
- delboy1978uk/icon: Simple class for generating Font Awesome icons
- dev-master
- v2.5.0
- v2.4.4
- v2.4.3
- v2.4.2
- v2.4.1
- v2.4.0
- v2.3.8
- v2.3.7
- v2.3.6
- v2.3.5
- v2.3.4
- v2.3.2
- v2.3.1
- v2.3.0
- v2.2.2
- v2.2.1
- v2.2.0
- v2.1.1
- v2.1.0
- v2.0.0
- v1.5.4
- v1.5.3
- v1.5.2
- v1.5.1
- v1.5.0
- v1.4.0
- v1.3.3
- v1.3.2
- v1.3.1
- v1.3.0
- v1.2.1
- v1.2.0
- v1.1.1
- v1.1.0
- v1.0.0
- v0.9.10
- v0.9.9
- v0.9.8
- v0.9.7
- v0.9.6
- v0.9.5
- v0.9.4
- v0.9.3
- v0.9.2
- v0.9.1
- v0.9.0
- dev-feature/php82and83
- dev-bugfix/domtext
- dev-refactor/is-invalid
- dev-dev-master
- dev-origin/dev-master
- dev-dynamicfields
This package is auto-updated.
Last update: 2024-08-31 00:37:36 UTC
README
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');
动态表单
例如,您可以为单选按钮提供两个选项,每个选项都可以根据选中的值显示一个相关的表单。例如,一个关于食物或饮料的单选按钮,当点击饮料选项时,可以显示一个动态表单,并且饮料表单将显示出来。
<?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);
现在,您用来自填充表单的数组可以包含string
或DateTime
表示形式。在从表单获取值时,您可以通过传递true来使用转换器。
<?php $values = $form->getValues(); // $values['date'] === '2014-09-18' (for instance) $values = $form->getValues(true); // $values['date'] instanceof DateTime