表单辅助函数

表单辅助函数文件包含有助于处理表单的函数。

配置

自 v4.3.0 起,form_helper 函数中的空 HTML 元素(如 <input>)默认已更改为 HTML5 兼容模式。如果需要与 XHTML 兼容,必须将 app/Config/DocTypes.php 中的 $html5 属性设置为 false

加载此辅助函数

使用以下代码加载此辅助函数:

<?php

helper('form');

转义字段值

可能需要在表单元素中使用 HTML 和引号等字符。为了安全地执行此操作,需要使用 通用函数 esc()

考虑以下示例:

<?php

$string = 'Here is a string containing "quoted" text.';

?>

<input type="text" name="myfield" value="<?= $string ?>">

由于上述字符串包含一组引号,会导致表单损坏。 esc() 函数转换 HTML 特殊字符,使其可以安全使用:

<input type="text" name="myfield" value="<?= esc($string) ?>">

备注

如果使用本页列出的任何表单辅助函数,并以关联数组形式传递值, 表单值将自动转义,因此无需调用此函数。 仅在创建自己的表单元素(以字符串形式传递)时才需要使用它。

可用函数

提供以下函数:

form_open([$action = ''[, $attributes = ''[, $hidden = []]]])
参数:
  • $action (string) -- 表单 action/目标 URI 字符串

  • $attributes (mixed) -- HTML 属性,作为数组或已转义的字符串

  • $hidden (array) -- 隐藏字段的定义数组

返回:

HTML 表单起始标签

返回类型:

string

创建一个带有 URL 的表单起始标签,该 URL 基于 Config\App::$baseURL 构建。 可以选择添加表单属性和隐藏输入字段,并且会始终根据 app/Config/App.php 配置文件中的 $charset 属性添加 accept-charset 属性。

使用此标签而不是硬编码 HTML 的主要好处是,它允许你的网站在 URL 更改时具有更好的可移植性。

简单示例:

<?php

echo form_open('email/send');

以上示例将创建一个指向你的站点 URL 加上 "email/send" URI 段的表单,如下所示:

<form action="http://example.com/index.php/email/send" method="post" accept-charset="utf-8">

也可以添加 {locale},如下所示:

<?php

echo form_open('{locale}/email/send');

以上示例将创建一个指向你的站点 URL 加上当前请求语言环境和 "email/send" URI 段的表单,如下所示:

<form action="http://example.com/index.php/en/email/send" method="post" accept-charset="utf-8">

添加属性

可以通过向第二个参数传递关联数组来添加属性,如下所示:

<?php

$attributes = ['class' => 'email', 'id' => 'myform'];
echo form_open('email/send', $attributes);

或者,可以将第二个参数指定为字符串:

<?php

echo form_open('email/send', 'class="email" id="myform"');

以上示例将创建一个类似如下的表单:

<form action="http://example.com/index.php/email/send" class="email" id="myform" method="post" accept-charset="utf-8">

如果启用 CSRF 过滤器,form_open() 将在表单开头生成 CSRF 字段。 可以通过将 csrf_id 作为 $attributes 数组的元素来指定此字段的 ID:

<?php

echo form_open('/u/sign-up', ['csrf_id' => 'my-id']);

将返回:

<form action="http://example.com/index.php/u/sign-up" method="post" accept-charset="utf-8">
<input type="hidden" id="my-id" name="csrf_test_name" value="964ede6e0ae8a680f7b8eab69136717d">

备注

要使用 CSRF 字段的自动生成功能,需要在 app/Config/Filters.php 文件中启用 CSRF 过滤器。 在大多数情况下,表单页面使用 GET 方法请求。通常,POST/PUT/DELETE/PATCH 请求需要 CSRF 保护, 但即使对于 GET 请求,显示表单的页面也必须启用 CSRF 过滤器。

如果通过 $globals 启用 CSRF 过滤器,它将对所有请求类型有效。 但如果使用 public array $methods = ['POST' => ['csrf']]; 启用 CSRF 过滤器,则不会在 GET 请求中添加隐藏的 CSRF 字段。

