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') ?>::: tip
**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() ?>