技術資料

CodeIgniter4 フォームヘルパー入門 ― HTMLフォーム生成の実践解説

作成日:2025.03.25

本記事では、CodeIgniter4 のフォームヘルパーを活用して、HTMLフォームを効率的に生成する手法を解説します。基本的な使い方から、CSRF対策や各種入力要素の生成、バリデーション連携の実践例まで、具体的なコードサンプルを交えながら分かりやすく説明しています。

フォームヘルパーとは

フォームを出力・処理する際に便利な関数群で構成されたヘルパーです。

コントローラーでフォームヘルパーをロードする

<?php

namespace App\Controllers;

class Form extends BaseController
{
    // フォームヘルパーのロード
    protected $helpers = ['form'];

    public function getNewform()
    {
        $data = [
            'title' => 'NEW FORM',
        ];
        // フォームのビューファイルを出力
        return view('form/newform',$data);
    }

}

ビューでフォームヘルパーを使ってHTML要素を出力する

フォームヘルパーには、form要素や input要素など、フォームを構成するHTML要素を出力するための関数が多数用意されています。

詳細はForm Helper — CodeIgniter 4.6.0 documentation を参照。

form_open

form要素の開始タグを出力します。

<?= form_open(
        'form/input',
        [
            'id' => 'element-id',
            'class' => 'element-class',
        ],
    );
?>

第一引数に action属性の値(URL)、第二引数に配列としてその他の属性を渡して使用します。

この関数を利用するメリットは、

  • CSRFフィルターが有効になっている場合、CSRFトークンを自動で出力してくれる
  • 設定した baseURL を元に、自動でURLを出力してくれる

という点です。

上記コードの出力は以下のようになります。

<form action="https://localhost/ci4/form/input" id="element-id" class="element-class" method="post" accept-charset="utf-8">
<input type="hidden" name="projectname_csrf_token" value="dd362ee5a1bcb7343e1ae954e8147e604c386c21de1ef2c74f87a992b392d7ee">

GETメソッドのフォームを出力したい場合は、第二引数に 'method' => 'GET' を追加すればOKです(※GETメソッドの場合は自動出力されません)。

form_open_multipart

ファイルアップロードフォームを実装するための enctype属性つきの form要素の開始タグを出力します。

※参考:PHPとPerlを使ったファイルアップロードとサーバー処理の基本

<?= form_open_multipart(
        'form/input',
        [
            'id' => 'element-id',
            'class' => 'element-class',
        ],
    );
?>

出力結果は以下の通り。

<form action="https://localhost/ci4/form/input" id="element-id" class="element-class" enctype="multipart/form-data" method="post" accept-charset="utf-8">
<input type="hidden" name="projectname_csrf_token" value="796450fd7ccb6aa5ec6bd305a664c080e86a123903692f569df693c3fde2690e">
form_close

form要素の閉じタグを出力するだけの関数です。

正直、</form> をそのまま書いた方が早いし分かりやすいですが、form_openform_open_multipart を使った場合は、form_close も使った方がコードとしての統一性があるかと思います。

<?= form_close(); ?>

出力結果は、

</form>
form_input

input要素を出力する関数です。

<?= form_input([
        'name' => 'input_name',
        'id' => 'input-id',
        'class' => 'input-class',
        'value' => 'input-value',
        'placeholder' => '名前を入力してください',
        'autocomplete' => 'off',
        'required' => 'required',
    ]);
?>

上記コードの出力結果は、

<input type="text" name="input_name" value="input-value" id="input-id" class="input-class" placeholder="名前を入力してください" autocomplete="off" required="required">

となります。

この関数に渡した値は自動的にHTMLエスケープ処理されて出力されるのが、この関数の利点です。※以降のHTML要素出力系関数も同様

type="text" 以外の input 要素を出力したい時は、引数の配列に 'type' => 'number', のように追加すればOK。

また、form_hiddenform_passwordform_upload など、専用の関数もいくつかあります。詳しくは公式ドキュメント参照。

form_textarea

textarea要素を出力するための関数です。

<?= form_textarea([
        'name' => 'textarea_name',
        'id' => 'textarea-id',
        'class' => 'textarea-class',
        'rows' => 5,
        'cols' => 200,
        'value' => 'textarea value',
        'placeholder' => 'テキストを入力してください',
    ]);
?>

出力結果は、

<textarea name="textarea_name" cols="200" rows="5" id="textarea-id" class="textarea-class" placeholder="テキストを入力してください">textarea value</textarea>
form_dropdown

