public static function buildPersoCriteria(&$conditions, &$values, &$joins, &$params_list, $module, $activity_param = 'act', $na_activities = array()) { $has_merged = self::buildConditionItem($conditions, $values, $joins, $params_list, 'ItemNull', 'm.redirects_to', 'merged', 'merged'); if ($has_merged) { $joins['merged'] = $has_merged; } else { $conditions[] = 'm.redirects_to IS NULL'; } self::buildConditionItem($conditions, $values, $joins, $params_list, 'Config', '', 'all', 'all'); if (isset($joins['all'])) { if ($joins['all']) { return; } else { unset($joins['all']); } } $perso = c2cTools::getArrayElement($params_list, 'perso'); if (!empty($perso)) { $perso = explode('-', $perso); } else { $perso = array(); } $filters_active_and_on = c2cPersonalization::getInstance()->areFiltersActiveAndOn($module); if (!$has_merged) { if ($filters_active_and_on && (empty($params_list) || count($perso) == 1 && in_array('ifon', $perso))) { list($langs_enable, $areas_enable, $activities_enable) = c2cPersonalization::getDefaultFilters($module); if ($langs_enable) { $perso[] = 'cult'; } if ($areas_enable) { $perso[] = 'areas'; } if ($activities_enable) { $perso[] = 'act'; } } elseif (!$filters_active_and_on && in_array('ifon', $perso)) { $perso = array(); } } else { $perso = array(); } if (!empty($perso)) { $params = array_keys($params_list); if (!array_intersect(array('areas', 'bbox', 'around'), $params) && array_intersect(array('areas', 'yes', 'all'), $perso)) { $areas = c2cPersonalization::getInstance()->getPlacesFilter(); if (count($areas)) { $params_list['areas'] = implode('-', $areas); } } if (!in_array($activity_param, $params) && array_intersect(array('act', 'yes', 'all'), $perso)) { $activities = c2cPersonalization::getInstance()->getActivitiesFilter(); $activities = array_udiff($activities, $na_activities, 'strcmp'); if (count($activities)) { $params_list[$activity_param] = implode('-', $activities); } } $culture_param = c2cTools::Module2Letter($module) . 'cult'; if (!in_array($culture_param, $params) && array_intersect(array('cult', 'yes', 'all'), $perso)) { $cultures = c2cPersonalization::getInstance()->getLanguagesFilter(); if (count($cultures)) { $params_list[$culture_param] = implode('-', $cultures); } } if (isset($params_list['perso'])) { unset($params_list['perso']); } if (empty($params_list)) { $joins['all'] = true; } } if (isset($params_list[$activity_param])) { $joins['act'] = $params_list[$activity_param]; } else { $joins['act'] = ''; } }
public function executeBeforeExecution() { $context = $this->getContext(); $module = $context->getModuleName(); $action = $context->getActionName(); $request_parameters = $context->getRequest()->getParameterHolder()->getAll(); unset($request_parameters['module']); unset($request_parameters['action']); $count_request_parameters = count($request_parameters); // register our cache configuration $this->cacheManager->registerConfiguration($module); // this previous line removes the dynamic cache configuration we could have been adding in previous filter ! // so that conditionalCacheFilter defined in documentation : // http://www.symfony-project.com/book/1_0/12-Caching#Configuring%20the%20Cache%20Dynamically // does not work ! if ($action == 'home' || $module == 'portals' && $action == 'view') { $module_cache = 'outings'; } else { $module_cache = $module; } $perso = c2cPersonalization::getInstance(); list($langs_enable, $areas_enable, $activities_enable) = c2cPersonalization::getDefaultFilters($module_cache); $are_filters_active = $perso->areFiltersActive(); $is_main_filter_switch_on = $perso->isMainFilterSwitchOn(); $count_activities_filter = count($perso->getActivitiesFilter()); $count_places_filter = count($perso->getPlacesFilter()); $are_default_filters = $perso->areDefaultFilters(); $are_simple_activities_langs_filters = $perso->areSimpleActivitiesFilters(true); $are_simple_activities_filters = $perso->areSimpleActivitiesFilters(false); // portals and home cache // Following condition means that filter is deactivated, or filters are empty, // or there is only one culture in the prefs, which the same as the interface culture // Other cases should not happen often, we don't cache them switch ($action) { case 'home': case 'view': if (!$are_filters_active || !$is_main_filter_switch_on || $are_default_filters || $are_simple_activities_langs_filters) { $this->cacheManager->addCache('documents', 'home', array('lifeTime' => 300, 'vary' => array())); $this->cacheManager->addCache('portals', 'changerdapproche', array('lifeTime' => 600, 'vary' => array())); $this->cacheManager->addCache('portals', 'view', array('lifeTime' => 600, 'vary' => array())); } break; case 'list': if (!isset($request_parameters['page'])) { $request_parameters['page'] = 1; $count_request_parameters++; } if ($request_parameters['page'] <= 2 && ($count_request_parameters == 1 || $module == 'outings' && $count_request_parameters == 3 && isset($request_parameters['orderby']) && $request_parameters['orderby'] == 'date' && isset($request_parameters['order']) && $request_parameters['order'] == 'desc') && (!$are_filters_active || !$is_main_filter_switch_on || $perso->areCacheableFilters($module))) { $this->cacheManager->addCache($module, 'list', array('lifeTime' => 350000, 'vary' => array())); } break; case 'filter': if (!$count_request_parameters && !$count_places_filter && (!$are_filters_active || !$is_main_filter_switch_on || $are_simple_activities_filters)) { if (in_array($module, array('outings', 'images'))) { $lifetime = 86400; } else { $lifetime = 600000; } $this->cacheManager->addCache($module, 'filter', array('lifeTime' => $lifetime, 'vary' => array())); } break; case 'cdasearch': if (!$count_request_parameters || !$count_places_filter) { $this->cacheManager->addCache($module, 'cdasearch', array('lifeTime' => 350000, 'vary' => array())); } break; default: break; } if (!$is_main_filter_switch_on || !$count_activities_filter) { $this->cacheManager->addCache('common', '_menu', array('lifeTime' => 350000, 'vary' => array())); } // get current uri adapted for cache $uri = self::getCurrentCacheUri(); // page cache $this->cache[$uri] = array('page' => false, 'action' => false); $cacheable = $this->cacheManager->isCacheable($uri); if ($cacheable) { if ($this->cacheManager->withLayout($uri)) { $inCache = $this->getPageCache($uri); $this->cache[$uri]['page'] = !$inCache; if ($inCache) { // page is in cache, so no need to run execution filter return false; } } else { $inCache = $this->getActionCache($uri); $this->cache[$uri]['action'] = !$inCache; } } return true; }