all-in-one-event-calendar/lib/routing/router.php
2017-11-09 17:36:04 +01:00

243 lines
6.7 KiB
PHP

<?php
/**
* Routing (management) base class
*
* @author Time.ly Network Inc.
* @since 2.0
*
* @package AI1EC
* @subpackage AI1EC.Routing
*/
class Ai1ec_Router extends Ai1ec_Base {
/**
* @var boolean
*/
private $at_least_one_filter_set_in_request;
/**
* @var string Calendar base url
*/
protected $_calendar_base = null;
/**
* @var string Base URL of WP installation
*/
protected $_site_url = NULL;
/**
* @var Ai1ec_Adapter_Query_Interface Query manager object
*/
protected $_query_manager = null;
/**
* @var Ai1ec_Cookie_Present_Dto
*/
protected $cookie_set_dto;
/**
* @var array Rewrite structure.
*/
protected $_rewrite = null;
/**
* Check if at least one filter is set in the request
*
* @param array $view_args
* @return boolean
*/
public function is_at_least_one_filter_set_in_request( array $view_args ) {
if ( null === $this->at_least_one_filter_set_in_request ) {
$filter_set = false;
$ai1ec_settings = $this->_registry->get( 'model.settings' );
// check if something in the filters is set
$types = apply_filters(
'ai1ec_filter_types',
Ai1ec_Cookie_Utility::$types
);
foreach ( $types as $type ) {
if (
! is_array( $type ) &&
isset( $view_args[$type] ) &&
! empty( $view_args[$type] )
) {
$filter_set = true;
break;
}
}
// check if the default view is set
$mode = wp_is_mobile() ? '_mobile' : '';
$setting = 'default_calendar_view' . $mode;
if ( $ai1ec_settings->get( $setting ) !== $view_args['action'] ) {
$filter_set = true;
}
$this->at_least_one_filter_set_in_request = $filter_set;
}
return $this->at_least_one_filter_set_in_request;
}
/**
* @return the $cookie_set_dto
*/
public function get_cookie_set_dto() {
$utility = $this->_registry->get( 'cookie.utility' );
if( null === $this->cookie_set_dto ) {
$this->cookie_set_dto = $utility->is_cookie_set_for_current_page();
}
return $this->cookie_set_dto;
}
/**
* @param Ai1ec_Cookie_Present_Dto $cookie_set_dto
*/
public function set_cookie_set_dto( Ai1ec_Cookie_Present_Dto $cookie_set_dto = null ) {
$this->cookie_set_dto = $cookie_set_dto;
}
/**
* Set base (AI1EC) URI
*
* @param string $url Base URI (i.e. http://www.example.com/calendar)
*
* @return Ai1ec_Router Object itself
*/
public function asset_base( $url ) {
$this->_calendar_base = $url;
return $this;
}
/**
* Get base URL of WP installation
*
* @return string URL where WP is installed
*/
public function get_site_url() {
if ( null === $this->_site_url ) {
$this->_site_url = ai1ec_site_url();
}
return $this->_site_url;
}
/**
* Generate (update) URI
*
* @param array $arguments List of arguments to inject into AI1EC group
* @param string $page Page URI to modify
*
* @return string Generated URI
*/
public function uri( array $arguments, $page = NULL ) {
if ( NULL === $page ) {
$page = $this->_calendar_base;
}
$uri_parser = new Ai1ec_Uri();
$parsed_url = $uri_parser->parse( $page );
$parsed_url['ai1ec'] = array_merge(
$parsed_url['ai1ec'],
$arguments
);
$result_uri = $uri_parser->write( $parsed_url );
return $result_uri;
}
/**
* Properly capitalize encoded URL sequence.
*
* @param string $url Original URL to use.
*
* @return string Modified URL.
*/
protected function _fix_encoded_uri( $url ) {
$particles = preg_split(
'|(%[a-f0-9]{2})|',
$url,
-1,
PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY
);
$state = false;
$output = '';
foreach ( $particles as $particle ) {
if ( '%' === $particle ) {
$state = true;
} else {
if ( ! $state && '%' === $particle{0} ) {
$particle = strtoupper( $particle );
}
$state = false;
}
$output .= $particle;
}
return $output;
}
/**
* Register rewrite rule to enable work with pretty URIs
*/
public function register_rewrite( $rewrite_to ) {
if (
! $this->_calendar_base &&
! $this->_query_manager->rewrite_enabled()
) {
return $this;
}
$base = basename( $this->_calendar_base );
if ( false !== strpos( $base, '?' ) ) {
return $this;
}
$base = $this->_fix_encoded_uri( $base );
$base = '(?:.+/)?' . $base;
$named_args = str_replace(
'[:DS:]',
preg_quote( Ai1ec_Uri::DIRECTION_SEPARATOR ),
'[a-z][a-z0-9\-_[:DS:]\/]*[:DS:][a-z0-9\-_[:DS:]\/]'
);
$regexp = $base . '(\/' . $named_args . ')';
$clean_base = trim( $this->_calendar_base, '/' );
$clean_site = trim( $this->get_site_url(), '/' );
if ( 0 === strcmp( $clean_base, $clean_site ) ) {
$regexp = '(' . $named_args . ')';
$rewrite_to = remove_query_arg( 'pagename', $rewrite_to );
}
$this->_query_manager->register_rule(
$regexp,
$rewrite_to
);
$this->_rewrite = array(
'mask' => $regexp,
'target' => $rewrite_to,
);
add_filter(
'rewrite_rules_array',
array( $this, 'rewrite_rules_array' )
);
return $this;
}
/**
* Initiate internal variables
*/
public function __construct( Ai1ec_Registry_Object $registry ) {
parent::__construct( $registry );
$this->_query_manager = $registry->get( 'query.helper' );
}
/**
* Checks if calendar rewrite rule is registered.
*
* @param array $rules Rewrite rules.
*
* @return array Rewrite rules.
*/
public function rewrite_rules_array( $rules ) {
if ( null !== $this->_rewrite ) {
$newrules[$this->_rewrite['mask']] = $this->_rewrite['target'];
$rules = array_merge( $newrules, $rules );
}
return $rules;
}
}