今回の更新内容
- CSVエクスポート/インポート機能を追加しました。
- phpのexec関数を使用してbakeや各タスクを画面から実行する画面を作成しました。
- EC2にデプロイして動作確認しました。
CSVエクスポート機能について
CakePHP3用に開発されたcakephp-csvviewというプラグインを使用しました。ざっくりと以下のような仕様。
- ファイル項目、GoogleMap項目、WYSIWYGテキストエリア項目は非対応
- 選択肢項目は選択肢の名称を出力
- 外部キー項目は外部テーブルのidではなく画面表示に使用するカラムの値を出力
- エンコーディングはUTF-8
- 行末の改行コードはCR+LF
文字コードがUTF-8のため.csv拡張子がExcelと関連付いてる場合はダブルクリックから開いてしまうと文字化けするので、編集にはCassavaのようなCSV専用のエディタを使うと良いと思います。
どこかでCSVはSJISじゃないとダメみたいなこと見たような記憶があるので後でSJISにプログラム修正するかも?
CSVインポート機能について
エクスポート機能で出力したCSVファイルがそのまま使えることが望ましいので以下のような感じになりました。
- エクスポート側で非対応な項目(ファイル、GoogleMap、WYSIWYG)は同様に非対応
- 外部キー項目は出力された名称を元にIDを検索し見つかったidをセット
- サンプルのestatesの場合usersテーブルのnameカラムを完全一致検索し、見つかった場合はそのidをセット、見つからなかった場合はとりあえずnullをセット。エラーにはしない
- 選択肢項目は選択肢の名称が改行区切りで入っているため改行をデリミタとした配列に変換し、key,valueを入れ替えたコード定義でvalueを元にkeyを取得
- ヘッダー行のチェックを実施
- ID列が入力されてる場合は指定のIDで検索して対象を更新、未入力の場合は新規登録
- 全体をtry catchし何かあったら全部例外にぶん投げる(^q^)
- トランザクションを開始
- CSVの全件の処理が終わった後でコミット
- catch内でロールバック
CSVの入力データを管理画面の編集フォームと同じようなデータに変換する処理がちょっと汚くなってしまいました。コントローラークラス内のインポート処理も後で見直そうと思います。。
phpのexec関数を使用してbakeや各タスクを画面から実行する画面を作成
bake処理などをブラウザから行える仕組みを作ってみました。成果物となるCakePHP3とは切り離したいのでネイティブなPHPでwebroot直下に作成しました。
不特定多数のユーザーが使えちゃうと良くないのと、開発環境ではPHPのビルトインサーバーを使用しているのでPHPのプログラム内でBASIC認証を行っています。
参考:PHPを利用したBasic認証の仕組み – Qiita
以下の画面で管理者ログインに使用するアカウントや各種bake処理を行うことが可能です。各ボタンをクリックしたときにexecで実行されるコマンドや、標準出力、標準エラー出力がテキストエリアに表示されるようになっています。
最初の画面から「config、SQL生成ツール」というボタンをクリックした先の画面です。作成したい機能の詳細をここで設定します。
「行追加」ボタンをクリックすると末尾に新規の行を追加します。「行削除」ボタンをクリックすると末尾の行を削除します。途中の行追加/削除は今はできないですがそのうち対応しようと思います。
画面下部の「configファイル生成」ボタンをクリックすると右隣にconfigファイルとSQLファイルをダウンロードするボタンが出てきます。
2回目以降はダウンロードした2ファイルを「configファイルとsqlファイル読み込み」から読み込んであげることで前回の状態を引き継いでファイルの編集が可能となっています。
EC2にデプロイして動作確認
最初Amazon Linux 2で作ってたんですが何が原因なのか403エラーが収まらなかったので、Amazon Linuxで作り直しました(^q^
来年Amazon LinuxのEOLが来るのでそろそろAmazon Linux 2に慣れないといけない;;
以下のコマンド操作を見てわかる通りセキュリティに問題のある操作があります。一応セキュリティグループ設定でマイIPのみ許可とかしてるから大丈夫かな…?( ・`ー・´)
execで実行するコマンドの方は一応簡単な入力値チェックとか入れてるので大丈夫かも???( ・`~・´)
各設定ファイルは普段ならviで開いて編集するのですが、今回はsedを使ってできるだけ操作を減らしてみました。sed難しくて5%くらいしか理解できてません。
# apache install yum -y install httpd24 httpd24-tools chkconfig httpd on # php install yum -y install php72 php72-cli php72-common php72-devel php72-intl php72-php-gd php72-mbstring php72-mysqlnd php72-pdo php72-xml # mysql install yum -y install mysql57-server chkconfig mysqld on sed -i -e "/^\[mysqld_safe\]$/i character-set-server=utf8" /etc/my.cnf echo '' >> /etc/my.cnf echo '[client]' >> /etc/my.cnf echo 'default-character-set=utf8' >> /etc/my.cnf /etc/init.d/mysqld start # git,composer install yum -y install git curl -sS https://getcomposer.org/installer | php mv composer.phar /usr/local/bin/composer sed -i -e "/^export PATH$/i PATH=\/usr\/local\/bin:\$PATH\n" ~/.bash_profile source ~/.bash_profile # visudo sed -i 's/Defaults !visiblepw/Defaults visiblepw/' /etc/sudoers echo "apache ALL=NOPASSWD: ALL" | EDITOR='tee -a' visudo >/dev/null # cakephp3 install cd /var/www git clone https://[git_username]:[git_password]@github.com/imo-tikuwa/@@@@@@@@@@@@.git cake cd cake rm -fR .git/ rm -fR .settings/ rm -f .project rm -f .buildpath cd cake_app yes | composer install chmod +x /var/www/cake/cake_app/bin/cake # apache setting sed -i '/^DocumentRoot "\/var\/www\/html"$/s/^/# /g' /etc/httpd/conf/httpd.conf sed -i '/^ DirectoryIndex index.html$/s/^/# /g' /etc/httpd/conf/httpd.conf sed -i -e '/^# DocumentRoot "\/var\/www\/html"$/a DocumentRoot "\/var\/www\/cake\/cake_app\/webroot"\n<Directory "\/var\/www\/cake\/cake_app\/webroot">\n Options FollowSymLinks\n AllowOverride All\n Require all granted\n</Directory>' /etc/httpd/conf/httpd.conf sed -i -e '/^# DirectoryIndex index.html$/a DirectoryIndex index.html index.php' /etc/httpd/conf/httpd.conf /etc/init.d/httpd start
- php install
- 不要なのあるかも。intlとxmlは必須でした。
- mysql install
- インストール後、設定をutf-8にそろえる
- visudo
- 「Defaults !visiblepw」を「Defaults visiblepw」に置換
- apacheユーザーでsudoを使用可能に設定
- cakephp3 install
- プロジェクトクローンしてすぐ切断、composer installはrootでやってしまう(^-^
- rootで実行すると先頭で注意されました。
- git cloneのコマンドはユーザー名とパスワードをこんな感じで入れるとワンライナーなコマンドでいけるらしい
- プライベートなリポジトリなのでその辺マスクしました。
- ヒストリーに残っちゃうような気がするので、やらない方が良いかも。
- プロジェクトクローンしてすぐ切断、composer installはrootでやってしまう(^-^
- apache setting
- 今回は新規にEC2インスタンスを立てての手順のためバーチャルホストの設定などは行わずhttpd.confを直接編集しました。