此包已被弃用,不再维护。未建议替代包。

一个基本的框架无关表单构建包,具有一些额外的便利性,如记住旧输入和检索错误信息。

安装: 938,246

依赖者: 11

建议者: 0

安全性: 0

星标: 231

关注者: 19

分支: 116

开放问题: 15

v0.9.0 2017-07-07 16:13 UTC

README

重要:此包不再积极维护。 对于错误修复和新功能,请进行分支。

Form

This Project Has Been Deprecated. Code Climate Coverage Status

一个无聊的包名称。使用流畅的语法构建表单HTML,希望直观。

安装

您可以通过在项目的根目录下的终端中运行以下命令使用Composer安装此包

composer require adamwathan/form

Laravel

此包可以作为Laravel 5中已删除的表单构建器的替代品使用。API不同,但所有功能都在。

如果您正在使用Laravel 4或5,您可以注册FormServiceProvider以自动获得对旧输入和错误信息功能的访问。

为此,只需更新您的 config/app.php 文件中的 providers 数组

'providers' => [
        //...
        'AdamWathan\Form\FormServiceProvider'
    ],

您还可以选择使用外观,通过在 config/app.php 中添加别名来使用它

'aliases' => [
        //...
        'Form' => 'AdamWathan\Form\Facades\Form',
    ],

请注意,在Laravel 4中,已经有一个内置表单构建器的Form外观。如果您想同时使用两者,请使用不同的别名。如果您只想使用这个,请删除指向Illuminate组件的Form别名。

基本用法

入门

首先,实例化一个表单构建器...

$builder = new AdamWathan\Form\FormBuilder;

然后,使用表单构建器构建一个元素。例如

// <input type="text" name="email" value="example@example.com" required="required">
<?= $builder->text('email')->value('example@example.com')->required(); ?>
  • 所有元素都支持方法链,因此您可以为元素添加所需的所有选项。
  • 所有元素都实现了 __toString(),因此不需要手动渲染。

打开表单

// <form method="POST">
<?= $builder->open(); ?>

// <form method="GET">
<?= $builder->open()->get(); ?>

// <form method="POST">
// <input type="hidden" name="_method" value="PUT">
<?= $builder->open()->put(); ?>

// <form method="POST">
// <input type="hidden" name="_method" value="DELETE">
<?= $builder->open()->delete(); ?>

// <form method="POST" action="/test">
<?= $builder->open()->action('/test'); ?>

// <form method="POST" action="" enctype="multipart/form-data">
<?= $builder->open()->multipart() ?>

// <form method="POST" action="" enctype="custom">
<?= $builder->open()->encodingType("custom") ?>

文本和密码字段

文本和密码字段具有相同的界面。

// <input type="text" name="email">
<?= $builder->text('email'); ?>

// <input type="text" name="email" id="email_field">
<?= $builder->text('email')->id('email_field'); ?>

// <input type="password" name="password" class="required">
<?= $builder->password('password')->addClass('required'); ?>

// <input type="text" name="email" value="example@example.com" required="required">
<?= $builder->text('email')->value('example@example.com')->required(); ?>

其他可用方法

  • placeholder($string)
  • optional()
  • defaultValue($string)
  • disable()
  • enable()

文本区域

文本区域与常规文本字段具有相同的界面,但有一些额外有用的方法。

// <textarea name="bio" rows="5" cols="50"></textarea>
<?= $builder->textarea('bio')->rows(5); ?>

// <textarea name="bio" rows="10" cols="20"></textarea>
<?= $builder->textarea('bio')->cols(20); ?>

// <textarea name="bio" rows="5" cols="20" class="important">My biography</textarea>
<?= $builder->textarea('bio')->rows(5)->cols(20)->addClass('important')->value('My biography'); ?>

复选框和单选按钮

// <input type="checkbox" name="terms" value="1">
<?= $builder->checkbox('terms'); ?>

// <input type="checkbox" name="terms" value="1" checked="checked">
<?= $builder->checkbox('terms')->check(); ?>

// <input type="checkbox" name="terms" value="1">
<?= $builder->checkbox('terms')->uncheck(); ?>

// <input type="checkbox" name="terms" value="1" checked="checked">
<?= $builder->checkbox('terms')->defaultToChecked(); ?>

// <input type="checkbox" name="terms" value="agree">
<?= $builder->checkbox('terms')->value('agree'); ?>

// <input type="radio" name="color" value="red">
<?= $builder->radio('color', 'red'); ?>

选择

// <select name="birth_year"></select>
<?= $builder->select('birth_year'); ?>

// <select name="birth_year">
//   <option value="0">1990</option>
//   <option value="1">1991</option>
//   <option value="2">1992</option>
// </select>
<?= $builder->select('birth_year', [1990, 1991, 1992]); ?>

// <select name="birth_year">
//   <option value="1990">1990</option>
//   <option value="1991">1991</option>
//   <option value="1992">1992</option>
// </select>
<?= $builder->select('birth_year', ['1990' => 1990, '1991' => 1991, '1992' => 1992]); ?>

