inexio(アイネクシオ)

私たちはネットワークから新しいアイデアを創出します

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】->【ページ詳細設定】の内容をスマートフォンでも読み込めると思います。
もっともっとスマートな方法や、一般的な方法があったらぜひご教示ください。

 - EC-CUBE, PHP, カスタマイズ , ,