Como adiciono JavaScript específico para uma visualização?


26

Eu tenho uma exibição no meu site que tem um nome de classe específico. Quero saber, dentro do arquivo template.php de um tema, como posso saber se uma exibição com nome de classe específico está disponível na página solicitada.

Isso é muito importante para mim, porque preciso incluir JavaScript e CSS específicos, quando uma exibição com um nome de classe específico (como galeria de imagens) é usada em uma página.

Respostas:


40

Você pode usar o template_preprocess_views_view()gancho para fazer isso:

function THEME_preprocess_views_view(&$vars) {
  $view = &$vars['view'];
  // Make sure it's the correct view
  if ($view->name == 'your-view-name') {
    // add needed javascript
    drupal_add_js(drupal_get_path('theme', 'your-theme') . '/your-js.js');
    // add needed stylesheet
    drupal_add_css(drupal_get_path('theme', 'your-theme') . '/your-css.css');
  }
}

Observe que você também pode verificar a exibição específica da exibição usando:

if ($view->name == 'your-view-name' && $view->current_display == 'your-display-id') {
  // include javascript & css here
}

Você deve poder verificar uma classe css personalizada como esta:

if ($view->name == 'your-view-name' && $view->display[$view->current_display]->display_options['css_class'] == 'your-css-class') {
   // include javascript & css here
}

Muito obrigado, mas essa função reconhece a exibição pelo nome. Quero reconhecer o nome da classe, porque Existem várias exibições em uma página com o mesmo nome de classe. por exemplo, 2 visualizações têm o nome da classe 'galeria-imagem' e 3 exibições têm o nome da classe 'caixa de luz'. Quero adicionar js, por exemplo, se uma exibição com o nome da classe css 'light-box' estiver disponível na página.
precisa saber é o seguinte

Você não pode apenas verificar a tela? if($view->name == 'your-view-name' && $view->display_id == 'your-display-id')
precisa saber é o seguinte

não, porque não está claro quantas exibições estão disponíveis na página. talvez tenhamos 10 visualizações de que todas elas têm o mesmo nome de classe css.
precisa saber é o seguinte

Eu implementei esse gancho e limpei todos os caches - mas ele não foi chamado. Não sei por que. Sim, verifiquei o nome duas vezes.
Jdhildeb

Isso parece muito estranho? Você substituiu THEME pelo nome do seu tema real? Isso deve funcionar muito bem, desde que você o implemente corretamente.
Cyclonecode

8

Você pode usar a função views_get_page_view para descobrir qual exibição está sendo veiculada na página. Ele retorna o objeto de vistas. Observe que no snippet de código abaixo você deve comparar com o nome legível da máquina de visualizações, mas é claro que você pode escrever sua própria comparação com base no objeto de exibição retornado por views_get_page_view

function YOURTHEMENAME_preprocess_page(&$variables) {
    $view = views_get_page_view();
    if($view->name == 'YOURVIEW') {
    //Do what ever you want 
    }

6

Caso isso seja útil para qualquer pessoa que se depare com essa questão, procurando como eu fiz para anexar JavaScript a uma Drupal View . Em termos de D7 e Views 3.7, o seguinte funcionou melhor para mim:

function HOOK_views_pre_render ( &$view ) { 
  /// check to make sure the view has a classname
  if ( $view->display_handler && !empty($view->display_handler->options['css_class']) ) {
    $cln = $view->display_handler->options['css_class'];
    $cls = 'CLASS GOES HERE';
    /// test that the classname contains our class
    if ( preg_match('/(^|\s+)' . preg_quote($cls) . '(\s+|$)/i', $cln) ) {
      /// build the path to the js, which is local to my module, js/view.js
      $sep = DIRECTORY_SEPARATOR;
      $dir = rtrim(drupal_get_path('module', 'HOOK'), $sep);
      $pth = "{$dir}{$sep}js{$sep}view.js";
      drupal_add_js($pth);
    }
  }
}

Isso foi benéfico, pois eu queria manter o código dentro do meu módulo, e não o tema - porque os aprimoramentos trazidos pelo JavaScript não tinham nada a ver com a aparência visual.

NOTA: Obviamente, HOOKdeve ser substituído pelo nome do seu módulo, nos dois locais, e CLASS GOES HEREtambém pela classe que você está procurando.


Para maior clareza, por que o pre_render foi melhor que o pré-processo?
21414 Nick

@Nick ~ Não existe um HOOK_views_pre_process( api.drupal.org/api/views/views.api.php/7 ), a menos que você esteja entendendo a razão pela qual usar isso THEME_preprocess_views_view- nesse caso, é apenas fora de preferência de onde você deseja adicionar suas modificações de código. HOOK_views_pre_renderpode ser conectado a partir de um módulo, enquanto que THEME_preprocess_views_viewdeve ir no seu arquivo de tema / modelo. Você também pode usar HOOK_views_post_renderse preferir.
Pebbl

Desculpe, eu quis dizer THEME_preprocess_views_view, sim ... Tenho certeza que já fiz hook_preprocess_views_viewem módulos antes.
Nick

4

Se você usa o drupal 6 ou 7, também pode incluir recursos javascript no contexto do módulo e adicionar ativos. O que exige contexto, mas você terá certeza de que ele sempre será incluído quando a exibição estiver sendo renderizada.

https://drupal.org/project/context_addassets

Na página do projeto do módulo:

Você já quis incluir javascript ou css quando uma exibição ou bloco específico está sendo renderizado? Ou você já quis incluir javascript ou css apenas na primeira página sem precisar escrever código?

Os recursos de adição de contexto permitem que você faça isso. Ele tem uma interface fácil de usar para permitir que você faça tudo isso sem escrever nenhum código. Como ele usa ctools, tudo isso também é exportável.


2

Escreva o código JavaScript que pesquisa por classe específica na visualização, usando hasClass () do jQuery , e inclua seu arquivo JavaScript quando a condição for atendida.

Outra maneira é colocar um modelo para sua visualização e adicionar código JavaScript através desse modelo usando drupal_add_js () .


Você pode me dizer, como posso fazer isso. De fato, como pode incluir arquivos css e js após uma expressão condicional no script java ser verdadeira ??!
precisa saber é o seguinte

Para o Drupal 8, esta resposta descreve como criar um modelo de exibição personalizado para a saída de exibição para fazer isso: stackoverflow.com/a/43131240/227926
therobyouknow
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.