mdbottino / forms
框架无关的HTML表单渲染
Requires (Dev)
- phpunit/phpunit: ^8.5
README
简单、框架无关的HTML表单渲染。目的是以可重复、可重用和一致的方式渲染表单。
没有(将来也不会有)任何验证。它只处理制作有效的HTML字段和表单。
没有(将来也不会有)与任何框架的集成,它使用关联数组或stdClasses来预填充表单(例如,当你编辑数据库实体时)。
目标是使用一个(或几个)通用模板来以一致的方式渲染所有字段。
免责声明:它没有实现所有HTML5字段,并且不对属性进行任何验证。
安装
composer require mdbottino/forms
用法
为了在模板(或如果你愿意,纯PHP)中使用,你必须子类化BaseForm,并在构造函数中进行任何必要的配置。子类构造函数必须调用父构造函数并设置fields属性。在fields数组中,你需要至少以名称和标签实例化一个特定字段。
基本示例
use mdbottino\Forms\BaseForm; use mdbottino\Forms\Fields\TextField; class BasicForm extends BaseForm { public function __construct($src=null){ $this->fields = [ new TextField( 'desc', # Name 'Description', # Label ), ]; parent::__construct($src); } }
使用$src变量是可选的,如果提供,它允许用数据填充表单。这使得添加或编辑记录变得容易
# It will render empty (with placeholders if given) $addForm = new BasicForm(); # The folowing will render with the value given to each field. # Using arrays $array = ['desc' => 'some value']; $editFormArray = new BasicForm($array); # Using objects $obj = new \StdClass(); $obj->desc = 'some other value'; $editFormObject = new BasicForm($obj);
键/属性必须与创建时给出的字段名称匹配。
字段通过fields方法访问,该方法返回字段数组。
标签通过每个字段的label方法渲染。小部件通过每个字段的widget方法渲染。
前面的代码将生成以下HTML
<label for="id_desc">Description </label> <input id="id_desc" name="desc" type="text" value="">
使用blade模板,它可能看起来像这样
{!! $form->start() !!} @csrf @foreach ($form->fields() as $field) {!! $field->label() !!} {!! $field->widget(old($field->name())) !!} @endforeach <input value="Submit" type="submit" > <input value="Reset" type="reset" > {!! $form->end() !!}
默认为POST方法,没有操作和内容类型。如果其中一个字段是FileField,它将设置内容类型为multipart/form-data。这可以通过在表单中使用setAction、setMethod和setEnctype来覆盖。
样式
样式非常简单。第三个和可选的参数options支持各种关键字,这些关键字改变了渲染行为。
其中之一是attrs,它等同于渲染字段的属性。如果你给它一个名为class的键,它将在生成的HTML中显示该值。
use mdbottino\Forms\BaseForm; use mdbottino\Forms\Fields\TextField; use mdbottino\Forms\Fields\EmailField; class StyledForm extends BaseForm { public function __construct($src=null){ $options = [ 'attrs' => [ 'class' => 'form-control', ], ]; $this->fields = [ new TextField( 'desc', 'Description', $options, ), new EmailField( 'email', 'E-mail address', $options, ), ]; parent::__construct($src); } }
生成的HTML将是
<label for="id_desc">Description </label> <input id="id_desc" name="desc" type="text" value="" class="form-control"> <label for="id_email">E-mail address </label> <input id="id_email" name="email" type="email" value="" class="form-control">
使用blade模板进行样式化可能看起来像这样
{!! $form->start() !!} <div class='col-sm-6 m-auto'> @csrf @foreach ($form->fields() as $field) <div class='form-group'> {!! $field->label() !!} {!! $field->widget(old($field->name())) !!} </div> @endforeach </div> <div class="col-sm-6 m-auto"> <input value="Submit" type="submit" class="btn btn-primary mr-4" > <input value="Reset" type="reset" class="btn btn-secondary" > </div> {!! $form->end() !!}
高级用法
待办事项
示例
待办事项