it-swarm-es.com

¿Cómo mostrar un campo antes del título del nodo?

Estoy buscando representar un cierto campo antes del título del nodo cuando se muestra un avance en D7.

Efectivamente quiero ir de esto a esto .

He buscado actualizar el node.tpl.php pero noto que separa $title desde $content así que no estoy seguro de cómo abordar esto. Después de algunas búsquedas, descubrí que la gente sugirió usar los módulos CCK y ConTemplate para solucionar esto en Drupal-6, pero yo ' Me pregunto si hay una solución más Drupal-7.

¿Alguna sugerencia?

39
irishbuzz

Esto es realmente bastante simple con Drupal 7.

Con render y hide sabes que tienes la posibilidad de controlar la ubicación de un solo elemento en $content sin tener que imprimir todos los elementos que necesitabas en Drupal 6.

Una plantilla de nodo simplificada se ve así:

<div>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

Una pequeña modificación manejaría sus necesidades:

<div>
  <?php print render($content['field_name_of_image']); ?>
  <h2><?php print $title; ?></h2>
  <div class="content">
    <?php print render($content); ?>
  </div>
</div>

Usando render, puede generar un elemento. Esto es más inteligente que simplemente imprimir cosas, ya que Drupal realizará un seguimiento de lo que se ha procesado, para evitar que se imprima lo mismo dos veces en el lugar. Al representar el campo sobre el título, usted está también eliminando lo que se representa cuando $content se representa.

51
googletorp

Display Suite también es genial.

Display Suite le permite tomar el control total sobre cómo se muestra su contenido mediante una interfaz de arrastrar y soltar. Organice sus nodos, vistas, comentarios, datos de usuario, etc. de la manera que desee sin tener que trabajar a través de docenas de archivos de plantilla. ¡Una lista predefinida de diseños (solo D7) está disponible para más diversión de arrastrar y soltar!

8
stevepurkiss

Eche un vistazo al módulo Título - http://drupal.org/project/title . Puede resultar útil para su escenario. Lo instalé/habilité por alguna razón, probablemente similar a la suya, y parecía dar flexibilidad sobre cómo colocar el campo de título.

Desde entonces lo he deshabilitado (y estoy usando Display Suite), por lo que mi recuerdo puede ser un poco incompleto.

7
Greta

Esta es una solución pirata y estoy seguro de que a alguien se le ocurrirá algo más elegante, pero en caso de que estés atrapado, y nadie lo haga ...

Podrías usar page.tpl.php para eliminar la impresión de $title en conjunto, y agregue un nuevo campo personalizado llamado Título con el nombre de máquina $ new_title o algo así. Luego, en la edición del nodo, oculte el cuadro de título original y en el nodo Guardar use el campo calculado o algún php personalizado para copiar el $new_title a $title.

Después de todo eso, escriba algunos CSS para hacer que $ new_title se vea como el título de la página y debería poder colocar los campos en el orden que desee, simplemente arrastrando y soltando en la pantalla de administración de campos. Porque copiaste sobre $new_title a $title, el título de la página en la barra del navegador aún debería funcionar y nada debería quejarse de la falta de títulos de nodo.

Como dije, es un truco, pero funcionaría. Hágame saber si necesita más información

4
Frederik

page.tpl.php (guirnalda)

...
      <div id="center"><div id="squeeze"><div class="right-corner"><div class="left-corner">
          <?php print $breadcrumb; ?>
          <?php if ($mission): print '<div id="mission">'. $mission .'</div>'; endif; ?>

          /*
           * Print custom block or var
           */
          <?php if ($custom_block): print '<div id="custom-block" class="clear-block">'. $custom_block .'</div>'; endif; ?>

          <?php if ($tabs): print '<div id="tabs-wrapper" class="clear-block">'; endif; ?>
          <?php if ($title): print '<h2'. ($tabs ? ' class="with-tabs"' : '') .'>'. $title .'</h2>'; endif; ?>
          <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></div>'; endif; ?>
          <?php if ($tabs2): print '<ul class="tabs secondary">'. $tabs2 .'</ul>'; endif; ?>
          <?php if ($show_messages && $messages): print $messages; endif; ?>
          <?php print $help; ?>
          <div class="clear-block">
            <?php print $content ?>
          </div>
          <?php print $feed_icons ?>
          <div id="footer"><?php print $footer_message . $footer ?></div>
      </div></div></div></div> <!-- /.left-corner, /.right-corner, /#squeeze, /#center -->
