отображение представления Drupal без шаблона страницы вокруг него

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

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

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

17 ответов


Я искал способ вытащить данные узла через ajax и придумал следующее решение для Drupal 6. После реализации изменений ниже, если вы добавите ajax=1 в URL (например mysite.com/node/1?ajax=1), вы получите только содержание и не макет страницы.

в шаблоне.php-файл для вашей темы:

function phptemplate_preprocess_page(&$vars) {

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

}

затем создайте страницу-ajax.ТПЛ.php в каталоге темы с этим контентом:

<?php print $content; ?>

основываясь на ответе Ufonion Labs, я смог полностью удалить весь вывод HTML вокруг содержимого страницы в Drupal 7, реализовав оба hook_preprocess_page и hook_preprocess_html в моем шаблоне темы.php, например:

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> с содержимым страницы, чтобы его можно было встроить в другую страницу.


Я знаю, что на этот вопрос уже ответили, но я хотел добавить свое собственное решение, которое использует элементы ответа Philadelphia Web Design (PWD) и использует hook_theme_registry_alter, как предложил Оуэн. С помощью этого решения можно загрузить шаблон непосредственно из пользовательского модуля.

во-первых, я добавил raw.ТПЛ.php в недавно созданную папку "шаблоны" внутри моего модуля. Содержимое сырое.ТПЛ.php идентичны странице PWD-ajax.ТПЛ.на PHP:

<?php print $content; ?>

Далее Я реализован hook_preprocess_page в моем модуле так же, как PWD (за исключением того, что я изменил параметр $_GET и обновил ссылку на файл шаблона:

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

наконец, я реализовал 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');
}

Теперь, когда я добавить ?raw=1 к URL-адресу представления, он будет использовать указанный шаблон внутри моего модуль.


для других, кто может попасть на эту страницу, если вы просто работаете со стандартными обратными вызовами (не обязательно представлениями), это легко. В функции обратного вызова вместо возврата кода для рендеринга на странице используйте функцию "печать".

например:

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;
}    

-- Update

было бы гораздо лучше использовать exit(); вместо return TRUE; (см. комментарий).


Эй, вот еще один способ сделать это:

1) Скачать и установить Views Bonus Pack (http://drupal.org/project/views_bonus) 2) Создайте представление "Feed" и используйте стиль "XML" (или что-то, что, по вашему мнению, лучше соответствует вашим потребностям). 3) Если вы не удовлетворены стандартным выходом XML, вы можете изменить его, настроив шаблон для представления. Проверьте настройки "тема", чтобы получить предложения по альтернативным именам шаблонов для этого конкретного представления (так что вы все равно оставьте вывод XML по умолчанию для дальнейшего использования).

удачи! //Юхан Фальк, NodeOne, Швеция


на основе ответа Филадельфии веб-дизайн (спасибо) и некоторые googling (http://drupal.org/node/957250) вот что сработало для меня в Drupal 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.ТПЛ.на PHP :

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

на выходе, однако, все еще есть много ссылок CSS на обертку и тему. Не уверен, как выводить полностью unthemed данные...


предполагая, что вы находитесь в Drupal 6, Самый простой способ сделать это-поставить phptemplate_views_view_unformatted_VIEWNAME вызов в template.php (предполагается, что ваше представление неформатировано - если это что-то еще, скажем, список, используйте соответствующую функцию темы). Тема результаты просмотра в этом вызове темы, вместо того, чтобы возвращать результаты, как обычно, распечатайте их и верните NULL. Это выведет HTML напрямую.

PS-обязательно очистите кэш (в /admin/settings / performance), чтобы увидеть эту работу.


есть, вероятно, несколько способов обойти это, однако, "самый простой" может быть просто установка вашей собственной темы и наличие страницы.ТПЛ.php просто пуст, или некоторые случайные divs

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

этот метод в основном просто позволит узлу.ТПЛ.php для отображения (или любого из представлений формы drupal и т. д...) и было бы простым способом избежать изменения ядра или изменения реестра тем, чтобы избежать отображения страницы.ТПЛ.PHP в первую очередь.

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

ok Я немного поиграл с представлениями, похоже, что он берет на себя и создает собственный "узел".ТПЛ.php " (в некотором смысле) для отображения внутри "страницы.ТПЛ.РНР." на первый взгляд, мое внутреннее чувство было бы зацепиться за theme_registry_alter().

когда вы смотрите на страницу просмотров, у вас есть доступ к грудам информации здесь, а также к странице.ТПЛ.пути/файлы 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.ТПЛ.php " шаблон в текущей теме, в которой вы можете удалить все, что хотите (как мой первый ответ выше).

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

  • как я уже сказал, Не уверен, если views_ui_list_views всегда доступен для проверки, но похоже, что он должен быть установлен, если мы смотрим на вид
  • вы можете изменить theme paths на page массив, если вы предпочитаете (чтобы изменить местоположение, где drupal будет искать страницу.ТПЛ.на PHP, вместо того, чтобы переименовав его всего)
  • для этого конкретного представления не существует никаких идентификаторов, поэтому этот метод может быть подходом "все представления будут удалены". если вам нужно очистить страницу.ТПЛ.php только для определенного представления, возможно, подключение к template_preprocess_page() может быть, лучше.

Мне нравится модуль Drupal. Но есть и другой способ.

страница копия.ТПЛ.php в папке темы в новый файл с именем page-VIEWNAME.ТПЛ.php, где VIEWNAME-это машинное имя представления.

затем отредактируйте page-VIEWNAME.ТПЛ.PHP в костюме.


появилась http://drupal.org/project/pagearray что это общее решение...

кроме того, решение @Scott Evernden-это дыра в безопасности межсайтовых сценариев (XSS). Не делай этого. Прочитайте документацию на drupal.org о том, как обрабатывать текст в безопасном режимеhttp://drupal.org/node/28984


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


Если я понимаю ваш вопрос, вы хотите иметь узлы, которые содержат весь HTML для страницы, от DOCTYPE до

. Я бы создал тип контента для этих узлов - "fullhtml" как его машиночитаемое имя-и затем создал шаблон узла для него под названием node-fullhtml.ТПЛ.РНР. Вы не можете просто сбросить содержимое узла, так как они были дезинфицированы HTML. узел.fullhtml.ТПЛ.php будет буквально следующим:

echo htmlspecialchars_decode($content);

тогда вам понадобится Способ переопределить стандартная страница.ТПЛ.РНР. Я!--4-->думаю то, что вы могли бы сделать, находится в верхней части страницы.ТПЛ.php проверяет тип контента $node и выручает, если это fullhtml. Или установите глобальную переменную в node-fullhtml.ТПЛ.php эта страница.ТПЛ.php проверит.

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


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


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

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

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

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

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

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

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}