EC-CUBE PCとスマートフォンのデータを統一
EC-CUBEのPCとスマートフォンの統一というか、デバイスをPCで固定などの方法はよく見つかったのですが、管理画面でのページ詳細を統一する方法は見つかりませんでした。
管理する人の立場だと、PCとスマートフォンの2箇所更新するのが面倒っていう話もあったし、レスポンシブにする場合とかに利用できるかなぁと思ったので、その方法をメモしておこうと考えました。
条件
- EC-CUBE 2.13.3 で試した
- /data/class_extends/helper_extends/SC_Helper_PageLayout_Ex.php に追記
拡張クラスでカスタマイズ
基本クラスをそのままカスタマイズしても良いでしょうけど、とりあえず拡張クラスに記述します。
「/data/class/helper/SC_Helper_PageLayout.php」ファイルを開き、「sfGetPageLayout」メソッドをまるまるコピーして、拡張クラス「/data/class_extends/helper_extends/SC_Helper_PageLayout_Ex.php」にペーストします。
そして3行ほどの処理を追加します。
以下コードの「2~8行目」と「25行目~28行目」を追加しました。
public function sfGetPageLayout(&$objPage, $preview = false, $url = '', $device_type_id = DEVICE_TYPE_PC) {
// ここから追加
// 通常のデバイスIDを保存しておく
$tmp_device_type_id = $device_type_id;
// デバイスIDを一時的にPCに設定
$device_type_id = DEVICE_TYPE_PC;
// ここまで追加
// URLを元にページ情報を取得
if ($preview === false) {
$url = preg_replace('|^' . preg_quote(ROOT_URLPATH) . '|', '', $url);
$arrPageData = $this->getPageProperties($device_type_id, null, 'url = ?', array($url));
// プレビューの場合は, プレビュー用のデータを取得
} else {
$arrPageData = $this->getPageProperties($device_type_id, 0);
}
if (empty($arrPageData)) {
trigger_error('ページ情報を取得できませんでした。', E_USER_WARNING);
}
$objPage->tpl_mainpage = $this->getTemplatePath($device_type_id) . $arrPageData[0]['filename'] . '.tpl';
// ここから追加
// 変更したデバイスIDを元に戻す
$device_type_id = $tmp_device_type_id;
// ここまで追加
if (!file_exists($objPage->tpl_mainpage)) {
$msg = 'メイン部のテンプレートが存在しません。[' . $objPage->tpl_mainpage . ']';
trigger_error($msg, E_USER_WARNING);
}
$objPage->arrPageLayout =& $arrPageData[0];
if (strlen($objPage->arrPageLayout['author']) === 0) {
$arrInfo = SC_Helper_DB_Ex::sfGetBasisData();
$objPage->arrPageLayout['author'] = $arrInfo['company_name'];
}
// ページタイトルを設定
if (SC_Utils_Ex::isBlank($objPage->tpl_title)) {
$objPage->tpl_title = $objPage->arrPageLayout['page_name'];
}
// 該当ページのブロックを取得し, 配置する
$masterData = new SC_DB_MasterData_Ex();
$arrTarget = $masterData->getMasterData('mtb_target');
$arrBlocs = $this->getBlocPositions($device_type_id, $objPage->arrPageLayout['page_id']);
// 無効なプラグインのブロックを取り除く.
$objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();
$arrBlocs = $objPlugin->getEnableBlocs($arrBlocs);
// php_path, tpl_path が存在するものを, 各ターゲットに配置
foreach ($arrTarget as $target_id => $value) {
foreach ($arrBlocs as $arrBloc) {
if ($arrBloc['target_id'] != $target_id) {
continue;
}
if (is_file($arrBloc['php_path']) || is_file($arrBloc['tpl_path'])) {
$objPage->arrPageLayout[$arrTarget[$target_id]][] = $arrBloc;
} else {
$error = "ブロックが見つかりません\n"
. 'tpl_path: ' . $arrBloc['tpl_path'] . "\n"
. 'php_path: ' . $arrBloc['php_path'];
trigger_error($error, E_USER_WARNING);
}
}
}
// カラム数を取得する
$objPage->tpl_column_num = $this->getColumnNum($objPage->arrPageLayout);
}
PCとスマートフォンのデータを統一
それぞれ処理は調整する必要はありますが、とりあえずこれで問題なさそうです。
管理画面、【デザイン管理】->【PC】->【ページ詳細設定】の内容をスマートフォンでも読み込めると思います。
もっともっとスマートな方法や、一般的な方法があったらぜひご教示ください。