Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Я искал способ вытащить данные node через ajax и придумал следующее решение для Drupal 6. После внесения изменений ниже, если вы добавите ajax = 1 в URL-адрес (например, 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';
  }

}

затем создайте в вашем каталоге тем страницу-ajax.tpl.php:

<?php print $content; ?>

Ответ 2

Основываясь на ответе Ufonion Labs, я смог полностью удалить весь вывод HTML вокруг содержимого страницы в Drupal 7, реализовав как hook_preprocess_page, так и hook_preprocess_html в моих тем template.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']); ?>

Теперь, когда я открываю страницу node, например http://example.com/node/3, я вижу полную страницу как обычно, но когда я добавляю параметр response_type, такой как http://example.com/node/3?response_type=embed, я получаю <div> с содержимым страницы, чтобы он мог быть встроен в другую страницу.

Ответ 3

Я знаю, что на этот вопрос уже был дан ответ, но я хотел добавить свое собственное решение, которое использует элементы ответа Филадельфийского веб-дизайна (PWD) и использует hook_theme_registry_alter, как полагает Оуэн. Используя это решение, вы можете загрузить шаблон непосредственно из настраиваемого модуля.

Во-первых, я добавил raw.tpl.php в недавно созданную папку "шаблоны" внутри моего модуля. Содержимое raw.tpl.php идентично PWD-странице-ajax.tpl.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-адреса представления, он будет использовать указанный шаблон внутри моего модуля.

Ответ 4

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

Например:

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

Ура!

Ответ 5

Другой способ сделать это, который мне очень удобен, - добавить элемент меню с функцией обратного вызова страницы, которая не возвращает строку:

Пример:

/**
 * 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; (см. комментарий).

Ответ 6

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

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

Ответ 7

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

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

Удачи! // Йохан Фальк, NodeOne, Швеция

Ответ 8

Основываясь на ответе Филадельфийского веб-дизайна (спасибо) и некоторых поисковых системах (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 должно быть имя_of_your_theme во имя функции. Кроме того, я должен был поставить два символа подчеркивания __ в переменной php с именем файла, но для фактического имени файла шаблона требуется две тире -

содержимое страницы - vlozeno.tpl.php:

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

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

Ответ 9

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

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

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

изменить: см. комментарии

ok Я немного поиграл с представлениями, похоже, что он берет на себя и создает собственный "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 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() может быть лучшей идеей.

Ответ 10

Мне нравится модуль Drupal. BUt, здесь по-другому.

скопируйте page.tpl.php в папку темы в новый файл с именем-VIEWNAME.tpl.php, где VIEWNAME - это машиночитаемое имя представления.

Затем отредактируйте страницу-VIEWNAME.tpl.php, чтобы она соответствовала.

Ответ 11

Существует также http://drupal.org/project/pagearray, который является общим решением...

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

Ответ 12

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

Ответ 13

Если я понимаю ваш вопрос, вы хотите иметь узлы, которые содержат весь HTML для страницы, от DOCTYPE до </HTML> . Я хотел бы создать тип содержимого для этих узлов - "fullhtml" в качестве его машиночитаемого имени - и затем создать шаблон node для него под названием node -fullhtml.tpl.php. Вы не можете просто сбросить содержимое node, так как они были обработаны с помощью 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, но как бы я это сделал. Я говорю с манжетой, поэтому следите за дьяволом в деталях.

Ответ 14

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

Ответ 15

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

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