添加隐藏输入字段

可以通过向第三个参数传递关联数组来添加隐藏字段,如下所示:

<?php

$hidden = ['username' => 'Joe', 'member_id' => '234'];
echo form_open('email/send', '', $hidden);

可以通过向第二个参数传递任何 false 值来跳过它。

以上示例将创建一个类似如下的表单:

<form action="http://example.com/index.php/email/send" method="post" accept-charset="utf-8">
    <input type="hidden" name="username" value="Joe">
    <input type="hidden" name="member_id" value="234">
form_open_multipart([$action = ''[, $attributes = ''[, $hidden = []]]])
参数:
  • $action (string) -- 表单 action/目标 URI 字符串

  • $attributes (mixed) -- HTML 属性,作为数组或已转义的字符串

  • $hidden (array) -- 隐藏字段的定义数组

返回:

HTML multipart 表单起始标签

返回类型:

string

此函数与上面的 form_open() 完全相同, 只是它添加了 multipart 属性,如果你想使用表单上传文件,这是必需的。

form_hidden($name[, $value = ''])
参数:
  • $name (string) -- 字段名称

  • $value (string) -- 字段值

返回:

HTML 隐藏输入元素

返回类型:

string

生成隐藏输入字段。可以提交名称/值字符串来创建一个字段:

<?php

form_hidden('username', 'johndoe');
// Would produce: <input type="hidden" name="username" value="johndoe">

... 或者可以提交关联数组来创建多个字段:

<?php

$data = [
    'name'  => 'John Doe',
    'email' => 'john@example.com',
    'url'   => 'http://example.com',
];

echo form_hidden($data);
/*
 * Would produce:
 * <input type="hidden" name="name" value="John Doe">
 * <input type="hidden" name="email" value="john@example.com">
 * <input type="hidden" name="url" value="http://example.com">
 */

也可以向值字段传递关联数组:

<?php

$data = [
    'name'  => 'John Doe',
    'email' => 'john@example.com',
    'url'   => 'http://example.com',
];

echo form_hidden('my_array', $data);
/*
 * Would produce:
 * <input type="hidden" name="my_array[name]" value="John Doe">
 * <input type="hidden" name="my_array[email]" value="john@example.com">
 * <input type="hidden" name="my_array[url]" value="http://example.com">
 */

如果要创建带有额外属性的隐藏输入字段:

<?php

$data = [
    'type'  => 'hidden',
    'name'  => 'email',
    'id'    => 'hiddenemail',
    'value' => 'john@example.com',
    'class' => 'hiddenemail',
];

echo form_input($data);
/*
 * Would produce:
 * <input type="hidden" name="email" value="john@example.com" id="hiddenemail" class="hiddenemail">
 */
form_input([$data = ''[, $value = ''[, $extra = ''[, $type = 'text']]]])
参数:
  • $data (array) -- 字段属性数据

  • $value (string) -- 字段值

  • $extra (mixed) -- 要添加到标签的额外属性,作为数组或字面字符串

  • $type (string) -- 输入字段的类型。例如,'text'、'email'、'number' 等

返回:

HTML 文本输入元素

返回类型:

string

生成标准文本输入字段。可以最少在第一个和第二个参数中传递字段名称和值:

<?php

echo form_input('username', 'johndoe');
/*
 * Would produce:
 * <input type="text" name="username" value="johndoe">
 */

或者可以传递包含希望表单包含的任何数据的关联数组:

<?php

$data = [
    'name'      => 'username',
    'id'        => 'username',
    'value'     => 'johndoe',
    'maxlength' => '100',
    'size'      => '50',
    'style'     => 'width:50%',
];
echo form_input($data);
/*
 * Would produce:
 * <input type="text" name="username" value="johndoe" id="username" maxlength="100" size="50" style="width:50%">
 */

如果需要布尔属性,传递布尔值(true/false)。在这种情况下,布尔值无关紧要:

