• Welcome to ชมรมนิติกรองค์กรปกครองส่วนท้องถิ่น:เว็บไซท์อันดับ๑ของวงการท้องถิ่น.
Main Menu

[SMF] วิธีทำกระทู้แนะนำในเว็บบอร์ด

เริ่มโดย admin, 03-09-2020, 08:10:22

หัวข้อก่อนหน้า - หัวข้อถัดไป

admin

 [SMF] วิธีทำกระทู้แนะนำในเว็บบอร์ด

อ้างอิงจากกระทู้นี้ http://forum.ubuntuclub.com/forum?topic=8915 ของ Ubuntuclub Forum  ครับ
เห็นว่าน่าสนใจดีเลยขออนุญาตนำมาเผยแพร่ต่อเผื่อให้ท่านที่สนใจ

กระทู้ที่อ้างอิงด้านบนนั่นกล่าวถึงการ "กระทู้แนะนำ" หรือกระทู้โหวต ซึ่งสามารถเขียนให้สมาชิกโหวต หรือเฉพาะแอดมินเท่านั้นที่โหวตก็ได้
แต่จากตัวอย่างลิงค์ด้านบน อนุญาตให้สมาชิกเท่านั้นโหวต  เพื่อให้กระทู้ขึ้นในหมวดกระทู้แนะนำ

ความจริงจะบอกว่าเป็นกระทู้โหวตก็ไม่ใคร่ถูกนัก เป็นเพียงการอนุญาตให้สมาชิกคลิกเลือกกระทู้ให้ไปอยู่ในหมวด "กระทู้แนะนำ" ซึ่งจะอยู่บนสุด แขกใครไปไหนมาไหนก็จะเห็นเด่นเป็นสง่า
ผมจะไม่เขียนอะไรเพิ่มเติมในระบบที่ทาง Ubuntuclub Forum  เขียนไว้แล้วนะครับ
แค่จะแนะนำวิธีใช้งานเท่านั้นเอง (ในลิงค์ดังกล่าวแนะนำการใช้งานไว้สำหรับทั้งเวอร์ชั่น 1 และเวอร์ชั่น 2 แต่ในที่นี้ผมจะขอพูดถึงเฉพาะเวอร์ชั่น 2 เท่านั้นนะครับ)

ถ้าท่านยังคิดภาพกระทู้แนะนำไม่ออก ..ก็ขอให้คิดถึงภาพเว็บบอร์ดที่มีกระทู้เรียงกันเป็นลำดับ แต่ด้านบนสุดของกระทู้ที่เรียงเป็นลำดับนั้น มีกล่องสี่เหลี่ยมตกแต่งสวยงาม ซึ่งในกล่องนั้นปรากฏกระทู้, ผู้ตั้งกระทู้, วันเวลาที่ตั้งกระทู้ ฯลฯ แล้วแต่จะหยิบนำอะไรมาแสดง ไม่เรียงลำดับ ไม่ใช่กระทู้ปักหมุด แต่เป็นกระทู้แนะนำ (ตามภาพ)

คล้ายๆ กระทู้ล่าสุด แต่การเลือกกระทู้มาแสดงเกิดจากการเลือก ไม่ใช่เลือกกระทู้ล่าสุดมาแสดง ข้อดีคือจะสามารถขุดเอากระทู้เก่าๆ แต่ยังมีประโชยน์และอยากให้โชว์อยู่ขึ้นมาแสดงในหน้าแรกได้

มาดูการนำไปใช้งานเลยดีกว่านะครับ
ไฟล์ที่เกี่ยวข้องมี 3 ไฟล์ และ 1 ใน 3 ไฟล์นั้นต้องสร้างขึ้นมาใหม่
1. Display.template.php // เพิ่มปุ่มโหวต หรือปุ่มเลือกกระทู้ในไฟล์นี้
2. BoardIndex.template.php //  สำหรับแสดงกระทู้โหวต และ
3. voterec.php // สำหรับโหวตหรือเลือกกระทู้

