156 lines
No EOL
5.8 KiB
PHP
156 lines
No EOL
5.8 KiB
PHP
<?php
|
|
/**
|
|
* The class that handles rendering the shortcode.
|
|
*
|
|
* @author Time.ly Network Inc.
|
|
* @since 2.0
|
|
*
|
|
* @package AI1EC
|
|
* @subpackage AI1EC.View
|
|
*/
|
|
class Ai1ec_View_Calendar_Shortcode extends Ai1ec_Base {
|
|
|
|
/**
|
|
* Generate replacement content for [ai1ec] shortcode.
|
|
*
|
|
* @param array $atts Attributes provided on shortcode
|
|
* @param string $content Tag internal content (shall be empty)
|
|
* @param string $tag Used tag name (must be 'ai1ec' always)
|
|
*
|
|
* @staticvar $call_count Used to restrict to single calendar per page
|
|
*
|
|
* @return string Replacement for shortcode entry
|
|
*/
|
|
public function shortcode( $atts, $content = '', $tag = 'ai1ec' ) {
|
|
$settings_view = $this->_registry->get( 'model.settings-view' );
|
|
$view_names_list = array_keys( $settings_view->get_all() );
|
|
$default_view = $settings_view->get_default();
|
|
|
|
$view_names = array();
|
|
foreach ( $view_names_list as $view_name ) {
|
|
$view_names[$view_name] = true;
|
|
}
|
|
|
|
$view = $default_view;
|
|
$_events_categories = $_events_tags = $post_ids = array();
|
|
|
|
if ( isset( $atts['view'] ) ) {
|
|
if ( 'ly' === substr( $atts['view'], -2 ) ) {
|
|
$atts['view'] = substr( $atts['view'], 0, -2 );
|
|
}
|
|
if ( ! isset( $view_names[$atts['view']] ) ) {
|
|
return false;
|
|
}
|
|
$view = $atts['view'];
|
|
}
|
|
|
|
$mappings = array(
|
|
'cat_name' => 'events_categories',
|
|
'cat_id' => 'events_categories',
|
|
'tag_name' => 'events_tags',
|
|
'tag_id' => 'events_tags',
|
|
'post_id' => 'post_ids',
|
|
'events_limit' => 'events_limit',
|
|
);
|
|
$matches = array();
|
|
$custom_taxonomies = array();
|
|
if ( ! empty( $atts ) ) {
|
|
foreach ( $atts as $att => $value ) {
|
|
if (
|
|
! preg_match( '/([a-z0-9\_]+)_(id|name)/', $att, $matches ) ||
|
|
isset( $mappings[$matches[1] . '_id'] )
|
|
) {
|
|
continue;
|
|
}
|
|
${'_' . $matches[1] . '_ids'} = array();
|
|
$custom_taxonomies[] = $matches[1];
|
|
|
|
if ( ! isset( $mappings[$matches[1] . '_id'] ) ) {
|
|
$mappings[$matches[1] . '_id'] = $matches[1];
|
|
}
|
|
if ( ! isset( $mappings[$matches[1] . '_name'] ) ) {
|
|
$mappings[$matches[1] . '_name'] = $matches[1];
|
|
}
|
|
}
|
|
}
|
|
|
|
foreach ( $mappings as $att_name => $type ) {
|
|
if ( ! isset( $atts[$att_name] ) ) {
|
|
continue;
|
|
}
|
|
$raw_values = explode( ',', $atts[$att_name] );
|
|
foreach ( $raw_values as $argument ) {
|
|
if ( 'post_id' === $att_name ) {
|
|
if ( ( $argument = (int)$argument ) > 0 ) {
|
|
$post_ids[] = $argument;
|
|
}
|
|
} else {
|
|
if ( ! is_numeric( $argument ) ) {
|
|
$search_val = trim( $argument );
|
|
$argument = false;
|
|
foreach ( array( 'name', 'slug' ) as $field ) {
|
|
$record = get_term_by(
|
|
$field,
|
|
$search_val,
|
|
$type
|
|
);
|
|
if ( false !== $record ) {
|
|
$argument = $record;
|
|
break;
|
|
}
|
|
}
|
|
unset( $search_val, $record, $field );
|
|
if ( false === $argument ) {
|
|
continue;
|
|
}
|
|
$argument = (int)$argument->term_id;
|
|
} else {
|
|
if ( ( $argument = (int)$argument ) <= 0 ) {
|
|
continue;
|
|
}
|
|
}
|
|
${'_' . $type}[] = $argument;
|
|
}
|
|
}
|
|
}
|
|
$query = array(
|
|
'ai1ec_cat_ids' => implode( ',', $_events_categories ),
|
|
'ai1ec_tag_ids' => implode( ',', $_events_tags ),
|
|
'ai1ec_post_ids' => implode( ',', $post_ids ),
|
|
'action' => $view,
|
|
'request_type' => 'jsonp',
|
|
'events_limit' => isset( $atts['events_limit'] )
|
|
// definition above casts values as array, so we take first element,
|
|
// as there won't be others
|
|
? (int) $atts['events_limit']
|
|
: null,
|
|
);
|
|
// this is the opposite of how the SuperWidget works.
|
|
if ( ! isset( $atts['display_filters'] ) ) {
|
|
$query['display_filters'] = 'true';
|
|
} else {
|
|
$query['display_filters'] = $atts['display_filters'];
|
|
}
|
|
|
|
foreach ( $custom_taxonomies as $taxonomy ) {
|
|
$query['ai1ec_' . $taxonomy . '_ids'] = implode( ',', ${'_' . $taxonomy} );
|
|
}
|
|
if ( isset( $atts['exact_date'] ) ) {
|
|
$query['exact_date'] = $atts['exact_date'];
|
|
}
|
|
$request = $this->_registry->get(
|
|
'http.request.parser',
|
|
$query,
|
|
$default_view
|
|
);
|
|
$request->parse();
|
|
$page_content = $this->_registry->get( 'view.calendar.page' )
|
|
->get_content( $request, 'shortcode' );
|
|
$this->_registry->get( 'css.frontend' )
|
|
->add_link_to_html_for_frontend();
|
|
$this->_registry->get( 'controller.javascript' )
|
|
->load_frontend_js( true );
|
|
$page_content['html'] = preg_replace( '/\s+/', ' ', $page_content['html'] );
|
|
return $page_content['html'];
|
|
}
|
|
} |