<?php

$data = [
    'name'     => 'username',
    'id'       => 'username',
    'value'    => '',
    'required' => true,
];
echo form_input($data);
/*
 * Would produce:
 * <input type="text" name="username" value="" id="username" required>
 */

如果希望表单包含一些额外数据,如 JavaScript,可以在第三个参数中将其作为字符串传递:

<?php

$js = 'onClick="some_function ()"';
echo form_input('username', 'johndoe', $js);
/*
 * Would produce:
 * <input type="text" name="username" value="johndoe" onClick="some_function ()">
 */

或者可以将其作为数组传递:

<?php

$js = ['onClick' => 'some_function ();'];
echo form_input('username', 'johndoe', $js);
/*
 * Would produce:
 * <input type="text" name="username" value="johndoe" onClick="some_function ();">
 */

为了支持扩展范围的 HTML5 输入字段,可以在第四个参数中传递输入类型:

<?php

echo form_input('email', 'joe@example.com', ['placeholder' => 'Email Address...'], 'email');
/*
 * Would produce:
 * <input type="email" name="email" value="joe@example.com" placeholder="Email Address...">
 */
form_password([$data = ''[, $value = ''[, $extra = '']]])
参数:
  • $data (array) -- 字段属性数据

  • $value (string) -- 字段值

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

HTML 密码输入元素

返回类型:

string

此函数在所有方面都与上面的 form_input() 函数相同, 只是它使用 "password" 输入类型。

form_upload([$data = ''[, $value = ''[, $extra = '']]])
参数:
  • $data (array) -- 字段属性数据

  • $value (string) -- 字段值

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

HTML 文件上传输入元素

返回类型:

string

此函数在所有方面都与上面的 form_input() 函数相同, 只是它使用 "file" 输入类型,允许它用于上传文件。

form_textarea([$data = ''[, $value = ''[, $extra = '']]])
参数:
  • $data (array) -- 字段属性数据

  • $value (string) -- 字段值

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

HTML textarea 元素

返回类型:

string

此函数在所有方面都与上面的 form_input() 函数相同, 只是它生成 "textarea" 类型。

备注

在上面的示例中,需要指定 rowscols 属性,而不是 maxlengthsize 属性。

form_dropdown([$name = ''[, $options = [][, $selected = [][, $extra = '']]]])
参数:
  • $name (string) -- 字段名称

  • $options (array) -- 要列出的选项的关联数组

  • $selected (array) -- 用 selected 属性标记的字段列表

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

HTML select(下拉框)元素

返回类型:

string

创建标准下拉框字段。第一个参数将包含字段名称,第二个参数将包含选项的关联数组, 第三个参数将包含希望选择的值。也可以通过第三个参数传递多个项目的数组, 辅助函数将为你创建多选。

示例:

<?php

$options = [
    'small'  => 'Small Shirt',
    'med'    => 'Medium Shirt',
    'large'  => 'Large Shirt',
    'xlarge' => 'Extra Large Shirt',
];

$shirts_on_sale = ['small', 'large'];
echo form_dropdown('shirts', $options, 'large');
/*
 * Would produce:
 * <select name="shirts">
 *     <option value="small">Small Shirt</option>
 *     <option value="med">Medium Shirt</option>
 *     <option value="large" selected="selected">Large Shirt</option>
 *     <option value="xlarge">Extra Large Shirt</option>
 * </select>
 */

echo form_dropdown('shirts', $options, $shirts_on_sale);
/*
 * Would produce:
 * <select name="shirts" multiple="multiple">
 *     <option value="small" selected="selected">Small Shirt</option>
 *     <option value="med">Medium Shirt</option>
 *     <option value="large" selected="selected">Large Shirt</option>
 *     <option value="xlarge">Extra Large Shirt</option>
 * </select>
 */

如果希望起始 <select> 标签包含额外数据,如 id 属性或 JavaScript, 可以在第四个参数中将其作为字符串传递:

