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'), '&' . _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('/((?:>|>)+)(?: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 ? '&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 . '&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(',', ',', $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&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; }
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}&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}&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}&page=all\">全部</a>]</span> "; } $dat .= "</td>"; if ($countresALL > $next && !$AllRes) { $dat .= "<td><form action=\"{$_SERVER['PHP_SELF']}?res={$res}&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; }