отображение представления Drupal без шаблона страницы вокруг него - PullRequest
36 голосов
/ 29 октября 2008

Я хотел бы отобразить представление Drupal без шаблона страницы, который обычно его окружает - я хочу просто простое HTML-содержимое узлов представления.

Это представление будет включено в другой, не Drupal сайт.

Я ожидаю, что придется сделать это с несколькими представлениями, поэтому лучшим решением будет решение, позволяющее быстро и легко настроить их - я бы предпочел не создавать файл .tpl.php каждый раз Мне нужно где-то включить представление.

Ответы [ 17 ]

1 голос
/ 14 января 2010

Простой способ отображения контента специального типа, который вы хотите отобразить, без всего, что есть в 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 в теле.

1 голос
/ 29 октября 2008

Существует, вероятно, несколько способов обойти это, однако, "самый простой" может быть просто установить вашу собственную пользовательскую тему и просто пустым page.tpl.php, или некоторые случайные div

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

этот метод в основном просто позволял бы показывать node.tpl.php (или любое из представлений формы drupal и т. Д.) И был бы простым способом избежать модификации ядра или необходимости изменить реестр тем, чтобы избежать отображения page.tpl.php на первом месте.

редактировать : см. Комментарии

хорошо, я немного поигрался с представлениями, похоже, что он вступает во владение и создает свой собственный "node.tpl.php" (в некотором смысле) для отображения в "page.tpl.php". На первый взгляд, мое внутреннее чувство должно было бы зацепиться за theme_registry_alter().

когда вы просматриваете страницу просмотров, у вас есть здесь доступ к кучам информации, а также к путям / файлам 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';        
  }
}

это должно позволить вам использовать шаблон «override_page.tpl.php» в вашей текущей теме, в котором вы можете удалить все, что захотите (как мой первый ответ выше).

несколько вещей:

  • Как я уже сказал, не уверен, что views_ui_list_views всегда доступен для проверки, но, похоже, его следует установить, если мы смотрим на представление
  • вы можете изменить theme paths массива page, если хотите (изменить местоположение, где drupal будет искать page.tpl.php, вместо того, чтобы переименовывать его полностью)
  • похоже, что для этого конкретного представления нет идентификаторов, поэтому этот метод может быть подходом "все представления будут удалены". если вам нужно удалить файл page.tpl.php только для определенного вида, возможно, лучше зацепить template_preprocess_page().
0 голосов
/ 02 августа 2018

Мой первый ответ позволил мне отображать узел только когда я вызывал его в веб-браузере. Однако конечная цель этого - встроить друпальный узел в сторонний сайт с использованием iframe.

С момента выпуска Drupal Core 7.50 iframe по умолчанию заблокирован для предотвращения Clickjacking

Чтобы успешно встраивать только сторонние узлы в сторонний сайт, вам также необходимо изменить настройку по умолчанию для x-frame. Все начало работать после того, как я добавил следующее в template.php

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
0 голосов
/ 01 августа 2018

Джероен ответил, что сделал для меня после игры с ним. У меня есть сайт 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, поэтому мне пришлось обновить и ее. Снова очевидно, если вы думаете, посмотрите на это.
0 голосов
/ 10 января 2009

Я вижу, что вы уже ушли и сделали себя модулем, так что это может больше не помочь, но довольно просто получить представление об RSS-канале, который может быть более простым способом получить доступ к контенту, особенно если вы хотите включить его на другом сайте.

0 голосов
/ 27 августа 2014

На D7 вы можете использовать menu_execute_active_handler

$build = menu_execute_active_handler('user', FALSE);
return render($build);
0 голосов
/ 29 октября 2008

Если я понимаю ваш вопрос, вы хотите иметь узлы, которые содержат весь HTML-код страницы, от DOCTYPE до . Я хотел бы создать тип контента для этих узлов - «fullhtml» в качестве его машиночитаемого имени - и затем создать для него шаблон узла с именем node-fullhtml.tpl.php. Вы не можете просто сбросить содержимое узла, так как они были продезинфицированы HTML. node.fullhtml.tpl.php буквально будет выглядеть так:

echo htmlspecialchars_decode($content);

Тогда вам понадобится способ переопределить стандартный page.tpl.php. Я думаю, , что вы могли бы сделать, в верхней части вашего page.tpl.php проверить тип содержимого $ node и выручить, если он fullhtml. Или установите глобальную переменную в node-fullhtml.tpl.php, которую будет проверять page.tpl.php.

Я не эксперт по Drupal, но я так и сделаю. Я говорю с манжеты, так что следите за дьяволами в деталях.

...