¿Mostrar una lista de términos de taxonomía separados por comas?

10

Drupal 7.

En mi node.tpl.php, quiero imprimir una lista de términos de taxonomía (la taxonomía se llama "canales"). Si yo uso:

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

Funciona, obviamente, pero lo mejor que puedo hacer para ponerlos en línea es usar CSS para flotarlos a la izquierda. Me gustaría que estuvieran separados por comas. ¿Algunas ideas?

Gracias.

Miguel
fuente

Respuestas:

11

Podrías probar el campo usando field.tpl.phpo theme_field().

Como ejemplo (usando field.tpl.php):

  1. Copie field.tpl.phpa su directorio de temas desde "modules / field / theme"
  2. Haga una copia de ese archivo y cámbiele el nombre a field--field-channel.tpl.php
  3. Edite el archivo como quiera.

Como un ejemplo rápido / sucio para que esto funcione, field--field-channel.tpl.phppodría verse así:

<div class="<?php print $classes; ?> clearfix"<?php print $attributes; ?>>
  <?php if (!$label_hidden) : ?>
    <div class="field-label"<?php print $title_attributes; ?>><?php print $label ?>:&nbsp;</div>
  <?php endif; ?>
  <div class="field-items"<?php print $content_attributes; ?>>
    <?php foreach ($items as $delta => $item) : ?>
      <div style="display:inline;" class="field-item <?php print $delta % 2 ? 'odd' : 'even'; ?>"<?php print $item_attributes[$delta]; ?>>
        <?php 
          print render($item);
          // Add comma if not last item
          if ($delta < (count($items) - 1)) {
            print ','; 
          }
        ?>
      </div>
    <?php endforeach; ?>
  </div>
</div>

Probablemente hay varias formas de lograr esto usando el archivo .tpl, pero esta es solo una opción. Recomiendo agregar una clase al DIV en lugar de un estilo y hacer los cambios en su hoja de estilo en lugar de usar estilos en línea.

Laxman13
fuente
Impresionante, esto funcionó perfectamente. No sabía que podría usar plantillas en los campos así. Todavía tengo mucho que aprender con estas cosas. Gracias de nuevo.
Mike
El uso de archivos tpl requiere un poco más de recursos y el modo preferido es usar la sugerencia de hook_field a continuación.
Shaneonabike
11

El módulo de formateador de texto ahora está disponible para Drupal 7, y le permite hacer esto sin trabajo de tema personalizado.

jhedstrom
fuente
El módulo de formateador de texto es probablemente la solución ideal para esto ahora, a diferencia de la respuesta elegida anteriormente, que requiere hurgar en la capa del tema.
JamesWilson
7

Aquí hay una forma de usar el theme_fieldenfoque (agréguelo a su template.phparchivo):

/**
 * Implements theme_field()
 *
 * Make field items a comma separated unordered list
 */
function THEMENAME_field__NAME_OF_FIELD__NAME_OF_CONTENT_TYPE($variables) {
  $output = '';

  // Render the label, if it's not hidden.
  if (!$variables['label_hidden']) {
    $output .= '<div class="field-label"' . $variables['title_attributes'] . '>' . $variables['label'] . ':&nbsp;</div>';
  }

  // Render the items as a comma separated inline list
  $output .= '<ul class="field-items"' . $variables['content_attributes'] . '>';
  for ($i=0; $i < count($variables['items']); $i++) {
    $output .= '<li>'. drupal_render($variables['items'][$i]);
    $output .= ($i == count($variables['items'])-1) ? '</li>' : ', </li>';
  }
  $output .= '</ul>';

  return $output;
}
cdmo
fuente
1
Súper gracias, ¡esto ayudó mucho en realidad! También el método preferido, ¡entonces un archivo tpl!
Shaneonabike
4

Puedes hacerlo fácilmente solo en CSS:

.field-type-taxonomy-term-reference .field-items .field-item {
  pantalla: bloque en línea;
  * pantalla: en línea;
  * zoom: 1;
}
.field-type-taxonomy-term-reference .field-items .field-item: after {
  contenido: ", ";
}
.field-type-taxonomy-term-reference .field-items .field-item: last-child: after {
  contenido: "";
}
Steven Wright
fuente
1
Gracias, aunque tuve que usar Unicode escapado para el espacio, así content: ", \00a0": stackoverflow.com/a/5467676/724176
Hugo
0
<?php
if ($node->taxonomy) {
    foreach($node->taxonomy as $term) {
        if ($term->vid == 3) { // the id of the vocabulary
            $my_terms[] = l(
                t($term->name),
                'taxonomy/term/' . $term->tid
            );
        }
    }
}

if ($my_terms) { ?>
    <div class="clear-block">
        <div class="terms">
            <?php print implode(", ", $my_terms); ?>
        </div>
    </div>
<?php } ?>
brunorios1
fuente
3
Esto evita el sistema de temas, coloca la lógica de visualización codificada en el archivo tpl y crea un dolor de cabeza de mantenimiento.
Jeremy French
¿Es mejor usar módulos laterales que están haciendo casi lo mismo? ¿Podría proporcionar un código más fácil de mantener?
Rootical V.
0

Aún más fácil para el delimitador y el contenedor, utiliza el módulo Formateador de taxonomía: http://drupal.org/project/taxonomy_formatter

Más detalles de la página del proyecto:

Este es un pequeño módulo escrito para proporcionar un formateador personalizado para elementos de taxonomía. Los formateadores predeterminados generan los términos envueltos en divs. Este módulo agrega un nuevo formateador que le permite especificar el tipo de elemento, el tipo de contenedor, las clases para ambos, el separador utilizado y si se vinculan a las páginas de términos o no. Esto ofrece opciones de diseño mucho más personalizables.

Greta
fuente