CodeIgniter2+xajaxのシステムをCodeIgniter4へアップグレードするときにやったこと

この記事を書いた背景

PHPフレームワークのCodeIgniter2とPHPからJavaScriptを生成するxajaxフレームワークで作られたシステムをだいぶ放置していたのですが、とうとうサーバ側のPHPのバージョンアップやらなんやらでCodeIgniter4へアップグレードせざるをえない状況になりました。

ドキュメントにアップグレードガイドがあるだろうと思っていたら3系からの情報しかなかったorz

ということで自分で行ったときに手を入れた部分を情報として残しておきます。

変更が必要だった部分(今回のケースで)

  • 環境設定のファイル
  • コントローラ
  • モデル
  • ビュー

環境設定のファイル

.envかApp.php/Database.phpで環境設定を行います。

サーバによってはパラメータ指定が上手くいかない場合もあるので、下記の記事も参考にしていただければ。
参考:CodeIgniter4で「No input file specified.」が出た場合の対処

/.env

CI_ENVIRONMENT = development
app.baseURL = 'https://~/'
database.default.*

/app/Config/App.php

public $baseURL = 'https://~/';
public $defaultLocale = 'ja';
public $supportedLocales = ['ja'];
public $appTimezone = 'Asia/Tokyo';

/app/Config/Database.php

public $default = [];

コントローラ

namespace App\Controllers;
use App\Models\MyModel;

class MyController extends BaseController {
    $myModel = new MyModel();
    
    $result = json_decode( $myModel->myFunction( $this->request->getVar('someName') ) );
    foreach ($result as $row) {
        $row->columnname
    }

    return view('pathto/viewname', $data);

モデル

namespace App\Models;
use CodeIgniter\Model;
 
class MyModel extends Model {

    public function myFunction()
        $db = \Config\Database::connect();

        $sql =<<<_EOT_
        SQL
        _EOT_;
        $query = $db->query($sql);

        //単一行の場合
        $row = $query->getRow();
        return $row->columnname;

        $query = $db->query($sql, ['%' . $db->escapeLikeString( $value ) . '%']);

        //複数行の場合
        foreach( $query->getResult() as $row ) {
            $result[] = array(
              'columnname' => $row->columnname
            );
        }

        return json_encode( $result );

単一行であれば $db->getRow() で取得する
複数行であれば $db->getResult() で取得する

ビュー

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

<form name="formName" id="formName" onsubmit="myFunction(); return false;">
    <input type="text" id="someId" name="someName" value="" />
</form>

<div id="placeHolder" onClick="myFunction()"></div>
<script>
    function myFunction() {
      var formValues = document.forms['formName'];
      $.ajax({
        url: "<?php echo base_url('MyController/myFunction'); ?>",
        data: $(formValues).serialize(), //formデータのシリアライズ
        beforeSend: function (f) {
          $('#placeHolder').html('処理中...');
        },
        success: function (data) {
          $('#placeHolder').html(data);
        }
      })
    }
</script>

今回は、あとでWebAPIとしても使えるような構造にしたかったので、次の構造としました。

  • ビュー→コントローラ/メソッドをjQueryのajaxで呼び出す
  • モデル→コントローラはJSONでデータを受け渡す
  • コントローラ→ビューは受け取ったJSONをビューデータ(HTMLなど)に変換して生成してechoする
    • 変換部分は部分表示用のビューで分けた方が良い
  • コントローラ→ビューはechoされた結果をsuccessイベントで出力する

まとめ

他にも実現方法はたくさんあると思いますが、今回のシステムでは可能な限り既存のコントローラ/ライブラリ/ビューに手を加えたくなかったことから今回の様な実装となりました。

まとめると大したことないのですが、JavaScriptに苦手意識も強いせいか調査にだいぶかかってしまいました(苦笑)

どなたかのお役に立ちますように!

10年集客し続けられるサイトを、ワードプレスで自作する9つのポイント プレゼント

【最後まで読んでくれたあなたに】

あなたは、24時間365日、自分の代わりに集客し続けてくれるWebサイトを作りたい!と思ったことはありませんか?

私はこれまで500以上のWebサイトの構築と運営のご相談に乗ってきましたが、Webサイトを作ってもうまく集客できない人には、ある一つの特徴があります。

それは、「先を見越してサイトを構築していないこと」です。
Webサイトで集客するためには、構築ではなく「どう運用するか」が重要です。

しかし、重要なポイントを知らずにサイトを自分で構築したり、業者に頼んで作ってもらってしまうと、あとから全く集客に向いていないサイトになっていたということがよく起こります。

そこで今回、期間限定で
『10年集客し続けられるサイトをワードプレスで自作する9つのポイント』
について、過去に相談に乗ってきた具体的な失敗事例と成功事例を元にしてお伝えします。

・ワードプレスを使いこなせるコツを知りたい!
・自分にピッタリのサーバーを撰びたい!
・無料ブログとの違いを知りたい!
・あとで悔しくならない初期設定をしておきたい!
・プラグイン選びの方法を知っておきたい!
・SEO対策をワードプレスで行うポイントを知りたい!
・自分でデザインできる方法を知りたい!

という方は今すぐ無料でダウンロードしてください。

期間限定で、無料公開しています。

※登録後に表示される利用条件に沿ってご利用ください

コメントを残す