EC-CUBE3でサイトを構築することになり色々学んでいるのですが、どうもこいつドキュメントが少ないですね。今でもこそ開発ドキュメントはある程度充実しましたが、始めた当初は間違いだらけのスカスカのドキュメントしかなく、「これ、ほんまに正式リリースされとるんやろか」と不審に思った程です。現時点では結構内容が充実してありがたいのですが、それでもかゆいところがかけないことがあり、どこかに読めていないドキュメントがあるのではと不安になります。
EC-CUBE開発ドキュメント – http://ec-cube.github.io/
そんな中、1記事サイズのちょうどいい感じのノウハウを見つけましたので記載しておきます(ちなみにこの記事は休みにお家でダラダラテレビ見ながら書いております)。
EC-CUBE3はPHPのフレームワーク「Silex」で構築されており、Silexは「Symfony2 Components」を用いて構築されています。判らないことがあれば色んなドキュメントを転々としながら情報収集をします。手間ではありますが最近はだいたいこんなもんですし、それで済むなら寧ろ有り難いぐらいです。問題はEC-CUBE3独自の機能です。当然EC-CUBE3のドキュメントにしか載っていない訳ですがフォローされていないことも…。
便利な静的メソッド
なんかあるやろと思い探すと当然ありました。Googleで検索しても意外と言及している記事が出てこないので、知らん人もいるのではないでしょうか。
use Eccube\Util\Cache;
use Eccube\Util\EntityUtil;
use Eccube\Util\Str;
use Eccube\Common\Constant;
$outputValue = function ($title, $name, $value, $note)
{
ob_start();
if (is_object($value)) {
echo get_class($value);
} else {
var_dump($value);
}
$result = ob_get_clean();
echo sprintf("■%s\n%s : %s %s\n\n", $title, $name, $result, (!empty($note) ? "// ".$note : ""));
};
// soft_delete filter を有効にする
$config = $app['orm.em']->getConfiguration();
$config->addFilter("soft_delete", '\Eccube\Doctrine\Filter\SoftDeleteFilter');
$app['orm.em']->getFilters()->enable('soft_delete');
$productEntity = $app['eccube.repository.product']->find(1);
$memberEntity = $productEntity->getCreator();
$outputValue("商品エンティティから削除フラグが1のメンバーを取得",
"getMember", $memberEntity, "");
$rtn = EntityUtil::isEmpty($memberEntity);
$outputValue("LAZY loading したエンティティの有無をチェックする1",
"EntityUtil::isEmpty", $rtn, "無=true");
$rtn = EntityUtil::isNotEmpty($memberEntity);
$outputValue("LAZY loading したエンティティの有無をチェックする NOT",
"EntityUtil::isNotEmpty", $rtn, "有=true");
$rtn = EntityUtil::dumpToArray($productEntity);
$outputValue("エンティティのプロパティを配列で返す",
"EntityUtil::dumpToArray", $rtn, "");
$rtn = Str::random(16);
$outputValue("厳密にランダム文字列を生成する",
"Str::random", $rtn, "ランダム文字列");
$rtn = Str::quickRandom(16);
$outputValue("ランダム文字列を生成する",
"Str::quickRandom", $rtn, "ランダム文字列");
$rtn = Str::convertLineFeed("一行目\n二行目", "\r\n");
$outputValue("改行コードの変換",
"Str::convertLineFeed", $rtn, "変換後の文字列");
$rtn = Str::characterEncoding("ユーティーエフエイト", array('SJIS', 'EUC-JP', 'UTF-8'));
$outputValue("文字コードの判定1",
"Str::characterEncoding", $rtn, "文字コード");
$rtn = Str::characterEncoding("ユーティーエフエイト", array('SJIS', 'EUC-JP'));
$outputValue("文字コードの判定2",
"Str::characterEncoding", $rtn, "ヒットしない場合");
$rtn = Str::ellipsis("あいうえお", 4, "...");
$outputValue("指定した文字列以上ある場合、「...」を付加する1",
"Str::ellipsis", $rtn, "設定文字数より長い場合");
$rtn = Str::ellipsis("あいうえお", 5, "...");
$outputValue("指定した文字列以上ある場合、「...」を付加する2",
"Str::ellipsis", $rtn, "設定文字数と同じ場合");
$rtn = Str::ellipsis("あいうえお", 6, "...");
$outputValue("指定した文字列以上ある場合、「...」を付加する3",
"Str::ellipsis", $rtn, "設定文字数より短い場合");
$rtn = Str::timeAgo("2016/12/01");
$outputValue("現在からの経過時間を書式化する",
"Str::timeAgo", $rtn, "便利ですね");
$rtn = Str::isBlank("");
$outputValue("変数が空白かどうかをチェックする1",
"Str::isBlank", $rtn, "空文字");
$rtn = Str::isBlank("0");
$outputValue("変数が空白かどうかをチェックする2",
"Str::isBlank", $rtn, "0(文字列)");
$rtn = Str::isBlank(0);
$outputValue("変数が空白かどうかをチェックする3",
"Str::isBlank", $rtn, "0(数値)");
$rtn = Str::isBlank(null);
$outputValue("変数が空白かどうかをチェックする4",
"Str::isBlank", $rtn, "NULL");
$rtn = Str::isBlank(" ");
$outputValue("変数が空白かどうかをチェックする5",
"Str::isBlank", $rtn, "半角半角");
$rtn = Str::isBlank(" ");
$outputValue("変数が空白かどうかをチェックする6",
"Str::isBlank", $rtn, "全角空白");
$rtn = Str::isBlank("\t");
$outputValue("変数が空白かどうかをチェックする7",
"Str::isBlank", $rtn, "タブ");
$rtn = Str::isBlank("\n");
$outputValue("変数が空白かどうかをチェックする8",
"Str::isBlank", $rtn, "リターン");
$rtn = Str::isBlank("\r");
$outputValue("変数が空白かどうかをチェックする9",
"Str::isBlank", $rtn, "改行");
$rtn = Str::isBlank("\0");
$outputValue("変数が空白かどうかをチェックする10",
"Str::isBlank", $rtn, "NULバイト");
$rtn = Str::isBlank("\x0B");
$outputValue("変数が空白かどうかをチェックする11",
"Str::isBlank", $rtn, "垂直タブ");
$rtn = Str::isNotBlank("");
$outputValue("変数が空白かどうかをチェックする NOT",
"Str::isNotBlank", $rtn, "空文字");
$rtn = Str::trimAll(" あ い う ");
$outputValue("両端にある全角スペース、半角スペースを取り除く1",
"Str::trimAll", $rtn, "半角スペース");
$rtn = Str::trimAll(" あ い う ");
$outputValue("両端にある全角スペース、半角スペースを取り除く2",
"Str::trimAll", $rtn, "全角スペース");
$rtn = Str::trimAll("\tあ\tい\tう\t");
$outputValue("両端にある全角スペース、半角スペースを取り除く3",
"Str::trimAll", $rtn, "タブ");
$rtn = Str::trimAll("\nあ\nい\nう\n");
$outputValue("両端にある全角スペース、半角スペースを取り除く4",
"Str::trimAll", $rtn, "リターン");
$rtn = Str::trimAll("\rあ\rい\rう\r");
$outputValue("両端にある全角スペース、半角スペースを取り除く5",
"Str::trimAll", $rtn, "改行");
■商品エンティティから削除フラグが1のメンバーを取得
getMember : DoctrineProxy\__CG__\Eccube\Entity\Member
■LAZY loading したエンティティの有無をチェックする1
EntityUtil::isEmpty : bool(true)
// 無=true
■LAZY loading したエンティティの有無をチェックする NOT
EntityUtil::isNotEmpty : bool(false)
// 有=true
■エンティティのプロパティを配列で返す
EntityUtil::dumpToArray : array(30) {
["_calc"]=>
bool(false)
["stockFinds"]=>
array(0) {
}
["stocks"]=>
array(0) {
}
["stockUnlimiteds"]=>
array(0) {
}
["price01"]=>
array(0) {
}
["price02"]=>
array(0) {
}
["price01IncTaxs"]=>
array(0) {
}
["price02IncTaxs"]=>
array(0) {
}
["codes"]=>
array(0) {
}
["classCategories1"]=>
array(0) {
}
["classCategories2"]=>
array(0) {
}
["className1"]=>
NULL
["className2"]=>
NULL
["id"]=>
int(1)
["name"]=>
string(24) "ディナーフォーク"
["note"]=>
NULL
["description_list"]=>
NULL
["description_detail"]=>
string(332) "セットで揃えたいディナー用のカトラリー。
定番の銀製は、シルバー特有の美しい輝きと柔らかな曲線が特徴です。適度な重みと日本人の手に合いやすいサイズ感で長く愛用いただけます。
最高級プラチナフォークは、贈り物としても人気です。"
["search_word"]=>
NULL
["free_area"]=>
NULL
["del_flg"]=>
int(0)
["create_date"]=>
string(8) "DateTime"
["update_date"]=>
string(8) "DateTime"
["ProductCategories"]=>
string(33) "Doctrine\ORM\PersistentCollection"
["ProductClasses"]=>
string(33) "Doctrine\ORM\PersistentCollection"
["CustomerFavoriteProducts"]=>
string(33) "Doctrine\ORM\PersistentCollection"
["Creator"]=>
string(41) "DoctrineProxy\__CG__\Eccube\Entity\Member"
["Status"]=>
string(46) "DoctrineProxy\__CG__\Eccube\Entity\Master\Disp"
["ProductImage"]=>
string(33) "Doctrine\ORM\PersistentCollection"
["ProductTag"]=>
string(33) "Doctrine\ORM\PersistentCollection"
}
■厳密にランダム文字列を生成する
Str::random : string(16) "boLfM2L7frzQ0D32"
// ランダム文字列
■ランダム文字列を生成する
Str::quickRandom : string(16) "5MfESFvOZSpEH7jp"
// ランダム文字列
■改行コードの変換
Str::convertLineFeed : string(20) "一行目
二行目"
// 変換後の文字列
■文字コードの判定1
Str::characterEncoding : string(5) "UTF-8"
// 文字コード
■文字コードの判定2
Str::characterEncoding : NULL
// ヒットしない場合
■指定した文字列以上ある場合、「...」を付加する1
Str::ellipsis : string(15) "あいうえ..."
// 設定文字数より長い場合
■指定した文字列以上ある場合、「...」を付加する2
Str::ellipsis : string(18) "あいうえお..."
// 設定文字数と同じ場合
■指定した文字列以上ある場合、「...」を付加する3
Str::ellipsis : string(18) "あいうえお..."
// 設定文字数より短い場合
■現在からの経過時間を書式化する
Str::timeAgo : string(8) "29日前"
// 便利ですね
■変数が空白かどうかをチェックする1
Str::isBlank : bool(true)
// 空文字
■変数が空白かどうかをチェックする2
Str::isBlank : bool(false)
// 0(文字列)
■変数が空白かどうかをチェックする3
Str::isBlank : bool(false)
// 0(数値)
■変数が空白かどうかをチェックする4
Str::isBlank : bool(true)
// NULL
■変数が空白かどうかをチェックする5
Str::isBlank : bool(true)
// 半角半角
■変数が空白かどうかをチェックする6
Str::isBlank : bool(false)
// 全角空白
■変数が空白かどうかをチェックする7
Str::isBlank : bool(true)
// タブ
■変数が空白かどうかをチェックする8
Str::isBlank : bool(true)
// リターン
■変数が空白かどうかをチェックする9
Str::isBlank : bool(true)
// 改行
■変数が空白かどうかをチェックする10
Str::isBlank : bool(true)
// NULバイト
■変数が空白かどうかをチェックする11
Str::isBlank : bool(true)
// 垂直タブ
■変数が空白かどうかをチェックする NOT
Str::isNotBlank : bool(false)
// 空文字
■両端にある全角スペース、半角スペースを取り除く1
Str::trimAll : string(11) "あ い う"
// 半角スペース
■両端にある全角スペース、半角スペースを取り除く2
Str::trimAll : string(15) "あ い う"
// 全角スペース
■両端にある全角スペース、半角スペースを取り除く3
Str::trimAll : string(11) "あ い う"
// タブ
■両端にある全角スペース、半角スペースを取り除く4
Str::trimAll : string(11) "あ
い
う"
// リターン
■両端にある全角スペース、半角スペースを取り除く5
Str::trimAll : string(11) "あ
い
う"
// 改行
単に一覧にするより見やすいかと思い出力結果を用意してみましたが、時間掛かった割に見づらくなったかも…。
EntityUtil::isEmpty, isNotEmptyはsoft_delete filterをONにして、リレーション経由で削除済みのエンティティを取得したとき、DoctrineのProxyクラスが返ってきてどうのこうの、とのことですが、説明できるほどピンと来ておりませんので、詳しくお知りになりたければ、メソッド定義にコメント書いてくれておりましたのでご確認ください。
以上!