Сброс кэша Views при изменении флага (flag)

В предыдущей статье рассматривался модуль для сброса кэша Views content cache, который сбрасывает кэш вьюшки при обновлении материала. Но бывает необходимость сбрасывать кешь при использовании модуля Flag. Здесь есть несколько вариантов:

1. Использовать хук hook_flag_flag

function hook_flag_flag($flag, $entity_id, $account, $flagging) {
  $view_name = '<view_name>';
  $display_id = '<display_id>';
  $cid = $view_name . ':' . $display_id . ':*';
  cache_clear_all($cid, $bin = 'cache_views_data', $wildcard = TRUE);
}

но это не всегда удобно.

2. Допилить модуль Views content cache. Для этого переходим /sites/all/modules/views_content_cache и в директории plugins/views_content_cache создаем файл flag.inc с содержимым

<?php
class views_content_cache_key_flag extends views_content_cache_key {
  function options_form($value= NULL, &$handler= NULL) {
    $options = array();
    $flags = flag_get_flags();
    foreach ($flags as $fid => $flag) {
      $description = '';
      $description = 'flag type: <em>'. $flag->entity_type .'</em>';
      if (($flag->entity_type == 'node' || $flag->entity_type == 'comment') && count($flag->types)) {
        $description .= '<br />node types: <em>'. implode(', ', $flag->types) .'</em>';
      }
      $options[$flag->fid] = $flag->title . '<br />'. $description;
    }
    natcasesort($options);
    return array(
      '#title' => t('Flags'),
      '#description' => t('Checks for flag and unflag actions for the selected flags.'),
      '#type' => 'checkboxes',
      '#options' => $options,
      '#default_value' => $value,
    );
  }
  function content_key($object, $object_type) {
    if ($object_type === 'flag') {
      return $object->fid;
    }
  }
  function clause_mode() {
    return 'OR';
  }
}

Далее необходимо подключить наш файл в views_content_cache.info

files[] = plugins/views_content_cache/flag.inc

После открываем файл views_content_cache.module, в начало добавляем две функции:

function views_content_cache_flag_flag($flag, $entity_id, $account, $flagging) {
      views_content_cache_update_set($flag, 'flag');
}
function views_content_cache_flag_unflag($flag, $entity_id, $account, $flagging) {
  views_content_cache_update_set($flag, 'flag');
}

Там же находим функцию views_content_cache_views_content_cache_plugins() и переде строчкой if (module_exists('votingapi')) добавляем:

if (module_exists('flag')) {
    $plugins['flag'] = array(
      'title' => t('Flag'),
      'description' => t('Invalidates cache when content is flagged'),
      'handler' => array(
        'path' => drupal_get_path('module', 'views_content_cache') . '/plugins',
        'file' => 'flag.inc',
        'class' => 'views_content_cache_key_flag',
        'parent' => 'base',
      ),
    );
  }

Вот и все. Чистим кэш, переходим в наше представление и настройках кэширования будут доступны существующие флаги. Выбираем те, по действию которых будет обновляться кеш и сохраняем вьюшку.