mdbottino/forms

框架无关的HTML表单渲染

v1.8.3 2020-07-04 23:51 UTC

This package is auto-updated.

Last update: 2024-09-05 09:08:53 UTC


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() !!}
	

高级用法

待办事项

示例

待办事项