Exibir lista separada por vírgula de termos de taxonomia?

10

Drupal 7.

No meu node.tpl.php, quero imprimir uma lista de termos de taxonomia (a taxonomia é chamada de "canais"). Se eu usar:

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

Funciona, obviamente, mas o melhor que posso fazer para colocá-los em linha é usar CSS para fazê-los flutuar para a esquerda. Eu gostaria que eles fossem separados por vírgulas. Alguma ideia?

Valeu.

Mike
fonte

Respostas:

11

Você pode experimentar o tema usando o campo field.tpl.phpou theme_field().

Como um exemplo (usando field.tpl.php):

  1. Copie field.tpl.phppara o diretório de temas de "modules / field / theme"
  2. Faça uma cópia desse arquivo e renomeie-o para field--field-channel.tpl.php
  3. Edite o arquivo da maneira que desejar.

Como um exemplo rápido / sujo para isso funcionar, field--field-channel.tpl.phppode parecer com:

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

Provavelmente, há várias maneiras de fazer isso usando o arquivo .tpl, mas essa é apenas uma opção. Eu recomendo adicionar uma classe ao DIV em vez de um estilo e fazer as alterações na folha de estilo em vez de usar estilos embutidos.

Laxman13
fonte
Incrível, isso funcionou perfeitamente. Eu não sabia que você poderia usar modelos nos campos assim. Ainda temos muito a aprender com essas coisas. Obrigado novamente.
Mike
O uso de arquivos tpl é um pouco mais intenso em recursos e o modo preferido é usar a sugestão hook_field abaixo.
shaneonabike
12

O módulo Formatador de texto agora está disponível para o Drupal 7 e permite fazer isso sem o trabalho temático personalizado.

jhedstrom
fonte
O módulo Formatador de Texto é provavelmente a solução ideal para isso agora, em oposição à resposta escolhida acima, que exige que se mexa na camada de tema.
22413 JamesJilson
7

Aqui está uma maneira de usar a theme_fieldabordagem (adicione-a ao seu template.phparquivo):

/**
 * 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
fonte
1
Super ótimo graças a isso ajudou bastante! Também o método preferido, em seguida, um arquivo tpl!
shaneonabike
4

Você pode fazer isso facilmente apenas em CSS:

.field-type-taxonomy-term-reference .field-items .field-item {
  display: bloco embutido;
  * display: em linha;
  * zoom: 1;
}
.field-type-taxonomy-term-reference .field-items .field-item: depois de {
  conteúdo: ",";
}
.field-type-taxonomy-term-reference .field-items .field-item: last-child: after {
  conteúdo: "";
}
Steven Wright
fonte
1
Obrigado, embora eu tivesse que usar o Unicode de escape para o espaço, desta forma 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
fonte
3
Isso está evitando o sistema de temas, colocando a lógica de exibição codificada no arquivo tpl e criando uma dor de cabeça na manutenção.
Jeremy French
É melhor usar módulos laterais que estão fazendo quase o mesmo? Você poderia fornecer um código mais fácil de manutenção?
Rootical V.
0

Ainda mais fácil para o delimitador e o wrapper, você usa o módulo Taxonomy Formatter: http://drupal.org/project/taxonomy_formatter

Mais detalhes na página do projeto:

Este é um pequeno módulo criado para fornecer um formatador personalizado para itens de taxonomia. Os formatadores padrão emitem os termos agrupados em divs. Este módulo adiciona um novo formatador que permite especificar o tipo de elemento, o tipo de invólucro, as classes para ambos, o separador usado e se eles vinculam ou não às páginas de termos. Isso oferece muito mais opções de layout personalizáveis.

Greta
fonte