Sponsored Link

OpenPNEの最近のブログ記事

OpenPNEを携帯で見るとURLはリンクされないままURLが表示されてしまいます。これはPC用サイトの場合携帯では見れないことが多いから仕方なくリンクできないようにしているのではないでしょうか。

そこでGoogleのモバイル用最適化(コンバータ?)を使って携帯からも見れるようにしてみました。
/webapp/lib/smarty_plugins/modifier.t_url2a_ktai.php の30行目あたりの

    if (!$openpne_url) {
        return $raw_url;
    }
        if (!$openpne_url) {
        return sprintf('<a href="%sjump.php?u=%s">%s</a>', OPENPNE_URL, urlencode($raw_url), $raw_url);
    }
に入れ替えてください。

次にジャンプ用ページを作成します。(リファラ等セキュリティ強化のため)
public_html の直下(つまりindex.phpと同じディレクトリです)にこのファイル(jump.php)を解凍して置いてください。

一応jump.phpのソースです。これをコピペしても結構です。(必ずSJISで保存すること)


これで設定完了です。


これは結構使える機能だと思います。
もし使ったかたはご一報いただけると嬉しいです。

mixiがOpenIDに対応しましたね。これは使いようによってはすごく楽しい機能かもしれません。

できればOpenPNEにMixiのIDやYahooIDでログインできるようにしたいものです~。

でも現時点でOpenPNEではコンシューマ機能は実装しておらずOpenPNE3(結構先の話)以降になりそうです。

ということでカスタマイズしてコンシューマ機能を実装してみようかなぁと考え中。
どうしようかなぁ・・・

私はオープンソースを眺めるのが好きです。なんといっても実力者のソースを見ることで自分のスキルもアップすることができるからです。

例えばOpenPNE非常に巨大なシステムですが、よく整頓されておりソースを理解することで自然とPHPのスキルを高めることができます。

ではPHPで学べるスキルをあげてみます。


・クラスの基礎知識(オーバーライドなど)
・デザインパターン(特にシングルトン、テンプレート、ファクトリー、アダプターなど)
・フレームワークの効果(便利さ)
・セキュリティ対策
・Pear


など挙げるときりがありません。

例えばPerlだったらMovableTypeを眺めてみるとかもいいでしょうね。

OpenPNEのセッション情報はデフォルトでは公開フォルダ内のみで有効です(当然ですね)

でも上位のディレクトリとかでもこのセッション情報を利用したいことってありますよね。例えばヤフーのトップページみたいに通常サイトの右側にログイン情報(○通のメッセージがあります~とかね)の枠とかを作るとか。

こういうときは以下を変更すれば可能です。


/webapp/init.inc の105行目あたり

ini_set('session.cookie_path', $url['path']);

  を
ini_set('session.cookie_path', "/"');

に変更。

次に/webapp/init.inc の

//144行目あたりの
setcookie(session_name(), session_id(), $expire, $this->cookie_path);

//182行目あたりの
setcookie(session_name(), session_id(), $expire, $this->cookie_path);

  を

//144行目あたり
setcookie(session_name(), session_id(), $expire, "/");

//182行目あたり
setcookie(session_name(), session_id(), $expire, "/");

に変更すればサイト全体でセッション情報を活用できるようになります。

しかし!!

この場合はクッキーの有効範囲がサイト全体で有効になるため、そのサイト内で別にクッキーを使っている場合は競合する恐れがあります。もしも同じサイト内でOpenPNEを2つ以上構築している場合でもセッション情報が失われてログイン画面に戻ってしまいます。

セッションとクッキーの知識を装備して、うまく使い分けてください。

OpenPNEではポイント機能があって、日記やコミュに書き込みするなどのアクションごとにポイントが加算される機能があります。
この機能はすごく便利なのですが、「日記を書く」→「日記を削除」の繰り返しでどんどんポイントが増えていってしまいます。そのため日記を削除するなどのマイナスアクションをする度にポイントを減算するコードを書いてみました。

/webapp/lib/db/point.phpの最後に以下を追加します。

function db_point_dec_point($c_member_id, $point)
{
    if (!OPENPNE_USE_POINT_RANK) {
        return false;
    }
    
    // 管理者は減算しない
    if (!OPENPNE_IS_POINT_ADMIN && $c_member_id == 1) {
        return false;
    }

$sql = 'SELECT c_profile_id, public_flag_default FROM c_profile WHERE name = \'PNE_POINT\'';
if (!$c_profile = db_get_row($sql, array(), 'main')) {
return false;
}
$c_profile_id = $c_profile['c_profile_id'];
$public_flag = $c_profile['public_flag_default'];

$sql = 'SELECT value FROM c_member_profile WHERE c_member_id = ? AND c_profile_id = ?';
$params = array(intval($c_member_id), intval($c_profile_id));
$p = db_get_one($sql, $params, 'main');

// プロフィールにポイントがなければ追加
if (is_null($p)) {
$data = array(
'c_member_id' => intval($c_member_id),
'c_profile_id' => intval($c_profile_id),
'c_profile_option_id' => 0,
'value' => '0',
'public_flag' => $public_flag,
);
db_insert('c_member_profile', $data);
}

// ポイント減算
$p = intval($p) - intval($point);

$data = array('value' => $p);
$where = array('c_member_id' => intval($c_member_id), 'c_profile_id' => intval($c_profile_id));
db_update('c_member_profile', $data, $where);

return $p;
}


ポイントを減算したいアクションごとのファイルの最後かがある場合はその一行前に以下を追加
例 日記を削除したした時にポイントを減算する場合は以下の2ファイルの最後尾の「openpne_redirect・・・・」の前の行に下のコードを追加します。
/webapp/modules/pc/do/fh_diary_delete_c_diary.php (PC用)
/webapp/modules/ktai/do/fh_diary_delete_c_diary.php (携帯用)

        if (OPENPNE_USE_POINT_RANK) {
            //ポイント減算
            $point = db_action_get_point4c_action_id(4);
            db_point_dec_point($u, $point);
        }


日記を削除したときにこれでポイントが減算されるようになります。


他のアクションの減算方法は後日説明します。(眠い・・・)アクションごとに若干ソースが変わります。

私の使っているsoftbank携帯(912SH)では製造番号通知がデフォルトではオフのため、かんたんログインができませんでした。意外とこの問題を抱えている人は多いのではないでしょうか?

softbank3G携帯ではUIDが取得できるため、こちらを取得すればログインができるはずです。

試しに実装してみました/webapp/lib/OpenPne/KetaiID.phpの77行目

        // SoftBank
        elseif (!strncmp($ua, 'SoftBank', 8)) {
            $pieces = explode('/', $ua);
            $piece_sn = explode(' ', $pieces[4]);
            $sn = array_shift($piece_sn);
            if (!strncmp($sn, 'SN', 2)) {
                $id = $sn;
            }
        }
        // SoftBank
       elseif (!strncmp($ua, 'SoftBank', 8)) {
            $pieces = explode('/', $ua);
            $piece_sn = explode(' ', $pieces[4]);
            $sn = array_shift($piece_sn);
            if (!strncmp($sn, 'SN', 2)) {
                $id = $sn;
            }elseif (isset($_SERVER["x-jphone-uid"])){
                $id = $_SERVER["x-jphone-uid"];
            }elseif (isset($_SERVER['HTTP_X_JPHONE_UID'])){
                $id = $_SERVER['HTTP_X_JPHONE_UID'];
            }
        }


これで私の携帯でもログインできるようになりました。 UIDであれば機種変更しても変わらないため今後はこちらをメインで取得したほうがよいかもしれません。(mixiやモバゲーもUIDを取得しているはずです)今回は先にUIDを取得してしまうと現ユーザーが再設定しない限りログインできないためこうなってしまいました。バージョンは2.12までは動作確認済みです。

 
後述:
実はこのプログラムは2.12で本家のOpenPNEに
組み込んでいただくことになりました。
そのためそれ以降のバージョンには対応済みです。
自分のソースが組み込まれるのはちょっとうれしかったりします。
まあ・・たいしたソースでもないんですけどね・・・

        

OpenPNE-2.11.6を試してみました

なんとなく表示が早くなった気がしていい感じです。これはスタイルシートを使うことで大幅にコードを省略できたことが大きいのかもしれません。

SNSポータルクリエーターの機能も面白い。あと個人的に欲しいなあと思う機能は日記の外部公開選択機能かなあ。外部公開選択した日記もポータルクリエーターの項目に入れれるようなれば、よりSNSも活性化される気もします。

OpenID機能にも期待大ですね。