■ユーザーズフォーラム リニューアルのお知らせ
新規投稿は新ユーザーズフォーラムにお願いします。

特定カテゴリ以下のプログラムでのレイアウトファイルの切り替えについて

s_eggplant > 特定カテゴリ以下のプログラムでのレイアウトファイルの切り替えについて @ 2014/1/9 17:13
お世話になります。

動作環境
===
■ BaserCMSのバージョン:3
■ 開発環境: Mac OS X
■ スマートURLの利用: ON
■ 設置フォルダ: ドキュメントルート
■ 利用しているデータベース: MySQL
====

固定ページでの 特定カテゴリ以下のプログラムでのレイアウトファイルの切り替えについて お尋ねします。英語と日本語のサイトをディレクトリで切り分けようと考えております。

そこで、en(例) 以下(サブカテゴリを含む)のレイアウトをdefalt_enのような形でプログラム的に
変更出来ないかと考えております。

ヘッダーフッターであれば イベントに登録すれば良いのかとも考えましたが方法が分からず質問させて頂きました。

もう一点、カテゴリに コンテンツレイアウトという項目が存在しますがこれはどのように使うものでしょうか。

以上です。宜しくお願い致します。
goichi > Re: 特定カテゴリ以下のプログラムでのレイアウトファイルの切り替えについて @ 2014/1/10 23:35
ちょっと不完全な回答になりますが、他に回答がついていないようなので、、、。

レイアウトの切り替え自体は、ver.2系までの流れのままなら、
 <?php $this->BcBaser->layout('FaileName'); ?>

みたいな感じで出来るかもしれませんが、特定のカテゴリ以下の場合に切り替えたいということであれば、レイアウトファイルではなく、エレメントの読み込みを変更したほうが良いかもしれません。

例えば、日本語のサイドメニューを
 /app/webroot/theme/テーマ/Elements/JP/sidemenu.php

において、英語のサイドメニューを
 /app/webroot/theme/テーマ/Elements/EN/sidemenu.php

とかに置いておきます。

特定のカテゴリ“以下”に入るということは、URLのどこかに、そのカテゴリ名が入っているはずですので、
 $this->BcBaser->getHere()

のような関数で現在のページのURLを取得し、特定のカテゴリ名が含まれているかどうかで条件分岐をして、読み込むエレメントを変更すると、日本語と英語を切り替えできると思います。(例えば、問題のカテゴリ名が「en」だったとすると、以下の様な感じでどうでしょうか?)

 <?php
$url =  $this->BcBaser->getHere();
if (strstr($url, '/en/')) {
  this->BcBaser->element('EN/sidemenu.php');
} else {
  $this->BcBaser->element('JP/sidemenu.php');
}
?>


どちらかというと、レイアウトファイルは「枠組み」といったような感じのイメージですので、英語か日本語かというような部分を、ファイルベースで切り替えるのであれば、エレメントファイルで切り分けたほうが、単純で保守性も高いかも知れません。

全然、試していないので、出来るかどうか分かりませんが、参考までにご覧頂ければと思います。m(__)m
s_eggplant > Re: 特定カテゴリ以下のプログラムでのレイアウトファイルの切り替えについて @ 2014/1/11 0:28
お世話になります。有り難うございます。

はい、確かにヘッダーフッターは Elements 以下に現状も置いております。

その後に nada-icons のテーマ(他も共通だと思いますが)

BcBaser->footer() ?>

というかたちで呼び出していますので、この中で処理を書く事で可能になるのではと考えています。

BCBaserHelperの中のfooterファンクションがありその中に

$event = $this->dispatchEvent('footer', array(
'out' => $out
), array('layer' => 'View', 'class' => $this->_View->name));

という処理があるのですが、追加方法が分からず相談させて頂きました。

コントローラの中に書ければ、パスも取れますので goichi さんの仰る事も出来ると思います。
色々難しいのであれば layouts ファイルで切り分けた方が良いと考えて質問させて頂いています。

私もgoichi さんの実装のイメージが付いていたので重ねて質問させて頂きました。




goichi > Re: 特定カテゴリ以下のプログラムでのレイアウトファイルの切り替えについて @ 2014/1/11 9:23
こんにちは。質問の意図を勘違いしていたかもしれません、すみませんでした。

引用:
確かにヘッダーフッターは Elements 以下に現状も置いております。

