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

求人一覧の作成

求人一覧は、GiiのCRUD Generatorの機能を使って、一覧を開発します。

CRUD Generatorツールの実行

以下のプロパティにてCRUD Generatorを実行します。

Model Class app\models\Job
Search Model Class app\models\JobSearch
Controller Class app\controllers\JobController
View Path @app/views/job
その他 Enable Pjaxのみチェック

表示確認

以下URLより求人データの一覧表示を確認します。

http://yii-jobeet.takeho.com/job/

表示データの修正

一覧では各カテゴリ毎に新しい求人を最大で5件表示するように修正します。

JobControllerの修正

JobControllerにカテゴリ毎にデータを取得するように修正します。

単に求人のデータを取得する場合は $jobs へデータベースからの戻りを入れますが、今回はCategoryテーブルからリレーションの関係にあるJobテーブルへアクセスする形となりますので、$categoryへの戻りとなります。

controllers/JobController.php
・・・省略
    public function actionIndex()
    {
        $categories = \app\models\Category::find()
            ->joinWith('jobs', true)
            ->where(['<>', 'job.category_id', ''])
            ->andWhere(['>', 'job.expires_at', date('Y-m-d H:i:s', time())])
            ->all();

        return $this->render('index', [
            'categories' => $categories,
            'perpage' => 5,
        ]);
    }
・・・省略

Viewの修正

以下のようにViewを修正します。

views/job/index.php
<?php

use yii\data\ActiveDataProvider;
use yii\helpers\Html;
use yii\helpers\Url;
use yii\widgets\ListView;
/* @var $this yii\web\View */
/* @var $searchModel app\models\JobSerch */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'Jobs';
$this->params['breadcrumbs'][] = $this->title;
$this->registerCssFile("@web/css/jobs.css", [
  'depends' => [\app\assets\AppAsset::className()],
], 'css-jobs');
?>
<div id="jobs">
  <?php foreach($categories as $category): ?>
    <div>
      <div class="category">
        <div class="feed">
          <a href="">Feed</a>
        </div>
        <h1><?php echo $category->name ?></h1>
      </div>
      <?php
        $dataProvider = new ActiveDataProvider([
          'query' => $category->getJobs(),
          'pagination' => [
              'pageSize' => $perpage,
          ],
          'sort' => [
              'defaultOrder' => [
                  'category_id' => SORT_ASC,
                  'created_at' => SORT_DESC,
              ]
          ],
        ]);
      ?>
      <table class="jobs">
        <tbody>
          <?php echo ListView::widget([
            'dataProvider' => $dataProvider,
            'itemView' => '_list',
            'layout' => "{items}",
          ]);?>
        </tbody>
      </table>
    </div>
  <?php endforeach; ?>
</div>

ItemViewの作成

ListView::widgetは、データベースから取得したデータを一覧表示する為のテンプレートウィジェットライブラリになり、各レコードのデザインテンプレートは、itemViewの引数にて別ファイルで管理する事ができます。

ここでは、itemViewの値に設定されている_list.phpを追加し以下のように編集します。

view/job/_list.php
<?php
use yii\helpers\Html;
use yii\helpers\Url;
?>
    <tr>
      <td class="location"><?php echo $model->location ?></td>
      <td class="position">
        <?php echo Html::a($model->position, Url::toRoute(['job/view', 'id' => $model->id])) ?>
      </td>
      <td class="company"><?php echo $model->company ?></td>
    </tr>

表示確認

以下のURLで表示を確認します。

http://yii-jobeet.takeho.com/job

URLルーティング

一覧画面がある程度、仕上がったところで、求人の詳細ページへ遷移してみましょう。

この時、ブラウザのアドレスバーのURLは以下のようになっています。

http://yii-jobeet.takeho.com/job/view?id=1

上記URLからは何のページは想像する事はできません。

http://yii-jobeet.takeho.com/job/sensio-labs/paris-france/1/web-developer

しかし、上記URLであれば Jobeet についての知識がなくても、ページをみなくても、Sensio Labs がフランスのパリで Web 開発者を探しているということがわかります。

Tips

わかりやすい URL はユーザーに情報を伝える上で重要となります。メールのなかで URL をコピペしたり、検索エンジンに合わせて自分の Web サイトを最適化するのに役立ちます。

ルーティングのルールの内訳

http://yii-jobeet.takeho.com/job/sensio-labs/paris-france/1/web-developer

URLからページの内容が理解できるようにする為、上記URLを参考にルーティング規則を定義します。

http://yii-jobeet.takeho.com/job固定値
sensio-labs会社名
paris-france勤務地
1求人ID(Jobテーブルのプライマリキー)
web-developer職種

上記の内訳より固定値のjob(コントローラー)へアクセス時のルーティング規則を定期する方向で対応するのが望ましいと判断する事ができます。

ルーティング規則の追加

ルーティング規則の追加は設定ファイルにて以下のように定義する事ができます。

config/web.php
$config = [
・・・省略
    'components' => [
・・・省略
        'urlManager' => [
            'enablePrettyUrl' => true,
            'showScriptName' => false,
            'rules' => [
                '/' => 'job/index',
                'job/index' => 'job/index',
                '/job/<company>/<location>/<id>/<position>' => '/job/view',
            ],
        ],
・・・省略

リンクの変更

求人一覧からのリンクを修正します。

views/job/_list.php
<?php
use yii\helpers\Html;
use yii\helpers\Url;
?>
<tr>
  <td class="location"><?php echo $model->location ?></td>
  <td class="position">
    <?php echo Html::a($model->position, Url::toRoute(['job/'.str_replace(' ', '-', $model->company).'/'.str_replace(' ', '-', $model->location).'/'.$model->id.'/'.str_replace(' ', '-', $model->position)])) ?>
  </td>
  <td class="company"><?php echo $model->company ?></td>
</tr>

コントローラの修正

URL引数の取得方法を変更します。

controllers/JobController.php
class JobController extends Controller
{
・・・省略
    public function actionView()
    {
        $attr = explode('/', Yii::$app->request->getPathInfo());
        return $this->render('view', [
            'model' => $this->findModel($attr[3]),
        ]);
    }
・・・省略

上記のコードにてリクエストパスの情報を取得してIDを抽出している事が確認できます。

これで新しいルーティング規則にて求人詳細ページへアクセスできる事が確認できます。

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