프로그래밍 방식으로 ctools 컨텐츠 유형을 렌더링하는 방법은 무엇입니까?


12

일명 ctools 플러그인이 있습니다. 콘텐츠 유형 일명. 패널 창. 프로그래밍 방식으로 어떻게 렌더링합니까?


+1, 매우 흥미로운 질문입니다. ctools 플러그인을 페이지 관리자 페이지 외부에서 렌더링 할 수 있습니까? 컨텍스트가 없기 때문에 e 컨텐츠 유형을 렌더링하는 것이 여전히 의미가 있습니까?
Letharion

컨텍스트 사용은 필수가 아닙니다. 또한 컨텍스트를 수동으로 강제하는 것은 항상 옵션입니다. 여기처럼 -gist.github.com/3076130
roGi

답변:


4

ctools_content_render() 솔루션입니다.


2
이것이 어떻게 작동하는지 예를 들어 줄 수 있습니까? 나는 문서를 읽고 일을 시도하지만 어디받지 못했습니다
폴 셀 드레이크

ctools_content_render ()를 호출하는 위치에 따라 ctools 코드를 범위로 가져와야 할 수도 있습니다. 그렇지 않으면 치명적인 오류가 발생합니다. "module_load_include ("inc ","ctools ","includes / content ");"를 사용하면됩니다.
alexkb

다른 경우에는 치명적 오류가 발생 ctools_include('content');하기 ctools_content_render()때문에 before 포함하는 것을 잊지 마십시오 .
Andrey Rudenko

3

ctools_ajax_sample모듈 (CTools 제품군)에서 이를 수행하는 방법에 대한 훌륭하고 간단한 예가 있습니다.

지적했듯이 핵심은 기능을 사용하는 것 ctools_content_render()입니다.

이 예제에서는 함수의 인수를 채우는 방법을 보여 주지만, 필요에 따라 함수를 사용자 정의해야합니다.

Drupal Groups 의이 스레드 는 올바른 컨텍스트를로드하는 방법에 대한 통찰력을 제공합니다.

파일 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표준 클래스 객체를 반환하는 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
답장을 보내 주셔서 감사합니다. 물론 렌더 기능을 직접 호출하는 것은 명백한 선택입니다. 그러나이 솔루션은 더 해킹처럼 느껴집니다. "ctools_render_ctype ( 'ctype_name')"줄을 따라 무언가를 찾고 있습니다.
roGi

@roGi 그 함수는 존재하지 않습니다. 위에서 보여준 것은 그것이 어떻게 보일지에 대한 요점이지만 ctools 컨텐츠 유형은 그렇지 않기 때문에 제안한 것처럼 간단하게 만드는 것은 불가능할 것입니다 단순한.
googletorp

0

다음 코드를 사용하여 패널화 된 페이지를 panopoly로 가져올 수있었습니다.

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.