all-in-one-event-calendar/app/view/event/single.php

284 lines
12 KiB
PHP
Raw Normal View History

2017-03-16 16:59:53 +01:00
<?php
/**
* This class renders the html for the single event page.
*
* @author Time.ly Network Inc.
* @since 2.0
*
* @package AI1EC
* @subpackage AI1EC.View.Event
*/
class Ai1ec_View_Event_Single extends Ai1ec_Base {
2017-11-09 17:36:04 +01:00
/**
* Renders the html of the page and returns it.
*
* @param Ai1ec_Event $event
*
* @return string the html of the page
*/
public function get_content( Ai1ec_Event $event ) {
$settings = $this->_registry->get( 'model.settings' );
$rrule = $this->_registry->get( 'recurrence.rule' );
$taxonomy = $this->_registry->get( 'view.event.taxonomy' );
$location = $this->_registry->get( 'view.event.location' );
$ticket = $this->_registry->get( 'view.event.ticket' );
$content = $this->_registry->get( 'view.event.content' );
$time = $this->_registry->get( 'view.event.time' );
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$subscribe_url = AI1EC_EXPORT_URL . '&ai1ec_post_ids=' .
$event->get( 'post_id' );
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$event->set_runtime(
'tickets_url_label',
$ticket->get_tickets_url_label( $event, false )
);
$event->set_runtime(
'content_img_url',
$content->get_content_img_url( $event )
);
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$extra_buttons = apply_filters(
'ai1ec_rendering_single_event_actions',
'',
$event
);
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$venues_html = apply_filters(
'ai1ec_rendering_single_event_venues',
nl2br( $location->get_location( $event ) ),
$event
);
$default_tz = $this->_registry->get( 'date.timezone' )->get_default_timezone();
$timezone_info = array(
'show_timezone' => $this->_registry->get( 'model.settings' )->get( 'always_use_calendar_timezone' ),
'using_calendar_tz' => $this->_registry->get( 'model.settings' )->get( 'always_use_calendar_timezone' ),
'event_timezone' => str_replace( '_', ' ', $event->get( 'timezone_name' ) ) . ' ' . __( 'Timezone', AI1EC_PLUGIN_NAME ),
'calendar_timezone' => str_replace( '_', ' ', $default_tz ) . ' ' . __( 'Timezone', AI1EC_PLUGIN_NAME ),
);
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$banner_image_meta = get_post_meta( $event->get( 'post_id' ), 'ai1ec_banner_image' );
$banner_image = $banner_image_meta ? $banner_image_meta[0] : '';
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
// objects are passed by reference so an action is ok
do_action( 'ai1ec_single_event_page_before_render', $event );
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$filter_groups_html = apply_filters( 'ai1ec_get_filter_groups_html', $event );
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$args = array(
'event' => $event,
'recurrence' => $rrule->rrule_to_text( $event->get( 'recurrence_rules' ) ),
'exclude' => $time->get_exclude_html( $event, $rrule ),
'categories' => $taxonomy->get_categories_html( $event ),
'tags' => $taxonomy->get_tags_html( $event ),
'location' => html_entity_decode( $venues_html ),
'filter_groups' => $filter_groups_html,
'map' => $location->get_map_view( $event ),
'contact' => $ticket->get_contact_html( $event ),
'back_to_calendar' => $content->get_back_to_calendar_button_html(),
'subscribe_url' => $subscribe_url,
'subscribe_url_no_html' => $subscribe_url . '&no_html=true',
'edit_instance_url' => null,
'edit_instance_text' => null,
'google_url' => 'https://www.google.com/calendar/render?cid=' . urlencode( $subscribe_url ),
'show_subscribe_buttons' => ! $settings->get( 'turn_off_subscription_buttons' ),
'hide_featured_image' => $settings->get( 'hide_featured_image' ),
'extra_buttons' => $extra_buttons,
'show_get_calendar' => ! $settings->get( 'disable_get_calendar_button' ),
'text_add_calendar' => __( 'Add to Calendar', AI1EC_PLUGIN_NAME ),
'subscribe_buttons_text' => $this->_registry
->get( 'view.calendar.subscribe-button' )
->get_labels(),
'text_get_calendar' => Ai1ec_I18n::__( 'Get a Timely Calendar' ),
'text_when' => __( 'When:', AI1EC_PLUGIN_NAME ),
'text_where' => __( 'Where:', AI1EC_PLUGIN_NAME ),
'text_cost' => __( 'Cost:', AI1EC_PLUGIN_NAME ),
'text_contact' => __( 'Contact:', AI1EC_PLUGIN_NAME ),
'text_tickets' => __( 'Tickets:', AI1EC_PLUGIN_NAME ),
'text_free' => __( 'Free', AI1EC_PLUGIN_NAME ),
'text_categories' => __( 'Categories', AI1EC_PLUGIN_NAME ),
'text_tags' => __( 'Tags', AI1EC_PLUGIN_NAME ),
'buy_tickets_text' => __( 'Buy Tickets', AI1EC_PLUGIN_NAME ),
'timezone_info' => $timezone_info,
'banner_image' => $banner_image,
'content_img_url' => $event->get_runtime( 'content_img_url' ),
'post_id' => $event->get( 'post_id' ),
'ticket_url' => $event->get( 'ticket_url' ),
'tickets_url_label' => $event->get_runtime( 'tickets_url_label' ),
'start' => $event->get( 'start' ),
'end' => $event->get( 'end' ),
'cost' => $event->get( 'cost' ),
'instance_id' => $event->get( 'instance_id' ),
);
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
if (
! empty( $args['recurrence'] ) &&
$event->get( 'instance_id' ) &&
current_user_can( 'edit_ai1ec_events' )
) {
$args['edit_instance_url'] = ai1ec_admin_url(
'post.php?post=' . $event->get( 'post_id' ) .
'&action=edit&instance=' . $event->get( 'instance_id' )
);
$args['edit_instance_text'] = sprintf(
Ai1ec_I18n::__( 'Edit this occurrence (%s)' ),
$event->get( 'start' )->format_i18n( 'M j' )
);
}
$loader = $this->_registry->get( 'theme.loader' );
$api = $this->_registry->get( 'model.api.api-ticketing' );
if ( false === ai1ec_is_blank( $event->get( 'ical_feed_url' ) ) ) {
$ticket_url = $api->get_api_event_buy_ticket_url( $event->get( 'post_id' ) );
if ( ! empty ( $ticket_url ) ) {
$args['ticket_url'] = $ticket_url;
}
} else {
$api_event_id = $api->get_api_event_id( $event->get( 'post_id' ) );
if ( $api_event_id ) {
$api = $this->_registry->get( 'model.api.api-ticketing' );
$ticket_types = json_decode( $api->get_ticket_types( $event->get( 'post_id' ), false ) );
$args['has_tickets'] = true;
$args['API_URL'] = AI1EC_API_URL;
$args['tickets_block'] = $loader->get_file(
'tickets.twig',
array(
'tickets_checkout_url' => $api->get_api_event_buy_ticket_url( $event->get( 'post_id' ) ),
'tickets' => $ticket_types->data,
'text_tickets' => $args['text_tickets'],
'buy_tickets_text' => $args['buy_tickets_text'],
'api_event_id' => $api_event_id
), false
)->get_content();
}
}
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
return $loader->get_file( 'event-single.twig', $args, false )
->get_content();
}
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
/**
* Add meta OG tags to the event details page
*/
public function add_meta_tags() {
// Add tags only on Event Details page
$aco = $this->_registry->get( 'acl.aco' );
if ( ! $aco->is_our_post_type() ) return;
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
// Get Event and process description
$instance_id = ( isset( $_GET[ 'instance_id' ] ) ) ? $_GET[ 'instance_id' ] : null;
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
if ( !is_null( $instance_id ) ) {
$instance_id = preg_replace( '/\D/', '', $instance_id );
}
$event = $this->_registry->get( 'model.event', get_the_ID(), $instance_id );
2019-07-25 14:11:00 +02:00
$avatar = $this->_registry->get( 'view.event.avatar' );
2017-11-09 17:36:04 +01:00
$content = $this->_registry->get( 'view.event.content' );
$desc = $event->get( 'post' )->post_content;
$desc = apply_filters( 'the_excerpt', $desc );
$desc = strip_shortcodes( $desc );
$desc = str_replace( ']]>', ']]&gt;', $desc );
$desc = strip_tags( $desc );
$desc = preg_replace( '/\n+/', ' ', $desc);
$desc = substr( $desc, 0, 300 );
2019-07-25 14:11:00 +02:00
// Get featured image
$image = $avatar->get_post_thumbnail_url( $event );
if ( ! $image ) {
$image = $content->get_content_img_url( $event );
}
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$og = array(
'url' => home_url( esc_url( add_query_arg( null, null ) ) ),
'title' => htmlspecialchars(
$event->get( 'post' )->post_title .
' (' . substr( $event->get( 'start' ) , 0, 10 ) . ')'
),
'type' => 'article',
'description' => htmlspecialchars( $desc ),
2019-07-25 14:11:00 +02:00
'image' => $image,
2017-11-09 17:36:04 +01:00
);
foreach ( $og as $key => $val ) {
echo "<meta property=\"og:$key\" content=\"$val\" />\n";
}
// Twitter meta tags
$twitter = array(
'card' => 'summary',
'title' => htmlspecialchars(
$event->get( 'post' )->post_title .
' (' . substr( $event->get( 'start' ) , 0, 10 ) . ')'
),
'description' => htmlspecialchars( $desc ),
2019-07-25 14:11:00 +02:00
'image' => $image,
2017-11-09 17:36:04 +01:00
);
foreach ( $twitter as $key => $val ) {
if ( empty( $val ) && 'image' !== $key ) {
$val = Ai1ec_I18n::__( 'No data' );
}
echo "<meta name=\"twitter:$key\" content=\"$val\" />\n";
}
}
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
/**
* @param Ai1ec_Event $event
*
* @return The html of the footer
*/
public function get_footer( Ai1ec_Event $event ) {
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$text_calendar_feed = null;
2017-03-16 16:59:53 +01:00
2017-11-09 17:36:04 +01:00
$feed_url = trim( strtolower( $event->get( 'ical_feed_url' ) ) );
if ( strpos( $feed_url, 'http' ) === 0 ) {
$text_calendar_feed = Ai1ec_I18n::__(
'This post was replicated from another site\'s <a href="%s" title="iCalendar feed"><i class="ai1ec-fa ai1ec-fa-calendar"></i> calendar feed</a>.'
);
} else {
$text_calendar_feed = Ai1ec_I18n::__(
'This post was imported from a CSV/ICS file.'
);
}
$loader = $this->_registry->get( 'theme.loader' );
$text_calendar_feed = sprintf(
$text_calendar_feed,
esc_attr( str_replace( 'http://', 'webcal://', $event->get( 'ical_feed_url' ) ) )
);
$args = array(
'event' => $event,
'text_calendar_feed' => $text_calendar_feed,
'text_view_post' => Ai1ec_I18n::__( 'View original' ),
);
return $loader->get_file( 'event-single-footer.twig', $args, false )
->get_content();
}
/**
* Render the full article for the event  title, content, and footer.
*
* @param Ai1ec_Event $event
* @param string $footer Footer HTML to append to event
*/
public function get_full_article( Ai1ec_Event $event, $footer = '' ) {
$title = apply_filters(
'the_title',
$event->get( 'post' )->post_title,
$event->get( 'post_id' )
);
$event_details = $this->get_content( $event );
$content = wpautop(
apply_filters(
'ai1ec_the_content',
apply_filters(
'the_content',
$event->get( 'post' )->post_content
)
)
);
$args = compact( 'title', 'event_details', 'content', 'footer' );
$loader = $this->_registry->get( 'theme.loader' );
return $loader->get_file( 'event-single-full.twig', $args, false )
->get_content();
}
2017-03-16 16:59:53 +01:00
}