Pregunta

Me gustaría mostrar un Drupal vista sin la plantilla de página que normalmente rodea - quiero que el simple contenido HTML de la vista de los nodos.

Este punto de vista sería incluido en otro, no en el sitio de Drupal.

Espero tener que hacer esto con un número de puntos de vista, de modo que una solución que me permite establecer estas rápidamente y fácilmente podría ser el mejor - yo preferiría no tener que crear una .tpl.php archivo cada vez que tengo que incluyen una vista en algún lugar.

¿Fue útil?

Solución

Estaba buscando una forma de extraer datos de nodo a través de ajax y se me ocurrió la siguiente solución para Drupal 6. Después de implementar los cambios a continuación, si agrega ajax = 1 en la URL (por ejemplo, mysite.com/node/1 ? ajax = 1), obtendrá solo el contenido y no el diseño de la página.

en el archivo template.php para su tema:

function phptemplate_preprocess_page(&$vars) {

  if ( isset($_GET['ajax']) && $_GET['ajax'] == 1 ) {
        $vars['template_file'] = 'page-ajax';
  }

}

luego cree page-ajax.tpl.php en su directorio de temas con este contenido:

<?php print $content; ?>

Otros consejos

Basado en la respuesta de Ufonion Laboratorios yo era capaz de eliminar completamente todo el HTML de salida de todo el contenido de la página en Drupal 7 por la aplicación de ambas hook_preprocess_page y hook_preprocess_html en mis 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';
  }
}

Luego he añadido dos plantillas a mi tema: html--embed.tpl.php:

<?php print $page; ?>

y page--embed.tpl.php:

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

Ahora cuando abro un nodo de la página, tales como http://example.com/node/3, Puedo ver la página completa, como de costumbre, pero cuando agrego el response_type de parámetros, tales como http://example.com/node/3?response_type=embed, Me sólo obtener la <div> con el contenido de la página por lo que puede ser incrustado en otra página.

Sé que esta pregunta ya ha sido respondida, pero quería agregar mi propia solución que usa elementos de la respuesta de Philadelphia Web Design (PWD) y usa hook_theme_registry_alter, como lo sugiere Owen. Con esta solución, puede cargar la plantilla directamente desde un módulo personalizado.

Primero, agregué raw.tpl.php a una carpeta de 'plantillas' recién creada dentro de mi módulo. El contenido de raw.tpl.php es idéntico al de page-ajax.tpl.php de PWD:

<?php print $content; ?>

