hook_preprocess_page (): como informar uma página de visualizações?

10

Estou escrevendo um módulo personalizado que precisa inserir alguns arquivos javascript e css apenas em uma página Views.

Estou usando hook_preprocess_page, mas não sei dizer se a página atual é de uma exibição:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if([view page])
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
        // Rebuild scripts 
        $scripts = drupal_get_js();
        $vars['scripts'] = $scripts;
        // Same for css
    }
}

Eu sei que eu poderia usar um arquivo de modelo (page-my_view_page_path.tpl.php), mas o js e o css extra devem ser incluídos apenas se meu módulo estiver ativado; então eu gosto de manter essas coisas diretamente dentro do código do meu módulo .

Ideias?

Strae
fonte
Você pode usar arquivos de modelo em seu módulo.
Jeremy French
@ Jeremy: adicione sua resposta explicando como, para que as pessoas possam votar e discutir.
Strae
Não estava diretamente relacionado à resposta, apenas salientando que um arquivo tpl pode ser incluído em um módulo. um DANIEL parecia indicar que não podia.
Jeremy French
bem .. eu poderia incluir o page.tpl tema, mas meu objetivo é manter este módulo totalmente independente zona do tema ..
Strae
Você pode implementar os modelos do Views pré-processando seu módulo, conforme sugerido na resposta de Jeremy French.
Pierre Buyle

Respostas:

12

views_get_page_view()descobre qual visualização de página, se houver, está atualmente em uso. Se retornar NULL, a página atual não será uma página de visualizações.

Mas usar drupal_add_js()e drupal_add_css()em um hook_preprocess_page()não funcionará como esperado, porque a variável $scripte as $stylevariáveis ​​já foram definidas por template_preprocess_page(). O pré-processamento de modelos do Views (consulte a resposta de Jeremy French) é provavelmente um lugar melhor para adicionar CSS e JavaScript.

Pierre Buyle
fonte
Atualizei minha resposta para você, segundo parágrafo - eu sei que é uma boa prática adicionar css ou js no tema (theme_preprocess_ *), mas minha necessidade é do módulo dependente.
Strae
Excelente, views_get_page_view apenas obtém a visualização já carregada do cache, portanto não deve ter impacto no desempenho. IMHO esta deve ser a resposta aceita.
marcvangend
@Strae Minha sugestão foi usar HOOK_preprocess_views_view(&$variables)um gancho de pré-processo de outro modelo do Views em vez de HOOK_preprocess_page(&$variables). Dessa forma, você pode obter as visualizações, o $variablesuso drupal_add_js()e a drupal_add_css()segurança.
precisa
11

Há um encadeamento longo nos pré - processadores para visualizações aqui. Este comentário parece muito simples para mim.

function mymodule_theme_registry_alter(&$theme_registry) {
  //dpm($theme_registry);
  $theme_registry['views_view__YOUR_VIEW_NAME_HERE']['preprocess functions'][] = 'mymodule_preprocess_func';
}

// now go on and play with your new preprocess function
function mymodule_preprocess_func(&$vars) {
  // etc
}
Jeremy French
fonte
Concordo que o pré-processamento da saída do modo de exibição em vez da página inteira é provavelmente a abordagem mais correta.
Garrett Albright
8

Se você estiver em um hook_preprocess_page (), por definição, sua exibição terá uma exibição de página e um caminho de menu, que deve ser exclusivo - para que você possa fazer isso:

function mymodule_preprocess_page(&vars)
{
    var_dump($vars); //output: nothings that reference the views!
    if($_GET['q'] == 'my/view/path')
    {
        drupal_add_js([...]);
        drupal_add_css([...]);
    }
}

Se você tiver argumentos passados ​​para esta página, precisará de partes dele $_GET['q'], faça-o com a arg()função de Drupal :

if(arg(0) == 'my' && arg(1) == 'view' && arg(2) == 'path')

http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/arg

Greg
fonte
Eu não recomendaria examinar $ _GET ['q']. Use menu_get_item () ou menu_get_object () . Nenhum dos dois requer um argumento se você estiver inspecionando a página atual e os dois armazenam em cache seus resultados.
Mikey P
O uso de drupal_add_js () e drupal_add_css () em uma hook_preprocess_page () não funcionará conforme o esperado, porque as variáveis ​​$ script e $ style já foram definidas por template_preprocess_page (). O usuário views_get_page_view () para recuperar a visualização da página atual (se houver).
precisa
3

Para mim, este funciona:

function MYMODULE_preprocess_page(&$vars) {
  $view = (array)views_get_page_view();
  if (!empty($view)) {
    // do stuff
  }
}
leymannx
fonte
2

Se você estiver adicionando JS ou CSS a um retorno de chamada específico, é melhor usar hook_page_build():

Simon Poulston
fonte