/** * Singleton access method * * @return Ai1ec_Router Instance of self */ public static function instance() { if (!isset(self::$_instance) || !self::$_instance instanceof Ai1ec_Router) { self::$_instance = new Ai1ec_Router(); } return self::$_instance; }
/** * Check if at least one filter is set in the request * * @param array $view_args * @return boolean */ public static function is_at_least_one_filter_set_in_request(array $view_args) { if (null === self::$at_least_one_filter_set_in_request) { $filter_set = false; $ai1ec_settings = Ai1ec_Settings::get_instance(); // check if something in the filters is set foreach (Ai1ec_Cookie_Utility::$types as $type) { if (!empty($view_args[$type])) { $filter_set = true; break; } } // check if the default view is set if ($ai1ec_settings->default_calendar_view !== $view_args['action']) { $filter_set = true; } self::$at_least_one_filter_set_in_request = $filter_set; } return self::$at_least_one_filter_set_in_request; }
/** * Initializes the URL router used by our plugin. * * @return void Method is not intended to return anything */ public function initialize_router() { global $ai1ec_settings, $ai1ec_router, $ai1ec_localization_helper; if (!isset($ai1ec_settings->calendar_page_id) || $ai1ec_settings->calendar_page_id < 1) { // Routing may not be affected in any way if no calendar page exists. return NULL; } $ai1ec_router = Ai1ec_Router::instance(); $page_base = ''; $clang = ''; if ($ai1ec_localization_helper->is_wpml_active()) { $trans = $ai1ec_localization_helper->get_wpml_translations_of_page($ai1ec_settings->calendar_page_id, true); $clang = $ai1ec_localization_helper->get_language(); if (isset($trans[$clang])) { $ai1ec_settings->calendar_page_id = $trans[$clang]; } } $page_base = get_page_link($ai1ec_settings->calendar_page_id); $page_base = Ai1ec_Wp_Uri_Helper::get_pagebase($page_base); $page_link = 'index.php?page_id=' . $ai1ec_settings->calendar_page_id; $pagebase_for_href = Ai1ec_Wp_Uri_Helper::get_pagebase_for_links(get_page_link($ai1ec_settings->calendar_page_id), $clang); // Add a trailing slash if it is missing and we are using permalinks. if (Ai1ec_Meta::get_option('permalink_structure')) { $pagebase_for_href = trailingslashit($pagebase_for_href); } // Set up the view factory. Ai1ec_View_Factory::set_page($pagebase_for_href); // If the calendar is set as the front page, disable permalinks. // They would not be legal under a Windows server. See: // https://issues.apache.org/bugzilla/show_bug.cgi?id=41441 if (Ai1ec_Meta::get_option('permalink_structure') && (int) get_option('page_on_front') !== (int) $ai1ec_settings->calendar_page_id) { Ai1ec_View_Factory::set_pretty_permalinks_enabled(true); } // If we are requesting the calendar page and we have a saved cookie, // redirect the user. Do not redirect if the user saved the home page, // otherwise we enter a loop. $cookie_dto = $ai1ec_router->get_cookie_set_dto(); if (true === $cookie_dto->get_is_cookie_set_for_calendar_page()) { $cookie = $cookie_dto->get_calendar_cookie(); $href = Ai1ec_View_Factory::create_href_helper_instance($cookie); // wp_redirect sanitizes the url which strips out the | header('Location: ' . $href->generate_href(), true, '302'); exit(0); } // We need to reset the cookie, it's to early for the is_page() call $ai1ec_router->set_cookie_set_dto(); // Initialize SEO helper. Ai1ec_Seo_Helper::get_instance(); $ai1ec_router = Ai1ec_Router::instance()->asset_base($page_base)->register_rewrite($page_link); }
/** * _get_view_and_restore_globals method * * Set global request ($_REQUEST) variables, call rendering routines * and reset $_REQUEST afterwards. * * @uses do_action To launch * 'ai1ec_load_frontend_js' action * * @param array $arguments Arguments to set for rendering * * @return string Rendered view */ protected function _get_view_and_restore_globals($arguments) { global $ai1ec_calendar_controller, $ai1ec_app_controller, $ai1ec_settings; $ai1ec_router = Ai1ec_Router::instance(); $cookie_dto = $ai1ec_router->get_cookie_set_dto(); if (true === $cookie_dto->get_is_cookie_set_for_shortcode()) { $cookie = $cookie_dto->get_shortcode_cookie(); $cookie_for_shortcode = array(); foreach (Ai1ec_Cookie_Utility::$types as $type) { $cookie_for_shortcode[$type] = implode(',', $cookie[$type]); } // in the cookie i save an array with action. tag_ids and cat_ids. // if something is saved, we use that $arguments = $cookie_for_shortcode + $arguments; } $request = Ai1ec_Routing_Factory::create_argument_parser_instance($arguments); $page_content = $ai1ec_calendar_controller->get_calendar_page($request); // Load requirejs for the calendar do_action('ai1ec_load_frontend_js', true, true); return $page_content; }
/** * @return Ai1ec_Generic_Html_Tag */ public static function create_save_filtered_view_buttongroup(array $view_args, $shortcode) { $btn_group = Ai1ec_Helper_Factory::create_generic_html_tag('div'); $btn_group->add_class('btn-group'); $btn = Ai1ec_Helper_Factory::create_bootstrap_button_instance(); $btn->add_class('btn-mini ai1ec-tooltip-trigger'); $btn->set_id('save_filtered_views'); $icon = Ai1ec_Helper_Factory::create_generic_html_tag('icon'); $icon->add_class('icon-pushpin'); $btn->add_renderable_children($icon); $ai1ec_router = Ai1ec_Router::instance(); $cookie_dto = $ai1ec_router->get_cookie_set_dto(); $cookie_set = $cookie_dto->get_is_a_cookie_set_for_this_page(); // if there are no filter set, but the cookie is set i need to show the button so that the cookie can be removed if (false === Ai1ec_Router::is_at_least_one_filter_set_in_request($view_args) && !$cookie_set) { $btn->add_class('hide'); } $cookie = false; if (true === $cookie_set) { $cookie = 'true' === $shortcode ? $cookie_dto->get_shortcode_cookie() : $cookie_dto->get_calendar_cookie(); } // If we have a cookie and the filters are in the same state of the cookie, show the remove version // Saving the same state again would not make sense // if we have a cookie and no filters are set, show the remove button, the user can't save the // standard calendar view if ($cookie_set && (self::check_if_saved_cookie_and_requested_page_match($view_args, $cookie) || false === Ai1ec_Router::is_at_least_one_filter_set_in_request($view_args))) { $btn->add_class('active'); $text = __("Remove default filter", AI1EC_PLUGIN_NAME); } else { $text = __("Save this filter as default", AI1EC_PLUGIN_NAME); } // Add a span to hold text $btn->set_attribute('title', $text); $btn_group->add_renderable_children($btn); return $btn_group; }
/** * Returns rendered calendar page. * * @return string Rendered calendar page */ public function get_calendar_page(Ai1ec_Abstract_Query $request) { global $ai1ec_view_helper, $ai1ec_settings, $ai1ec_events_helper, $ai1ec_themes_controller; $ai1ec_calendar_helper = Ai1ec_Calendar_Helper::get_instance(); if ($notice = $ai1ec_themes_controller->frontend_outdated_themes_notice(false)) { return $notice; } // Queue any styles, scripts $this->load_css(); // Are we loading a shortcode? $shortcode = $request->get('shortcode'); $view_args = $this->get_view_args_for_view($request); $action = $view_args['action']; $type = $request->get('request_type'); $exact_date = $this->get_exact_date($request); $get_view = 'get_' . $action . '_view'; $page_hash = $this->get_cache_key($request); $cache = NULL; if (false !== $page_hash) { $cache = Ai1ec_Strategies_Factory::create_blob_persistence_context($page_hash, AI1EC_CACHE_PATH); } $generated = false; if (false !== $page_hash) { try { $generated = $cache->get_data_from_persistence(); } catch (Ai1ec_Cache_Not_Set_Exception $excpt) { // discard $generated = false; } } if (false === $generated) { $view = $this->{$get_view}($view_args); $content = ''; $categories = ''; $tags = ''; $authors = ''; $args_for_filter = array(); if (true === $ai1ec_settings->use_select2_widgets) { $categories = Ai1ec_View_Factory::create_select2_multiselect(array('name' => 'ai1ec_filter_categories', 'id' => 'ai1ec_filter_categories', 'use_id' => true, 'placeholder' => __('Filter by category', AI1EC_PLUGIN_NAME), 'type' => 'category'), get_terms('events_categories'), $view_args); $categories = $categories->render_as_html(); $tags = Ai1ec_View_Factory::create_select2_multiselect(array('name' => 'ai1ec_filter_tags', 'id' => 'ai1ec_filter_tags', 'use_id' => true, 'placeholder' => __('Filter by tag', AI1EC_PLUGIN_NAME), 'type' => 'tag'), get_terms('events_tags'), $view_args); $tags = $tags->render_as_html(); $authors = Ai1ec_Author::get_instance()->get_all_for_select2(); $authors = Ai1ec_View_Factory::create_select2_multiselect(array('name' => 'ai1ec_filter_authors', 'id' => 'ai1ec_filter_authors', 'use_id' => true, 'placeholder' => __('Filter by author', AI1EC_PLUGIN_NAME), 'type' => 'author'), $authors, $view_args); $authors = $authors->render_as_html(); } else { $categories = $ai1ec_calendar_helper->get_html_for_categories($view_args); $authors = $ai1ec_calendar_helper->get_html_for_authors($view_args); $tags = $ai1ec_calendar_helper->get_html_for_tags($view_args); } $dropdown_args = $view_args; if (isset($dropdown_args['time_limit']) && false !== $exact_date) { $dropdown_args['exact_date'] = $exact_date; } $views_dropdown = $ai1ec_calendar_helper->get_html_for_views_dropdown($dropdown_args); $subscribe_buttons = ''; if (!$ai1ec_settings->turn_off_subscription_buttons) { $subscribe_buttons = $ai1ec_calendar_helper->get_html_for_subscribe_buttons($view_args); } $save_view_btngroup = Ai1ec_View_Factory::create_save_filtered_view_buttongroup($view_args, $shortcode); if (($view_args['no_navigation'] || $type !== 'standard') && 'true' !== $shortcode) { $args_for_filter = $view_args; $are_filters_set = Ai1ec_Router::is_at_least_one_filter_set_in_request($view_args); // send data both for json and jsonp as shortcodes are jsonp $content = array('html' => $view, 'categories' => $categories, 'authors' => $authors, 'tags' => $tags, 'views_dropdown' => $views_dropdown, 'subscribe_buttons' => $subscribe_buttons, 'save_view_btngroup' => $save_view_btngroup->render_as_html(), 'are_filters_set' => $are_filters_set); } else { // Determine whether to display "Post your event" button on front-end. $contribution_buttons = $ai1ec_calendar_helper->get_html_for_contribution_buttons(); $show_dropdowns = true; $show_select2 = false; $span_for_select2 = ''; // if we use select2, calculate the span settings if (true === $ai1ec_settings->use_select2_widgets) { $show_dropdowns = false; $show_select2 = true; $count = 0; if (!empty($categories)) { $count += 1; } if (!empty($authors)) { $count += 1; } if (!empty($tags)) { $count += 1; } if (0 === $count) { $show_select2 = false; } else { $span_for_select2 = 'span' . 12 / $count; } } // Define new arguments for overall calendar view $page_args = array('current_view' => $action, 'views_dropdown' => $views_dropdown, 'view' => $view, 'contribution_buttons' => $contribution_buttons, 'categories' => $categories, 'authors' => $authors, 'tags' => $tags, 'subscribe_buttons' => $subscribe_buttons, 'data_type' => $view_args['data_type'], 'save_view_btngroup' => $save_view_btngroup, 'disable_standard_filter_menu' => $ai1ec_settings->disable_standard_filter_menu, 'show_dropdowns' => $show_dropdowns, 'show_select2' => $show_select2, 'span_for_select2' => $span_for_select2); $filter_menu = Ai1ec_Render_Entity_Utility::get_instance('Filter_Menu')->set($page_args); $page_args['filter_menu'] = $filter_menu; $content = $ai1ec_view_helper->get_theme_view('calendar.php', $page_args); $args_for_filter = $page_args; } $generated = apply_filters('ai1ec_view', $content, $args_for_filter); if ($page_hash) { try { $cache->write_data_to_persistence($generated); } catch (Ai1ec_Cache_Not_Set_Exception $exception) { // ignore write failures } } } return $generated; }
function ai1ec_initialize_router() { global $ai1ec_settings, $ai1ec_router, $ai1ec_localization_helper; $page_base = ''; $clang = ''; if ($ai1ec_settings->calendar_page_id > 0) { if ($ai1ec_localization_helper->is_wpml_active()) { $trans = $ai1ec_localization_helper->get_wpml_translations_of_page($ai1ec_settings->calendar_page_id, true); $clang = $ai1ec_localization_helper->get_language(); if (isset($trans[$clang])) { $ai1ec_settings->calendar_page_id = $trans[$clang]; } } $page_base = get_page_link($ai1ec_settings->calendar_page_id); } $page_base = Ai1ec_Wp_Uri_Helper::get_pagebase($page_base); $page_link = 'index.php?page_id=' . $ai1ec_settings->calendar_page_id; $pagebase_for_href = Ai1ec_Wp_Uri_Helper::get_pagebase_for_links(get_page_link($ai1ec_settings->calendar_page_id), $clang); // add a trailing slash if it's missing and we are using permalinks if (get_option('permalink_structure')) { $pagebase_for_href = trailingslashit($pagebase_for_href); } // Set up the view factory Ai1ec_View_Factory::set_page($pagebase_for_href); // if the calendar is set as the front page, disable permalinks. // They would not be legal under windows // https://issues.apache.org/bugzilla/show_bug.cgi?id=41441 if (get_option('permalink_structure') && (int) get_option('page_on_front') !== (int) $ai1ec_settings->calendar_page_id) { Ai1ec_View_Factory::set_pretty_permalinks_enabled(true); } $ai1ec_router = Ai1ec_Router::instance()->asset_base($page_base)->register_rewrite($page_link); }