Personalizando o primeiro item em uma visão


7

Como um bloco na minha página inicial, estou tentando gerar:

<ul>
  <li><a><img><p>Node 1</p></a></li>
  <li><a>Node 2</a></li>
  <li><a>Node 3</a></li>
  <li><a>Node 4</a></li>
</ul>

onde cada <li> representa um nó e a imagem / texto fornecido pelos campos CCK anexados a cada nó.

Atualmente, estou usando uma exibição de bloco para gerar os nós 2-4 e uma exibição de anexo para apresentar o primeiro nó, conforme descrito aqui: http://www.agileapproach.com/blog-entry/the-views2-attachment-display

O problema é que minha saída acaba mais ou menos assim:

<div class="attachment attachment-before">
  <div class="view view-homepage-news ..">
    <div class="item-list">
      <ul>
        <li class="views-row ...">  
          <a><img><p>Node 1</p></a>            
        </li>
      </ul>
    </div>  
  </div> <!-- /.view -->
</div>
<div class="item-list">
  <ul>
    <li class="views-row ..."><a>Node 2</a></li>
    <li class="views-row ..."><a>Node 3</a></li>
    <li class="views-row ..."><a>Node 4</a></li>
  </ul>
</div>

Provavelmente posso dobrar essa saída de acordo com o meu objetivo, mas isso envolverá muitos modelos e configurações. Eu também gostaria de evitar o uso de CSS e / ou JavaScript para modificar a saída, a menos que seja minha única opção.

Diante disso, qual é a maneira mais fácil de obter a saída mais próxima do que eu preciso?

Edit: aqui está um código php áspero que estou usando no campo de código customfield php (com base na sugestão de Jeremy French: Aqui está o código que estou usando no meu código customfield do código PHP:

<?php
  ++$static;
  if ($static == 1) {
    $nd=node_load($data->nid);
    $img_path = imagecache_create_path('news_image_thumbnail', $nd->field_image[0]['filepath']);
    print '<a><img src="' . $img_path . '"><p>Node 1</p></a>';
  } else {
    print "<a>Node $static</a>";
  }
?>

Respostas:


5

Você poderia fazer algo com views_customfield .

Você adiciona um campo php, obtém apenas a exibição da marcação desejada (sem elementos que contêm) e gera um valor apenas para a linha número 1.


Isso parece ótimo! Parece uma maneira limpa de fazer isso.
Daniel Nitsche

8

Eu pessoalmente uso funções de pré-processo para fazer isso, algo como o seguinte:

function HOOK_preprocess_views_view_fields(&$vars) {
  if ($vars['view']->name == 'VIEW_NAME' && $vars['view']->row_index == 1) {
    // Do stuff here.
  }
}

6

Não tenho certeza se estou entendendo sua pergunta corretamente, mas acredito que você possa usar o módulo Vistas Semânticas para isso. Se você definir o Estilo em Configurações básicas como Vistas semânticas, terá uma opção nas configurações Vistas semânticas para definir um "atributo de primeira classe", que o ajudará a direcionar o primeiro item da lista na sua exibição no estilo do seu tema. arquivo css.


O Semantic Views parece ótimo e definitivamente limpará a saída, mas quero evitar confiar no CSS para ocultar a marcação extra que eu estaria produzindo. Caso contrário, provavelmente usaria o li: primeiro filho para fazer o que preciso.
Daniel Nitsche

Estou curioso, pois ainda estou aprendendo, mas qual é a razão por trás de não querer usar CSS para modificar o primeiro item em uma exibição de lista?
Jay

11
principalmente o HTML extra que ele produzirá. Caso em questão: o site em que estou trabalhando será usado por alguns usuários com conexões dial-up - cada byte conta nesses casos. Além disso, usar CSS parece um hack: em termos de manutenção, os administradores não precisam modificar o CSS para modificar a saída HTML. Isso deve ser feito em Drupal.
Daniel Nitsche

4

A solução mais fácil é com um modelo personalizado. Porém, não precisa ser muito trabalhoso. Com as informações sobre o tema disponíveis na interface das visualizações, é possível ver qual modelo você precisa alterar. Tudo que você precisa fazer é adicionar algum código para imprimir os itens extras para o primeiro nó. As visualizações percorrerão cada linha, portanto, deve ser fácil.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.