シェアする

  • このエントリーをはてなブックマークに追加

[CakePHP+EC-CUBE]CakePHPのwebrootにEC-CUBEを(無理やり)設置するTips

medium_2924924027

久々にEC-CUBEネタです。
CakePHPの/app/webrootにEC-CUBEを無理やり設置する方法をメモします。

※無理やり設置する方法なので問題が出るかもしれません。私もまだ十分な検証をおこなっていないので、やってみる方がいましたら問題が起こる可能性があることを承知の上で行なってください。

今、EC-CUBEとCakePHPで作成したアプリのハイブリットサイトの案件を開発しているのですが、webrootに設置したEC-CUBEのフロント側の表示が、ヘッダとフッタしか表示されないという問題がありました。

example.com/app/webroot/にEC-CUBEを展開し、/htmlを/ecにリネームしてあります。
なので、example.com/ec/にアクセスするとEC-CUBEのトップページが表示されるはずですが、ヘッダとフッタしか表示されず、div#containerは空になっています。
管理画面のexaple.com/ec/admin/以下へのアクセスは問題ありません。

内容はおそらく「EC-CUBE 開発コミュニティサイト – フォーラム」と同様だと思います。

結論から言うと、アクセスしたページのレイアウトを取得するときにdtb_pagelayoutテーブルを参照するのですが、このときの検索条件に$_SERVER[‘PHP_SELF’]で取得したパスを使用していることが問題でした。
本来、/index.phpというURLにアクセスした場合には$_SERVER[‘PHP_SELF’]が/設置パス/index.phpになることが想定されますが、CakePHPの/app/webroot/ec/に設置してある場合、/app/webroot/ec/index.phpになってしまうため、dtb_pagelayoutにヒットするレイアウトファイルが無いということになってしまうようです。

LC_Page_Ex.phpのinitメソッドを修正する

きちんとソースを追って説明しようと思いましたが、関数呼びまくりで追うのも大変なので対処方法だけ書きます。

dtb_pagelayoutを参照する部分を遡ると、LC_Pageクラスのinitメソッドから$layout->sfGetPageLayoutメソッドの引数$urlに$_SERVER[‘PHP_SELF’]を渡していることが問題でした。
そこで、LC_Pageの子クラスLC_Page_Exでinitメソッドをオーバライドして、該当箇所を無理やり書き換えます。

/app/webroot/data/class_extends/page_extends/LC_Page_Ex.php

<?php
require_once CLASS_REALDIR . 'pages/LC_Page.php';

class LC_Page_Ex extends LC_Page {

    /**
     * Page を初期化する.
     *
     * @return void
     */
    function init() {
        // 開始時刻を設定する。
        $this->timeStart = SC_Utils_Ex::sfMicrotimeFloat();

        $this->tpl_authority = $_SESSION['authority'];

        // ディスプレイクラス生成
        $this->objDisplay = new SC_Display_Ex();

        $layout = new SC_Helper_PageLayout_Ex();

        $layout->sfGetPageLayout($this, false, str_replace("/app/webroot", "", $_SERVER['PHP_SELF']),	// str_replaceで強引に書き換える
                                 $this->objDisplay->detectDevice());

        // プラグインクラス生成
        $this->objPlugin = new SC_Helper_Plugin_Ex();
        $this->objPlugin->preProcess($this);

        // 店舗基本情報取得
        $this->arrSiteInfo = SC_Helper_DB_Ex::sfGetBasisData();

        // トランザクショントークンの検証と生成
        $this->doValidToken();
        $this->setTokenTo();
    }

}
?>

ちなみにwebroot以下の/ecはインストール時にexample.com/ec/というパスでインストールしていれば、urlの置換が行われるため問題ありません。
この問題はCakePHPの.htaccessでルートを/app/webrootに置き換えているために起こるわけですね。

よくわかりませんが、冒頭の「EC-CUBE 開発コミュニティサイト – フォーラム」でも、マルチドメインツールというやつがリダイレクトしてるんでしょう。

それにしてもEC-CUBEは相変わらずソースを追うのが大変でした。。。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする