phpBB Login and Redirect with Modifying Code

ต่อเนื่องจากเนื้อหาคราวก่อนในการ Login Integration กับ phpBB นั้น หากเราไม่ต้องการทำอะไรเกี่ยวกับการ login/logout เลย ให้ใช้ระบบ login ของ phpBB โดยพลัน แต่ต้องทำการแก้โค๊ดนิดหน่อย เพื่อทำให้หลัง login เสร็จแล้วจะทำการ redirect กลับมายังหน้าที่เรียกไป

ขอก๊อปเนื้อหาจากเว็บที่ผมไปดูมาเลยละกันนะ ประมาณว่าแปลเป็นไทย (ขอบคุณ tutorial-phpbb3-mod-login-redirection)

ไฟล์ที่เกี่ยวข้องมีดังต่อไปนี้
ucp.php
includes/functions.php,
styles/prosilver/template/overall_header.html

มาดูกันทีละไฟล์เลยละกัน ทั้งหมดนี้เป็นการรับ parameter ด้วย method post จากหน้าที่ส่งข้อมูลมา ทำให้ phpBB สามารถ redirect ตัวเองกลับไปยัง page นั้นๆได้ครับ
ucp.php
1. เปิดไฟล์ ucp.php ขึ้นมา
2. หาโค๊ดนี้ให้เจอครับ

1
2
3
4
5
6
7
8
case '<span>login</span>':
if ($user-&gt;data['is_registered'])
{
<span>redirect</span>(append_sid("{$phpbb_root_path}index.$phpEx"));
}
 
login_box(request_var('<span>redirect</span>', "index.$phpEx"));
break;

3. ให้เอาโค๊ดด้านล่างนี้ไปทับ (replace)

1
2
3
4
5
6
7
8
9
10
case '<span>login</span>':
$<span>redirect</span> = $_POST['from'];
 
if($user-&gt;data['is_registered'])
{
header("Location: ". append_sid($<span>redirect</span>));
}
 
login_box(request_var('<span>redirect</span>', "index.$phpEx"), '', '', '', '', append_sid($<span>redirect</span>));
break;

includes/functions.php
1. เปิดไฟล์ functions.php ขึ้นมา (แก้ระวังๆนะครับ เป็น core กลางเลยหน้านี้)
2. หาโค๊ดนี้ให้เจอ

1
'T_STYLESHEET_NAME'     => $user->theme['theme_name'],

3. วางโค๊ดนี้ไว้ด้านหลังครับ (add after)

1
'THIS_PAGE'             => str_ireplace('&','&amp;',$_SERVER['REQUEST_URI']),

4. หาโค๊ดนี้ให้เจอ

1
function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = false, $s_display = true)

5. เอาโค๊ดนี้ไปทับ (replace)

1
function login_box($redirect = '', $l_explain = '', $l_success = '', $admin = false, $s_display = true, $redirect = './index.php')

styles/prosilver/template/overall_header.html
1. เปิดไฟล์ overall_header.html
2. หาโค๊ดนี้ให้เจอ

1
2
3
4
5
6
7
8
9
<!-- IF S_DISPLAY_SEARCH and not S_IN_SEARCH -->
            <div id="search-box">
                <form action="{U_SEARCH}" method="post" id="search">
                <fieldset>
                    <input name="keywords" id="keywords" type="text" maxlength="128" title="{L_SEARCH_KEYWORDS}" class="inputbox search" value="<!-- IF SEARCH_WORDS-->{SEARCH_WORDS}<!-- ELSE -->{L_SEARCH_MINI}<!-- ENDIF -->" onclick="if(this.value=='{LA_SEARCH_MINI}')this.value='';" onblur="if(this.value=='')this.value='{LA_SEARCH_MINI}';" />
                    <input class="button2" value="{L_SEARCH}" type="submit" /><br />
                    <a href="{U_SEARCH}" title="{L_SEARCH_ADV_EXPLAIN}">{L_SEARCH_ADV}</a> {S_SEARCH_HIDDEN_FIELDS}
                </fieldset>
                </form>

3. จากนั้นเอาโค๊ดนี้ไว้ข้างหลัง (add after)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!-- IF not S_USER_LOGGED_IN and not S_IS_BOT -->
                <form method="post" action="{S_LOGIN_ACTION}" class="headerspace">
 
                    <fieldset class="quick-login">
                        <input type="hidden" name="from" value="{THIS_PAGE}" />
                        <label for="username2">{L_USERNAME}:</label>&nbsp;<input type="text" name="username" id="username2" size="20" class="inputbox" title="{L_USERNAME}" /><br />
                        <label for="password2">{L_PASSWORD}:</label>&nbsp;<input type="password" name="password" id="password2" size="20" class="inputbox" title="{L_PASSWORD}" /><br />
                        <!-- IF S_AUTOLOGIN_ENABLED -->
                        <label for="autologin2">{L_LOG_ME_IN} <input type="checkbox" name="autologin" id="autologin2" /></label>
                        <!-- ENDIF -->
                        <input type="submit" name="login" value="{L_LOGIN}" class="button2" />
                    </fieldset>
                </form>
            <!-- ENDIF -->

นี่เป็นการแก้ไขในส่วนของ phpBB หลังจากนี้เป็นตัวส่งข้อมูลไปยังหน้า ucp.php ส่งด้วย method post ใช้ code ง่ายๆตามนี้ครับ เป็นแค่ปุ่มๆเดียวในการ link ไปหาหน้า login ของ phpBB นั้นๆ

1
2
3
4
<form action="http://aspgod.com/ucp.php?mode=login" method="post">
    <input type="hidden" name="from" value="http://aspgod.com">
    <input type="submit" value="LogIn">
</form>

เมื่อกดปุ่มแล้วก็จะ ไปยังหน้า login เมื่อ login เสร็จก็จะกลับมายังหน้าเดิมตาม value ที่ส่งไป
*** ต้องส่งด้วยชื่อ paramerter ว่า “from” เท่านั้นนะครับ เพราะเซ็ตให้เป็นแบบนั้น

สำหรับใครที่ต้องการให้ login เสร็จแล้ววิ่งไปยัง domain name อื่น (cross domain) โดย default แล้ว phpBB ไม่อนุญาตให้ redirect ไปยัง domain อื่น ดังนั้นเราต้องแก้เพิ่มอีกนิดหน่อย (อันนี้ผมหาเจอเองนะ ขอ credit หน่อยละกัน อิอิ)
1. เปิดไฟล์ includes/functions.php ขึ้นมา
2. หาโค๊ดนี้ในไฟล์

1
$redirect = meta_refresh(3, $redirect)

3. เอาโค๊ดนี้ไปทับ (replace) จริงๆเป็นการเพิ่ม parameter

1
$redirect = meta_refresh(3, $redirect, true)

เป็นการทำให้ redirect โดยไม่สนใจ root domain

ก็เป็นด้วยประการฉะนี้แล หวังว่าข้อมูลนี้จะเป็นประโยชน์ไม่มากก็น้อยนะครับ