忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/05/27 22:49 |
EC-CUBE スタティックページ作成
といってもmod_rewriteのことではありません。

周囲のテンプレは利用して、単に中のテキストだけ違うという、ほとんど静的な内容のページを大量に作りたいと思っても素のEC-CUBEではできません。
一ページごとにデザイン管理→新規ページ作成を行って中身を書いていくとかしないといけません。
もしかしたら方法があるかもしれませんがとりあえず見あたりませんでした。
そんなのやってらんないのでスタティックな内容は一つに纏めます。

まず上記デザイン管理→新規ページ作成を行って基準となるページを一枚作ります。
名称は変更する予定なのでデフォルト的なものを、URLは簡単にstatic.phpとかに、本文は空白(あるいは「お探しの内容は見つかりませんでした」的内容)にしておきます。

保存すると自動的にファイルが作成され、
/html/user_data/static.phpにロジックが、
/html/user_data/packages/default/static.tplにテンプレートができあがります。
ちょっとこの位置では扱いづらいのでどうにかします。
/data/Smarty/templates/default/static/フォルダを作成し、中にとりあえず適当にhoge.tplとかを入れておきます。

次に割り当てられるテンプレを変更できるようにしたいわけですが、テンプレの割り当てを行っているのはLC_Page_User::process()内の$objLayout->sfGetPageLayout($this);という部分です。

具体的なロジックはSC_Helper_PageLayout::sfGetPageLayout()に書かれているのですが、このメソッド、ファイル名から自動的にテンプレート名を算出するようになっています。
全ロジックをひとつのメソッドに突っ込んでいるうえに引数から任意のテンプレートファイルを指定する方法がありません。
つまり、テンプレを変更する手段がありません。
平たく言うとこのソースは酷い。

ちょっと穏便にどうにかする方法が見あたらなかったので、場当たり的な解決を行いたいと思います。

/html/user_data/static.phpに以下の一行を追加。
define('IS_STATIC_PAGE',true);

ついでに最初のrequire_once()が何故かフルパスにされてしまっているので、意味もなく
require_once("../require.php");
に変更しておきましょう。

/data/class_extends/helper_extends/SC_Helper_PageLayout_Ex.phpにおいて、SC_Helper_PageLayout::sfGetPageLayout()をオーバーライド。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    /*
    *    SC_Helper_PageLayout::sfGetPageLayout()をオーバーライド
    *    ひとつのURLで任意のテンプレートを選択できるようにする
    */
    function sfGetPageLayout(&$objPage, $preview = false, $url = ""){
        
        //IS_STATIC_PAGEが定義されていない場合は今までと同じ
        parent::sfGetPageLayout(&$objPage, $preview, $url);
        if(!defined('IS_STATIC_PAGE')){return true;}
        
        //引数からテンプレートへのパスを作成
        if(!$_REQUEST['page']){return true;}
        $template_filename=TEMPLATE_DIR . 'static' 
          . DIRECTORY_SEPARATOR . basename($_REQUEST['page']) . '.tpl';
        
        //テンプレートが見つかれば変更、無ければそのまま
        if(is_file($template_filename)){
            $objPage->tpl_mainpage=$template_filename;
        }
        return true;
    }

return true;は成功したという意思表示をしているだけで、実際はreturn;だけでかまいません。
一番下はreturn;すら不要ですが、明白に書いておかないと気持ち悪いので私はいつも付けています。

http://eccube.localhost/user_data/static.php?page=hoge
というURLがやってきた場合に
/data/Smarty/templates/default/static/hoge.tplを探し、見つからなければ/html/user_data/packages/default/static.tplを表示するようになります。
めでたし。


……ひとつ重大な問題があって、
デザイン管理→ページ詳細設定で編集を行うたびに/html/user_data/static.phpが上書き保存されてしまいます。
ヒィ
どうすれバインダー。

SC_Helper_PageLayout::sfGetPageLayout()を再度書き換えます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    function sfGetPageLayout(&$objPage, $preview = false, $url = ""){
        
        //対象のファイル以外は今までと同じ
        parent::sfGetPageLayout(&$objPage, $preview, $url);
        if($_SERVER['PHP_SELF']!=='/user_data/static.php'){return true;}
        
        //引数からテンプレートへのパスを作成
        if(!$_REQUEST['page']){return true;}
        $template_filename=TEMPLATE_DIR . 'static' . 
             DIRECTORY_SEPARATOR .basename($_REQUEST['page']) . '.tpl';
        
        //テンプレートが無ければそのまま、見つかれば変更
        if(is_file($template_filename)){
            $objPage->tpl_mainpage=$template_filename;
        }
        return true;
    }

呼ばれたファイルがstatic.phpであればテンプレートの見直しを行い、それ以外は今まで通りとなります。
更に場当たり的な対処になりました。

新規ページ作成で作成したページはdtb_pagelayoutに入っています。
dtb_pagelayout.edit_flgを変更すれば削除はできなくなりますが、編集不可にはできないようです。
削除されると困る場合は値をとりあえず2とかにしておきましょう。


以上で、レイアウトを共有しつつ、テンプレートを追加するだけで簡単に静的ページの追加を行えるようになりました。

URLが美しくないとかいうならば
RewriteRule ^/user_data/static/(.*)$ /user_data/static.php?page=$1
とか書けばいいですが、この場合$_SERVERも変わるのでそこらへん手直しが必要です。


EC-CUBEの記事
PR


2010/02/12 23:30 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買ったものリスト 2010/02/14 | HOME | ショートカットメニュー:EC-CUBE>>
忍者ブログ[PR]