web-dev-qa-db-ja.com

文字列の置換にはJResponse :: setBodyまたはonContentPrepareを使用する必要がありますか?

Joomlaコンテンツ全体を検索し、一致した文字列からHTML出力を作成するショートコードプラグインを開発しています。

現在これを使用しています

   public function onContentPrepare($context, &$row, &$params, $page = 0){

        if ($this->run_plg != 1)return;
        require_once 'shortcodes.php';
        $row->text = shortcodes($row->text);

        return true;
    }

そして、それは非常にうまく機能します。ご覧のとおり、これは基本的に、モジュールを含むすべてのJoomlaコンテンツで実行されます(Virtuemartや他のサードパーティの拡張機能についてはわかりません)。しかし、テンプレートファイルでショートコードを使用すると、それが見つかりません。

だから私はこのようなonAfterRenderに関数を配置することを考えています:

function onAfterRender() {
    require_once 'shortcodes.php';
    $body        = JResponse::getBody();
    $body       = shortcodes($body);
    JResponse::setBody($body);
}

これは、サイトの任意の場所の文字列と一致します。私の懸念はパフォーマンスです。以下は、ショートコード関数の簡単な例です。

https://eval.in/141437

オリジナルのものはPREG_SET_ORDERで改良され、$ shortcode ['type']からの文字列が見つかった場合にのみ実行されます。

だから問題は、あなたが何を推奨し、なぜあなたが説明する時間があるならなぜかということです。

ありがとう、おめでとう:)

5
Dan

私の プラグインのパフォーマンスに関する他の回答 と同様に、見つけるための最良の方法はtestです。

詳細については、他の回答を参照してください。ただし、JLogクラスを使用して時間ロギングステートメントを追加すると、各メソッドのタイミング結果を簡単に比較できます。

とはいえ、サイトのショートコードをどこでもキャッチする必要がある場合は、onAfterRenderがすばやく、簡単で、おそらく唯一の方法です(プラグイン)。

1
codinghands

onContentPrepareは多かれ少なかれ拡張機能の出力用にビルドされています。読み込み時の検索/置換を追加する場所は他にないはずだと私は考えています。私がこれを言う理由は、Joomlaがそのメソッドと一貫性を保つようにするためです。

そのため、何らかの検索/置換が必要な場合は、代わりにカスタムHTMLモジュールに配置するのが最善です(そのためのカスタムレイアウトなどを作成することもできます)。このように、コンテンツプラグインはコンテンツの解析を継続し、システムプラグインは環境設定などを調整したり、追加のライブラリをロードしたりします(基本的に、Joomlaのコアを調整して拡張します)。

Nonumber拡張、主にAdvanced module managerを調べます。これにより、より多くの設定でモジュールをターゲットにできます。それはあなたを助けないかもしれませんが、彼らが与える制御は、あなたが他の方法では考えられないであろう別の解決策を導くことができます。 http://www.nonumber.nl/

1
Jordan Ramstad