exibindo uma vista Drupal sem um modelo de página em torno dele
-
05-07-2019 - |
Pergunta
Gostaria de exibir uma visão Drupal sem o modelo da página que normalmente rodeia -. Quero apenas o conteúdo HTML simples dos nós da vista ??p>
Essa visão seria incluído em outro, não Drupal site.
Eu esperava ter que fazer isso com um número de pontos de vista, então uma solução que me permite configurá-los rapidamente e facilmente seria o melhor - Eu prefiro não ter que criar um arquivo .tpl.php cada vez preciso incluir a algum lugar vista.
Solução
Eu estava procurando uma maneira de dados do nó puxar via Ajax e veio com a seguinte solução para o Drupal 6. Depois de implementar as mudanças a seguir, se você adicionar ajax = 1 no URL (por exemplo mysite.com/node/1 ? ajax = 1), você vai ter apenas o conteúdo e não o layout da página.
no arquivo template.php para seu tema:
function phptemplate_preprocess_page(&$vars) {
if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
$vars['template_file'] = 'page-ajax';
}
}
, em seguida, criar uma página-ajax.tpl.php em seu diretório tema com este conteúdo:
<?php print $content; ?>
Outras dicas
Com base na resposta de Ufonion Labs eu era capaz de remover completamente toda a saída HTML em torno do conteúdo da página em Drupal 7 através da implementação de ambos hook_preprocess_page
e hook_preprocess_html
em meus temas template.php, como este:
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';
}
}
Então eu adicionei dois modelos para o meu tema: html--embed.tpl.php
:
<?php print $page; ?>
e page--embed.tpl.php
:
<?php print render($page['content']); ?>
Agora, quando eu abrir uma página nó, como http://example.com/node/3 , vejo o página completa como de costume, mas quando eu adicionar o parâmetro response_type, como http://example.com/node/3?response_type = incorporar , eu única obter o <div>
com o conteúdo da página para que possa ser incorporado em outra página.
Eu sei que esta questão já foi respondida, mas eu queria acrescentar a minha própria solução que utiliza elementos de Filadélfia Web Design (PCD) resposta e usos hook_theme_registry_alter, como sugerido por Owen. Usando essa solução, você pode carregar o modelo diretamente de um módulo personalizado.
Em primeiro lugar, eu adicionei raw.tpl.php para uma pasta 'modelos' recém-criado dentro do meu módulo. O conteúdo do raw.tpl.php são idênticos aos página-ajax.tpl.php do PWD:
<?php print $content; ?>
Em seguida, eu implementado hook_preprocess_page no meu módulo da mesma forma como PCD (exceto que eu modificado o $ _GET parâmetro e atualizado a referência de arquivo template:
function MY_MODULE_NAME_preprocess_page(&$vars) {
if ( isset($_GET['raw']) && $_GET['raw'] == 1 ) {
$vars['template_file'] = 'raw';
}
}
Finalmente, eu implementei hook_theme_registry_alter para adicionar diretório 'modelos' do meu módulo para o registro tema (baseado em 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');
}
Agora, quando eu acrescentar? Raw = 1 a caminho de URL do ponto de vista, ele usará o modelo especificado dentro do meu módulo.
Para outros, que podem atingir esta página, se você está apenas trabalhando com retornos de chamada padrão (não necessariamente visualizações), isso é fácil. Em sua função de retorno, em vez de devolver o código para tornar dentro da página, use a função 'print'.
Por exemplo:
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.
}
Felicidades!
Outra maneira de fazer isso que eu acho muito útil é adicionar um item de menu com uma função de página de retorno de chamada que não retorna um string:
Exemplo:
/**
* 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;
}
- Atualização
Seria muito melhor para uso exit();
vez de return TRUE;
(ver comentário).
Ei, aqui está uma outra maneira de fazê-lo:
1) Baixe e instale Visualizações Bonus Pack ( http://drupal.org/project/views_bonus) 2) Criar uma vista exibir "Feed" e estilo de uso "XML" (ou algo que você acha que se adapta às suas necessidades melhor). 3) Se você não está satisfeito com a saída XML padrão, você pode alterá-lo, ajustando o modelo para a vista. Verifique as definições de "tema" para obter sugestões para nomes de modelos alternativos para esta visão específica (assim você ainda vai ter a saída XML padrão deixado para uso futuro).
Boa sorte! // Johan Falk, NodeOne, Suécia
Com base na resposta da Filadélfia Web Design (obrigado) e alguns googling ( http://drupal.org/node/ 957250 ) aqui é o que funcionou para mim em Drupal 7 para obter páginas escolhidos exibido sem o template:
function pixture_reloaded_preprocess_page(&$vars)
{
if ( isset($_GET['vlozeno']) && $_GET['vlozeno'] == 1 ) {
$vars['theme_hook_suggestions'][] = 'page__vlozeno';
}
}
em vez de phptemplate, em D7 tem que haver o name_of_your_theme no nome da função. Além disso, eu tive que colocar dois sublinhados __ na variável php com o nome do arquivo, mas o nome arquivo de modelo real precisa de dois traços -
conteúdo da página - vlozeno.tpl.php:
<?php print render($page['content']); ?>
A saída, no entanto, ainda tem um monte de acondicionamento e referências CSS do tema. Não sabe como saída totalmente unthemed dados ...
Assumindo que você está no Drupal 6, a maneira mais fácil de fazer isso é colocar uma chamada phptemplate_views_view_unformatted_VIEWNAME
em template.php
(assume que o seu ponto de vista é não formatado - se é algo mais, uma lista digamos, utilizar a função de tema apropriado). Tema a vista resultado nesta chamada tema seguida, em vez de retornar os resultados como faria normalmente, imprimi-los e voltar NULL
. A saída será o HTML diretamente.
PS -. Certifique-se de limpar o cache (em / admin / settings / performance) para ver este trabalho
provavelmente há uma série de maneiras de contornar isso, no entanto, o "mais fácil" pode ser apenas definir o seu próprio tema personalizado, e ter a page.tpl.php apenas estar vazio, ou algumas divs aleatórios
// page.tpl.php
<div id="page"><?php print $content ?></div>
este método seria basicamente apenas permitir node.tpl.php para show (ou qualquer um dos pontos de vista de formulário do Drupal, etc ...) e seria uma maneira fácil de evitar modificar core, ou ter que alterar o registro tema para evitar a exibição page.tpl.php em primeiro lugar.
Editar : ver comentários
ok eu brinquei com vistas um pouco, parece que ele assume e construções a sua própria "node.tpl.php" (em um sentido) para exibição dentro "page.tpl.php". à primeira vista, a minha sensação seria a de ligar para theme_registry_alter()
.
quando você está olhando para uma página vista, você tem acesso a pilhas de informações aqui, bem como os caminhos page.tpl.php / arquivos. como tal, eu faria algo como:
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';
}
}
este deve permitir que você usar um modelo "override_page.tpl.php" em seu tema atual em que você pode remover qualquer coisa que você quer (como a minha primeira resposta acima).
algumas coisas:
- Como eu disse, não tenho certeza se
views_ui_list_views
está sempre disponível para verificar contra, mas parece que ele deve ser definido se nós estamos olhando para uma visão - Você pode alterar a
theme paths
da matrizpage
se preferir (para alterar o local de onde o Drupal irá procurar page.tpl.php, em vez de renomeá-lo completamente) - não parece haver qualquer identificadores para este ponto de vista específico, para que este método pode ser uma abordagem "todos os pontos de vista será despojado". se você precisa tirar a page.tpl.php para uma visão específica única, talvez enganchando em
template_preprocess_page()
pode ser uma idéia melhor.
Eu gosto do módulo de Drupal. Mas, aqui está uma outra maneira.
copiar page.tpl.php na sua pasta de tema a um novo arquivo chamado page-VIEWNAME.tpl.php, onde VIEWNAME é o nome da máquina-readible da vista.
Em seguida, editar página-VIEWNAME.tpl.php para se adequarem.
Há também http://drupal.org/project/pagearray que é uma solução geral ...
Além disso, a solução de @ Scott Evernden é uma falha de segurança Cross Site Scripting (XSS). Não faça isso. Leia a documentação sobre drupal.org sobre como lidar com texto de uma forma segura http://drupal.org/node/ 28984
Uma maneira simples de conteúdo de um especial de exibição do tipo de conteúdo que você deseja exibir, sem todo o material do page.tpl.php
:
Adicione o seguinte trecho ao seu arquivo template.php
:
function mytheme_preprocess_page(&$vars) {
if ($vars['node'] && arg(2) != 'edit') {
$vars['template_files'][] = 'page-nodetype-'. $vars['node']->type;
}
}
Adicionar um page-nodetype-examplecontenttype.tpl.php
ao seu tema, como o seu page.tpl.php
mas sem o material que você não deseja exibir e com print $content
no corpo.
Se entendi sua pergunta, você quer ter os nós que contêm todo o HTML de uma página, a partir DOCTYPE para