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

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

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

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

    Я искал способ вывести данные узла через 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; ?> 

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

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

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

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

    Например:

     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) Загрузите и установите Views Bonus Pack ( http://drupal.org/project/views_bonus ). 2) Создайте представление «Подача» и используйте стиль «XML» (или то, что, по вашему мнению, лучше подходит для ваших нужд). 3) Если вас не устраивает стандартный вывод XML, вы можете изменить его, настроив шаблон для представления. Проверьте настройки темы, чтобы получить предложения для альтернативных имен шаблонов для этого конкретного представления (так что вы все равно оставите выходной XML по умолчанию для дальнейшего использования).

    Удачи! // Johan Falk, NodeOne, Швеция

    Основываясь на ответе Филадельфийского веб-дизайна (спасибо) и некоторых поисковых системах ( 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 и CSS. Не знаете, как выводить полностью незатронутые данные …

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

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

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

     // 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 к theme paths массива page если хотите (чтобы изменить местоположение, где drupal будет искать page.tpl.php, вместо того чтобы переименовать его вообще)
    • для этого конкретного представления не существует никаких идентификаторов, поэтому этот метод может быть подход «все представления будут лишены». если вам нужно стричь page.tpl.php только для определенного вида, возможно, переключение на template_preprocess_page() может быть лучшей идеей.

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

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

    Затем отредактируйте страницу-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 в теле.

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

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

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

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