Example #1
0
function arrangeThread($PTE, $tree, $tree_cut, $posts, $hiddenReply, $resno = 0, $arr_kill, $arr_old, $kill_sensor, $old_sensor, $showquotelink = true, $adminMode = false)
{
    $PIO = PMCLibrary::getPIOInstance();
    $FileIO = PMCLibrary::getFileIOInstance();
    $PMS = PMCLibrary::getPMSInstance();
    $thdat = '';
    // 討論串輸出碼
    $posts_count = count($posts);
    // 迴圈次數
    if (gettype($tree_cut) == 'array') {
        $tree_cut = array_flip($tree_cut);
    }
    // array_flip + isset 搜尋法
    if (gettype($tree) == 'array') {
        $tree_clone = array_flip($tree);
    }
    // $i = 0 (首篇), $i = 1~n (回應)
    for ($i = 0; $i < $posts_count; $i++) {
        $imgsrc = $img_thumb = $imgwh_bar = '';
        $IMG_BAR = $REPLYBTN = $QUOTEBTN = $WARN_OLD = $WARN_BEKILL = $WARN_ENDREPLY = $WARN_HIDEPOST = '';
        extract($posts[$i]);
        // 取出討論串文章內容設定變數
        // 設定欄位值
        $name = str_replace('&' . _T('trip_pre'), '&amp;' . _T('trip_pre'), $name);
        // 避免 &#xxxx; 後面被視為 Trip 留下 & 造成解析錯誤
        if (CLEAR_SAGE) {
            $email = preg_replace('/^sage( *)/i', '', trim($email));
        }
        // 清除E-mail中的「sage」關鍵字
        if (ALLOW_NONAME == 2) {
            // 強制砍名
            $name = preg_match('/(\\' . _T('trip_pre') . '.{10})/', $name, $matches) ? '<span class="nor">' . $matches[1] . '</span>' : '';
            if ($email) {
                $now = "<a href=\"mailto:{$email}\">{$now}</a>";
            }
        } else {
            $name = preg_replace('/(\\' . _T('trip_pre') . '.{10})/', '<span class="nor">$1</span>', $name);
            // Trip取消粗體
            if ($email) {
                $name = "<a href=\"mailto:{$email}\">{$name}</a>";
            }
        }
        if (AUTO_LINK) {
            $com = auto_link($com);
        }
        $com = quoteLight($com);
        if (USE_QUOTESYSTEM && $i) {
            // 啟用引用瀏覽系統
            if (preg_match_all('/((?:&gt;|>)+)(?:No\\.)?(\\d+)/i', $com, $matches, PREG_SET_ORDER)) {
                // 找尋>>No.xxx
                $matches_unique = array();
                foreach ($matches as $val) {
                    if (!in_array($val, $matches_unique)) {
                        array_push($matches_unique, $val);
                    }
                }
                foreach ($matches_unique as $val) {
                    if (isset($tree_clone[$val[2]])) {
                        $r_page = $tree_clone[$val[2]];
                        // 引用回應在整體討論串中的位置
                        // 在此頁顯示區間內,輸出錨點即可
                        if (isset($tree_cut[$val[2]])) {
                            $com = str_replace($val[0], '<a class="qlink" href="#r' . $val[2] . '" onclick="replyhl(' . $val[2] . ');">' . $val[0] . '</a>', $com);
                        } else {
                            $com = str_replace($val[0], '<a class="qlink" href="' . PHP_SELF . '?res=' . $tree[0] . (RE_PAGE_DEF ? '&amp;page_num=' . floor(($r_page - 1) / RE_PAGE_DEF) : '') . '#r' . $val[2] . '">' . $val[0] . '</a>', $com);
                        }
                    }
                }
            }
        }
        // 設定附加圖檔顯示
        if ($ext && $FileIO->imageExists($tim . $ext)) {
            $imageURL = $FileIO->getImageURL($tim . $ext);
            // image URL
            $thumbName = $FileIO->resolveThumbName($tim);
            // thumb Name
            $imgsrc = '<a href="' . $imageURL . '" target="_blank" rel="nofollow"><img src="nothumb.gif" class="img" alt="' . $imgsize . '" title="' . $imgsize . '" /></a>';
            // 預設顯示圖樣式 (無預覽圖時)
            if ($tw && $th) {
                if ($thumbName != false) {
                    // 有預覽圖
                    $thumbURL = $FileIO->getImageURL($thumbName);
                    // thumb URL
                    $img_thumb = '<small>' . _T('img_sample') . '</small>';
                    $imgsrc = '<a href="' . $imageURL . '" target="_blank" rel="nofollow"><img src="' . $thumbURL . '" style="width: ' . $tw . 'px; height: ' . $th . 'px;" class="img" alt="' . $imgsize . '" title="' . $imgsize . '" /></a>';
                } elseif ($ext == '.swf') {
                    $imgsrc = '';
                }
                // swf檔案不需預覽圖
            }
            if (SHOW_IMGWH) {
                $imgwh_bar = ', ' . $imgw . 'x' . $imgh;
            }
            // 顯示附加圖檔之原檔長寬尺寸
            $IMG_BAR = _T('img_filename') . '<a href="' . $imageURL . '" target="_blank" rel="nofollow">' . $tim . $ext . '</a>-(' . $imgsize . $imgwh_bar . ') ' . $img_thumb;
        }
        // 設定回應 / 引用連結
        if ($resno) {
            // 回應模式
            if ($showquotelink) {
                $QUOTEBTN = '<a href="javascript:quote(' . $no . ');" class="qlink">No.' . $no . '</a>';
            } else {
                $QUOTEBTN = '<a href="' . PHP_SELF . '?res=' . $tree . '&amp;page_num=all#r' . $no . '" class="qlink">No.' . $no . '</a>';
            }
        } else {
            if (!$i) {
                $REPLYBTN = '[<a href="' . PHP_SELF . '?res=' . $no . '">' . _T('reply_btn') . '</a>]';
            }
            // 首篇
            $QUOTEBTN = '<a href="' . PHP_SELF . '?res=' . $tree[0] . '#q' . $no . '" class="qlink">No.' . $no . '</a>';
        }
        if ($adminMode) {
            // 前端管理模式
            $modFunc = '';
            $PMS->useModuleMethods('AdminList', array(&$modFunc, $posts[$i], $resto));
            // "AdminList" Hook Point
            $QUOTEBTN .= $modFunc;
        }
        // 設定討論串屬性
        if (STORAGE_LIMIT && $kill_sensor) {
            if (isset($arr_kill[$no])) {
                $WARN_BEKILL = '<span class="warn_txt">' . _T('warn_sizelimit') . '</span><br />' . "\n";
            }
        }
        // 預測刪除過大檔
        if (!$i) {
            // 首篇 Only
            if ($old_sensor) {
                if (isset($arr_old[$no])) {
                    $WARN_OLD = '<span class="warn_txt">' . _T('warn_oldthread') . '</span><br />' . "\n";
                }
            }
            // 快要被刪除的提示
            $flgh = $PIO->getPostStatus($status);
            if ($flgh->exists('TS')) {
                $WARN_ENDREPLY = '<span class="warn_txt">' . _T('warn_locked') . '</span><br />' . "\n";
            }
            // 被標記為禁止回應
            if ($hiddenReply) {
                $WARN_HIDEPOST = '<span class="warn_txt2">' . _T('notice_omitted', $hiddenReply) . '</span><br />' . "\n";
            }
            // 有隱藏的回應
        }
        // 對類別標籤作自動連結
        if (USE_CATEGORY) {
            $ary_category = explode(',', str_replace('&#44;', ',', $category));
            $ary_category = array_map('trim', $ary_category);
            $ary_category_count = count($ary_category);
            $ary_category2 = array();
            for ($p = 0; $p < $ary_category_count; $p++) {
                if ($c = $ary_category[$p]) {
                    $ary_category2[] = '<a href="' . PHP_SELF . '?mode=category&amp;c=' . urlencode($c) . '">' . $c . '</a>';
                }
            }
            $category = implode(', ', $ary_category2);
        } else {
            $category = '';
        }
        // 最終輸出處
        if ($i) {
            // 回應
            $arrLabels = array('{$NO}' => $no, '{$SUB}' => $sub, '{$NAME}' => $name, '{$NOW}' => $now, '{$CATEGORY}' => $category, '{$QUOTEBTN}' => $QUOTEBTN, '{$IMG_BAR}' => $IMG_BAR, '{$IMG_SRC}' => $imgsrc, '{$WARN_BEKILL}' => $WARN_BEKILL, '{$NAME_TEXT}' => _T('post_name'), '{$CATEGORY_TEXT}' => _T('post_category'), '{$SELF}' => PHP_SELF, '{$COM}' => $com);
            if ($resno) {
                $arrLabels['{$RESTO}'] = $resno;
            }
            $PMS->useModuleMethods('ThreadReply', array(&$arrLabels, $posts[$i], $resno));
            // "ThreadReply" Hook Point
            $thdat .= $PTE->ParseBlock('REPLY', $arrLabels);
        } else {
            // 首篇
            $arrLabels = array('{$NO}' => $no, '{$SUB}' => $sub, '{$NAME}' => $name, '{$NOW}' => $now, '{$CATEGORY}' => $category, '{$QUOTEBTN}' => $QUOTEBTN, '{$REPLYBTN}' => $REPLYBTN, '{$IMG_BAR}' => $IMG_BAR, '{$IMG_SRC}' => $imgsrc, '{$WARN_OLD}' => $WARN_OLD, '{$WARN_BEKILL}' => $WARN_BEKILL, '{$WARN_ENDREPLY}' => $WARN_ENDREPLY, '{$WARN_HIDEPOST}' => $WARN_HIDEPOST, '{$NAME_TEXT}' => _T('post_name'), '{$CATEGORY_TEXT}' => _T('post_category'), '{$SELF}' => PHP_SELF, '{$COM}' => $com);
            if ($resno) {
                $arrLabels['{$RESTO}'] = $resno;
            }
            $PMS->useModuleMethods('ThreadPost', array(&$arrLabels, $posts[$i], $resno));
            // "ThreadPost" Hook Point
            $thdat .= $PTE->ParseBlock('THREAD', $arrLabels);
        }
    }
    $thdat .= $PTE->ParseBlock('THREADSEPARATE', $resno ? array('{$RESTO}' => $resno) : array());
    return $thdat;
}
Example #2
0
function showPost($res, $page = 0)
{
    global $PTE;
    $tmp_page = 0;
    $p = 0;
    $pte_vals = array();
    $tree = file(TREEFILE);
    $counttree = count($tree);
    $find = false;
    if ($res) {
        for ($i = 0; $i < $counttree; $i++) {
            list($artno, ) = explode(",", rtrim($tree[$i]));
            if ($artno == $res) {
                $st = $i;
                $find = true;
                break;
            }
            // 先搜尋欲回應之原文章
        }
        if (!$find) {
            error("欲回應之文章並不存在!");
        }
    }
    $line = file(DATAFILE);
    $countline = count($line);
    for ($i = 0; $i < $countline; $i++) {
        list($no, ) = explode(",", $line[$i]);
        $lineindex[$no] = $i + 1;
        // 作成逆轉換標籤
    }
    if (!$res) {
        // php動態生成討論串用
        if ($page < 0 || $counttree && $page * PAGE_AMOUNT >= $counttree) {
            error("對不起,您所要求的頁數並不存在");
        }
        // $page 超過範圍則顯示錯誤畫面,與MySQL版不同 (但預設值0不必擋)
        $tmp_page = $page;
        // 進行跳頁所用
    }
    $dat = '';
    $tmprno = 0;
    $pte_vals += array('{$TITLE}' => TITLE, '{$SELF}' => $_SERVER['PHP_SELF'], '{$FORM_NAME_FIELD}' => '<input class="hide" type="text" name="name" value="spammer" /><input type="text" name="' . getFieldName(true) . '" id="fname" size="28" />', '{$FORM_EMAIL_FIELD}' => '<input type="text" name="' . getFieldName() . '" id="femail" size="28" /><input type="text" class="hide" name="email" value="*****@*****.**" />', '{$FORM_TOPIC_FIELD}' => '<input class="hide" value="DO NOT FIX THIS" type="text" name="sub" /><input type="text" name="' . getFieldName() . '" id="fsub" size="28" />', '{$FORM_COMMENT_FIELD}' => '<textarea name="' . getFieldName() . '" id="fcom" cols="48" rows="4" style="width: 400px; height: 80px;"></textarea><textarea name="com" class="hide" cols="48" rows="4">EID OG SMAPS</textarea>');
    $pte_vals['{$POSTS}'] = array();
    if (!$res) {
        $st = $tmp_page * PAGE_AMOUNT;
    }
    if ($res) {
        $pte_vals['{$RESTO}'] = $res;
    }
    for ($i = $st; $i < $st + PAGE_AMOUNT; $i++) {
        $fil = '';
        $alert = '';
        if (empty($tree[$i])) {
            continue;
        }
        $treeline = explode(",", rtrim($tree[$i]));
        $disptree = $treeline[0];
        $j = $lineindex[$disptree] - 1;
        // 在$j陣列搜尋該本文
        if (empty($line[$j])) {
            continue;
        }
        // 在$j之範圍外
        list($no, $now, $name, $email, $sub, $com, $url, $host, $pwd, $ext, $w, $h, $time, $chk) = explode(",", $line[$j]);
        if ($email) {
            $name = "<a href=\"mailto:{$email}\">{$name}</a>";
        }
        $com = auto_link(quoteLight($com));
        // 討論串所有回應生成
        if (!$res) {
            $s = count($treeline) - PAGE_AMOUNT;
            if ($s < 1) {
                $s = 1;
            } elseif ($s > 1) {
                $alert .= "<font color=\"#707070\">有回應 " . ($s - 1) . " 篇被省略。要閱讀所有回應請按下回應連結。</font><br>\n";
            }
            $RES_start = $s;
            // 分頁開始回應指標
            $RES_end = count($treeline);
            // 分頁結束回應指標
        } else {
            // 回應模式
            $RES_start = 1;
            // 分頁開始回應指標
            $RES_end = count($treeline);
            // 分頁結束回應指標
            if (PAGE_AMOUNT > 0) {
                // PAGE_AMOUNT有設定 (開啟分頁)
                $countresALL = count($treeline) - 1;
                // 總回應數
                if ($countresALL > 0) {
                    // 有回應才做分頁動作
                    if ($page == "RE_PAGE_MAX" && is_string($page)) {
                        // 特殊值:最末頁
                        $page = intval($countresALL / PAGE_AMOUNT);
                        // 最末頁資料指標位置
                        if (!($countresALL % PAGE_AMOUNT)) {
                            $page--;
                        }
                        // 如果回應數和一頁顯示取餘數=0,則-1
                        $RES_end = $countresALL + 1;
                        // 分頁結束回應指標
                    } elseif ($page == "all" && is_string($page)) {
                        // 特殊值:全部
                        $page = 0;
                        $RES_end = $countresALL + 1;
                        // 分頁結束回應指標
                    } else {
                        if ($page < 0) {
                            $page = 0;
                        }
                        // 負數要求惡搞合理化
                        if ($page * PAGE_AMOUNT >= $countresALL) {
                            error("對不起,您所要求的頁數並不存在");
                        }
                        // 超過最大筆數,顯示錯誤
                        $RES_end = ($page + 1) * PAGE_AMOUNT + 1;
                        // 分頁結束回應指標
                    }
                    $RES_start = $page * PAGE_AMOUNT + 1;
                    // 分頁開始回應指標
                } else {
                    // 沒有回應的情況只允許page = 0 或負數(惡搞合理化)
                    if ($page > 0) {
                        error("對不起,您所要求的頁數並不存在");
                    }
                }
            }
        }
        $pte_vals['{$POSTS}'][$i] = array('{$NO}' => $no, '{$SUB}' => $sub, '{$NAME}' => $name, '{$NOW}' => $now, '{$COM}' => $com, '{$ALERT}' => $alert);
        if (!$res) {
            $pte_vals['{$POSTS}'][$i] += array('{$REPLYBTN}' => "[<a href=\"{$_SERVER['PHP_SELF']}?res={$no}\">回應</a>]");
        }
        $pte_vals['{$POSTS}'][$i]['{$RES}'] = array();
        for ($k = $RES_start; $k < $RES_end; $k++) {
            if ($k < 0 || $k > count($treeline) - 1) {
                continue;
            }
            $disptree = $treeline[$k];
            $j = $lineindex[$disptree] - 1;
            if ($line[$j] == "") {
                continue;
            }
            list($no, $now, $name, $email, $sub, $com, $url, $host, $pwd, $ext, $w, $h, $time, $chk) = explode(",", $line[$j]);
            if ($email) {
                $name = "<a href=\"mailto:{$email}\">{$name}</a>";
            }
            $com = auto_link(quoteLight($com));
            $pte_vals['{$POSTS}'][$i]['{$RES}'][$k] = array('{$NO}' => $no, '{$SUB}' => $sub, '{$NAME}' => $name, '{$NOW}' => $now, '{$COM}' => $com);
        }
        $p++;
        if ($res) {
            break;
        }
        // 為回應模式時僅輸出單一討論串
    }
    $prev = $res ? ($page - 1) * PAGE_AMOUNT : $st - PAGE_AMOUNT;
    $next = $res ? ($page + 1) * PAGE_AMOUNT : $st + PAGE_AMOUNT;
    // 換頁判斷
    if ($res) {
        // 回應分頁
        if (PAGE_AMOUNT > 0) {
            // 回應分頁開啟
            $dat .= "<table align='left' class='navi'><tr>";
            if ($prev >= 0) {
                $dat .= "<td><form action=\"{$_SERVER['PHP_SELF']}?res={$res}&amp;page=" . $prev / PAGE_AMOUNT . "\" method=post><input type=submit value=\"上一頁\"></form></td><td>";
            } else {
                $dat .= "<td nowrap>第一頁</td><td>";
            }
            if ($countresALL == 0) {
                // 無回應
                $dat .= "[<b>0</b>] ";
            } else {
                $AllRes = isset($_GET['page']) && $_GET['page'] == "all";
                for ($i = 0; $i < $countresALL; $i += PAGE_AMOUNT) {
                    if ($page == $i / PAGE_AMOUNT && !$AllRes) {
                        $dat .= "[<b>" . $i / PAGE_AMOUNT . "</b>] ";
                    } else {
                        $dat .= "[<a href=\"{$_SERVER['PHP_SELF']}?res={$res}&amp;page=" . $i / PAGE_AMOUNT . "\">" . $i / PAGE_AMOUNT . "</a>] ";
                    }
                }
                $dat .= $AllRes ? "<span style='white-space: nowrap;'>[<b>全部</b>]</span> " : "<span style='white-space: nowrap;'>[<a href=\"{$_SERVER['PHP_SELF']}?res={$res}&amp;page=all\">全部</a>]</span> ";
            }
            $dat .= "</td>";
            if ($countresALL > $next && !$AllRes) {
                $dat .= "<td><form action=\"{$_SERVER['PHP_SELF']}?res={$res}&amp;page=" . $next / PAGE_AMOUNT . "\" method=post><input type=submit value=\"下一頁\"></form></td><td>";
            } else {
                $dat .= "<td nowrap>最後一頁</td>";
            }
            $dat .= "</tr></table><br clear='all'>\n";
        }
    } else {
        // 一般分頁
        $dat .= "<table align='left' class=\"navi\"><tr>";
        if ($prev >= 0) {
            if ($prev == 0) {
                $dat .= "<td><form action=\"{$_SERVER['PHP_SELF']}\" method='get'>";
            } else {
                $dat .= "<td><form action=\"{$_SERVER['PHP_SELF']}?page=" . $prev / PAGE_AMOUNT . "\" method=post>";
            }
            // 直接用php生成
            $dat .= "<input type=submit value=\"上一頁\">";
            $dat .= "</form></td>";
        } else {
            $dat .= "<td nowrap>第一頁</td>";
        }
        $dat .= "<td>";
        for ($i = 0; $i < $counttree; $i += PAGE_AMOUNT) {
            if ($st == $i) {
                $dat .= "[<b>" . $i / PAGE_AMOUNT . "</b>] ";
            } else {
                $dat .= "[<a href=\"{$_SERVER['PHP_SELF']}?page=" . $i / PAGE_AMOUNT . "\">" . $i / PAGE_AMOUNT . "</a>] ";
            }
            // 直接用php生成
        }
        $dat .= "</td>";
        if ($p >= PAGE_AMOUNT && $counttree > $next) {
            $dat .= "<td><form action=\"{$_SERVER['PHP_SELF']}?page=" . $next / PAGE_AMOUNT . "\" method=post>";
            $dat .= "<input type=submit value=\"下一頁\">";
            $dat .= "</form></td>";
        } else {
            $dat .= "<td nowrap>最後一頁</td>";
        }
        $dat .= "</tr></table><br clear=all>\n";
    }
    $pte_vals['{$PAGENAV}'] = $dat;
    $pte_vals['{$FOOTER}'] = 'Rev: 1.1.2';
    echo $PTE->ParseBlock('main', $pte_vals);
    exit;
}