Luego, implementé hook_preprocess_page en mi módulo de la misma manera que PWD (excepto que modifiqué el parámetro $ _GET y actualicé la referencia del archivo de plantilla:

function MY_MODULE_NAME_preprocess_page(&$vars) {
    if ( isset($_GET['raw']) && $_GET['raw'] == 1 ) {
        $vars['template_file'] = 'raw';
    }
} 

Finalmente, implementé hook_theme_registry_alter para agregar el directorio de 'plantillas' de mi módulo al registro de temas (basado en 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');
}

Ahora, cuando agregue? raw = 1 a la ruta URL de la vista, usará la plantilla especificada dentro de mi módulo.

Para otras personas que pueden acceder a esta página, si solo está trabajando con devoluciones de llamada estándar (no necesariamente vistas), esto es fácil. En su función de devolución de llamada, en lugar de devolver el código para representar dentro de la página, use la función 'imprimir'.

Por ejemplo:

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

¡Salud!

Otra forma de hacerlo que me parece muy útil es agregar un elemento de menú con una función de devolución de llamada de página que no devuelva una cadena:

Ejemplo:

/**
 * 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;
}    

- Actualizar

Sería mucho mejor usar exit(); en lugar de return TRUE; (ver comentario).

Oye, aquí hay otra forma de hacerlo:

1) Descargue e instale el paquete de bonificación Views ( http://drupal.org/project/views_bonus) 2) Crear una visualización de Vistas & Quot; Feed & Quot; y use el estilo " XML " (o algo que creas que se adapta mejor a tus necesidades). 3) Si no está satisfecho con la salida XML estándar, puede cambiarla ajustando la plantilla para la vista. Compruebe el & Quot; tema & Quot; configuraciones para obtener sugerencias de nombres de plantilla alternativos para esta vista específica (por lo que aún tendrá la salida XML predeterminada para uso futuro).

¡Buena suerte! // Johan Falk, NodeOne, Suecia

Basado en la respuesta del diseño web de Filadelfia (gracias) y algunas búsquedas en Google ( http://drupal.org/node/ 957250 ) aquí es lo que funcionó para mí en Drupal 7 para que las páginas elegidas se muestren sin la plantilla:

function pixture_reloaded_preprocess_page(&$vars)
{
  if ( isset($_GET['vlozeno']) && $_GET['vlozeno'] == 1 ) {
        $vars['theme_hook_suggestions'][] = 'page__vlozeno';
  }   
}

en lugar de phptemplate, en D7 tiene que haber el name_of_your_theme en el nombre de la función. Además, tuve que poner dos guiones bajos __ en la variable php con el nombre del archivo, pero el nombre real del archivo de plantilla necesita dos guiones -

contenido de la página - vlozeno.tpl.php:

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

La salida, sin embargo, todavía tiene mucho envoltorio y referencias CSS del tema. No estoy seguro de cómo generar datos totalmente sin tema ...

Suponiendo que está en Drupal 6, la forma más fácil de hacer esto es poner una llamada phptemplate_views_view_unformatted_VIEWNAME en template.php (asume que su vista no está formateada; si es algo más, una lista dice, use la función de tema apropiada ) Tema los resultados de la vista en esta llamada de tema, luego, en lugar de devolver los resultados como lo haría normalmente, imprímalos y devuelva NULL. Esto generará el HTML directamente.

PD: asegúrese de borrar su caché (en / admin / settings / performance) para ver este trabajo.

probablemente hay varias formas de evitar esto, sin embargo, el & "; el más fácil &"; puede estar configurando su propio tema personalizado y tener el page.tpl.php solo vacío, o algunos divs aleatorios

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

este método básicamente permitiría que se mostrara node.tpl.php (o cualquiera de las vistas de formulario de drupal, etc.) y sería una manera fácil de evitar modificar el núcleo, o tener que alterar el registro de temas para evitar mostrar page.tpl.php en primer lugar.

editar : ver comentarios

ok, jugué un poco con las vistas, parece que se hace cargo y construye su propio " node.tpl.php " (en cierto sentido) para mostrar dentro de " page.tpl.php " ;. a primera vista, mi instinto sería enganchar a theme_registry_alter().

cuando está mirando una página de vistas, tiene acceso a montones de información aquí, así como a las rutas / archivos page.tpl.php. como tal, haría 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';        
  }
}

esto debería permitirle usar un " override_page.tpl.php " plantilla en su tema actual en la que puede eliminar todo lo que desee (como mi primera respuesta anterior).

algunas cosas:

  • como dije, no estoy seguro de si views_ui_list_views siempre está disponible para verificar, pero parece que debería establecerse si estamos viendo una vista
  • puede alterar el theme paths de la matriz page si lo prefiere (para cambiar la ubicación de donde buscará drupal page.tpl.php, en lugar de renombrarlo por completo)
  • no parece haber ningún identificador para esta vista específica, por lo que este método podría ser un " todas las vistas se eliminarán " enfoque. si necesita quitar el page.tpl.php solo para una vista específica, quizás sea mejor enganchar a template_preprocess_page().

Me gusta el módulo Drupal. BUt, aquí hay otra forma.

copie page.tpl.php en su carpeta de temas a un nuevo archivo llamado page-VIEWNAME.tpl.php, donde VIEWNAME es el nombre de la vista que puede leer la máquina.

Luego edite page-VIEWNAME.tpl.php para adaptarlo.

También hay http://drupal.org/project/pagearray que es una solución general ...

Además, la solución de @Scott Evernden es un agujero de seguridad de scripting entre sitios (XSS). No hagas eso. Lea la documentación en drupal.org sobre cómo manejar texto de manera segura http://drupal.org/node/ 28984

Una manera simple de mostrar contenido de un tipo de contenido especial que desea mostrar sin todas las cosas de page.tpl.php:
Agregue el siguiente fragmento a su template.php archivo:

function mytheme_preprocess_page(&$vars) {
  if ($vars['node'] && arg(2) != 'edit') {
      $vars['template_files'][] = 'page-nodetype-'. $vars['node']->type;
    }
}

Agregue un page-nodetype-examplecontenttype.tpl.php a su tema, como su print $content pero sin las cosas que no desea mostrar y con <=> en el cuerpo.

Si entiendo su pregunta, desea tener nodos que contengan todo el HTML de una página, desde DOCTYPE hasta < / HTML > ;. Lo que haría es crear un tipo de contenido para esos nodos: & Quot; fullhtml & Quot; como su nombre legible por máquina, y luego cree una plantilla de nodo llamada node-fullhtml.tpl.php. No puede simplemente volcar los contenidos del nodo, ya que han sido desinfectados con HTML. node.fullhtml.tpl.php sería literalmente esto:

echo htmlspecialchars_decode($content);

Entonces necesitará una forma de anular el page.tpl.php estándar. Creo que creo lo que podría hacer es en la parte superior de su page.tpl.php, verifique el tipo de contenido del $ nodo y rescate si es fullhtml. O establezca una variable global en node-fullhtml.tpl.php que page.tpl.php buscaría.

No soy un experto en Drupal, pero así es como lo haría. Estoy hablando fuera de lugar, así que ten cuidado con los demonios en los detalles.

Veo que ya se ha ido y ha creado un módulo, por lo que puede que esto ya no ayude, pero es bastante fácil obtener una vista para exponer un feed rss, que podría ser una forma más fácil de acceder al contenido, especialmente si quieres incluirlo en un sitio diferente.

En D7 puede usar menu_execute_active_handler

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

La respuesta de jeroen fue lo que hizo por mí después de jugar con ella. Tengo un sitio Drupal 7.

  1. En primer lugar, asegúrese de reemplazar MY_THEME con el nombre de su tema. Sí, es obvio, pero la mayoría de los novatos se lo pierden.

  2. En realidad ya tenía un function MY_THEME_preprocess_page(&$variables) {. No vuelva a crear la función, pero agregue este código al final de la función antes de cerrarla con }.


if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
  $variables['theme_hook_suggestions'][] = 'page__embed';
}
  1. Mi función usaba $vars no $variables, así que tuve que actualizar eso también. Nuevamente obvio si crees buscarlo.

Mi primera respuesta me permitió mostrar solo el nodo cuando lo llamé en un navegador web. Sin embargo, el objetivo final de esto es incrustar el nodo drupal en un sitio de terceros utilizando iframe.

Desde el lanzamiento de Drupal Core 7.50 iframe está bloqueado de forma predeterminada para evitar Clickjacking

Para que solo el nodo se incruste con éxito en un sitio de terceros, también debe anular la configuración predeterminada de x-frame. Todo comenzó a funcionar después de agregar lo siguiente en template.php

function MY_THEME_page_alter($page) {

 if (isset($_GET['response_type']) && $_GET['response_type'] == 'embed') {
   header_remove('X-Frame-Options');
 } 
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top