// <select name="birth_year">
//   <optgroup label="Ontario">
//     <option value="toronto">Toronto</option>
//     <option value="ottawa">Ottawa</option>
//   </optgroup>
//   <optgroup label="Quebec">
//     <option value="montreal">Montreal</option>
//     <option value="quebec_city">Quebec City</option>
//   </optgroup>
// </select>
$options = [
	'Ontario' => [
		'toronto' => 'Toronto',
		'ottawa' => 'Ottawa',
	],
	'Quebec' => [
		'montreal' => 'Montreal',
		'quebec_city' => 'Quebec City',
	]
];

<?= $builder->select('birth_year', $options); ?>

// <select name="birth_year">
//   <option value="1">1990</option>
// </select>
<?= $builder->select('birth_year')->addOption('1', 1990); ?>

// <select name="birth_year">
//   <option value="1">1990</option>
//   <option value="2">1991</option>
//   <option value="3" selected>1992</option>
// </select>
<?= $builder->select('birth_year', ['1' => 1990, '2' => 1991, '3' => 1992])->select('3'); ?>

按钮

// <button type="button">Click Me</button>
<?= $builder->button('Click Me'); ?>

// <button type="submit">Sign Up</button>
<?= $builder->submit('Sign Up'); ?>

// <button type="reset">Reset Form</button>
<?= $builder->reset('Reset Form'); ?>

// <button type="submit" class="js-submit">Sign Up</button>
<?= $builder->submit('Sign Up')->addClass('js-submit'); ?>

隐藏输入

// <input type="hidden" name="secret" value="my-secret-value">
<?= $builder->hidden('secret')->value('my-secret-value'); ?>

标签

基本标签

// <label>Email</label>
<?= $builder->label('Email'); ?>

// <label for="email">Email</label>
<?= $builder->label('Email')->forId('email'); ?>

包装另一个元素

// <label>Email<input type="text" name="email"></label>
<?= $builder->label('Email')->before($emailElement); ?>

// <label><input type="text" name="email">Email</label>
<?= $builder->label('Email')->after($emailElement); ?>

设置属性

// Attributes can be set with attribute(...)
// <input type="text" name="foobar" min="4">
<?= $builder->text('foobar')->attribute('min', 4); ?>

// Or by calling the attribute name as a method
// <input type="text" name="foobar" min="4">
<?= $builder->text('foobar')->min(4); ?>

// Setting data-* attributes
// <input type="text" data-foo="bar" name="foobar">
<?= $builder->text('foobar')->data('foo', 'bar'); ?>

// Multiple data-* attributes can be set at once
// <input type="text" data-foo="bar" data-bar="foo" name="foobar">
<?= $builder->text('foobar')->data(['foo' => 'bar', 'bar' => 'foo']); ?>

记住旧输入

FormBuilder可以记住旧输入,如果您因为验证错误而返回表单,它会预先填充您的表单字段。

为了使此功能生效,您必须创建一个实现了OldInputInterface的类,并将其传递给FormBuilder

$builder->setOldInputProvider($myOldInputProvider);

现在,如果可用,您的表单元素将自动用用户的旧输入数据填充。

这与defaultValue()方法配合得很好,允许您设置默认值,如果用户已经提交了表单,则旧输入将覆盖它。

此软件包随Laravel实现一起提供,称为IlluminateOldInput

错误消息

FormBuilder还允许您轻松检索表单元素的错误消息。为此,只需实现ErrorStoreInterface并将其传递给FormBuilder即可

$builder->setErrorStore($myErrorStore);

此软件包随Laravel实现一起提供,称为IlluminateErrorStore

// Check if the form has an error for an element
$builder->hasError('email');

// Retrieve the error message for an element
$builder->getError('email');

您还可以向getError()提供format参数以清理您的标记。您不需要这样做

<?php if ($builder->hasError('email')): ?>
	<span class="error"><?= $builder->getError('email'); ?></span>
<?php endif; ?>

...只需这样做,如果存在格式化的消息,则会显示它,否则不显示。

<?= $builder->getError('email', '<span class="error">:message</span'); ?>

CSRF保护

假设您在实例化Formbuilder时设置了CSRF令牌(或您正在使用Laravel),可以像这样轻松地将CSRF令牌添加到您的表单中

<?= $builder->token(); ?>

数据绑定

有时您可能有一个所有字段都与系统中的某种对象或数组的属性匹配的表单,并且您希望用户能够编辑这些数据。数据绑定通过允许您将对象或数组绑定到表单来实现这一点,该表单将用于自动提供所有字段的默认值。

$model->first_name = "John";
$model->last_name = "Doe";
$model->email = "john@example.com";
$model->date_of_birth = new DateTime('1985-05-06');

<?= $builder->open(); ?>
<?= $builder->bind($model); ?>
<?= $builder->text('first_name'); ?>
<?= $builder->text('last_name'); ?>
<?= $builder->email('email'); ?>
<?= $builder->date('date_of_birth'); ?>
<?= $builder->close(); ?>

这将与Laravel的Eloquent模型无缝工作。

使用数据绑定时,旧输入将优先于任何绑定值,因此您仍然可以轻松地将用户返回到带有任何验证错误的表单,而不会丢失他们输入的数据。

注意:请务必在创建任何其他表单元素之前进行bind