0

私はcakephpに慣れていないので、これは素朴な質問かもしれません。

多くのレイアウト、ヘルパー、および要素があるプロジェクトに取り組んでいます。これは多言語サイトであるため、最終的にレンダリングされた出力をインターセプトして言語変換を行っています (そのため、各訪問者には、ユーザー入力を含むサイトで母国語のみが表示されます)。

AppController の afterFilter() 関数と AppHeler の afterRender() 関数の 2 つの場所にコードを追加することで、ほとんどのレイアウトとヘルパーを変換することができました。しかし、要素を一元的に処理する方法がわかりません。要素は数十あります。

ここに私の質問があります: cakephp のすべての要素は共通の祖先クラスを持っていますか? もしそうなら、この祖先クラスは afterRender() のようなコールバック関数を持っていますか?

どうもありがとう!

4

1 に答える 1

1

そのようなコールバックが「要素」に固有に存在するかどうかはわかりませんが、ソースコードを見ると、ビュー自体と同じメソッドView::element()を使用して要素をレンダリングし、トリガーして実行する必要があります _render()beforeRender()afterRender()

カスタム ビュー クラスとカスタム コールバックの作成

カスタムの「ビュー」クラスを使用してメソッドをオーバーライドすることができelement()ます。たとえば、独自の「カスタム」コールバックをヘルパーでトリガーすることができます。

このようなもの;

アプリ/ビュー/app_view.php

class AppViewView extends View {
    /**
     * custom 'element()' method, triggers custom
     * before/aferRenderElement callbacks on all loaded helpers
     */
    public function element($name, $params = array(), $loadHelpers = false)
    {
        $this->_triggerHelpers('beforeRenderElement');
        $output = parent::element($name, $params, $loadHelpers);
        $this->_triggerHelpers('afterRenderElement');
    }

    /**
     * Names of custom callbacks
     */
    protected $_customCallBacks = array(
        'beforeRenderElement',
        'afterRenderElement',
    );

    function _triggerHelpers($callback)
    {
         if (!in_array($callback, $this->_customCallbacks)) {
             // it's a standard callback, let the parent class handle it
             return parent::_triggerHelpers($callback);
         }

         if (empty($this->loaded)) {
             return false;
         }
         $helpers = array_keys($this->loaded);
         foreach ($helpers as $helperName) {
             $helper =& $this->loaded[$helperName];
             if (is_object($helper)) {
                 if (
                      is_subclass_of($helper, 'Helper') 
                      && method_exists($helper, $callback)
                 ) {
                     $helper->{$callback}();
                 }
             }
         }
    }
}

次に、AppController で使用する「view」クラスを指定します。

class AppController extends Controller {
    public $view = 'AppView';
}
于 2013-03-22T22:46:02.200 に答える