วิธีการแสดงชนิดเนื้อหา ctools โดยทางโปรแกรม?


12

ฉันมีปลั๊กอิน ctools หรือที่รู้จัก ประเภทเนื้อหา aka บานหน้าต่างแผง หนึ่งจะแสดงผลโดยทางโปรแกรมอย่างไร


+1 คำถามที่น่าสนใจมาก ฉันสงสัยว่าจะสามารถสร้างปลั๊กอิน ctools นอกหน้าตัวจัดการหน้าได้หรือไม่ เนื่องจากสิ่งนั้นจะเป็นโมฆะของบริบทการแสดงผลประเภทเนื้อหา e ยังคงสมเหตุสมผลหรือไม่
Letharion

การใช้บริบทไม่ได้บังคับ นอกจากนี้การบังคับให้บริบทด้วยตนเองเป็นตัวเลือกเสมอ ชอบที่นี่ - gist.github.com/3076130
roGi

คำตอบ:


4

ctools_content_render() เป็นทางออก


2
คุณสามารถให้ตัวอย่างของวิธีการนี้จะทำงานอย่างไร ฉันกำลังอ่านเอกสารและพยายามทำสิ่งต่าง ๆ แต่ไม่ได้ไปไหน
พอลเชลเดรก

ขึ้นอยู่กับตำแหน่งที่คุณโทรหา ctools_content_render () คุณอาจต้องใส่รหัส ctools ลงในขอบเขตมิฉะนั้นคุณจะได้รับข้อผิดพลาดร้ายแรง สามารถทำได้ด้วย "module_load_include (" inc "," ctools "," include / content ");"
alexkb

อย่าลืมที่จะรวมctools_include('content');ก่อนctools_content_render()เพราะในกรณีอื่นคุณจะได้รับข้อผิดพลาดร้ายแรง
Andrey Rudenko

3

มีตัวอย่างที่ดีและเรียบง่ายเกี่ยวกับวิธีการทำเช่นนี้ในctools_ajax_sampleโมดูล (ในชุดเครื่องมือ CTools)

ctools_content_render()ในขณะที่มันได้รับการชี้ออกที่สำคัญคือการใช้ฟังก์ชั่น

ตัวอย่างแสดงวิธีเติมอาร์กิวเมนต์ของฟังก์ชันแม้ว่าคุณจะต้องกำหนดค่าตามความต้องการของคุณ

หัวข้อนี้ในกลุ่ม Drupal ให้ข้อมูลเชิงลึกมากขึ้นเกี่ยวกับวิธีการโหลดบริบทที่เหมาะสม

ไฟล์ ctools/ctools_ajax_sample/ctools_ajax_sample.module

function ctools_ajax_simple_form() {
  ctools_include('content');
  ctools_include('context');
  $node = node_load(1);
  $context = ctools_context_create('node', $node);
  $context = array('context_node_1' => $context);
  return ctools_content_render('node_comment_form', 'node_comment_form', ctools_ajax_simple_form_pane(), array(), array(), $context);
}

function ctools_ajax_simple_form_pane() {
  $configuration = array(
    'anon_links' => 0,
    'context' => 'context_node_1',
    'override_title' => 0,
    'override_title_text' => '',
  );
  return $configuration;
}

2

หากคุณโหลดไฟล์ที่ต้องการสิ่งที่คุณต้องทำจริงๆคือการเรียกฟังก์ชั่นการแสดงผล ( hook_content_type_render) ซึ่งจะส่งคืนวัตถุคลาสมาตรฐานเช่นเดียวกับที่hook_block_viewทำ
สิ่งที่คุณต้องการจากที่นั่นคือฟังก์ชั่นชุดรูปแบบเว้นแต่คุณเพียงต้องการแสดงผลข้อมูลดิบโดยตรง

ในรหัสมันอาจมีลักษณะเช่นนี้:

function render_ctools_content($subtype, $conf, $panel_args, $context, $function, $file, $theme = TRUE) {
  require_once $file;
  $pane = new stdClass();
  if (function_exists($function)) {
    $pane = $function($subtype, $conf, $panel_args, $context); // hook_content_type_render
  }
  if ($theme) {
    return theme('module_ctools_content', array('pane' => $pane));
  }
  return $pane->content;
}

1
ขอบคุณสำหรับการตอบกลับของคุณ. แน่นอนว่าการโทรไปที่ render นั้นเป็นตัวเลือกที่ชัดเจน แต่วิธีนี้ให้ความรู้สึกเหมือนเป็นแฮ็ค ฉันกำลังมองหาบางอย่างตามแนวของ "ctools_render_ctype ('ctype_name')" :)
roGi

@roGi ฟังก์ชั่นนั้นไม่มีอยู่สิ่งที่ฉันได้แสดงไว้ด้านบนเป็นส่วนสำคัญของลักษณะที่ปรากฏ แต่อาจเป็นไปไม่ได้ที่จะทำสิ่งที่ง่ายอย่างที่คุณแนะนำเนื่องจากเนื้อหาประเภท ctools ไม่ใช่ ง่าย
googletorp

0

ฉันสามารถดึงพาเนลเพจในพาเนลโดยใช้รหัสต่อไปนี้:

module_load_include('inc', 'page_manager', 'plugins/tasks/node_view');
$node = node_load($nid);
$render = page_manager_node_view_page($node);
echo drupal_render($render);

โดยการรวมไฟล์ปลั๊กอินไว้ด้วยmodule_load_include()อาจทำให้กระบวนการโหลดปลั๊กอินของ ctools เสียหายได้ CTools ใช้require_onceเมธอดดังนั้นหากไฟล์ถูกรวมไว้ก่อนหน้านี้โดยสคริปต์ของบุคคลที่สามจะไม่สามารถรวมไว้ใน ctools (และ$pluginอาร์เรย์แยกวิเคราะห์) ได้ ดังนั้นในฐานะที่เป็น resullt บานหน้าต่างของคุณจะไม่ทำงานในที่อื่น
Andrey Rudenko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.