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

41

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

Efectivamente quiero pasar de esto a esto .

He buscado actualizar el node.tpl.php pero noto que se separa $titlede, $contentasí 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 me pregunto si hay una solución más de Drupal-7.

¿Alguna sugerencia?

irishbuzz
fuente
Además de todas las soluciones de plantillas basadas en php, también puede recorrer un largo camino solo con CSS. Los márgenes negativos pueden hacer mucho. En su ejemplo jsfiddle se vería así .
marcvangend 01 de
Lo había considerado pero ¿qué pasa con los títulos largos ?
irishbuzz 01 de
Tienes toda la razón, esto solo funciona si el título tiene una altura fija. Como todas las soluciones, tiene sus puntos débiles. Personalmente, creo que (independientemente del diseño y la tecnología que esté usando) los títulos largos deben evitarse educando a los editores, pero me doy cuenta de que no siempre es una opción.
marcvangend 01 de

Respuestas:

53

Esto es realmente bastante simple con Drupal 7.

Con rendery hideya sabes, tienes la posibilidad de controlar la ubicación de un solo elemento $contentsin 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 hará 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, también está eliminando lo que se representa cuando $contentse representa.

googletorp
fuente
2
Muy agradable. En un mundo ideal, podría ser mejor decirle a Drupal que trate el campo del título como cualquier otro campo, pero al menos en Drupal 7 tenemos soluciones simples como esta. Felicitaciones @googletorp!
irishbuzz 01 de
Para el registro: esto no es muy diferente de Drupal6, al contrario de lo que el comentario anterior podría insinuar.
berkes
1
@berkes: si imprime los campos individualmente en D6, debe mantener la plantilla de nodo y editar el código para poder agregar nuevos campos. Esta es una gran diferencia en comparación con D7, donde puede seguir agregando campos y usar la interfaz de usuario para ordenarlos también.
googletorp
render es de hecho nuevo. Pero su concepto no lo es. Hay varios trucos para lograr lo mismo. No quise decir que en Drupal6 esto sea tan simple, limpio y agradable. Simplemente que también es posible .
berkes
@googletorp, ¿hay alguna forma de imprimir un campo en page.tpl.php?
CocoSkin
9

Display Suite también es bastante 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!

stevepurkiss
fuente
Es un módulo genial, pero desafortunadamente solo parece ofrecer control para los campos sin título, por lo que no hay ayuda aquí. Gracias de todos modos.
irishbuzz
En realidad eso no es cierto, solo necesita instalar todos los módulos requeridos: drupal.org/project/ds , drupal.org/project/nd & drupal.org/project/nd_contrib
Decipher
@Decipher: ¿Instalar 3 módulos para mover una etiqueta de imagen sobre la etiqueta h2? Debes estar bromeando, cierto :)
berkes
@berkes - Instalando Drupal para mostrar una página web, debes estar bromeando ¿verdad? Mi punto es que con estos módulos instalados puede hacer mucho, al igual que con Drupal puede hacer mucho, pero también puede usarlo para resolver una tarea de baja categoría.
Descifrar el
@Decipher: seguro, la instalación de módulos genéricos brinda nuevas oportunidades a su sitio. Pero no es aconsejable instalar vistas, galería de vistas, cck, filefiend y campo de imagen para mostrar simplemente una fila de imágenes. Sería un buen consejo si las vistas, cck y el resto se utilizarán para más que solo esta lista de imágenes. Pero el OP no mencionó esto en absoluto.
berkes
8

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.

Greta
fuente
5

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

Puede usar page.tpl.phppara eliminar la impresión de $titletodo y agregar un nuevo campo personalizado llamado Título con el nombre de máquina $ new_title o algo así. A continuación, en el nodo de edición, ocultar el cuadro Título original, y en el nodo Guardar utilización computarizada campo o algún PHP personalizado para copiar el $new_titlea $title.

Después de todo eso, escriba algunos css para que $ new_title se vea como el título de la página antes y debería poder colocar los campos en el orden que desee, simplemente arrastrando y soltando en la pantalla de administración de campos. Debido a que ha copiado $new_titlea $title, el título de la página en la barra del navegador debe todavía trabajo y nada debe quejarse de falta títulos de nodo.

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

Frederik
fuente
1
Gracias por la sugerencia Frederik. Como indica, está lejos de ser ideal, pero parece una de las pocas soluciones posibles. Agregaré a su solución sugiriendo que se use el módulo auto_nodetitle si se adopta este enfoque. Dejaré la pregunta abierta por ahora, ya que realmente espero que haya una mejor manera y pueda comenzar una recompensa. +1 por tu esfuerzo de todos modos.
irishbuzz
4

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';
  }
}
Dobeerman
fuente
No estoy seguro de seguir lo que está sucediendo aquí, ya que el primer fragmento de código da poca indicación de lo que es nuevo y lo que existe. También estoy usando el tema Zen en lugar de Garland, aunque los cambios necesarios deberían ser similares. En el segundo fragmento de código, ¿estás invocando un hook_preprocess_page ()? ¿Se puede ampliar con un ejemplo más concreto?
irishbuzz
En el segundo código teníamos que definir una nueva variable 'custom_block'. Mire parte del primer código donde estamos imprimiendo 'custom_block'. <? php if ($ custom_block): imprime '<div id = "custom-block" class = "clear-block">'. $ custom_block. '</div>'; terminara si; ?> solo defina reglas para generar esta variable. ¿Asi que? :)
dobeerman
4

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 encima de su bloque de contenido pero en la misma región.

puntilla
fuente
Todavía soy un drupal n00b, ¿podrías explicar a qué te refieres?
Kenny Wyland
3

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.

Dobeerman
fuente
1
Esas funciones no alteran el orden en que se emiten el título y otros campos de nodo. Para eso, debe cambiar el archivo de plantilla.
kiamlaluno
Ya veo. Pensé que le gustaría agregar un valor de campo al título.
Dobeerman
3

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 en algún lugar sobre 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.

Mirsoft
fuente
2

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;
?>
usuario991554
fuente
con respecto al page.tpl.php, recibí una advertencia de variable indefinida con el tema Responsive Business, pero cuando eliminé el condicional, funciona bien. En otras palabras, cambié <? Php if ($ my_image_field): print render ($ my_image_field); terminara si; ?> a <? php print render ($ mi_imagen_campo); ?> Lo que parece no arrojar ninguna advertencia en todas mis páginas.
Amy Niebel
2

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

Mis sugerencias para todos los desarrolladores que crean un tema en Drupal 7 serían 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.

Y
fuente
1

Puedes hacerlo con el módulo de paneles

houmem
fuente
Antigua respuesta aquí, pero esto atrapó una bandera. Sería mejor explicar un poco cómo se pueden usar los paneles en esta situación.
mpdonadio
Los paneles tienen una gran sobrecarga para mover un campo en una posición diferente.
Akko