ตัวจัดการมุมมองที่กำหนดเองโดยไม่มีตาราง


22

สิ่งนี้ดูง่ายในตอนแรก แต่ฉันทำผมเสียนี่

ฉันต้องการเพิ่มตัวจัดการมุมมองแบบกำหนดเองที่ไม่ใช้ตาราง

ฉันพยายามที่จะทำตามมุมมองที่เสนอ php, $ data ['views'] ['mycustomfield'] ใน hook_views_data แต่ก็ยัง "ไม่พบ mycustomfield colum"

ความช่วยเหลือใด ๆ ขอบคุณมาก!

คำตอบ:


26

จริง ๆ แล้วมันง่าย เพียงแค่ดูที่การดำเนินการขนย้ายวัสดุชมทั่วโลกที่มีอยู่ในviews.views.inc

ด้านล่างเป็นตัวอย่างวิธีที่คุณสามารถเพิ่มตัวจัดการฟิลด์โดยไม่ต้องมีตาราง

  1. ระบุตัวจัดการที่กำหนดเองของคุณในhook_views_dataเช่นด้านล่าง

    /**
     * Implements hook_views_data().
     */
     function my_module_views_data() {
       $data['custom']['table']['group'] = t('Custom');
       $data['custom']['table']['join'] = array(
         // #global is a special flag which let's a table appear all the time.
         '#global' => array(),
       );
    
       $data['custom']['custom_handler'] = array(
         'title' => t('Custom Handler'),
         'help' => t('Custom Handler.'),
         'field' => array(
           'handler' => 'views_handler_custom_handler',
         ),
       );
    
       return $data;
    }
    
  2. สร้างไฟล์ inc สำหรับผู้จัดการวางตรรกะของคุณไว้ที่นั่น สิ่งที่ต้องการด้านล่างนี่ชื่อไฟล์จะเป็น views_handler_custom_handler.inc

    /**
     * A handler to provide a field that is completely custom by the administrator.
     *
     * @ingroup views_field_handlers
     */
     class views_handler_custom_handler extends views_handler_field {
       function query() {
         // do nothing -- to override the parent query.
       }
    
       function option_definition() {
         $options = parent::option_definition();
    
         // Override the alter text option to always alter the text.
         $options['alter']['contains']['alter_text'] = array('default' => TRUE);
         return $options;
       }
    
       function options_form(&$form, &$form_state) {
         parent::options_form($form, $form_state);
    
         // Remove the checkbox
         unset($form['alter']['alter_text']);
         unset($form['alter']['text']['#dependency']);
         unset($form['alter']['text']['#process']);
       }
    
       function render($values) {
         // Render your content.
         return 'Sample';
       }
    }
  3. ระบุไฟล์ตัวจัดการใหม่นี้ในไฟล์ข้อมูลของโมดูล

  4. ล้างแคช

ตอนนี้ตัวจัดการฟิลด์ใหม่จะอยู่ที่นั่นในรายการฟิลด์


1
ขอบคุณ ! สิ่ง 2 อย่างที่ฉันต้องการ: แทนที่คิวรีโดยระบุว่าว่างเปล่าและเข้าร่วม '#global'
Gregory Kapustin

มีวิธีกรองผลลัพธ์เหล่านี้หรือไม่ ตัวอย่างเช่นฉันได้สร้าง Field Handler ที่กำหนดเองสำหรับการคำนวณ "สถานะ" พิเศษตามความสัมพันธ์ของผู้ใช้กับเอนทิตี ฉันต้องการกรองผ่านสถานะนั้น ความคิดใด ๆ
tigertrussell

ขอบคุณนี่คือสิ่งที่ฉันต้องการ! แต่ดูเหมือนว่าฉันไม่สามารถเปิดใช้งานความสัมพันธ์มุมมองสำหรับตัวจัดการฟิลด์เช่นนี้ drupal.stackexchange.com/questions/166734/…ความคิดใด ๆ
donquixote

1

ทำให้เสร็จสมบูรณ์: คุณจะต้องเพิ่ม hook_views_api ด้วย

function my_module_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'my_module'),
  );
}

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