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

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

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

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

Ответы [ 17 ]

49 голосов
/ 04 марта 2009

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

}

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

<?php print $content; ?>
19 голосов
/ 06 декабря 2011

Основываясь на ответе 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']); ?>

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

7 голосов
/ 11 августа 2012

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

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

5 голосов
/ 11 июня 2009

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

Например:

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

ура!

3 голосов
/ 11 января 2012

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

Пример:

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

2 голосов
/ 07 февраля 2011

Основываясь на ответе Philadelphia Web Design (спасибо) и некотором поиске (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.tpl.php:

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

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

2 голосов
/ 15 марта 2010

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

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

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

2 голосов
/ 30 октября 2008

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

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

1 голос
/ 23 апреля 2009

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

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

1 голос
/ 03 декабря 2008

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

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

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

...