ワイヤード・パンチ

元・大阪人が、岡山の山奥でも生きていけることを証明するためのブログ。

Osclassのテーマbenderで、会員メニューから退会できないときの対処法。

またもやたのしくないプログラミングの話。

仕事のうえで、Osclassにデフォルトで入っているbenderというテーマを利用したサイトを進めていますが、会員ログイン後のメニューから退会ができないという、バグ報告を受けてしまいました。

今回はその対処法について。

広告

問題発生時の状況。

サイトに会員ログイン後、メニューから「アカウントを削除」を選ぶと、退会するかどうかのダイアログが出てきます。

(写真はテスト環境のものであり、日本語がうまく反映されないため、英語になっています。)

ここで「削除(Delete)」を押しても、なぜか先に進めないという状態です。

Chromeの場合、F12を押して検証ツールを開くと「bender.user.id」という値が見つからないといった感じのメッセージが表示されています。

Javascriptがエラーを起こしているため、停止してしまっているようです。

<script type="text/javascript">
	bender.user = {};
	bender.user.id = '19';
	bender.user.secret = 'xxxxxxxx';
</script>

会員メニューのいずれかのページでソースコードを表示させると、上記のような記述が見つかりますが、エラーが起きるページでは上記コードが見つかりません。

解決方法。

if( !function_exists('user_info_js') ) {
	function user_info_js() {
		$location = Rewrite::newInstance()->get_location();
		$section  = Rewrite::newInstance()->get_section();

		if( $location === 'user' && in_array($section, array('dashboard', 'profile', 'alerts', 'change_email', 'change_username',  'change_password', 'items')) ) {
			$user = User::newInstance()->findByPrimaryKey( Session::newInstance()->_get('userId') );
			View::newInstance()->_exportVariableToView('user', $user);
			?>
<script type="text/javascript">
	bender.user = {};
	bender.user.id = '<?php echo osc_user_id(); ?>';
	bender.user.secret = '<?php echo osc_user_field("s_secret"); ?>';
</script>
		<?php }
	}
	osc_add_hook('header', 'user_info_js');
}

benderのfunctions.phpを見てみると、上記のように先程のJavascriptを出力している部分が見つかります。

どうやらif文の中で、どのページにいるときに出力するか決めているようです。

今回出力されなかったページは、プラグインにより新たに会員メニュー内に生成されたページです。

プラグインのページはif文の中に含まれていなかったので、user.idが出力されず、退会もできなかったということですね。

というわけで、この部分を書き換えて、退会できるようにします。

if( !function_exists('user_info_js') ) {
	function user_info_js() {
		$location = Rewrite::newInstance()->get_location();
		$section  = Rewrite::newInstance()->get_section();

		if(
			($location === 'user' && in_array($section, array('dashboard', 'profile', 'alerts', 'change_email', 'change_username',  'change_password', 'items'))) ||
			($location === 'custom')) {
			$user = User::newInstance()->findByPrimaryKey( Session::newInstance()->_get('userId') );
			View::newInstance()->_exportVariableToView('user', $user);
			?>
<script type="text/javascript">
	bender.user = {};
	bender.user.id = '<?php echo osc_user_id(); ?>';
	bender.user.secret = '<?php echo osc_user_field("s_secret"); ?>';
</script>
		<?php }
	}
	osc_add_hook('header', 'user_info_js');
}

プラグインで生成されたページは$locationの値がcustomになるので、それを追加しました。

これで会員メニュー内のどのページを開いていても、無事に退会できるはずです。