문제

저는 일반적으로 주변에 있는 페이지 템플릿 없이 Drupal 뷰를 표시하고 싶습니다. 뷰 노드의 일반 HTML 콘텐츠만 원합니다.

이 보기는 Drupal이 아닌 다른 사이트에 포함됩니다.

나는 여러 가지 보기로 이 작업을 수행해야 할 것으로 예상하므로 이러한 작업을 빠르고 쉽게 설정할 수 있는 솔루션이 가장 좋을 것입니다. 필요할 때마다 .tpl.php 파일을 생성할 필요가 없는 것을 선호합니다. 어딘가에 뷰를 포함합니다.

도움이 되었습니까?

해결책

Ajax를 통해 노드 데이터를 가져 오는 방법을 찾고 있었고 Drupal 6에 대한 다음 솔루션을 생각해 냈습니다. 아래 변경 사항을 구현 한 후 URL에 Ajax = 1을 추가하면 (예 : mysite.com/node/1?ajax= 1), 콘텐츠와 페이지 레이아웃이 없습니다.

테마의 Template.php 파일에서 :

function phptemplate_preprocess_page(&$vars) {

  if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
        $vars['template_file'] = 'page-ajax';
  }

}

그런 다음이 컨텐츠를 사용하여 테마 디렉토리에서 page-ajax.tpl.php를 만듭니다.

<?php print $content; ?>

다른 팁

Ufonion Labs의 답변을 바탕으로 Drupal 7의 페이지 컨텐츠 주변의 모든 HTML 출력을 둘 다 구현하여 완전히 제거 할 수있었습니다. hook_preprocess_page 그리고 hook_preprocess_html 내 테마 템플릿에서 다음과 같이 :

function MY_THEME_preprocess_page(&$variables) {
  if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
    $variables['theme_hook_suggestions'][] = 'page__embed';
  }
}

function MY_THEME_preprocess_html(&$variables) {
  if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
    $variables['theme_hook_suggestions'][] = 'html__embed';
  }
}

그런 다음 테마에 두 개의 템플릿을 추가했습니다. html--embed.tpl.php:

<?php print $page; ?>

그리고 page--embed.tpl.php:

<?php print render($page['content']); ?>

이제 노드 페이지를 열면 다음과 같은 http://example.com/node/3, 전체 페이지를 평소처럼 보이지만 response_type 매개 변수를 추가 할 때 http://example.com/node/3?response_type=embed, 나 얻으십시오 <div> 페이지 내용을 사용하여 다른 페이지에 포함시킬 수 있습니다.

이 질문이 이미 답변되었음을 알고 있지만 PWD (Philadelphia Web Design) 답변의 요소를 사용하는 내 자신의 솔루션을 추가하고 Owen이 제안한대로 Hook_theme_registry_alter를 사용하고 싶었습니다. 이 솔루션을 사용하면 사용자 정의 모듈에서 직접 템플릿을로드 할 수 있습니다.

먼저, 모듈 내부의 새로 만든 '템플릿'폴더에 raw.tpl.php를 추가했습니다. raw.tpl.php의 내용은 PWD의 page-ajax.tpl.php와 동일합니다.

<?php print $content; ?>

