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行目」を追加しました。

<br />
public function sfGetPageLayout(&amp;$objPage, $preview = false, $url = '', $device_type_id = DEVICE_TYPE_PC) {<br />
  // ここから追加<br />
  // 通常のデバイスIDを保存しておく<br />
  $tmp_device_type_id = $device_type_id;</p>
<p>  // デバイスIDを一時的にPCに設定<br />
  $device_type_id = DEVICE_TYPE_PC;<br />
  // ここまで追加</p>
<p>  // URLを元にページ情報を取得<br />
  if ($preview === false) {<br />
    $url = preg_replace('|^' . preg_quote(ROOT_URLPATH) . '|', '', $url);<br />
    $arrPageData = $this-&gt;getPageProperties($device_type_id, null, 'url = ?', array($url));<br />
  // プレビューの場合は, プレビュー用のデータを取得<br />
  } else {<br />
    $arrPageData = $this-&gt;getPageProperties($device_type_id, 0);<br />
  }</p>
<p>  if (empty($arrPageData)) {<br />
    trigger_error('ページ情報を取得できませんでした。', E_USER_WARNING);<br />
  }</p>
<p>  $objPage-&gt;tpl_mainpage = $this-&gt;getTemplatePath($device_type_id) . $arrPageData[0]['filename'] . '.tpl';</p>
<p>  // ここから追加<br />
  // 変更したデバイスIDを元に戻す<br />
  $device_type_id = $tmp_device_type_id;<br />
  // ここまで追加</p>
<p>  if (!file_exists($objPage-&gt;tpl_mainpage)) {<br />
    $msg = 'メイン部のテンプレートが存在しません。[' . $objPage-&gt;tpl_mainpage . ']';<br />
    trigger_error($msg, E_USER_WARNING);<br />
  }</p>
<p>  $objPage-&gt;arrPageLayout =&amp; $arrPageData[0];<br />
  if (strlen($objPage-&gt;arrPageLayout['author']) === 0) {<br />
    $arrInfo = SC_Helper_DB_Ex::sfGetBasisData();<br />
    $objPage-&gt;arrPageLayout['author'] = $arrInfo['company_name'];<br />
  }</p>
<p>  // ページタイトルを設定<br />
  if (SC_Utils_Ex::isBlank($objPage-&gt;tpl_title)) {<br />
    $objPage-&gt;tpl_title = $objPage-&gt;arrPageLayout['page_name'];<br />
  }</p>
<p>  // 該当ページのブロックを取得し, 配置する<br />
  $masterData = new SC_DB_MasterData_Ex();<br />
  $arrTarget = $masterData-&gt;getMasterData('mtb_target');<br />
  $arrBlocs = $this-&gt;getBlocPositions($device_type_id, $objPage-&gt;arrPageLayout['page_id']);<br />
  // 無効なプラグインのブロックを取り除く.<br />
  $objPlugin = SC_Helper_Plugin_Ex::getSingletonInstance();<br />
  $arrBlocs = $objPlugin-&gt;getEnableBlocs($arrBlocs);<br />
  // php_path, tpl_path が存在するものを, 各ターゲットに配置<br />
  foreach ($arrTarget as $target_id =&gt; $value) {<br />
    foreach ($arrBlocs as $arrBloc) {<br />
      if ($arrBloc['target_id'] != $target_id) {<br />
        continue;<br />
      }<br />
      if (is_file($arrBloc['php_path']) || is_file($arrBloc['tpl_path'])) {<br />
        $objPage-&gt;arrPageLayout[$arrTarget[$target_id]][] = $arrBloc;<br />
      } else {<br />
        $error = &quot;ブロックが見つかりません\n&quot;<br />
          . 'tpl_path: ' . $arrBloc['tpl_path'] . &quot;\n&quot;<br />
          . 'php_path: ' . $arrBloc['php_path'];<br />
        trigger_error($error, E_USER_WARNING);<br />
      }<br />
    }<br />
  }<br />
  // カラム数を取得する<br />
  $objPage-&gt;tpl_column_num = $this-&gt;getColumnNum($objPage-&gt;arrPageLayout);<br />
}<br />

PCとスマートフォンのデータを統一

それぞれ処理は調整する必要はありますが、とりあえずこれで問題なさそうです。
管理画面、【デザイン管理】->【PC】->【ページ詳細設定】の内容をスマートフォンでも読み込めると思います。
もっともっとスマートな方法や、一般的な方法があったらぜひご教示ください。

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