ตั้งค่าอย่างไรให้ Module Views สร้าง Block ที่แสดง Node ในช่วงที่เราต้องการ

  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.
  • warning: realpath() [function.realpath]: SAFE MODE Restriction in effect. The script whose uid is 1005 is not allowed to access /tmp owned by uid 0 in /var/www/sites/sugree/codenone.com/subdomains/www/html/includes/file.inc on line 190.

ผมใช้ Module Views สร้าง Block ขึ้นมา โดยผมกำหนดให้ Block นั้นสำหรับแสดงเรื่องมี Tag ที่ผมต้องการ แล้วนำ Block นั้นไปแสดงในหน้าแรก ซึ่งจะเป็น 10 เรื่องล่าสุด เรียงตามลำดับ Node : Created Time

ผมมีเรื่องสงสัยจะขอคำแนะนำหน่อยครับว่า

ถ้าผมต้องการให้ แสดง แค่ เรื่อง ตั้งแต่ 11 - 20 เรื่องล่าสุด เรียงตามลำดับ Node : Created Time
จะสามารถทำได้หรือไม่ ผมจะต้องกำหนดค่าต่างๆ ยังไงบ้างครับ

ขอบคุณครับ

sugree's picture

เอ่อ เกรงว่า Views จะทำให้ไม่ได้ ลองใช้โค้ดข้างล่างใส่ใน block แทนละกันครับ

<?php
$result = db_query_range(db_rewrite_sql("SELECT n.nid, n.title, n.created FROM {node} n WHERE n.status = 1 ORDER BY n.created DESC"), 10, 10);
if (db_num_rows($result)) {
  echo node_title_list($result);
}
?>
Blue Rabbit's picture

แล้วถ้าผมจะกำหนดให้แสดงแค่ term ที่ผมต้องการ ต้องกำหนดเพิ่มเติมยังไงครับ
(tid=22)

รบกวนหน่อยนะครับ ผมยังไม่ชำนาญ sql

sugree's picture

งั้นลองแบบนี้

<?php
$str_tids = "22";
$order = "n.created DESC";
 
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ('. $str_tids .') AND n.status = 1';
$result = db_query_range(db_rewrite_sql($sql .' ORDER BY '.$order), 10, 10);
if (db_num_rows($result)) {
  echo node_title_list($result);
}
?>
Blue Rabbit's picture

เยี่ยมเลยครับ ลองนำไปใช้แล้ว ได้ผลดีตามต้องการเลยครับ
ขอบคุณ คุณ sugree มากๆ ครับ

Blue Rabbit's picture

รบกวนช่วยอีกนิดนึงนะครับ ขอโทษที่ถามหลายๆ รอบ
ผมพยามแก้ไขด้วยตัวเองแล้ว แต่ยังทำไม่ได้เลยครับ
ขอบคุณครับ

แล้วถ้าต้องการให้แสดงชื่อผู้เขียนของเรื่องนั้น ต่อท้ายด้วย จะต้องทำอย่างไรครับ
เช่น

  • ชื่อบทความ (ชื่อผู้แต่ง)
  • ชื่อบทความ (ชื่อผู้แต่ง)


การแสดงผลในข้างต้นนี้เป็นการแสดงผลแบบ List
ถ้าต้องการให้แสดงผลแบบ Table View (แบบที่มีให้เลือกใน Module View) จะทำได้โดยง่ายไหมครับ

ลำบากเกินไป ไม่เป็นไรครับ

sugree's picture

ใส่ชื่อผู้เขียนก่อน เดี๋ยวทำตารางตามมาอีกที

<?php
$str_tids = "22";
$order = "n.created DESC";
 
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created, u.uid, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ('. $str_tids .') AND n.status = 1';
$result = db_query_range(db_rewrite_sql($sql .' ORDER BY '.$order), 10, 10);
if (db_num_rows($result)) {
  $items = array();
  while ($node = db_fetch_object($result)) {
    $items[] = l($node->title, 'node/'. $node->nid) .' ('. l($node->name, 'user/'. $node->uid) .')';
  }
 
  echo theme('node_list', $items);
}
?>
Blue Rabbit's picture