...

template.php

/**
 * Override or insert variables into the page template.
 */
function phptemplate_preprocess_page(&$variables) {
  $node = $variables['node'];
  if($node->type == MY_NODE_TYPE) {
    $variables['custom_block'] = 'bla bla bla';
  }
}
3
dobeerman

Esto no se aplica a la pregunta Teaser en la publicación original, pero para las personas que se topan con esto y solo quieren que suceda en la vista completa, aquí hay una opción sin código: mostrar el campo en un bloque (usando vistas, por ejemplo) y coloque ese bloque sobre su bloque de contenido pero en la misma región.

3
brad

Creo que deberías usar funciones de preproceso en tu template.php

/**
 * Override or insert variables into the page template.
 */
function THEMENAME_process_page(&$variables) {
  // look for $variables['page_title'] if i remember
}

Y como adicional

/**
 * Override or insert variables into the node template.
 */
function THEMENAME_preprocess_node(&$variables) {
  //
}

volcar variables y hacer lo que quieras. agregar/eliminar/actualizar.

2
dobeerman

Resolví esto mediante una solución sin código usando Display Suite y su función adicional "Región para bloquear". Me gusta más esta solución por su flexibilidad.

Básicamente, habilite la parte adicional "Región para bloquear", habilite la visualización de "Contenido de texto completo" en Display Suite. (suponiendo que desea mostrar el contenido sobre el título en la pantalla de nodo completo, de manera similar puede usarlo para cualquier otro modo de vista excepto Predeterminado). Ahora, en la parte "Administrar pantalla" de "Contenido de texto completo", en la parte inferior de la pantalla, debería aparecer la pestaña "Bloquear regiones". Ingrese el nombre del nuevo bloque allí, guarde y arrastre y suelte los campos deseados en este bloque. Por último, mueva el bloque recién creado en la pantalla Bloques a algún lugar ¡arriba el título del nodo.

Puede ver el video del mismo enfoque aquí: http://www.youtube.com/watch?v=y4wyjxyhbNA , por supuesto, debe colocar el bloque sobre el título (no en la barra lateral izquierda) al final.

2
Mirsoft

Para las plantillas zen a continuación, el código funciona para mí.

<?php
// this goes in template.php
// check if node type page and then add to $vars array
// declaring $vars['foo'] gives you a $foo variable to use in page.tpl.php

function YOURTHEMENAME_preprocess_page(&$vars, $hook) {
    if (isset($vars['node'])) :
        if($vars['node']->type == 'page'):       
            $node = node_load($vars['node']->nid);
            $output = field_view_field('node', $node, 'field_image', array('label' => 'hidden'));       
            $vars['my_image_field'] = $output;               
        endif;
    endif;
}
?>

Finalmente, puede imprimir fácilmente su campo en page.tpl.php;

<?php
if ($my_image_field):
   print render($my_image_field);
endif;
?>
1
user991554

Sé que ya habrías usado algún tema para compilar y ahora estás tratando de agregar los campos en la parte superior del título.

Mis sugerencias para todos los desarrolladores que crean el tema en Drupal 7 sería usar: Tema Omega + Contexto y módulos Delta. Esto proporciona una base muy sólida para su diseño.

Y flexibilidad para organizar regiones, bloques y campos.

1
AnAnD

Puedes hacerlo con el módulo de paneles

0
houmem