JobeetでYii2フレームワークを学習する(6)

このページでは求人の登録ページを作成しながらYii2のウィジェット機能やバリデーションのついて学んでいきます。

入力項目の整理

データベースの求人テーブル(Job)は、Gii の CRUD生成ツールを使ってコードを生成した為、求人登録ページには全てのカラムが入力できる状態になっています。

上記フォームは以下の仕様に変更します。

Category IDデータベーステーブル Category の情報よりドロップダウンリストから選択できるようにする
Type契約条件を入力できるようにする
Company会社名を入力できるようにする
Logo会社のロゴ画像をアップロードできるようにする
Url会社のホームページURLを入力できるようにする
Position配属部署を入力できるようにする
Location勤務地を入力できるようにする
Description求人内容を入力できるようにする
How To Apply応募条件・方法を入力できるようにする
Token自動でユニークな文字列を保持するようにする
Is Public自動で1を登録するようにする
Is Activated自動で0を登録するようにする
Emailメールアドレスを入力できるようにする
Created At登録日時を自動で登録できるようにする
Updated At更新日時を自動で登録できるようにする

Yii2 のフォームの扱いについて

Yii2 のフォームは、モデルのインスタンスをActiveFormというクラスに入れて使います。
この為、新規登録する際もモデルから空のインスタンスを作成したものをActiveFormへ入れて使う形となります。

これにより、ActiveFormで作成したテンプレートは求人の登録・更新で使いまわす事ができます。

入力フォームの作成

各入力フォームを整理した仕様にあわせて修正します。

Category ID

ActiveFormのdropDownListメソッドを使います。

dropDownListへ渡すデータは配列になる為、ArrayHelperクラスを使用して Categoryのデータを以下のように配列化します。

views/job/_form.php
<?php

use app\models\Category;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $model app\models\Job */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="job-form">

    <?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'category_id')->dropDownList(ArrayHelper::map(Category::find()->all(), 'id', 'name')) ?>
・・・省略
補足

ArrayHelper::mapは、配列のデータだけでなく、optionタグのvalueとなる値を第二引数、表示する値を第三引数をしてカラム名を指定する必要があります。

Type

Typeは入力必須項目になっていませんので、以下のように rules メソッドを修正しいます。

models\Job.php
・・・省略
    public function rules()
    {
        return [
            // typeを追加
            [['category_id', 'type', 'company', 'position', 'location', 'description', 'how_to_apply', 'email'], 'required'],
・・・省略

Logo

Logoは会社のロゴ画像をアップロードする機能を追加します。

ファイルのアップロードは画像が指定されている事の検証(バリデーション)が必要になります。

バリデーションがモデルへ定義する為、Jobモデルへ以下のように修正します。

models/Job.php
・・・省略
class Job extends \yii\db\ActiveRecord
{
    // 追加
    var $imageFile = '';
・・・省略

次にファイルにアップロードしたファイルを保存する処理をコントローラーに記述します。

controllers/JobController.php
・・・省略
    public function actionCreate()
    {
        $model = new Job();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
            $model->imageFile->saveAs('uploads/' . $model->token . '.' . $model->imageFile->extension);
            
            return $this->redirect(['view', 'id' => $model->id]);
        }

        return $this->render('create', [
            'model' => $model,
        ]);
    }
・・・省略

上記の処理ではファイル名をTokenの値を指定しています。

Tokenのこの後の処理についてはTokenの処理と同時に行います。

Token

Tokenは求人を新規保存時にユニークな文字列を生成して保存する形となります。

Yii2のモデルはWebアプリケーションの一連の処理に対し割り込み処理を行うフックが多数あります。

今回では保存前にユニークな値をTokenに設定する為のbeforeSaveメソッドに以下のように追加しいます。

models/Job.php
・・・省略
    public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {
            if ($this->isNewRecord) {
              do {
                $this->token = Yii::$app->security->generateRandomString();
                $tokenExists = self::findOne(['token' => $this->token]);
              } while ($tokenExists);
              $this->logo = $this->token . '.' . $this->imageFile->extension;
            }
            return true;
        }
        return false;
    }
・・・省略

上記処理では新規登録時にランダムな文字列を発行し、同じTokenのレコードが有れば繰返し処理を行います。

同じ値が無ければ、会社のロゴ画像のファイル名を設定して割り込み処理を終了しています。

テンプレートファイルの以下のTokenの入力フィールドも忘れずに消しましょう。

<?= $form->field($model, 'token')->textInput(['maxlength' => true]) ?>

Url

Urlは入力必須及びURLて正しい書式であるか検証する必要があります。

models/Job.php
・・・省略
    public function rules()
    {
        return [
            [['category_id', 'type', 'url', 'company', 'position', 'location', 'description', 'how_to_apply', 'email'], 'required'],
            [['url'], 'url'],
・・・省略

Is Public

この値は登録時、1に固定するので、前述の beforeSaveに処理を入れます。

model/Job.php
・・・省略
        if (parent::beforeSave($insert)) {
            if ($this->isNewRecord) {
              $this->is_public = 1;
              do {
・・・省略

テンプレートファイルの入力フィールドも忘れずに消します。

Is Activated

この値は登録時、0に固定するので、Is Public と同じ要領で処理を入れます。

model/Job.php
・・・省略
        if (parent::beforeSave($insert)) {
            if ($this->isNewRecord) {
              $this->is_public = 1;
              $this->is_activated = 0;
              do {
・・・省略

テンプレートファイルの入力フィールドも忘れずに消します。

Email

正しいメールアドレスか rules メソッドへ定義を追加します。

models/Job.php
・・・省略
        return [
            [['email'], 'email'],
・・・省略

Expires At

このカラムは求人を表示する期限を指定し、 Jobeetでは登録から30日間表示するルールとします。

model/Job.php
・・・省略
              $this->is_activated = 0;
              $this->expires_at = date('Y-m-d H:i:s', time() + 86400 * 30);
              do {
・・・省略

テンプレートファイルの入力フィールドも忘れずに消します。

Created At、Updated At

データベースのレコードの管理で登録日時及び更新日時はビヘイビアにて指定します。

modesl/Job.php
・・・省略
use yii\behaviors\TimestampBehavior;
use yii\db\Expression;
・・・省略
    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'createdAtAttribute' => 'created_at',
                'updatedAtAttribute' => 'updated_at',
                'value' => new Expression('NOW()'),
            ],
        ];
    }
 ・・・省略

テンプレートファイルの入力フィールドも忘れずに消します。

タイトルとURLをコピーしました