อะไรคือวิธีที่ดีที่สุดในการเขียนโปรแกรมเพื่อทำซ้ำผ่านผลลัพธ์ของมุมมอง


12

รับมุมมองชื่อ 'เด็ก ๆ ' (มีสองฟิลด์: child_node_id และ birth_order_value) วิธีที่ดีที่สุดโดยทางโปรแกรมคือวนซ้ำไปตามผลลัพธ์ของมุมมองที่กำหนดให้ display_id เป็น 'ค่าเริ่มต้น' และอาร์กิวเมนต์ที่มีรหัสโหนดหลัก

ก่อนหน้านี้ฉันใช้มุมมองในบล็อกโดยใช้โค้ดที่คล้ายกับที่แสดงต่อไปนี้:

if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)) {
   $node = node_load(arg(1));
   $args = array($node->nid);
   $view = views_get_view('Children');
   print $view->preview('default', $args);
}

อย่างไรก็ตามในบล็อกอื่นฉันต้องการดำเนินการตรรกะบางอย่างตามค่าที่พบในมุมมอง คุณอาจเดาได้ว่าตรรกะทางธุรกิจตามความต้องการขั้นสุดท้ายของฉัน: ฉันต้องการบล็อกของรหัสที่สนับสนุนมุมมอง ('เด็ก') ที่เรียกว่าหลายครั้ง ในขณะที่ฉันวนซ้ำผ่านผลลัพธ์ชุดข้อมูลการดูฉันต้องการวนซ้ำแบบซ้ำ ๆ ผ่านโหนดลูก ๆ เพื่อสอบถามลูก ๆ ของพวกเขา


วิธีการของคุณดูโอเค หากคุณใส่ไว้ในคำตอบที่ผู้คนสามารถลงคะแนนได้และอนุมัติ สิ่งหนึ่งที่คุณอาจลองทำคือแทนที่จะยกเลิกการกำหนดมุมมองในแต่ละครั้ง ทำ $ view-> clone_view () ก่อนดำเนินการ การโหลดการดูค่อนข้างหนักและอาจช่วยให้หน่วยความจำและประสิทธิภาพการทำงาน
Jeremy French

ให้อภัยถ้าฉันออกจากฐานที่นี่ แต่นี่คือสิ่งที่คุณสามารถทำได้โดยใช้ความสัมพันธ์และการจัดกลุ่มในเขตข้อมูลในตารางหลัก ฉันไม่แน่ใจว่าคุณต้องใช้รหัสเพื่อยัง มันอาจจะง่ายกว่าในการเรียกมุมมองย่อยและตรรกะจากการแทนที่แม่แบบ
Jason Smith

คุณควรพิจารณาforeach แทนที่จะเป็น (.. sizeof ()) มันทำงานได้ดีขึ้นมาก (เพราะมันคือ C แทนที่จะเป็น PHP)
berkes

สิ่งหนึ่งที่จะต้องทราบแทนการทำมันอาจจะดีกว่าที่จะใช้if (arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2)) if ($node = menu_get_object())
Chris Pliakas

ฉันตัดคำตอบออกจากคำถามแล้วโพสต์เป็นคำตอบ วิธีนี้จะชัดเจนสำหรับผู้ใช้ไซต์ที่คำถามนี้มีคำตอบ
Jeremy French

คำตอบ:


2

การเล่นกับ Views สักเล็กน้อยฉันดูเหมือนว่าจะได้หาแนวทางมาแล้ว อย่างไรก็ตามฉันต้องการเปิดคำถามให้กับคำตอบอื่น ๆ และวิธีแก้ปัญหาที่ดีกว่า

<?php
if ( arg(0) == 'node' && is_numeric(arg(1)) && ! arg(2) ) {
   $node = node_load(arg(1));
   $args = array($node->nid );
   unset($view);
   $view = views_get_view('Children');
   $view->set_display('default');  
   $view->set_arguments($args);
   $view->set_items_per_page(20);
   $view->execute();
   $newarg = array();
   for ($i=0; $i<sizeof($view->result); $i++) {
      $newarg[$i] = $view->render_field('nid_1', $i);
   }
   for ($i=0; $i<sizeof($newarg); $i++) {
      unset($view);
      $view = views_get_view('Children');
      $view->set_display('default');  
      $view->set_arguments($newarg[$i]);
      $view->set_items_per_page(20);
      $view->execute();
      ....
   }
}
?>

กุญแจสำคัญในการดำเนินการดูหลายครั้งคือสำหรับฉันที่จะยกเลิกการตั้งค่า ($ ดู) เมื่อฉันทำกับชุดผลลัพธ์


1

ฉันได้รับไมล์สะสมที่ดีจากฟังก์ชั่นต่อไปนี้ ค่าที่ส่งคืนคืออาร์เรย์ของระเบียนมุมมองทั้งหมด การเรียก dsm ($ return_value) จะทำให้คุณมีความคิดที่ดีเกี่ยวกับโครงสร้างของมุมมองเฉพาะของคุณ

function _get_view_data($view_name, $args, $page = NULL, $page_size = 0 ) {
    $view = views_get_view($view_name);
    $view->pager['items_per_page'] = $page_size;
    $view->set_arguments($args);
    if ($page) {
        $view->build($page);
        $view->execute($page);
    }
    else {
        $view->execute();
    }
    return $view->result;
}

1

นี่คือฟังก์ชั่นตัวช่วยที่สร้างไว้แล้วใน Drupal API (ฉันใช้เวลาซักพักใน Drupal Docs และในที่สุดก็พบว่ามันดูเหมือนว่าคนอื่น ๆ จำนวนมากได้ผลิตโซลูชั่นที่ไม่ได้ใช้ตัวช่วยนี้และผู้ช่วยตัวนี้ทำตามขั้นตอนที่น่าสนใจซึ่งโซลูชันอื่นไม่ได้ .. เพื่อเรียก pre_render บนออบเจ็กต์ $ view ก่อนที่จะดำเนินการ)

ฉันไม่สามารถรับรองได้ว่าจะใช้งานได้ดีหรือไม่ แต่อย่างน้อยก็เป็นสถานที่ที่ระบุปัญหาด้วยวิธีการเหล่านี้

สำหรับ D6 http://api.drupal.org/api/views/views.module/function/views_get_view_result/6

และสำหรับ D7 http://api.drupal.org/api/views/views.module/function/views_get_view_result/7

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