เป็นไปได้ไหมที่จะกำหนดการตั้งค่าเพจเจอร์ของพลวัต?


13

ตัวอย่างเช่นคุณมีมุมมองที่แสดงเมื่อดูชนิดโหนดบางอย่าง แต่คุณต้องการให้การตั้งค่าเพจเจอร์แตกต่างกันสำหรับแต่ละโหนด ฉันกำลังคิดที่จะสร้างเขตข้อมูล CCK เช่น "การตั้งค่าเพจเจอร์" จากนั้นให้ตัวเลือกจำนวนเต็มของ xy แต่ฉันไม่รู้ว่าเป็นไปได้ไหมที่จะเสียบฟิลด์นั้นเข้ากับการตั้งค่าของผู้ชม หรือมีวิธีอื่นในการทำเช่นนี้อาจจะ?

คำตอบ:


18

เบ็ดมุมมองที่คุณต้องการใช้คือhook_views_pre_buildสิ่งที่เรียกว่าก่อนที่จะสร้างแบบสอบถาม ตอนนี้สมมติว่าคุณมีประสบการณ์การพัฒนาโมดูลขั้นพื้นฐานและคุณคุ้นเคยกับมุมมอง API

คุณควรจะทำ:

/*
 * Implementation of hook_views_pre_build().
 */
function hook_views_pre_build(&$view) {

  // Make sure this is only for the specific view you want to modified
  if ($view->name == "foo_bar") {

    // Get the x-y value from where you're storing it (in your example the node object).
    $pager_count = get_count_for_this_node();

    // Lets also make sure that this is a number so we won't destroy our view.
    if (is_numeric($pager_count)) {

      // Now lets set the pager item to what ever out count is.
      $view->pager['items_per_page'] = $pager_count;
    }
  }
}

ด้านบนเรากำลังใช้เบ็ดการดูที่เรียกว่าก่อนที่จะสร้างคิวรีการดูวิธีที่เพจเจอร์และทุกอย่างอื่นจะแสดงถึงการเปลี่ยนแปลง

คำเตือน: ควรใช้ตะขอการดูเมื่อคุณเข้าใจว่าเกิดอะไรขึ้น โค้ดด้านบนเขียนขึ้นสำหรับ views-2.x

หวังว่านี่จะช่วยได้


เยี่ยมมากขอบคุณ ฉันยังไม่มีประสบการณ์ในการพัฒนาโมดูล แต่ฉันเริ่มต้นจากสิ่งนั้นสองสามอย่างที่ฉันต้องการสำเร็จ ฉันมีความเข้าใจในการใช้งาน PHP ดังนั้นฉันสามารถติดตามสิ่งที่เกิดขึ้นในโค้ดที่คุณวางไว้ด้านบน ฉันคิดว่าสิ่งนี้ช่วยฉันได้มาก ขอขอบคุณ.
Jay

1
สำหรับ Views 3.x รหัสที่เกี่ยวข้องควรเปลี่ยนเป็น$view->items_per_page = $pager_count;
stevenw00

เป็นไปได้ไหมที่จะตั้งค่าออฟเซ็ตของแต่ละหน้าแบบไดนามิกด้วย?
shekoufeh

2

สำหรับ Drupal 7 ควรเขียนดังนี้:

$view->items_per_page = $pager_count;

ในตัวอย่าง:

/**
 * Implements hook_views_pre_build().
 */
function module_name_views_pre_build(&$view) {
  if ($view->name == "foo_bar" && $view->current_display == 'foo_display') {
    $pager_count = get_count_for_this_node();
    if (is_numeric($pager_count)) {
      $view->items_per_page = $pager_count;
    }
  }
}

ฉันใช้ตัวอย่างรหัสโดย @ericduran


1

คุณควรใช้ฟังก์ชัน preprocess มุมมอง

/*
 * Implementation of hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view){
  // $view->name
  // $view->current_display
  // ...
  // look for other variables in $view object
}

"preprocess" สำหรับชุดรูปแบบและ pre_render สายเกินไป (เขาเรียกใช้แบบสอบถามทั้งหมด) - เบ็ด pre_build ดีกว่ามาก
mojzis

1

หากต้องการอัปเดตผลการดูและเพจเจอร์ใน hook_views_pre_render คุณสามารถทำดังนี้:

<?php

/**
 * Implementation of hook_views_pre_render().
 */
function MODULENAME_views_pre_render(&$view) {
  if ($view->name == 'my_view' && $view->current_display == 'my_display') {
    // View result update logic.
    // e.g.
    // $result = array();
    // foreach ($view->result as $k => $row) {
    //   if (whatever is your condition) {
    //     $result[$k] = $row;
    //   }
    // }

    // Assuming $result has data as per your logic.
    // Update the pager according to result.
    $view->query->pager->total_items = count($result);
    $view->query->pager->update_page_info();
    // Add results to view.
    $view->result = $result;
  }
}

มันควรจะใช้ได้ !! ;)


ยอดเยี่ยม ฉันต้องการ จำกัด จำนวนรายการในหน้าที่กำหนดขึ้นอยู่กับรายการที่ส่งคืนโดยแบบสอบถาม จะตรวจสอบวิธีการนี้โดยเร็ว
Jens

มันไม่ทำงานอย่างแน่นอน แถวที่คุณปล่อยจะไม่ปรากฏในหน้าถัดไป ดังนั้นคุณจะจบลงด้วยเนื้อหาที่ขาดหายไป ต้องการการสอบสวนเพิ่มเติม
Jens

0

รหัสของ @tanmayk ทำเพื่อฉัน ใน hook_views_pre_render เพิ่มรหัส 2 บรรทัดนี้เท่านั้น

$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();

แต่ฉันไม่จำเป็นต้องเพิ่มผลลัพธ์ลงในมุมมอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.