[bc_form.php]フォームコントロールのテンプレートについて

設置フォルダ: /var/www/html/
データベース: MySQL
SQLモード: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
baserCMSバージョン: 5.0.21
CakePHPバージョン: 4.4.17

baser-core/config/bc_form.php
このbc_form.phpは、

{ThemePlugin}/config/bc_form.php
こんな感じで、独自テーマで上書きできますか?

やってみたところ、上書きできないようでした。
1)できるはずだけど、何かしら間違えてて出来ていない
2)別の方法がある
3)そもそも上書きできない

どれでしょうか?

こんにちは!

ヘルパーに渡すテンプレートを指定すれば出来そうです。いかがでしょうか?

// 参考となるコアのソース
$this->loadHelper('BaserCore.BcForm', ['templates' => 'BaserCore.bc_form']);

// 例
$this->loadHelper('BaserCore.BcForm', ['templates' => 'BcPluginSample.my_form']);

返信ありがとうございます!
$this->loadHelperは、独自テーマのどこに書けば良いのでしょうか?

config/bootstrap.php
src/Plugin.php
この辺のinitializeの中に置いてみたのですが、うまく動きませんでした、、、
BaserCore\View\AppView これを継承する?と思って独自テーマの中で、View\AppView.phpを設置してみたのですが、継承してないのか、反映してないのか、とにかくうまく動きませんでした、、、

@hideichi
うーん、確かに差し替えとなると確かに難しいですね・・・。

独自テーマのconfig内にmy_template.phpを配置するとして、
例えばレイアウトファイル「layout/default.php」の先頭で

$this->helpers()->unload('BcForm');
$this->loadHelper('BaserCore.BcForm', ['templates' => 'BcThemeSample.my_template']);

とかで無理やり読み込み直すことは可能だと思います。
ただこれだとdefaultレイアウトではないViewには適用されないので、
全体に適用するには独自プラグインを作ってイベントで読み込み直すとかになりますかね。

もっとスマートな方法がありそうですが :melting_face:

なるほど、ありがとうございます。
引き続き有識者様のコメントを待ちたいと思います、

$this->helpers()->unload('BcForm');
$this->loadHelper('BaserCore.BcForm', ['templates' => 'BcThemeSample.my_template']);

今更なんですが、こちら、
layout/default.phpの先頭に配置しても、読み込めなかったです、
原因等については、まだ調べていませんが、

@hideichi こんにちは。
イベントを利用してください。次のコードでいけました。

class YourPluginViewEventListener extends \BaserCore\Event\BcViewEventListener
{
    public $events = [
        'beforeRender'
    ];
    public function beforeRender(Event $event)
    {
        $view = $event->getSubject();
        $view->helpers()->unload('BcAdminForm');
        $view->loadHelper('BaserCore.BcAdminForm', ['templates' => 'YourPlugin.bc_form']);
    }    
}
「いいね!」 2

@ryuring
今更なんですが、フロントのフォーム(bc-mail)で、独自テーマのテンプレート、

['templates' => 'YourPlugin.bc_form']

を適用するにはどうしたら良いでしょうか?

class YourPluginViewEventListener extends \BaserCore\Event\BcViewEventListener
{
    public $events = [
        'beforeRender'
    ];
    public function beforeRender(Event $event)
    {
        $view = $event->getSubject();
        $view->helpers()->unload('BcAdminForm');
        $view->loadHelper('BaserCore.BcAdminForm', ['templates' => 'YourPlugin.bc_form']);
    }    
}

このままだと、フロントのフォーム(bc-mail)ではたぶん発火すらしてないみたいなので、

public $events = ['BcMail.beforeRender'];
public $events = ['Mail.beforeRender'];

色々試してみたんですが、やっぱり発火すらしないみたいで、

1)BcMailはデフォルトのイベントが発火しない?
2)そもそも指定が間違えている?

この辺りだと思っているのですが、どうでしょうか?

@hideichi 僕の方で発火は確認してました。メールフォームかどうかは忘れましたが。

メールフォーム以外では発火しますか?

また、念のためですが、イベントリスナーの具体的なクラス名は何にしてますか?

メールフォーム以外でも発火してないようでした、
別な問題で動いていないようですね、調べてみます。

ちなみに全体は次のような感じです、

namespace DubBootstrapUI\Event;

use BaserCore\Event\BcViewEventListener;
use Cake\Event\Event;

/**
 * DubManual View Event Listener
 */
class DubBootstrapUIViewEventListener extends BcViewEventListener
{

    /**
     * events
     * @var string[]
     */
    public $events = [
        'beforeRender'
    ];

    public function beforeRender(Event $event)
    {
        $view = $event->getSubject();
        $view->helpers()->unload('BcAdminForm');
        $view->loadHelper('BaserCore.BcAdminForm', ['templates' => 'DubBootstrapUI.bc_form']);
        \Cake\Log\Log::warning('beforeRender イベントが発火しました。');
    }
}

@hideichi プラグイン名がキャメルケースになっていないのが原因のようでした。
DubBootstrapUi だと動きました。

イベント使わずに、bc_formを上書きできるように、プルリク送りました。

@hideichi マージしました!

「いいね!」 1