openpne 2.x 友達以外からのメッセージ拒否機能の作成手順メモ

openpne 2.x系でありそうでない「友達以外からのメッセージ拒否設定」を導入したのでメモ。
メッセージ画面に[設定]って項目を作って、設定してる場合、
お友達以外からのメッセージを拒否できる機能っす。

おおまかな手順

1.メッセージページに[設定画面]を追加する

/webapp/modules/pc/templates/h_message_box.tpl

2.バリデーション処理(新規作成)

/webapp/modules/pc/do/h_message_box_setting.php

3.新規変数の許可設定(新規作成)

/webapp/modules/pc/validate/do/h_message_box_setting.ini

4.友達以外からのメッセージ受信するかどうかフラグを追加する

/webapp/lib/util/util.php

5.拒否設定している場合、友達限定フラグを立てる

/webapp/modules/pc/page/f_message_send.php

6.テンプレPC:拒否設定されている場合、ごめんなさいメッセージを出す

/webapp/modules/pc/templates/f_message_send.tpl

7.拒否設定されている場合、権限エラーを出す(ガラケー用は内部処理だけ)

/webapp/modules/ktai/page/f_message_send.php

1.メッセージページに[設定画面]を追加する

/webapp/modules/pc/templates/h_message_box.tpl

適当な位置に追記

({elseif $box == "setting"})

({t_form_block _method=get m=pc a=do_h_message_box_setting _attr='name="do_h_message_box_setting"'})
<input type="hidden" name="box" value="({$box})" />

<div id="Center">
<div class="dparts formTable"><div class="parts">
<div class="partsHeading"><h3>設定</h3></div>
<div class="block">

<div style="padding:5px">

<table>
<tr><td>友達以外からのメッセージ</td>
<td><ul>

<li><input type="radio" class="input_radio" name="IS_FRIEND_ONLY_MESSAGE" id="is_friend_only_message_1" value="1"({if $C_MEMBER_CONFIG.IS_FRIEND_ONLY_MESSAGE}) checked="checked"({/if}) /><label for="is_friend_only_message_1">受信しない</label></li>
<li><input type="radio" class="input_radio" name="IS_FRIEND_ONLY_MESSAGE" id="is_friend_only_message_0" value="0"({if !$C_MEMBER_CONFIG.IS_FRIEND_ONLY_MESSAGE}) checked="checked"({/if}) /><label for="is_friend_only_message_0">受信する</label>
</li>
</ul></tr>

</td></tr>
<tr>
<td colspan=2 align=center>
<input class="input_submit" type=submit value="設定する">
</td>
</tr>
</table>

({/t_form_block})

</div>

</div>
</div></div>
</div>

同ファイル左メニューのところに挿入

({if $box != "trash"})<li><a href="({t_url m=pc a=page_h_message_box})&amp;box=trash">ごみ箱</a></li>
({else})<li class="looking">ごみ箱</li>
({/if})
({if $box != "setting"})<li><a href="({t_url m=pc a=page_h_message_box})&amp;box=setting">設定</a></li>
({else})<li class="looking">設定</li>
({/if})

2.メッセージページで設定された内容を処理する

/webapp/modules/pc/do/h_message_box_setting.php (新規作成する)

<?php
class pc_do_h_message_box_setting extends OpenPNE_Action
{
    function execute($requests)
    {
        $u = $GLOBALS['AUTH']->uid();
        $c_message_id = $requests['c_message_id'];
        $box = $requests['box'];
        $default_config = util_get_c_member_config_default();
        foreach ($requests as $key => $value) {
            if (!is_null($value) && array_key_exists($key, $default_config)) {
                db_member_update_c_member_config($u, $key, $value);
            }
        }
        $p = array('box' => $box);
        openpne_redirect('pc', 'page_h_message_box', $p);
    }
}
?>

3.バリデーション処理

/webapp/modules/pc/validate/do/h_message_box_setting.ini (新規作成する)

[box]
type = "string"
default = ""

[IS_FRIEND_ONLY_MESSAGE]
type = "bool"

4.友達以外からのメッセージ受信するかどうかフラグを追加する

/webapp/lib/util/util.php

function util_get_c_member_config_default()
{
    $default_config = array(
        'SEND_DIARY_COMMENT_MAIL_KTAI' => 0,
        'IS_DISPLAY_NEWDIARY_HOME' => 1,
        'IS_DISPLAY_NEWTOPIC_HOME' => 1,
        'IS_DISPLAY_NEWDIARY_HOME_KTAI' => 1,
        'IS_DISPLAY_NEWTOPIC_HOME_KTAI' => 1,
        'IS_DISPLAY_BOOKMARK_DIARY_HOME' => 1,
        'IS_DISPLAY_BOOKMARK_BLOG_HOME' => 1,
        'IS_DISPLAY_SCHEDULE_HOME' => 1,
        'IS_FRIEND_ONLY_MESSAGE' => 0, //←追加
    );
    return $default_config;
}

5.拒否設定している場合、友達限定フラグを立てる

/webapp/modules/pc/page/f_message_send.php

       // 友達以外から拒否機能
        $C_TARGET_CONFIG = util_get_c_member_config($target_c_member_id);
        $is_friend = db_friend_is_friend($u, $target_c_member_id);

        if(!$is_friend && $C_TARGET_CONFIG["IS_FRIEND_ONLY_MESSAGE"] == 1){
         $this->set("IS_VIEW_ONLY_FRIEND", 1);
        }
6.テンプレPC:拒否設定されている場合、ごめんなさいメッセージを出す

/webapp/modules/pc/templates/f_message_send.tpl

({if $IS_VIEW_ONLY_FRIEND})

<div style="text-align:center">
友達以外からのメッセージはお断りしてます。<br>
</div>

({else})
<!-- ※元のフォーム部分のテンプレを囲う -->
... 
({/if})
7.拒否設定されている場合、権限エラーを出す(ガラケー用は内部処理だけ)

/webapp/modules/ktai/page/f_message_send.php

       // 友達以外から拒否機能
        $C_TARGET_CONFIG = util_get_c_member_config($target_c_member_id);
        $is_friend = db_friend_is_friend($u, $target_c_member_id);

        if(!$is_friend && $C_TARGET_CONFIG["IS_FRIEND_ONLY_MESSAGE"] == 1){
         handle_kengen_error();
        }