$bcBaser->content() の出力結果に手を加えるプラグインの実装について

tecking > $bcBaser->content() の出力結果に手を加えるプラグインの実装について @ 2013/10/21 2:04
baserCMSプラグインの習作として、記事本文にメディアを埋め込む「oEmbed機能」のプラグインを作り始めています。

……が、開始早々行き詰まってしまいました

ともかく、$bcBaser->content() の出力結果を横どりできないことには始まらない、ということで /app/plugins/sample/views/helpers/sample_hook.php というファイルを作り、下記のようなコードを書いてみました。


<?php

class SampleHookHelper extends AppHelper {

	var $registerHooks = array('afterRender');

	function afterRender() {
		parent::afterRender();
		$out = ob_get_clean();
		$out = str_replace( 'baserCMS', 'べっしー', $out );
		ob_start();
		echo $out;
	}

}


これで記事本文中の「baserCMS」が「べっしー」に変わるはず……と思ったのですが、まったく変化ナシでした。

試しに afterRender メソッドの中身をまるっと /baser/views/helpers/bc_baser.php の afterRender 内に


function afterRender() {

	parent::afterRender();
	$out = ob_get_clean();
	$out = str_replace( 'baserCMS', 'べっしー', $out );
	ob_start();
	echo $out;
	// コンテンツをフックする
	$this->_content = ob_get_contents();

}


……のような形でコピペしたところ、こちらはうまくいきました。

baserCMSのプラグインフックについて理解が甘く、どこかで見落としをしているのだと思います。
どなたか、ご教示くださるとありがたいです。よろしくおねがいいたします。

■ BaserCMS:2.1.1
■ サーバー名:XAMPP Lite for Windows 1.8.1(PHP 5.4.7 / MySQL 5.1.57)
■ スマートURL:ON
■ 設置フォルダ:サブフォルダ
■ PHPスキル:C
■ PHPのバージョン:5.4.7
goichi > Re: $bcBaser->content() の出力結果に手を加えるプラグインの実装について @ 2013/10/22 0:24
こんにちは!
すごく、あやふやな記憶での回答になるのですが、公式プラグインのアップローダープラグインが、確か($bcBaser->content()での出力部分ではないのですが)afterLayoutを使って、出力されるHTMLを正規表現を使って書き換えていたように思います。
それを参考にしてソーシャルボタンを出力するプラグインを作った時も、同じようにafterLayoutを使ってフックを仕掛けた記憶があります。

参考にならなかったらすみません。。。。
tecking > Re: $bcBaser->content() の出力結果に手を加えるプラグインの実装について @ 2013/10/22 9:53
goichiさん

解決へのヒント、ありがとうございます。
ソーシャルボタンプラグインやアップローダープラグインのソース、見てみました。
たしかに $view->output に対して str_replace() や preg_replace() で置換してますね。

私も試行錯誤しながら、afterLayout にフックした方がいいかなあ、とも思ったのですが
oEmbedの対象になるYouTubeやTwitterなどのURLは、
コンテンツエリア以外(サイドバーやフッタ)にも出現する可能性があるので
HTMLファイル全体を走査する手法はとりづらそうです。

単にoEmbed機能を組み込むだけなら、jQueryプラグイン
(たとえば https://github.com/hypomodern/jquery-oembed
で実装してしまうのがサクっといけるのですけど
プラグインづくりの練習をかねて、なんとかPHPでやってみたいんですよねー :)

ともあれ、引き続き試行錯誤してみます。
tecking > Re: $bcBaser->content() の出力結果に手を加えるプラグインの実装について @ 2014/12/29 1:33
自己レス遅レスです。

1年以上伸ばし伸ばしにして、ようやくプラグインができました。その間にbaserCMSも3系にバージョンアップし、$bcBaser->content() という関数も忘却の彼方に……

ということで処理を全面的に見直し、CakePHPのイベントシステムを使っています。

完成までの道のりをブログに書きましたので、ご興味ございましたらご覧ください。

学習を兼ねてoEmbedが使えるプラグインつくってみました|WordPressユーザーのbaserCMS覚え書き
http://baser-for-wper.tecking.org/column/enable_oembed_plugin
ログイン
ユーザー名:
パスワード:


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

検索

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

フォーラムガイド


関連リンク

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

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