6

I have the following code in my Drupal 7 template.php file:

 function mytheme_preprocess_views_view__videos__videos(&$vars) {
        drupal_add_css(drupal_get_path('theme', 'mytheme') . "/css/qwembed-jquery-1.0.css");
        drupal_add_js(drupal_get_path('theme', 'mytheme').'/js/jquery.swfobject.1-1-1.min.js', array('type' => 'file', 'scope' => 'footer'));
        drupal_add_js(drupal_get_path('theme', 'mytheme').'/js/qwembed-jquery-1.0.js', array('type' => 'file', 'scope' => 'footer'));
    }

I need to load these css and js file only when this view is displayed.

the view display name is: Videos the view Machine Name is: videos

and the override files are:

views-view--videos--videos.tpl.php

views-view-unformatted--videos--videos.tpl.php

views-view-fields--videos--videos.tpl.php

any ideas why this is not working?

Cybercampbell
  • 2,486
  • 11
  • 48
  • 75
  • Is the double `__videos__videos` just a typo? If the views name is 'videos', I'd expect `[yourThemeName]_preprocess_views_view__videos(&$vars)`. – Henrik Opel May 04 '12 at 00:10
  • I asumed that was becuase the disply name was videos and in this case the machine name was videos. The template files listed above work perfectly and they are videos--videos. I will try removing one anyway just in case. Thanks – Cybercampbell May 04 '12 at 09:53
  • 1
    Hold on, I think I was mistaken by something, so I guess it will *not* work with only one '__videos' as well. Will recheck and add an answer. – Henrik Opel May 04 '12 at 10:00

1 Answers1

22

The problem is likely that you try to implement a preprocess function based on the same naming pattern as used for template overrides. But preprocess functions are a bit different in that by default, they can only be implemented based on the name of the 'base' template, and do not have the same mechanism for 'specific' versions based on template suggestions. See my answer to a more generic question for details.

So you'd need to fall back to implementing the 'base' preprocess function, and check if it gets called for the desired view (and optionally display) within that function, roughly like so:

function [yourThemeName]_preprocess_views_view(&$vars) {
  $view = $vars['view'];
  if ('videos' == $view->name) {
    // Add desired manipulations for all 'videos' views
    if ('videos' == $view->current_display) {
      // Add desired manipulations for the 'videos' display only
    }
  }
}

You could also add the behavior you expected by implementing a generic preprocess function that tries to call specific versions by checking for functions with the proper name - see the end of this article for an example - but this introduces quite some processing overhead and would only make sense, if you need specific preprocess functions for many views.

There are more 'base' preprocess functions per view type that you can implement directly - see the list of template_preprocess_views_view_* in 'views/theme/theme.inc' for the available options.

As a base rule, whenever there is a template_preprocess_* function for a template, you can implement a corresponding yourThemeOrModuleName_preprocess_* function as well. If you need to manipulate for templates based on template name suggestions, you need to find the 'base' preprocess function name, implement that and check for your specific case in that function (like for the specific view as in the example above).

Community
  • 1
  • 1
Henrik Opel
  • 19,341
  • 1
  • 48
  • 64
  • 2
    Wow!!! thank you so much for such a clear and detailed answer. I can't express how much I appreciate the effort you've gone to to help out someone you don't even know. And I can confirm your answer is 100% correct!! tested and working!! Thanks again @Henrik Opel – Cybercampbell May 04 '12 at 15:00
  • For future readers of your fantastic answer, I wanted to point out that this is only necessary in the first place because of a significant bug in Drupal 7 core. Check out this issue for more details: http://drupal.org/node/939462 – coredumperror Sep 28 '12 at 18:25