EC-CUBE4 独自プラグイン開発　③今後も使えそうなTips

# 概要
独自プラグインの開発を通して学んだことをまとめました。
別の記事として書いた場合もあります。タイトルにピンときたら読んでみてください。

# 目次
[EC-CUBE4 独自プラグイン開発　①環境構築手順](https://qiita.com/haruna-nagayoshi/items/948b196cf4f5186641e9)
[EC-CUBE4 独自プラグイン開発　②独自プラグイン開発Tips](https://qiita.com/haruna-nagayoshi/items/27108c75eaf9511f3524)
EC-CUBE4 独自プラグイン開発　③今後も使えそうなTips　(本記事)

# 今後も使えそうなTips
## .gitkeepと.gitignoreの違いと使い分け
[空のディレクトリを維持するための、 .gitkeep と .gitignore の使い分け](https://qiita.com/ndxbn/items/f124d2b183b60cb074e2)
PhpStormを使う都合上`.gitignore`はよく使うけど、`gitkeep`についてはよく知らなかったので、上記記事が参考になりました。

## カラーピッカーで色を選択し、#付き16進数を登録する
カラーピッカーから色を選択し、その色の#付き16進数をDBに登録・更新するという機能を管理画面側に作りました。
そのときに利用したライブラリがこちらです。
[jQuery MiniColors](https://labs.abeautifulsite.net/jquery-minicolors/)

EC-CUBE4の管理画面はbootstrapで作られているので、とても相性がよかったです。
他のプロジェクトで似たような機能を作るときも使えそう。

### サンプル
実際のコードはこんな感じ。

```javascript
$('.color-picker').minicolors({
  position: 'bottom right',
  theme: 'bootstrap',
  swatches: [
    '#FFFFFF',
    '#ff0000',
    '#FFFF00',
    '#00FF00',
    '#00FFFF',
    '#0000FF',
    '#FF00FF',
    '#C0C0C0',
    '#800000',
    '#808000',
    '#008000',
    '#008080',
    '#000080',
    '#800080',
    '#808080',
    '#000000',
  ],
})
```

```html
<input type="text" class="color-picker form-control" size="7">
```
`position`：入力フォームを基準としたカラーピッカーの表示位置
`theme`：bootstrapを利用している場合は`bootstrap`を指定する。そうでない場合は`default`でよいと思います(未検証)。
`swatches`：カラーパレットを表示する。いくつでも、#付き16進数で指定すれば追加できます。公式ページに例があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253650/2e0bf3ea-f928-b9d2-6ab8-72fa2cd7544d.png)

## TCPDFで座標を使ってPDFを出力する
EC-CUBE4ではPDFを出力するためのライブラリとして、TCPDFが使われています。(受注編集ページの納品書出力機能を参照) 「PHP PDF」で検索するとすぐ出てくるので定番のライブラリらしい。

別記事に使い方をまとめました。
[TCPDFで座標を使ってPDF出力](https://qiita.com/haruna-nagayoshi/items/85c172cf7c0a68e0c092)

PDF出力機能を実装したことも見たことも無かったので、勉強になった。最初はx,y座標に抵抗があったけど線や表、画像を描画するだけなら座標を使うほうが簡単だと思います。

## Excelに文字と画像を書き込んでExcelとして出力する
[PhpSpreadsheetでExcelを読み書きしてExcelとしてダウンロードする](https://qiita.com/haruna-nagayoshi/items/bccc4b844e909608f514)

PHPExcelやPhpSpreadsheetについてはたくさんの方が記事を書いているので何番煎じって感じですが...
ライブラリの使い方そのものより、ラッパークラスを作る利点を実感できたのがよかったです。
今後PhpSpreadsheetを使う機会があれば自分の記事を参照するだろうし、もし新たな機能を見つけたら追記します。

## Blob型カラムに保存した画像をHTML(twig)に出力する
[PHPでblob型でデータベースに保存した画像を出力する](https://qiita.com/haruna-nagayoshi/items/1a4884273b0ac437a09a)

`URI Scheme` `Data URI scheme`という概念が知れました。
今後この記事が役立つかどうかは怪しかった...ですが、次のZipダウンロードの段でもバイナリ画像を使うことになったので結果的に役立ちました。

## 複数のファイルをZipにまとめてダウンロード
[PHPで複数ファイル(blob型のファイル含む)をZipダウンロードする方法](https://qiita.com/haruna-nagayoshi/items/971b3d73be9931e25bbd)

この記事を書くためにいろいろ調べていたら、IEでダウンロードしたファイルの名前が文字化ける現象の対処方法を偶然知れて、開発に取り込めたのでよかったです。
Zip・Excel・PDFなどファイルの種類に限らず、日本語を含むファイル名のファイルをIEでダウンロードする際には、上記記事で説明している対策が必要だと思います。

## SymfonyでDQLを拡張してMysqlの関数を使えるようにする
キーワードで検索時に「半角・全角、小文字・大文字、かな・カナを区別しない」ように、照合順序を指定することを求められました。
そのため、DQLで[MySQLのCOLLATE関数](https://dev.mysql.com/doc/refman/5.6/ja/charset-collate.html)を利用したかったのですが、自分で拡張する必要がありました。
[SymfonyでDQLを拡張してMysqlの関数を使えるようにする](https://qiita.com/haruna-nagayoshi/items/5a9f08e3b337bf36c227)

## エラーとその解決策をメモし、共有する
今回の私のように、周りの誰も知らないツールやライブラリを使うときは、「エラーとその解決策をメモしておく」「何か分かったら共有し合う」というのが重要でした。
とくに、序盤はエラーの解決策を忘れてしまうことが多くて自分のメモがとても役に立ちました。

Qiitaの記事を短期間にこんなに書くのは初めてですが、開発と並行して書いておくと、「たしかあの記事にリンク貼っておいたよなー」とか「このエラーの対策方法なんだっけ」ってときに記事が辞書代わりになりました。

## MySQL カラムの照合順序の確認方法

```
# 文字コードを確認する
SHOW VARIABLES LIKE "chara%";

# UTF8に変更する
SET character_set_database=utf8;

# 照合順序を確認する
SHOW FULL COLUMNS FROM `{table_name}`;
```

ほとんど使わなさそう・・・。

## SQLにおいて `NULL` と `NULL` の比較はtrueではない
PHPなどプログラム言語上においては、「NULL===NULL」(※PHPでの厳密な比較式)はtrueです。

しかし、SQLにおいては、三値論理を用いているため、NULL同士の比較はtrueにはなりません。
また、NULLに比較演算子を適用した結果は必ず `unknown` というtrueでもfalseでもない値になり、NOT IN句などを使った場合に直感に反する挙動を生むことがあります。

これについては、アプリケーションの実装が粗方終わってから調べました。
後述する[参考記事](http://mickindex.sakura.ne.jp/database/db_3vl.html)に記載されているSQLをまんま書いていて、実装当時この挙動を知らなくてめちゃくちゃはまりました。

```sql
SLECT * 
FROM Table1
WHERE x NOT IN (SELECT y FROM Table2);
```

本来は設計段階からNULLを許容することを避けるべきですが、覚えておけば悩まずにすむ場面がこれからもありそうです。
>DB設計の段階においては、全力をもって NULL を追い出してください。可能な限りの列に NOT NULL制約をつけてください。

### 参考記事
- [3値論理 ―― 神のいない論理](http://mickindex.sakura.ne.jp/database/db_3vl.html)
   - 『達人に学ぶSQL徹底指南書』など書籍をいくつか出版されているミックさんの記事です。
- [NULL 値を含む項目の結合が行えない理由で、期待のSELECT結果を得られない（MSSQL）](https://ja.stackoverflow.com/questions/41928/null-値を含む項目の結合が行えない理由で-期待のselect結果を得られない-mssql)
  

# おわり
得た知識をどこかに共有する、っていう習慣をわずかながら身に付けられました。

今後はEC-CUBE4に関連した記事を書くことはないと思います。
追記することはあるかも。