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

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.

Foi útil?

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 matriz page 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 . O que eu gostaria de fazer é criar um tipo de conteúdo para esses nós - "fullhtml" como seu nome legível por máquina - e, em seguida, criar um modelo de nó para que chamou de nó-fullhtml.tpl.php. Você não pode simplesmente despejar o conteúdo do nó, como eles têm sido higienizado-HTML. node.fullhtml.tpl.php seria literalmente apenas isso:

echo htmlspecialchars_decode($content);

Em seguida, você precisa encontrar uma maneira para substituir o page.tpl.php padrão. I pensar o que você poderia fazer é no topo de sua page.tpl.php verificar o tipo de conteúdo $ nó, e socorrer Se é fullhtml. Ou, definir uma variável global no nó-fullhtml.tpl.php que page.tpl.php iria verificar.

Não sou especialista Drupal, mas é assim que eu o faria. Eu estou falando de improviso, para assistir a demônios nos detalhes.

Eu vejo você já passou e fez-se um módulo, de modo que este pode não mais ajuda, mas é bastante fácil de obter uma visão para expor um feed RSS, que pode ser uma maneira mais fácil de obter no conteúdo, especialmente se você quiser incluí-lo em um local diferente.

No D7 você pode usar menu_execute_active_handler

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

A resposta de jeroen foi o que fez por mim depois de jogar com ele. Eu tenho um site Drupal 7.

  1. Em primeiro lugar certifique-se de substituir MY_THEME com o nome do tema. Sim, é óbvio, mas a maioria dos novatos perder isso.

  2. Na verdade, eu já tinha um function MY_THEME_preprocess_page(&$variables) {. Não recriar a função, em seguida, mas acrescentar este código no fim da função antes de fechá-lo com }.


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. A minha função utilizada $vars não $variables, por isso tive de atualização que também. Novamente óbvio, se você acha que olhar para ele.

Meu primeiro respondeu me permitiu mostrar apenas o nó quando eu chamei-o em um navegador web. No entanto, o objetivo final deste é para incorporar o nó Drupal em um site 3o partido usando iframe.

Desde o lançamento do Drupal Núcleo 7,50 iframe é, por padrão bloqueadas para evitar Clickjacking

Para obter apenas o nó para incorporar com sucesso em um site 3o partido você também precisa substituir a configuração padrão x-frame. Tudo começou a trabalhar depois que eu adicionado o seguinte em template.php

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top