all-in-one-event-calendar/app/view/event/content.php
2017-11-09 17:36:04 +01:00

190 lines
5.7 KiB
PHP

<?php
/**
* This class process event content.
*
* @author Time.ly Network Inc.
* @since 2.0
*
* @package AI1EC
* @subpackage AI1EC.View.Event
*/
class Ai1ec_View_Event_Content extends Ai1ec_Base {
/**
* Render event excerpt header.
*
* @param Ai1ec_Event $event Event to render excerpt for.
*
* @return void Content is not returned, just rendered.
*/
public function excerpt_view( Ai1ec_Event $event ) {
$location = $this->_registry->get( 'view.event.location' );
$location = esc_html(
str_replace(
"\n",
', ',
rtrim( $location->get_location( $event ) )
)
);
$args = array(
'event' => $event,
'location' => $location,
'text_when' => __( 'When:', AI1EC_PLUGIN_NAME ),
'text_where' => __( 'Where:', AI1EC_PLUGIN_NAME ),
);
$loader = $this->_registry->get( 'theme.loader' );
echo $loader->get_file(
'event-excerpt.twig',
$args,
true
)->get_content();
}
/**
* Format events excerpt view.
*
* @param string $text Content to excerpt.
*
* @return string Formatted event excerpt.
*/
public function event_excerpt( $text ) {
if ( ! $this->_registry->get( 'acl.aco' )->is_our_post_type() ) {
return $text;
}
$event = $this->_registry->get( 'model.event', get_the_ID() );
$post = $this->_registry->get( 'view.event.post' );
$ob = $this->_registry->get( 'compatibility.ob' );
$ob->start();
$this->excerpt_view( $event );
// Re-apply any filters to the post content that normally would have
// been applied if it weren't for our interference (below).
echo shortcode_unautop( wpautop( $post->trim_excerpt( $event ) ) );
return $ob->get_clean();
}
/**
* Avoid re-adding `wpautop` for Ai1EC instances.
*
* @param string $content Processed content.
*
* @return string Paragraphs enclosed text.
*/
public function event_excerpt_noautop( $content ) {
if ( ! $this->_registry->get( 'acl.aco' )->is_our_post_type() ) {
return wpautop( $content );
}
return $content;
}
public function get_post_excerpt( Ai1ec_Event $event ) {
$content = strip_tags(
strip_shortcodes(
preg_replace(
'#<\s*script[^>]*>.+<\s*/\s*script\s*>#x',
'',
apply_filters(
'ai1ec_the_content',
apply_filters(
'the_content',
$event->get( 'post' )->post_content
)
)
)
)
);
$content = preg_replace( '/\s+/', ' ', $content );
$words = explode( ' ', $content );
if ( count( $words ) > 25 ) {
return implode(
' ',
array_slice( $words, 0, 25 )
) . ' [...]';
}
return $content;
}
/**
* Generate the html for the "Calendar" button for this event.
*
* @return string
*/
public function get_back_to_calendar_button_html() {
$class = '';
$data_type = '';
$href = '';
if ( isset( $_COOKIE['ai1ec_calendar_url'] ) ) {
$href = json_decode(
stripslashes( $_COOKIE['ai1ec_calendar_url'] )
);
setcookie( 'ai1ec_calendar_url', '', time() - 3600 );
} else {
$href = $this->_registry->get( 'html.element.href', array() );
$href = $href->generate_href();
}
$text = esc_attr( Ai1ec_I18n::__( 'Calendar' ) );
$tooltip = esc_attr( Ai1ec_I18n::__( 'View all events' ) );
$html = <<<HTML
<a class="ai1ec-calendar-link ai1ec-btn ai1ec-btn-default ai1ec-btn-sm
ai1ec-tooltip-trigger $class"
href="$href"
$data_type
data-placement="left"
title="$tooltip">
<i class="ai1ec-fa ai1ec-fa-calendar ai1ec-fa-fw"></i>
<span class="ai1ec-hidden-xs">$text</span>
</a>
HTML;
return apply_filters( 'ai1ec_get_back_to_calendar_html', $html, $href );
}
/**
* Simple regex-parse of post_content for matches of <img src="foo" />; if
* one is found, return its URL.
*
* @param null $size (width, height) array of returned image
*
* @return string|null
*/
public function get_content_img_url( Ai1ec_Event $event, &$size = null ) {
preg_match(
'/<img([^>]+)src=["\']?([^"\'\ >]+)([^>]*)>/i',
$event->get( 'post' )->post_content,
$matches
);
// Check if we have a result, otherwise a notice is issued.
if ( empty( $matches ) ) {
return null;
}
// Mark found image.
$event->get( 'post' )->post_content = str_replace(
'<img' . $matches[1],
'<img' . $matches[1] . ' data-ai1ec-hidden ',
$event->get( 'post' )->post_content
);
$url = $matches[2];
$size = array( 0, 0 );
// Try to detect width and height.
$attrs = $matches[1] . $matches[3];
$matches = null;
preg_match_all(
'/(width|height)=["\']?(\d+)/i',
$attrs,
$matches,
PREG_SET_ORDER
);
// Check if we have a result, otherwise a notice is issued.
if ( ! empty( $matches ) ) {
foreach ( $matches as $match ) {
$size[ $match[1] === 'width' ? 0 : 1 ] = $match[2];
}
}
return $url;
}
}