select要素及びoption要素を出力するための関数です。

  • 第一引数: select要素のname属性
  • 第二引数: option要素の配列
  • 第三引数: selected属性をつけるoption要素の値
  • 第四引数: select要素のその他の属性の配列
<?php
	$options = [
		'osaka' => '大阪府',
		'kyoto' => '京都府',
		'hyogo' => '兵庫県',
		'nara' => '奈良県',
		'wakayama' => '和歌山県',
		'shiga' => '滋賀県',
	];
	echo form_dropdown(
		'select_name',
		$options,
		'nara',
		[
			'id' => 'select-id',
			'class' => 'select-class',
			'required' => 'required',
		]
	);
?>

上記コードの出力結果は、

<select name="select_name" id="select-id" class="select-class" required="required">
<option value="osaka">大阪府</option>
<option value="kyoto">京都府</option>
<option value="hyogo">兵庫県</option>
<option value="nara" selected="selected">奈良県</option>
<option value="wakayama">和歌山県</option>
<option value="shiga">滋賀県</option>
</select>
form_checkbox

チェックボックス出力用関数です。

<?= form_checkbox([
        'name' => 'checkbox_name',
        'id' => 'checkbox-id',
        'class' => 'checkbox-class',
        'value' => '1',
        'checked' => true,
    ]);
?>

出力結果は、

<input type="checkbox" name="checkbox_name" value="1" checked="checked" id="checkbox-id" class="checkbox-class">

ほぼ同じ使い方ができるラジオボタン用の form_radio関数もあります。

form_button

button要素出力用関数です。

<?= form_button([
        'type' => 'submit',
        'id' => 'button-id',
        'class' => 'button-class',
        'content' => 'フォーム送信',
    ]);
?>

出力結果は、

<button type="submit" id="button-id" class="button-class">フォーム送信</button>

フォーム入力のバリデーションエラー時などの出力

フォーム送信後にコントローラー側で入力のバリデーションを行ない、エラーがあった際に再びフォームのビューを出力する、というのはWebアプリケーションにおいて基本の処理です。

この時に、ユーザーが入力していた値をセッションに保持して表示するために役立つ関数もフォームヘルパーには用意されています。

set_value

input type="text"textarea要素などに、入力された値をそのまま出力するための関数です。

<?= form_input([
        'name' => 'input_name1',
        'value' => set_value('input_name1','default value', false),
    ]);
?>
<!-- または -->
<input type="text" name="input_name2" value="<?= set_value('input_name2','default value'); ?>">

これで前の画面で入力していた値を取得できます。

第二引数に値を渡すことで、デフォルト値の設定も行なえます。

第三引数を false に設定すると、HTMLエスケープを無効にします。form_input, form_textarea関数などの中で set_value を使う場合は、二重エスケープを避けるために false を指定します。

set_select

option要素に selected を指定するための関数です。

<select name="select_name">
	<option value="osaka" <?= set_select('select_name', 'osaka'); ?>>大阪府</option>
	<option value="kyoto" <?= set_select('select_name', 'kyoto'); ?>>京都府</option>
	<option value="hyogo" <?= set_select('select_name', 'hyogo'); ?>>兵庫県</option>
	<option value="nara" <?= set_select('select_name', 'nara' ,true); ?>>奈良県</option>
	<option value="wakayama" <?= set_select('select_name', 'wakayama'); ?>>和歌山県</option>
	<option value="shiga" <?= set_select('select_name', 'shiga'); ?>>滋賀県</option>
</select>
  • 第一引数: select要素の name属性を指定
  • 第二引数: option要素の value属性を指定
  • 第三引数: true を指定するとデフォルトで selected="selected" となる

この関数は、指定した値が送信されていた場合は、文字列selected="selected" を、送信されていない場合は空文字列を返します。

form_dropdown関数で select要素を出力する場合は、代わりに set_value を使って以下のようにします。

<?php
	$options = [
		'osaka' => '大阪府',
		'kyoto' => '京都府',
		'hyogo' => '兵庫県',
		'nara' => '奈良県',
		'wakayama' => '和歌山県',
		'shiga' => '滋賀県',
	];
	echo form_dropdown(
		'select_name',
		$options,
		set_value('select_name','nara',false),
		[
			'id' => 'select-id',
			'class' => 'select-class',
			'required' => 'required',
		]
	);
?>
set_checkbox

チェックボックスに checked を指定するための関数です。

<input type="checkbox" name="checkbox_name[]" value="1" <?= set_checkbox('checkbox_name[]', 1, true); ?>>
<input type="checkbox" name="checkbox_name[]" value="2" <?= set_checkbox('checkbox_name[]', 2); ?>>
  • 第一引数: name属性を指定
  • 第二引数: value属性を指定
  • 第三引数: true を指定するとデフォルトで checked="checked" となる

