Drupal 7 preprocess_views not working

Cybercampbell picture Cybercampbell · May 3, 2012 · Viewed 10.4k times · Source

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?

Answer

Henrik Opel picture Henrik Opel · May 4, 2012

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