다음으로, 나는 PWD와 동일한 방식으로 내 모듈에서 hook_preprocess_page를 구현했다 ($ _get 매개 변수를 수정하고 템플릿 파일 참조를 업데이트했다는 점을 제외하고.

function MY_MODULE_NAME_preprocess_page(&$vars) {
    if ( isset($_GET['raw']) && $_GET['raw'] == 1 ) {
        $vars['template_file'] = 'raw';
    }
} 

마지막으로, 나는 module의 'templates'디렉토리를 테마 레지스트리에 추가하기 위해 hook_theme_registry_alter를 구현했습니다 ( http://drupal.org/node/1105922#comment-4265700):

function MY_MODULE_NAME_theme_registry_alter(&$theme_registry) {
   $modulepath = drupal_get_path('module','MY_MODULE_NAME');
   array_unshift($theme_registry['page']['theme paths'], $modulepath.'/templates');
}

이제 View의 URL 경로에? raw = 1을 추가하면 내 모듈 내부의 지정된 템플릿을 사용합니다.

이 페이지에 도달 할 수있는 다른 사람들의 경우 표준 콜백 (반드시보기는 필요하지 않음)으로 작업하는 경우 쉽습니다. 콜백 함수에서 페이지 내에서 렌더링하도록 코드를 반환하는 대신 '인쇄'기능을 사용하십시오.

예를 들어:

function mymodule_do_ajax($node)
{
    $rval = <<<RVAL
        <table>
            <th>
                <td>Data</td>
                <td>Data</td>
                <td>Data</td>
            </th>
            <tr>
                <td>Cool</td>
                <td>Cool</td>
                <td>Cool</td>
            </tr>
        </table>
RVAL;

    //return $rval; Nope!  Will render via the templating engine.
    print $rval; //Much better.  No wrapper.
}

건배!

내가 매우 편리하게 찾는 또 다른 방법은 문자열을 반환하지 않는 페이지 콜백 함수가있는 메뉴 항목을 추가하는 것입니다.

예시:

/**
 * Implementation of hook_menu.
 */
function test_menu(){
  $items['test'] = array (
    /* [...] */ 
    'page callback' => 'test_callback',
    /* [...] */ 
  );
  return $items;
}

function test_callback() {
  // echo or print whatever you want
  // embed views if you want
  // DO NOT RETURN A STRING
  return TRUE;
}    

-- 업데이트

사용하는 것이 훨씬 낫습니다 exit(); 대신에 return TRUE; (주석 참조).

이봐, 여기에 또 다른 방법이있다 :

1) 뷰 보너스 팩 다운로드 및 설치 (http://drupal.org/project/views_bonus2)보기 표시 "피드"및 스타일 "XML"(또는 필요에 맞는 것)를 사용합니다. 3) 표준 XML 출력에 만족하지 않으면보기의 템플릿을 조정하여 변경할 수 있습니다. 이 특정보기의 대체 템플릿 이름에 대한 제안을 얻으려면 "테마"설정을 확인하십시오 (따라서 향후 사용하기 위해 기본 XML 출력이 남아 있음).

행운을 빕니다! // Johan Falk, Nodeone, 스웨덴

Philadelphia Web Design(감사합니다)의 답변과 일부 인터넷 검색(http://drupal.org/node/957250) 여기에 나를 위해 일한 것이 있습니다 드루팔 7 템플릿 없이 선택한 페이지를 표시하려면:

function pixture_reloaded_preprocess_page(&$vars)
{
  if ( isset($_GET['vlozeno']) && $_GET['vlozeno'] == 1 ) {
        $vars['theme_hook_suggestions'][] = 'page__vlozeno';
  }   
}

phptemplate 대신 D7에서는 함수 이름에 name_of_your_theme가 있어야 합니다.또한 파일 이름과 함께 php 변수에 두 개의 밑줄 __을 넣어야 했지만 실제 템플릿 파일 이름에는 두 개의 대시가 필요합니다.

페이지 내용--vlozeno.tpl.php:

<?php print render($page['content']); ?>

그러나 출력에는 여전히 많은 래핑 및 테마 CSS 참조가 포함되어 있습니다.완전히 테마가 없는 데이터를 출력하는 방법을 잘 모르겠습니다...

당신이 Drupal 6에 있다고 가정하면, 가장 쉬운 방법은 phptemplate_views_view_unformatted_VIEWNAME 전화로 template.php (귀하의 견해가 형식화되지 않았다고 가정합니다. 다른 것이라면 목록에서는 적절한 테마 기능을 사용합니다). 테마 view the view는이 테마 호출에서 결과를 보이고, 평소와 같이 결과를 반환하는 대신 인쇄하고 반환합니다. NULL. 이것은 HTML을 직접 출력합니다.

추신 -이 작업을 확인하려면 캐시 (AT/Admin/Settings/Performance)를 지우십시오.

아마도 이것에 대해 여러 가지 방법이있을 수 있지만, "가장 쉬운"은 자신의 사용자 지정 테마를 설정하는 것일 수도 있고 Page.tpl.php가 비어 있거나 임의의 div를 사용하는 것입니다.

// page.tpl.php
<div id="page"><?php print $content ?></div>

이 방법은 기본적으로 Node.tpl.php가 표시 (또는 Drupal의 양식보기 등)를 표시하고 코어 수정을 피하거나 Page.tpl 표시를 피하기 위해 테마 레지스트리를 변경 해야하는 쉬운 방법입니다. .php 처음에.

편집하다: 댓글을 참조하십시오

좋아, 나는 약간의보기를 가지고 놀았다. 그것은 그것이 인수 된 것처럼 보이고 "page.tpl.php"내에 표시하기 위해 자체 "node.tpl.php"(어떤 의미에서)를 구성한다. 언뜻보기에, 내 직감은 theme_registry_alter().

Views 페이지를 살펴보면 Page.tpl.php 경로/파일뿐만 아니라 여기에 정보 더미에 액세스 할 수 있습니다. 따라서 나는 다음과 같은 일을 할 것입니다.

function modulejustforalteration_theme_registry_alter(&$variables) {
  if (isset($variables['views_ui_list_views']) ) {
  // not sure if that's the best index to test for "views" but i imagine it'll work
  // as well as others
    $variables['page']['template'] = 'override_page';        
  }
}

이를 통해 현재 테마에서 "remeride_page.tpl.php"템플릿을 사용할 수있어 원하는 것을 제거 할 수 있습니다 (위의 첫 번째 답변).

몇 가지:

  • 내가 말했듯이, 확실하지 않습니다 views_ui_list_views 항상 확인할 수 있지만, 우리가보기를보고 있다면 설정 해야하는 것처럼 들립니다.
  • 당신은 변경할 수 있습니다 theme pathspage 배열을 선호하는 경우 (Drupal이 찾을 수있는 위치를 변경하려면 Page.tpl.php를 모두 변경하는 대신).
  • 이 특정보기에 대한 식별자가없는 것처럼 보이 므로이 방법은 "모든 뷰가 제거 될 것"접근 방식 일 수 있습니다. 특정보기에만 Page.tpl.php를 제거 해야하는 경우 template_preprocess_page() 더 나은 아이디어 일 수 있습니다.

나는 Drupal 모듈을 좋아합니다. 그러나 여기에 또 다른 방법이 있습니다.

테마 폴더의 page.tpl.php 복사 page-viewname.tpl.php라는 새 파일로 ViewName은 뷰의 기계식 이름입니다.

그런 다음 Page-ViewName.tpl.php를 편집합니다.

도 있습니다 http://drupal.org/project/pagearray 일반적인 해결책입니다 ...

또한 @Scott Evernden의 솔루션은 크로스 사이트 스크립팅 (XSS) 보안 구멍입니다. 그렇게하지 마십시오. 안전한 방식으로 텍스트를 처리하는 방법에 대한 drupal.org의 문서를 읽으십시오. http://drupal.org/node/28984

특수 콘텐츠 유형의 내용을 표시하는 간단한 방법은 page.tpl.php:
다음 스 니펫을 추가하십시오 template.php 파일:

function mytheme_preprocess_page(&$vars) {
  if ($vars['node'] && arg(2) != 'edit') {
      $vars['template_files'][] = 'page-nodetype-'. $vars['node']->type;
    }
}

을 추가하다 page-nodetype-examplecontenttype.tpl.php 당신의 테마에 page.tpl.php 그러나 당신이 표시하고 싶지 않은 것들없이 print $content 몸에.

귀하의 질문을 이해하면 DocType에서 페이지의 모든 HTML을 포함하는 노드를 원합니다.u003C/HTML> . 내가 할 일은 해당 노드 ( "fullhtml"에 대한 컨텐츠 유형을 기계로 읽을 수있는 이름으로 작성한 다음 Node-fullhtml.tpl.php라고 불리는 노드 템플릿을 작성하는 것입니다. 노드의 내용을 HTML-sanitized로 버릴 수는 없습니다. node.fullhtml.tpl.php는 문자 그대로 다음과 같습니다.

echo htmlspecialchars_decode($content);

그런 다음 표준 page.tpl.php를 무시하는 방법이 필요합니다. 나 생각한다 당신이 할 수있는 일은 page.tpl.php의 상단에있는 것입니다. $ node의 컨텐츠 유형을 확인하고 fullhtml 인 경우 구제합니다. 또는 node-fullhtml.tpl.php에서 글로벌 변수를 설정하여 Page.tpl.php가 확인할 수 있습니다.

나는 Drupal 전문가가 아니지만 그게 내가하는 방식입니다. 나는 커프에서 이야기하고 있으므로 세부 사항에서 악마를보십시오.

나는 당신이 이미 사라져 모듈을 만들었습니다. 그래서 이것은 더 이상 도움이되지 않을 수 있지만, RSS 피드를 노출시키기 위해보기가 상당히 쉽습니다. 다른 사이트에 포함시키기 위해.

D7에서 사용할 수 있습니다 menu_execute_active_handler

$build = menu_execute_active_handler('user', FALSE);
return render($build);

Jeroen의 대답은 그것을 가지고 놀고 나서 나를 위해 한 일이었습니다. Drupal 7 사이트가 있습니다.

  1. 우선 교체해야합니다 MY_THEME 테마 이름으로. 예, 분명하지만 대부분의 초보자는 이것을 그리워합니다.

  2. 나는 실제로 이미 가지고 있었다 function MY_THEME_preprocess_page(&$variables) {. 그런 다음 기능을 재현하지 말고 기능 끝에이 코드를 추가하기 전에이 코드를 추가하십시오. }.


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. 내 기능이 사용되었습니다 $vars ~ 아니다 $variables, 그래서 나는 그것을 업데이트해야했다. 당신이 그것을 찾는다면 다시 분명합니다.

내 첫 번째 답변을 통해 웹 브라우저에서 전화 할 때만 노드 만 표시 할 수있었습니다. 그러나 이것의 궁극적 인 목표는 iframe을 사용하여 제 3 자 사이트에 Drupal 노드를 포함시키는 것입니다.

Drupal이 출시 된 이후 Core 7.50 Iframe은 기본적으로 클릭 재킹을 방지하기 위해 차단되었습니다.

제 3 자 사이트에 노드 만 성공적으로 포함되도록하려면 X- 프레임 기본 설정을 무시해야합니다. Template.php에서 다음을 추가 한 후 모든 것이 작동하기 시작했습니다.

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top