ไฟล์  Display.template.php ค้นหาคำว่า
  if (!$message['approved'] && $message['member']['id'] != 0 && $message['member']['id'] == $context['user']['id'])
   echo '
        <div class="approve_post">
         ', $txt['post_awaiting_approval'], '
        </div>';

พบแล้ววางคำสั่งด้านล่างนี้ต่อท้ายไป                             
      if(empty($message['counter']))
      echo '
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.js"></script>
<script type="text/javascript">
function voterec(id, ele){
   $(ele).unbind("click")
   $(".whs-rec-desc").html("โปรดรอ...")
   $.get("',$settings['theme_url'],'/voterec?act=vote&id="+id, {}, function(d){
      if(d!="OK")
         $(".whs-rec-desc").html(d)
      else
         $(".whs-rec-desc").html("โหวตเรียบร้อยแล้วครับ :)")
   })
}
</script>
                  <div class="whs-rec" style="float: right; text-align: center; font-size: 9pt;">
                     <a href="javascript:ubuntuclub();" onclick="voterec(',$context['current_topic'],', this); return false;">
                        <img src="',$settings['default_theme_url'],'/images/recommend.png" />
                     </a>
                     <div class="whs-rec-desc" style="margin-top: -20px;">
                        โหวตกระทู้นี้ ห้เป็นกระทู้แนะนำ
                     </div>
                  </div>';   
               
ไฟล์ BoardIndex.template.php ให้ค้นหาคำว่า
/* Each category in categories is made up of:
id, href, link, name, is_collapsed (is it collapsed?), can_collapse (is it okay if it is?),
new (is it new?), collapse_href (href to collapse/expand), collapse_image (up/down image),
and boards. (see below.) */

    พบแล้วให้วางโค๊ดด้านล่างนี้ด้านบน ..

       // WHS's Mod -> Recommend Topic
   print <<<WHSDOC
   <div class="tborder marginbottom categoryframe">
      <h3 class="catbg headerpadding">กระทู้แนะนำ</h3>
      <table cellspacing="1" class="bordercolor boardsframe">
         <tr>
            <td class="windowbg icon"><img src="{$settings['default_theme_url']}/images/recommend.png" alt="กระทู้แนะนำ" border="0" /><div style="margin-top: -20px;">กระทู้แนะนำ</div></td>
            <td class="windowbg"><iframe src="/voterec?act=view" style="width:100%; border: none;"></iframe></td>
         </tr>
      </table>
   </div>
WHSDOC;         

และสุดท้ายสร้างสร้างไฟล์ voterec.php และวางชุดคำสั่งนี้ลงไป