<?php

$js = 'id="shirts" onChange="some_function();"';
echo form_dropdown('shirts', $options, 'large', $js);

或者可以将其作为数组传递:

<?php

$js = [
    'id'       => 'shirts',
    'onChange' => 'some_function();',
];
echo form_dropdown('shirts', $options, 'large', $js);

如果作为 $options 传递的数组是多维数组,那么 form_dropdown() 将生成一个 <optgroup>,以数组键作为标签。

form_multiselect([$name = ''[, $options = [][, $selected = [][, $extra = '']]]])
参数:
  • $name (string) -- 字段名称

  • $options (array) -- 要列出的选项的关联数组

  • $selected (array) -- 用 selected 属性标记的字段列表

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

带有 multiple 属性的 HTML select 元素

返回类型:

string

创建标准多选字段。第一个参数将包含字段名称,第二个参数将包含选项的关联数组, 第三个参数将包含希望选择的值。

参数使用与上面的 form_dropdown() 相同, 当然,字段名称需要使用 POST 数组语法,例如 foo[]。

form_fieldset([$legend_text = ''[, $attributes = []]])
参数:
  • $legend_text (string) -- 要放在 <legend> 标签中的文本

  • $attributes (array) -- 要设置在 <fieldset> 标签上的属性

返回:

HTML fieldset 开始标签

返回类型:

string

生成 fieldset/legend 字段。

示例:

<?php

echo form_fieldset('Address Information');
echo "<p>fieldset content here</p>\n";
echo form_fieldset_close();

?>

<!-- Produces: -->
<fieldset>
    <legend>Address Information</legend>
    <p>form content here</p>
</fieldset>

与其他函数类似,如果希望设置额外属性,可以在第二个参数中提交关联数组:

<?php

$attributes = [
    'id'    => 'address_info',
    'class' => 'address_info',
];

echo form_fieldset('Address Information', $attributes);
echo "<p>fieldset content here</p>\n";
echo form_fieldset_close();

?>

<!-- Produces: -->
<fieldset id="address_info" class="address_info">
    <legend>Address Information</legend>
    <p>form content here</p>