สามารถนำไปใช้งานได้ดีครับ
ขอบคุณมากครับ..

sugree's picture

แบบใส่ตาราง

<?php
$str_tids = "22";
$order = "n.created DESC";
 
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created, u.uid, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid IN ('. $str_tids .') AND n.status = 1';
$result = db_query_range(db_rewrite_sql($sql .' ORDER BY '.$order), 10, 10);
if (db_num_rows($result)) {
  $header = array('Title', 'Author');
  $rows = array();
  while ($node = db_fetch_object($result)) {
    $rows[] = array(
      array('data' => l($node->title, 'node/'. $node->nid), 'class' => 'title'),
      array('data' => l($node->name, 'user/'. $node->uid), 'class' => 'author'));
  }
 
  echo theme('table', $header, $rows);
}
?>

มันง่ายแบบนี้แหละ ผมถึงชอบ Drupal

Blue Rabbit's picture

อ่อ.. อย่างนี้นี่เอง
ขอบคุณมากๆ ครับ

jrp13th's picture

สมมุติถ้าต้องการ node ที่ีมี term ที่ 5 กับ 20 (5 and 20 ไม่ใช่ 5 or 20 นะครับ)
ต้องแก้ยังไงดีครับ

sugree's picture

ถ้าเป็น mysql 4.1 ขึ้นไปจะใช้ subquery ได้

<?php
$str_tids = array(5,20);
$order = "n.created DESC";
 
$cond = array();
foreach($str_tids as $tid) {
  $cond[] = 'n.nid IN (SELECT n.nid FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid = '.$tid.')';
}
 
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created, u.uid, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid WHERE '.implode(' AND ',$cond).' AND n.status = 1';
$result = db_query_range(db_rewrite_sql($sql .' ORDER BY '.$order), 10, 10);
if (db_num_rows($result)) {
  $header = array('Title', 'Author');
  $rows = array();
  while ($node = db_fetch_object($result)) {
    $rows[] = array(
      array('data' => l($node->title, 'node/'. $node->nid), 'class' => 'title'),
      array('data' => l($node->name, 'user/'. $node->uid), 'class' => 'author'));
  }
 
  echo theme('table', $header, $rows);
}
?>

คำเตือน: ไม่ได้ลองจริงนะ

jrp13th's picture

ขอบคุณครับ

jrp13th's picture

ถ้าเป็นข้อมูล node title พร้อมลิงค์

><?php
$str_tids = array(5,20);
$order = "n.created DESC";
 
$cond = array();
foreach($str_tids as $tid) {
  $cond[] = 'n.nid IN (SELECT n.nid FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid = '.$tid.')';
}
 
$sql = 'SELECT DISTINCT(n.nid), n.sticky, n.title, n.created, u.uid, u.name FROM {node} n INNER JOIN {users} u ON n.uid = u.uid WHERE '.implode(' AND ',$cond).' AND n.status = 1';
$result = db_query_range(db_rewrite_sql($sql .' ORDER BY '.$order), 10, 10);
if (db_num_rows($result)) {
echo node_title_list($result);
}
?></code>
 
ป.ล. ถามนอกรอบกับคุณ vavar  มาอีกทีครับ ขอขึ้นบอร์ดไว้กันลืมครับ

ย้าย Codenone

ประกาศย้าย Codenone ไปใช้ Forum ของ Blognone แทนครับ ตามไปตั้งกระทู้ต่อได้ที่ Codenone Forum (รายละเอียดอ่านจากกระทู้ ย้าย Codenone ไปรวมกับ Blognone)

กระทู้เก่าๆ จะย้ายตามไปในภายหลัง ตอนนี้ปิดการโพสต์กระทู้ไว้ เหลือไว้เฉพาะอ้างอิงเท่านั้น