baserCMS 「Omotenashi-2」 テーマヘルパーを使ってみては?!という提案
「Omotenashi-2」テーマでBcBaserHelper.php絡みのトピックがフォーラムに上がっていて、ちょっと気になって調べてみたところ、このテーマは、トップページのスライダー用のHTML出力を変更する目的で、BcBaserHelper.phpをコアファイルからテーマフォルダ内にコピー、改修して利用されているようです。
「baserCMS「BcColors」テーマのススメ」の記事でも少し触れましたが、事情は違うものの同様に特定のコアファイルをテーマフォルダ内にコピーした上で改修、利用されていて、その結果、経年で動作が不安定になったり、baserCMS自体の機能ダウンに繋がったりしていました。
今回のトピックの不具合が、古いリビジョンのBcBaserHelper.phpをコピー(改修)して利用していたために生じた不具合かどうかはわかりませんが、特定の関数のみを改修したい事情で、該当するコアファイル(この場合、/lib/Baser/View/Helper/BcBaserHelper.phpで、文字通り結構コアなファイル)をテーマフォルダ内にコピー、改修して利用するというのは、ちょっと注意が必要で、あまり勧められない運用かもしれません。そこで、このようなケースの場合は、テーマ(独自)ヘルパーを作ってみてはどうか、というのが今回の提案です。
テーマにテーマヘルパーを組み込んで運用すれは、いつも最新のBcBaserHelperを継承しつつ、該当する関数を上書きする格好で動作させることができるというわけです。
手順は、いたって簡単です。
- 不具合を生じているtheme/omotenashi2/Helper/BcBaserHelper.phpファイルを削除し、代わりに後述のテーマヘルパーをtheme/omotenashi2/Helper/Omotenashi2Helper.phpの位置に配置します。
- その上で、レイアウトファイル(theme/omotenashi2/Layouts/default.php)上のmainImage()関数の呼び出し箇所を以下のように変更します。
<?php //$this->BcBaser->mainImage(['num' => 5, 'all' => true, 'class' => 'mainVisualList']) ?> <?php $this->Omotenashi2->mainImage(['num' => 5, 'all' => true, 'class' => 'mainVisualList']) ?>
テーマヘルパーは、「Omotenashi-2」テーマで改修されていたBcBaserHelper.phpのmainImage()関数のHTML出力部分のコードを参考に、最新のBcBaserHelper.phpのmainImage()関数のコードをベースにして書き直し、あらためて以下のように作成しました。
<?php
class Omotenashi2Helper extends BcBaserHelper {
/**
* BcBaserHelperを継承してテーマ独自のメインイメージを出力する
* テーマ内のみで使用: $this->Omotenashi2->mainImage()
*/
/**
*
* メインイメージを出力する
*
* メインイメージは管理画面のテーマ設定にて指定
*
* @param array $options オプション
* - `all`: 全ての画像を出力する。
* - `num`: 指定した番号の画像を出力する。all を true とした場合は、出力する枚数となる。
* - `id` : all を true とした場合、UL タグの id 属性を指定できる。
* - `class` : all を true とした場合、UL タグの class 属性を指定できる。
* ※ その他の、パラメーターは、 BcBaserHelper->getThemeImage() を参照
* @return void
*/
public function mainImage($options = [])
{
$options = array_merge([
'num' => 1,
'all' => false,
'id' => 'MainImage',
'class' => false
], $options);
if ($options['all']) {
$id = $options['id'];
$class = $options['class'];
$num = $options['num'];
unset($options['all']);
unset($options['id']);
unset($options['class']);
$tag = '';
for($i = 1; $i <= $num; $i++) {
$options['num'] = $i;
$themeImage = $this->getThemeImage('main_image', $options);
if ($themeImage) {
$tag .= '<div class="' . $class . '__item">' . $themeImage . '</div>' . "\n";
}
}
$ulAttr = '';
if ($id !== false) {
$ulAttr .= ' id="' . $id . '"';
}
if ($class !== false) {
$ulAttr .= ' class="' . $class . '"';
}
echo '<div' . $ulAttr . '>' . "\n" . $tag . "\n" . '</div>';
} else {
echo $this->getThemeImage('main_image', $options);
}
}
}
テーマヘルパーは、規約(CakePHP 2.x)に沿って、以下の点に注意して作成します。
- ヘルパーファイル名とclass名は、同一にする。
- ヘルパーファイル名(class名)は、既存のヘルパーファイル名と重複しない。
- ヘルパーファイル名(class名)は、アッパーキャメルケースで記述する。