この関数は、指定した値が送信されていた場合は、文字列checked="checked" を、送信されていない場合は空文字列を返します。

ほぼ同じ使い方ができるラジオボタン用の set_radio関数もあります。

form_checkbox関数でチェックボックスを出力する場合に同様の挙動をさせるには、代わりに set_value を使って以下のようにします。

<?= form_checkbox([
        'name' => 'checkbox_name',
        'id' => 'checkbox-id',
        'class' => 'checkbox-class', 
        'value' => '1',
        'checked' => set_value('checkbox_name', '', false) === '1',
    ]);
?>

まとめ

set_value 等の、入力値をセッションに保持して再出力するための関数は非常に有用で、コードもシンプルになります。

一方、HTML要素を出力するための関数群には、メリットとデメリットがあり、使用するかどうかはプロジェクトによって検討が必要だと思います。

フォームヘルパーでHTML要素を出力するメリット
  • 動的に出力する値が自動的にエスケープされる
  • CSRFトークンが自動的に発行される(CSRFフィルターを有効にしている場合)
  • ベースURLの変更時にコードを変更する必要がない
フォームヘルパーでHTML要素を出力するデメリット
  • CodeIgniterのフォームヘルパーでしか使えないヘルパー関数を覚える必要がある

なにげにこの「CodeIgniterのフォームヘルパーでしか使えないヘルパー関数を覚える必要がある」というデメリットは無視できないと思っていて、特に複数人での開発時に、ビューファイルをデザイナーさんやコーダーさんが触る可能性がある場合には、学習コストを強いるのがかなり微妙な気がします。

ヘルパーを使わずにHTMLを直接記述した方が、何をしているのかが多くの人にとって一目でわかって良い気がします。

この記事を書いた人

※上が私です。

奈良市を拠点に、25年以上の経験を持つフリーランスWebエンジニア、阿部辰也です。

これまで、ECサイトのバックエンド開発や業務効率化システム、公共施設の予約システムなど、多彩なプロジェクトを手がけ、企業様や制作会社様のパートナーとして信頼を築いてまいりました。

【制作会社・企業様向けサポート】
  • 専任エンジニアのいない企業様に対するシステム面の不安を解消
  • 柔軟な契約形態や短納期での対応により、急なニーズにも迅速にサポート
  • システムの企画段階から運用まで、ワンストップでのサービスを提供

Webシステムの開発やサイト改善でお困りの際は、どうぞお気軽にご相談ください。小さな疑問から大規模プロジェクトまで、最適なご提案を心を込めてさせていただきます。

ぜひ、プロフィールWeb制作会社様向け業務案内一般企業様向け業務案内もご覧くださいね。

CodeIgniter 4 URIルーティング入門 ― 手動設定と改善版自動ルーティングの徹底比較

2025.03.22

本記事では、CodeIgniter 4 の URIルーティング機能について、手動ルーティングと自動ルーティング(改善版)の違いや特徴を徹底解説しています。各設定方法の具体例や、ルーティング設定確認の手順を詳しく説明し、開発効率やセキュリティ、柔軟性の観点から最適な選択肢を検討するための情報を提供します。

CodeIgniter PHP

Windows環境でのCodeIgniter 4.6.0 セットアップガイド―基本設定からセキュリティ対策まで

2025.03.20

CodeIgniter 4.6.0のXAMPP環境へのインストール手順を詳しく解説します。PHPの環境設定から、Composerによるインストール、.envファイルの設定、そしてCSRFやXSS対策などのセキュリティ設定まで、実運用を見据えた導入ガイドをお届けします。

CodeIgniter PHP

PHP 8.2対応で発生するCodeIgniter3の警告への対処方法

2025.01.30

PHP 8.2では動的プロパティの利用が非推奨となり、CodeIgniter3環境で警告が出る問題が発生します。本記事では、その警告を抑制するための一時的な方法を解説しています。

CodeIgniter PHP

CodeIgniter 3.xでComposerライブラリを使う設定方法

2023.04.30

CodeIgniter 3.xでComposerでインストールしたPHPライブラリを使うための設定方法を解説します。

CodeIgniter PHP

阿部辰也へのお仕事の依頼・お問い合わせ

軽いご相談もお気軽にどうぞ!

個人情報の取り扱いについて *必須 プライバシーポリシーをご確認いただき、同意いただける場合は「同意する」にチェックをしてください。

keyboard_double_arrow_up
TOP