diff --git a/skinr.module b/skinr.module index 2d19df649f6cca557b0c2aaa5ff20024e48f386d..6b5744c32f924499ee58e860dd11d9f62c7a9979 100644 --- a/skinr.module +++ b/skinr.module @@ -92,36 +92,42 @@ function skinr_preprocess(&$variables, $hook) { // An array of $elements based on $module and $original_hook, derived from $variables. $array_elements = skinr_invoke_all('skinr_elements', $variables, $original_hook, 'preprocess'); foreach ($array_elements as $module => $elements) { - if (empty($elements)) { - // We can receive empty arrays; if that happens, there's no point - // in continuing. - continue; - } + $applied_skins = array(); + foreach ($elements as $element) { + $cid = 'skinr_preprocess:' . $module . ':' . $element . ':' . $data['current_theme']; + if ($cached = cache_get($cid)) { + $applied_skins = $cached->data; + } + else { + // Get a list of skin configuration IDs to pass to + // skinr_skin_load_multiple(). + $params = array( + 'theme' => $data['current_theme'], + 'module' => $module, + 'element' => $element, + 'status' => 1, + ); + $sids = skinr_skin_get_sids($params); + $skins = !empty($sids) ? skinr_skin_load_multiple($sids) : array(); + + // Invoke hook_skinr_preprocess_alter() in all modules. + $context = array( + 'hook' => $hook, + 'variables' => &$variables, + 'theme' => $data['current_theme'], + 'module' => $module, + 'elements' => $elements, + ); + drupal_alter('skinr_preprocess', $skins, $context); - // Get a list of skin configuration IDs to pass to - // skinr_skin_load_multiple(). - $params = array( - 'theme' => $data['current_theme'], - 'module' => $module, - 'element' => $elements, - 'status' => 1, - ); - $sids = skinr_skin_get_sids($params); - $skins = !empty($sids) ? skinr_skin_load_multiple($sids) : array(); - - // Invoke hook_skinr_preprocess_alter() in all modules. - $context = array( - 'hook' => $hook, - 'variables' => &$variables, - 'theme' => $data['current_theme'], - 'module' => $module, - 'elements' => $elements, - ); - drupal_alter('skinr_preprocess', $skins, $context); + $applied_skins = array(); + foreach ($skins as $skin) { + $applied_skins = array($skin->skin => $skin->options) + $applied_skins; + } - $applied_skins = array(); - foreach ($skins as $skin) { - $applied_skins = array($skin->skin => $skin->options) + $applied_skins; + // Cache data. + cache_set($cid, $applied_skins); + } } // Use drupal_process_attached() to add attachements such as JS and CSS. @@ -634,6 +640,8 @@ function skinr_skin_save(&$skin) { // @todo Once we have a more granular reset for skinr_skin_load_multiple(), we // need to use it here. drupal_static_reset('skinr_skin_load_multiple'); + // Clear preprocess cache. + cache_clear_all('skinr_preprocess:' . $skin->module . ':' . $skin->element . ':', 'cache', TRUE); return $status; }