<?php
include "smf/SSI.php";
// no trespasser!
if($context['user']['is_guest']){
   die('ต้องสมัครสมาชิกก่อนทำการโหวตครับ');
}
function boardName($bid){
   global $smcFunc;
   $req = $smcFunc['db_query']('', "
      SELECT name
      FROM {db_prefix}boards
      WHERE id_board = {int:bid}
      LIMIT 1
   ", array(
      'bid' => $bid,
   ));
   $row = $smcFunc['db_fetch_row']($req);
   return $row[0];
}
// yeah, I cheat.
// this using the [t=..] by the DtTvB :) ported to SMF 2's
// Get topic title from Zone-IT, with member color link!
function ubuntuclub_topic($message){
   global $smcFunc, $memberContext, $txt, $scripturl;
   $req = $smcFunc['db_query']('', "
      SELECT subject, id_member, id_board, id_topic
      FROM {db_prefix}messages
      WHERE id_topic = {int:idt}
      ORDER BY id_msg ASC LIMIT 1
   ", array(
      'idt' => $message,
   ));
   $row = $smcFunc['db_fetch_row']($req);
   if($row[1] != 0){
      // I don't reinvent the wheel, I'm lazy. I know this is slow but since we use iframe that doesn't matter.
      loadMemberData($row[1], false, 'minimal');
      @loadMemberContext($row[1]); // SHUT UP!
      $member = $memberContext[$row[1]]['link'];
   }else{
      $member = $txt['guest_title']; //I'm Fedora's l10n team after all.
   }
   // get the board's name!
   $bn = boardName($row[2]);
   return array($row[0], $member, "<a href='{$scripturl}/board,{$row[2]}.0.html'>$bn</a>");
}
if($_GET['act'] == "vote"){
   $topic = $_GET['id'];
   // is that thing really, exists?
   if (!ubuntuclub_topic($topic)){
      $smcFunc['db_free_result']($request);
      die("ไม่พบกระทู้ที่เรียก");
   }
   $smcFunc['db_free_result']($request);
   // well, so now it's exists. Just inject that into the table
   // but we need to know how much vote does it having?
   $request = $smcFunc['db_query']('', '
      SELECT * FROM {db_prefix}recommend WHERE ID_TOPIC = {int:idt}
   ', array(
      'idt' => $topic
   ));
   // hmm, PHP's DBAPI is clearly a mess, python's DBAPI is really simple
   $recommend = $smcFunc['db_fetch_row']($request);
   $smcFunc['db_free_result']($request);
   if(!$recommend){
      $request = $smcFunc['db_query']('', '
         INSERT INTO {db_prefix}recommend VALUES ({int:idt}, 1, "'.$context['user']['id'].'")
      ', array(
         'idt' => $topic
      ));
      die("OK");
   }else{
      // PHP showing it's suckness again, I think context.user.id in recommend[2].split(",") is more readable
      if(in_array($context['user']['id'], split(",", $recommend[2]))){
         die("คุณโหวตไปแล้ว");
      }
      $recommend[2] .= ",".$context['user']['id'];
      $recommend[1] += 1;
      // commit!
      $request = $smcFunc['db_query']('', '
         UPDATE {db_prefix}recommend SET count = {int:count}, voters = "'.$recommend[2].'"
         WHERE ID_TOPIC = {int:idt}
      ', array(
         'idt' => $topic,
         'count' => $recommend[1]
      ));
      die("OK");
   }
}else if($_GET['act'] == "view"){
   $req = $smcFunc['db_query']('', "
      SELECT ID_TOPIC FROM {db_prefix}recommend
      ORDER BY count DESC LIMIT 5
   ", array());
   while($row = $smcFunc['db_fetch_row']($req)){
      $tt = ubuntuclub_topic($row[0]);
      // hard coding to prevent beggars to use this
      print "<div><a href='$scripturl/topic,{$row[0]}.0.html' target='_parent'>{$tt[0]}</a> {$txt['started_by']} {$tt[1]} {$txt['in']} {$tt[2]}</div>";
   }
}

เซฟไว้ในโฟล์เดอร์ธีมของเรา
สุดท้ายต้องไปสร้างตารางไว้ในฐานข้อมูลด้วยครัับ

CREATE TABLE `smf_recommend` (
  `ID_TOPIC` int(11) NOT NULL,
  `count` int(11) NOT NULL default '0',
  `voters` longtext NOT NULL,
  PRIMARY KEY  (`ID_TOPIC`),
  KEY `count` (`count`)
)

ทั้งหมดนี้ผมเอาโค๊ดจากลิงค์ที่อ้างอิงด้านบนมา โดยไม่ได้ปรับแต่งหรือแก้ไขแต่อย่างใด ทั้งนี้เพื่อให้เครดิตแก่ผู้เขียนครับ
แต่ถ้าจะเอาไปใช้งานจริงก็ลองปรับดูให้เข้ากับบอร์ดของเรา จะให้สมาชิกสามารถโหวตได้ด้วย หรือให้เฉพาะแอดมินเท่านั้นโหวตก็ไปลองปรับกันใช้ดูครับ

อยากให้ชาตินี้เป็นชาติสุดท้ายของเรา