とりあえず、今回の言語切替について、必要なのはフッターとヘッダーのみで、他のエレメントについては考慮しなくてよいという事ですね。

引用:
というかたちで呼び出していますので、この中で処理を書く事で可能になるのではと考えています。

footer()でもelement()でも呼び出せますが、footer()、header()は処理を途中でフックする事ができます。

引用:
$event = $this->dispatchEvent('footer', array(
'out' => $out
), array('layer' => 'View', 'class' => $this->_View->name));

という処理があるのですが、追加方法が分からず相談させて頂きました。

$this->dispatchEvent()があるのは、前述のフックを可能にするためだと思います。Cakeイベントシステムを拡張したBaserEventの着火点をここで作っているのだと思います。
いまfooterとheaderだけを考慮するのであれば、このイベントシステムを利用して、これらの関数が呼びだされた時点を着火点として、出力するエレメントファイル(footerやheader)を変更できそうですが、BaserCMSの公式サイトによると、BaserEventは現在、プラグインからのフックしか対応していないようです。
ですので、BaserEventに頼らず、/app/フォルダ内に対象のヘルパーをコピーして、関数内に処理を書き込んだほうが速いかもしれませんし、もっと速いのは前回の回答で私が書いたサンプル処理を、レイアウトファイル内で利用することだと思います。
もし、MVCを崩したくないというように、View側に処理の記述を書きたくなければ、Controller側でbeforeFilter()のような部分を利用し、条件分岐で適用するレイアウトを変更するような感じになるのではないかと思います(←うまくいくか分かりません。。。)。

なお、Cakeイベントシステムについては、CakePHP2系統からの機能になります。機能の概要はGoogleなどで検索してみてください。個人的にはレイアウトファイル内から呼び出すエレメントを変更する処理が、もっとも簡単かなーと。。。
s_eggplant > Re: 特定カテゴリ以下のプログラムでのレイアウトファイルの切り替えについて @ 2014/1/11 16:00
お世話になります。回答有り難うございます。

そうですかBaserCMSのイベントはプラグインでしか使えないんですね。。又ドキュメントも有り難うございました。

手軽な解決策は仰る通り テンプレートの中に書く事なのですが。。そうするとイベントが使えないにしろheader()やfooter()の処理を何かしら消してしまう事になります。実は現状 default_enというレイアウトファイルを作ったのですが、View内でエレメントを呼んだのですがこれは美しく無いなというのが今回の相談の趣旨でした

その時に方法として考えたのが

1. イベント ⇒ 使用出来ない
2. header() footer()の拡張 ⇒ 可能性あり
3. 特定ディレクトリ以下のレイアウトの切り替え ⇒ 不明

で今回相談させて頂いた内容となります。 ※ ⇒ 以降は今回の質問で明確になった点です。

認識が違いましたら仰って下さい。丁寧に回答して頂いて有り難うございました。
イベントの所が明らかになっただけでも収穫でしたので。




s_eggplant > Re: 特定カテゴリ以下のプログラムでのレイアウトファイルの切り替えについて @ 2014/1/12 12:13
お世話になります。自己レスとなります。

解決策(下記)で 3 で対応しました。

===
1. イベント ⇒ 使用出来ない
2. header() footer()の拡張 ⇒ 可能性あり
3. 特定ディレクトリ以下のレイアウトの切り替え ⇒ 不明
===

対応方法としては

PagesControllerのdisplay を書き換えました。

632 行目辺り
			if(!empty($data['PageCategory']['layout_template'])) {
			    if (!empty($page) and strtolower($page) === "en") {
			        $layout = "default_en";
			    }
			    else{
			        $layout = $data['PageCategory']['layout_template'];
			    }



因に content_template の使い方はやはり良く分かりませんでした。

重ね重ね有り難うございました。一応解決済みとしてステータスを閉じますが何かこうした方がありましたら遠慮なく仰って下さい。

ログイン
ユーザー名:
パスワード:


  新規登録 / パスワード紛失

検索

facebook
フォーラムで悩みが解決した場合など、よかったら「いいね!」をポチっとクリックしてください!質問の回答者や開発者の励みになります

フォーラムガイド


関連リンク

オンライン状況
31 人のユーザが現在オンラインです。 (29 人のユーザが フォーラム を参照しています。)

登録ユーザ: 0
ゲスト: 31