</fieldset>
form_fieldset_close([$extra = ''])
参数:
  • $extra (string) -- 在闭合标签之后追加的任何内容(按原样输出

返回:

HTML fieldset 闭合标签

返回类型:

string

生成闭合 </fieldset> 标签。使用此函数的唯一好处是,它可以传递数据, 这些数据将被添加到标签下方。例如

<?php

$string = '</div></div>';
echo form_fieldset_close($string);
// Would produce: </fieldset></div></div>
form_checkbox([$data = ''[, $value = ''[, $checked = false[, $extra = '']]]])
参数:
  • $data (array) -- 字段属性数据

  • $value (string) -- 字段值

  • $checked (bool) -- 是否将复选框标记为 checked

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

HTML 复选框输入元素

返回类型:

string

生成复选框字段。简单示例:

<?php

echo form_checkbox('newsletter', 'accept', true);
// Would produce:  <input type="checkbox" name="newsletter" value="accept" checked="checked">

第三个参数包含布尔值 true/false,以确定是否应该选中复选框。

与此辅助函数中的其他表单函数类似,也可以向函数传递属性数组:

<?php

$data = [
    'name'    => 'newsletter',
    'id'      => 'newsletter',
    'value'   => 'accept',
    'checked' => true,
    'style'   => 'margin:10px',
];

echo form_checkbox($data);
// Would produce: <input type="checkbox" name="newsletter" id="newsletter" value="accept" checked="checked" style="margin:10px">

与其他函数一样,如果希望标签包含如 JavaScript 等额外数据, 可以在第四个参数中将其作为字符串传递:

<?php

$js = 'onClick="some_function()"';
echo form_checkbox('newsletter', 'accept', true, $js);

或者可以将其作为数组传递:

<?php

$js = ['onClick' => 'some_function();'];
echo form_checkbox('newsletter', 'accept', true, $js);
form_radio([$data = ''[, $value = ''[, $checked = false[, $extra = '']]]])
参数:
  • $data (array) -- 字段属性数据

  • $value (string) -- 字段值

  • $checked (bool) -- 是否将单选按钮标记为 checked

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

HTML 单选输入元素

返回类型:

string

此函数在所有方面都与上面的 form_checkbox() 函数相同, 只是它使用 "radio" 输入类型。

form_label([$label_text = ''[, $id = ''[, $attributes = []]]])
参数:
  • $label_text (string) -- 要放在 <label> 标签中的文本

  • $id (string) -- 正在为其创建标签的表单元素的 ID

  • $attributes (string) -- HTML 属性

返回:

HTML label 元素

返回类型:

string

生成 <label>。简单示例:

<?php

echo form_label('What is your Name', 'username');
// Would produce:  <label for="username">What is your Name</label>

与其他函数类似,如果希望设置额外属性,可以在第三个参数中提交关联数组。

示例:

<?php

$attributes = [
    'class' => 'mycustomclass',
    'style' => 'color: #000;',
];

echo form_label('What is your Name', 'username', $attributes);
// Would produce:  <label for="username" class="mycustomclass" style="color: #000;">What is your Name</label>
form_submit([$data = ''[, $value = ''[, $extra = '']]])
参数:
  • $data (string) -- 按钮名称

  • $value (string) -- 按钮值

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

HTML input submit 元素

返回类型:

string

生成标准提交按钮。简单示例:

<?php

echo form_submit('mysubmit', 'Submit Post!');
// Would produce:  <input type="submit" name="mysubmit" value="Submit Post!">

与其他函数类似,如果希望设置自己的属性,可以在第一个参数中提交关联数组。 第三个参数允许向表单添加额外数据,如 JavaScript。

form_reset([$data = ''[, $value = ''[, $extra = '']]])
参数:
  • $data (string) -- 按钮名称

  • $value (string) -- 按钮值

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

HTML input reset 元素

返回类型:

string

生成标准重置按钮。使用方式与 form_submit() 相同。

form_button([$data = ''[, $content = ''[, $extra = '']]])
参数:
  • $data (string) -- 按钮名称

  • $content (string) -- 按钮标签

  • $extra (mixed) -- 要添加到标签的额外属性(可以是一个数组或一个字符串)

返回:

HTML button 元素

返回类型:

string

生成标准按钮元素。可以最少在第一个和第二个参数中传递按钮名称和内容:

<?php

echo form_button('name', 'content');
// Would produce: <button name="name" type="button">Content</button>

或者,你可以传入一个关联数组,其中包含你希望表单中包含的任何数据:

<?php

$data = [
    'name'    => 'button',
    'id'      => 'button',
    'value'   => 'true',
    'type'    => 'reset',
    'content' => 'Reset',
];

echo form_button($data);
// Would produce: <button name="button" id="button" value="true" type="reset">Reset</button>

如果希望表单包含一些额外数据,如 JavaScript,可以在第三个参数中将其作为字符串传递:

<?php

$js = 'onClick="some_function()"';
echo form_button('mybutton', 'Click Me', $js);
form_close([$extra = ''])
参数:
  • $extra (string) -- 在闭合标签之后追加的任何内容(按原样输出

返回:

HTML 表单闭合标签

返回类型:

string

生成闭合 </form> 标签。使用此函数的唯一好处是,它可以传递数据, 这些数据将被添加到标签下方。例如:

<?php

$string = '</div></div>';
echo form_close($string);
// Would produce:  </form> </div></div>
set_value($field[, $default = ''[, $html_escape = true]])
参数:
  • $field (string) -- 字段名称

  • $default (string) -- 默认值

  • $html_escape (bool) -- 是否对该值禁用 HTML 转义

返回:

字段值

返回类型:

string

允许设置 input 或 textarea 元素的值。必须通过函数的第一个参数提供字段名称。 第二个(可选)参数允许为字段值设置默认值。第三个(可选)参数允许禁用 HTML 转义, 以防你需要将此函数与 form_input() 等函数结合使用,从而避免双重转义。

示例:

<input type="text" name="quantity" value="<?= set_value('quantity', '0') ?>" size="50">

以上表单在首次加载时将显示 "0"。

set_select($field[, $value = ''[, $default = false]])
参数:
  • $field (string) -- 字段名称

  • $value (string) -- 要检查的值

  • $default (string) -- 该值是否也是默认值

返回:

'selected' 属性或空字符串

返回类型:

string

如果使用 <select> 菜单,此函数允许显示已选择的菜单项。

第一个参数必须包含选择菜单的名称,第二个参数必须包含每个项目的值, 第三个(可选)参数允许将项目设置为默认值(使用布尔值 true/false)。

示例:

<select name="myselect">
    <option value="one" <?= set_select('myselect', 'one', true) ?>>One</option>
    <option value="two" <?= set_select('myselect', 'two') ?>>Two</option>
    <option value="three" <?= set_select('myselect', 'three') ?>>Three</option>
</select>
set_checkbox($field[, $value = ''[, $default = false]])
参数:
  • $field (string) -- 字段名称

  • $value (string) -- 要检查的值

  • $default (string) -- 该值是否也是默认值

返回:

'checked' 属性或空字符串

返回类型:

string

允许显示复选框在提交时的状态。

第一个参数必须包含复选框的名称,第二个参数必须包含其值, 第三个(可选)参数允许将项目设置为默认值(使用布尔值 true/false)。

示例:

<input type="checkbox" name="mycheck[]" value="1" <?= set_checkbox('mycheck', '1') ?>>
<input type="checkbox" name="mycheck[]" value="2" <?= set_checkbox('mycheck', '2') ?>>
set_radio($field[, $value = ''[, $default = false]])
参数:
  • $field (string) -- 字段名称

  • $value (string) -- 要检查的值

  • $default (string) -- 该值是否也是默认值

返回:

'checked' 属性或空字符串

返回类型:

string

允许显示单选按钮在提交时的状态。此函数与上面的 set_checkbox() 函数相同。

示例:

<input type="radio" name="myradio" value="1" <?= set_radio('myradio', '1', true) ?>>
<input type="radio" name="myradio" value="2" <?= set_radio('myradio', '2') ?>>
validation_errors()

Added in version 4.3.0.

返回:

验证错误

返回类型:

array

返回验证错误。首先,此函数检查存储在 Session 中的验证错误。 要将错误存储在 Session 中,需要将 withInput()redirect() 一起使用。

返回的数组与 Validation::getErrors() 相同。 详细信息请参见 验证

备注

此函数不适用于 模型内验证。 如果要获取模型验证中的验证错误,请参见 获取验证错误

示例:

<?php $errors = validation_errors(); ?>
validation_list_errors($template = 'list')

Added in version 4.3.0.

参数:
  • $template (string) -- 验证模板名称

返回:

验证错误的渲染 HTML

返回类型:

string

返回验证错误渲染后的 HTML。

参数 $template 是验证模板名称。 详细信息请参见 自定义错误显示

此函数内部使用 validation_errors()

备注

此函数不适用于 模型内验证。 如果要获取模型验证中的验证错误,请参见 获取验证错误

示例:

<?= validation_list_errors() ?>
validation_show_error($field, $template = 'single')

Added in version 4.3.0.

参数:
  • $field (string) -- 字段名称

  • $template (string) -- 验证模板名称

返回:

验证错误渲染后的 HTML

返回类型:

string

以格式化的 HTML 形式返回指定字段的单个错误。

参数 $template 是验证模板名称。 详细信息请参见 自定义错误显示

此函数内部使用 validation_errors()

备注

此函数不适用于 模型内验证。 如果要获取模型验证中的验证错误,请参见 获取验证错误

示例:

<?= validation_show_error('username') ?>