October CMS 提供了各种实用的函数,通过 Html 门面,有助于处理 HTML 和表单。虽然大多数示例将使用 PHP 语言所有这些功能都可以直接转换为 Twig 标记,只需进行简单的转换。
// PHP
<?= Form::open(..) ?>
// Twig
{{ form_open(...) }}
如您所见,在 Twig 中,所有以 form_ 为前缀的函数将直接绑定到 Form facade 并提供对使用 snake_case 的方法的访问。请参阅标记指南以获取更多信息 关于在前端使用表单助手。
表单可以使用 Form::open 方法打开该方法会传入一个属性数组作为第一个参数:
<?= Form::open(['url' => 'foo/bar']) ?>
//
<?= Form::close() ?>默认情况下,将假定 POST 方法,但是,您可以自由指定其他方法:
Form::open(['url' => 'foo/bar', 'method' => 'put'])由于 HTML 表单只支持
POST和GET,PUT和DELETE方法将通过自动向你的表单添加一个_method隐藏字段来模拟。
你也可以传入常规 HTML 属性:
Form::open(['url' => 'foo/bar', 'class' => 'pretty-form'])如果您的表单将接受文件上传,请向您的数组中添加一个 files 选项:
Form::open(['url' => 'foo/bar', 'files' => true])您还可以打开指向您的页面或组件中处理程序方法的表单:
Form::open(['request' => 'onSave'])同样地,启用 AJAX 的表单可以使用 Form::ajax 方法打开,其中第一个参数是处理程序方法名:
Form::ajax('onSave')Form::ajax 的第二个参数应包含属性:
Form::ajax('onSave', ['confirm' => 'Are you sure?'])你还可以传递部分内容用于更新,作为另一个数组:
Form::ajax('onSave', ['update' => [
'control-panel' => '#controlPanel',
'layout/sidebar' => '#layoutSidebar'
]
])大部分 来自 AJAX 框架的数据属性 在这里可用,通过去掉
data-request-前缀。
如果您已启用保护,使用 Form::open 方法配合 POST、PUT 或 DELETE 将自动向您的表单添加一个 CSRF 令牌作为隐藏字段。或者,如果您希望生成隐藏 CSRF 字段的 HTML,您可以使用 token 方法:
<?= Form::token() ?>用于延迟绑定的会话密钥将被添加到每个表单作为隐藏字段。如果你想手动生成这个字段,你可以使用sessionKey方法:
<?= Form::sessionKey() ?>您可能希望根据模型的内容填充表单。为此,请使用 Form::model 方法:
<?= Form::model($user, ['id' => 'userForm']) ?>现在,当您生成一个表单元素时,例如一个文本输入框,模型中与字段名称匹配的值将自动设置为字段的值。例如,对于一个名为email的文本输入框,用户模型的email属性将被设置为该值。如果 Session 闪存数据中存在一个与输入名称匹配的项目,它将优先于模型的值。优先级如下:
这使您能够快速构建表单,这些表单不仅能绑定到模型值,而且在服务器端出现验证错误时也能轻松重新填充。您可以使用 Form::value 手动访问这些值:
<input type="text" name="name" value="<?= Form::value('name') ?>" />您可以传递一个默认值作为第二个参数:
<?= Form::value('name', 'John Travolta') ?>使用
Form::model时,请务必使用Form::close关闭表单!
<?= Form::label('email', 'E-Mail Address') ?><?= Form::label('email', 'E-Mail Address', ['class' => 'awesome']) ?>创建标签后,任何名称与该标签名称匹配的表单元素,都将自动获得一个与该标签名称匹配的 ID。
<?= Form::text('username') ?><?= Form::text('email', 'emailaddress@example.tld') ?>该 hidden 和 textarea 方法具有与 text 方法相同的签名。
<?= Form::password('password') ?><?= Form::email($name, $value = null, $attributes = []) ?>
<?= Form::file($name, $attributes = []) ?><?= Form::checkbox('name', 'value') ?>
<?= Form::radio('name', 'value') ?><?= Form::checkbox('name', 'value', true) ?>
<?= Form::radio('name', 'value', true) ?><?= Form::number('name', 'value') ?><?= Form::file('image') ?>注意:表单必须已在
files选项设置为true的情况下打开。
<?= Form::select('size', ['L' => 'Large', 'S' => 'Small']) ?><?= Form::select('size', ['L' => 'Large', 'S' => 'Small'], 'S') ?><?= Form::select('animal', [
'Cats' => ['leopard' => 'Leopard'],
'Dogs' => ['spaniel' => 'Spaniel'],
]) ?><?= Form::selectRange('number', 10, 20) ?><?= Form::selectRange('number', 10, 20, 2, ['emptyOption' => 'Choose...']) ?><?= Form::selectMonth('month') ?><?= Form::selectMonth('month', 2, ['emptyOption' => 'Choose month...']) ?><?= Form::submit('Click Me!') ?>需要创建一个按钮元素吗?请尝试使用 button 方法。它的签名与 submit 相同。
定义您自己的自定义 Form 类助手(称为“宏”)非常简单。它的工作原理如下。首先,只需注册宏并提供一个给定名称和一个闭包:
Form::macro('myField', function() {
return '<input type="awesome">';
})现在你可以使用它的名称调用你的宏了:
<?= Form::myField() ?>