File: /var/www/intranet.kauko.lt/wp-content/plugins/employee-directory/includes/class-emd-widget.php
<?php
/**
* Class for frontend widgets
*
* @package EMD
* @copyright Copyright (c) 2014, Emarket Design
* @since 1.0
*/
if (!defined('ABSPATH')) exit;
/**
* Emd_Widget Class
*
* Widget class to setup and display frontend widgets.
*
* @since WPAS 4.0
*/
class Emd_Widget extends WP_Widget {
/**
* Instantiate widget class
* @since WPAS 4.0
*
* @param string $title
* @param string $class_label
* @param string $description
*
*/
public function __construct($id, $title, $class_label, $description) {
$this->title = $title;
$this->class_label = $class_label;
parent::__construct($id, $this->title, array(
'description' => $description,
));
}
/**
* Widget display on frontend
* @since WPAS 4.0
*
* @param array $args
* @param array $instance
*
*/
public function widget($args, $instance) {
if (!isset($args['id'])) {
$args['id'] = $this->id;
}
extract($args);
if(empty($instance['title'])){
$instance['title'] = '';
}
$title = apply_filters('widget_title', $instance['title']);
if(!empty($instance['count'])){
$count = $instance['count'];
}
else {
$count = 1;
}
add_filter( 'safe_style_css', function( $styles ) {
$styles[] = 'display';
return $styles;
});
$allowed = Array(
'input' => Array(
'value' => array() ,
'class' => array() ,
'name' => array() ,
'id' => Array() ,
'type' => Array(),
'placeholder' => Array(),
),
'div' => array('style'=>array(),'id' => array(), 'class'=>array(), 'data-field'=> array()),
'tr' => array('style'=>array()),
'td' => array('style'=>array()),
'ul' => array('class' => array(), 'style'=>array()),
'li' => array('class' => array(),'style'=>array()),
'form' => array('id'=>array(), 'action' => array(), 'method' => array(), 'class' => array(), 'novalidate' => array()),
'label' => array('class'=>array(), 'for' => array()),
'span' => array('class'=>array(), 'style' => array(), 'id' => array()),
'img' => array('src'=>array(), 'style' => array(), 'alt' => array()),
'a' => array(
'style'=> array(),
'href' => array(),
'target' => array(),
'rel' => array(),
'data-html'=>array(),
'data-toggle'=>array(),
'title' => array(),
'id' => array(),
'class' => array(),
),
'button' => Array(
'value' => array(),
'class' => array(),
'name' => array(),
'id' => Array(),
'type' => Array(),
),
'select' => array(
'id' => array(),
'class' => array(),
'name' => array(),
'placeholder'=> array(),
'data-options'=> array(),
'multiple' => array(),
),
'option' => array('value'=>array(), 'selected' => array(), 'disabled' => array()),
);
echo wp_kses($before_widget,$allowed);
$pids = Array();
$app = str_replace('-', '_', $this->text_domain);
$front_ents = emd_find_limitby('frontend', $app);
if(!empty($front_ents) && in_array($this->class,$front_ents) && $this->type != 'integration'){
$pids = apply_filters('emd_limit_by', $pids, $app, $this->class,'frontend');
}
if ($this->type == 'entity') {
$args['filter'] = $this->filter;
if(!empty($instance['pagination'])){
$args['has_pages'] = $instance['pagination'];
}
if(!empty($instance['count_per_page'])){
$args['posts_per_page'] = $instance['count_per_page'];
}
if(!empty($instance['pagination_size'])){
$args['pagination_size'] = $instance['pagination_size'];
}
$args['class'] = $this->class;
$args['cname'] = get_class($this);
$args['app'] = str_replace("-","_",$this->text_domain);
$args['query_args'] = $this->query_args;
$widg_layout = self::get_ent_widget_layout($count, $pids,$args);
} elseif ($this->type == 'comment') {
$widg_layout = $this->get_comm_widget_layout($count, $pids);
}
elseif($this->type == 'integration') {
$widg_layout = $this->layout();
}
if ($widg_layout) {
if($this->type != 'integration'){
$this->get_header_footer();
}
echo "<div class='emd-container'>";
if ($title) {
echo wp_kses($before_title . $title . $after_title,$allowed);
}
echo "<div class='emd-widg-results' id='wres-" . esc_attr($this->id) . "'>";
echo '<input type="hidden" id="emd_app" value="' . esc_attr($app) . '">';
if($this->type == 'comment'){
echo "<ul class='" . esc_attr($this->css_label) . "-list emd-widget'>";
}
elseif($this->type != 'integration'){
echo wp_kses($this->header,$allowed);
}
echo wp_kses($widg_layout,$allowed);
if($this->type == 'comment'){
echo "</ul>";
}
elseif($this->type != 'integration'){
echo wp_kses($this->footer,$allowed);
}
echo "</div>";
echo "</div>";
}
echo wp_kses($after_widget,$allowed);
$this->enqueue_scripts();
}
/**
* Widget update from admin
* @since WPAS 4.0
*
* @param array $new_instance
* @param array $old_instance
*
* @return array $instance
*/
public function update($new_instance, $old_instance) {
$instance = $old_instance;
$instance['title'] = strip_tags($new_instance['title']);
$instance['count'] = ( int )$new_instance['count'];
$instance['pagination'] = ( int )$new_instance['pagination'];
if($new_instance['pagination']){
$instance['count_per_page'] = ( int )$new_instance['count_per_page'];
$instance['pagination_size'] = $new_instance['pagination_size'];
}
else {
$instance['count_per_page'] = '';
$instance['pagination_size'] = '';
}
return $instance;
}
/**
* Widget form in admin
* @since WPAS 4.0
*
* @param array $instance
*
*/
public function form($instance) {
$defaults = array(
'title' => $this->title,
'count' => 5,
'count_per_page' => 5,
'pagination' => 0,
'pagination_size' => '',
);
$instance = wp_parse_args(( array )$instance, $defaults);
if (( int )$instance['count'] < 1) {
( int )$instance['count'] = 5;
}
if ($instance['pagination'] == 1){
if((int)$instance['count_per_page'] < 1) {
( int )$instance['count_per_page'] = 5;
}
}
elseif (empty($instance['pagination'])){
$paginate_style = ' style="display:none;"';
}
?>
<p>
<label for="<?php echo esc_attr($this->get_field_id('title')); ?>"><?php esc_html_e('Title', 'empd-com'); ?></label><br />
<input class="widefat" type="text" id="<?php echo esc_attr($this->get_field_id('title')); ?>" name="<?php echo esc_attr($this->get_field_name('title')); ?>" value="<?php echo esc_attr($instance['title']); ?>" />
</p>
<?php if($this->type != 'integration'){ ?>
<p>
<label for="<?php echo esc_attr($this->get_field_id('count')); ?>"><?php printf(esc_html__('Max number of %s to show', 'empd-com') , $this->class_label); ?></label>
<input type="text" id="<?php echo esc_attr($this->get_field_id('count')); ?>" name="<?php echo esc_attr($this->get_field_name('count')); ?>" value="<?php echo esc_attr($instance['count']); ?>" size="3" maxlength="4" /> <br>
</p>
<p>
<input type="checkbox" class="emd-enable-pagination" id="<?php echo esc_attr($this->get_field_id('pagination')); ?>" name="<?php echo esc_attr($this->get_field_name('pagination')); ?>" value="1"
<?php if($instance['pagination']) { echo 'checked'; } ?>/>
<label for="<?php echo esc_attr($this->get_field_id('pagination')); ?>"><?php printf(esc_html__('Enable pagination', 'empd-com') , $this->class_label); ?></label>
</p>
<p class="emd-paginate-show" <?php echo esc_attr($paginate_style); ?>>
<label for="<?php echo esc_attr($this->get_field_id('pagination_size')); ?>"><?php echo esc_html__('Pagination size', 'empd-com'); ?></label>
<select id="<?php echo esc_attr($this->get_field_id('pagination_size')); ?>" name="<?php echo esc_attr($this->get_field_name('pagination_size')); ?>">
<option value="small" <?php if($instance['pagination_size'] == 'small') { echo 'selected'; } ?>><?php echo esc_html__('Small','empd-com'); ?></option>
<option value="medium" <?php if($instance['pagination_size'] == 'medium') { echo 'selected'; } ?>><?php echo esc_html__('Medium','empd-com'); ?></option>
<option value="large" <?php if($instance['pagination_size'] == 'large') { echo 'selected'; } ?>><?php echo esc_html__('Large','empd-com'); ?></option>
</select>
</p>
<p class="emd-paginate-show" <?php echo esc_attr($paginate_style); ?>>
<label for="<?php echo esc_attr($this->get_field_id('count_per_page')); ?>"><?php printf(esc_html__('Number of %s to show per pagination', 'empd-com') , $this->class_label); ?></label>
<input type="text" id="<?php echo esc_attr($this->get_field_id('count_per_page')); ?>" name="<?php echo esc_attr($this->get_field_name('count_per_page')); ?>" value="<?php echo esc_attr($instance['count_per_page']); ?>" size="2" maxlength="2" /> <br>
</p>
<?php
}
}
/**
* Runs wp query and creates layout for entity widgets
* @since WPAS 4.0
*
* @param string $posts_per_page
* @param array $pids
* @param array $args
*
* @return string $layout
*/
public static function get_ent_widget_layout($posts_per_page, $pids, $args = Array()) {
$paged = 1;
$layout = "";
if(!empty($args['filter'])){
$emd_query = new Emd_Query($args['class'],$args['app'],$args['query_args']['context']);
$emd_query->args_filter($args['filter']);
$args['query_args'] = array_merge($args['query_args'],$emd_query->args);
}
if(!empty($args['query_args']['paged'])){
$paged = $args['query_args']['paged'];
}
if (!empty($args['has_pages'])) {
$args['query_args']['posts_per_page'] = $args['posts_per_page'];
$total_pages = round($posts_per_page / $args['posts_per_page']);
if (get_query_var('paged')) $paged = get_query_var('paged');
}
else {
$total_pages = 1;
$args['query_args']['posts_per_page'] = $posts_per_page;
}
$args['query_args']['paged'] = $paged;
$args['query_args']['post__in'] = $pids;
if($paged <= $total_pages){
$mywidget = new WP_Query($args['query_args']);
if($mywidget->max_num_pages < $total_pages){
$total_pages = $mywidget->max_num_pages;
}
if(!isset($args['posts_per_page'])){
$args['posts_per_page'] = 0;
}
$record_count = ($paged - 1) * intval($args['posts_per_page']) + 1;
while ($mywidget->have_posts()) {
$mywidget->the_post();
if(!isset($args['has_pages']) || (isset($args['has_pages']) && $record_count <= $posts_per_page)){
if (isset($args['fname'])) {
$layout.= $args['fname']();
} else {
$layout .= call_user_func(array($args['cname'],"layout"));
}
$record_count ++;
}
}
wp_reset_postdata();
}
if(!empty($args['filter'])){
$emd_query->remove_filters();
}
if (isset($args['has_pages'])) {
$paging_text = paginate_links(array(
'total' => $total_pages,
'current' => $paged,
//'base' => get_pagenum_link() . '&%_%',
'base' => '&%_%',
'format' => 'paged=%#%',
'type' => 'array',
'add_args' => true,
));
if(!empty($paging_text)){
$paging_html = "<ul class='emd-pagination";
switch($args['pagination_size']){
case 'medium':
break;
case 'large':
$paging_html .= " emd-pagination-lg";
break;
case 'small':
default:
$paging_html .= " emd-pagination-sm";
break;
}
$paging_html .= "'>";
foreach ($paging_text as $key_paging => $my_paging) {
$paging_html .= "<li";
if(strpos($my_paging,'page-numbers current') !== false){
$paging_html .= " class='active'";
}
$paging_html .= ">" . $my_paging . "</li>";
}
$paging_html .= "</ul>";
$layout .= '<div class="widg-pagination">' . $paging_html . '</div>';
}
}
return $layout;
}
/**
* Runs wp query and creates layout for comment widgets
* @since WPAS 4.0
*
* @param string $posts_per_page
* @param array $pids
*
* @return string $output
*/
public function get_comm_widget_layout($posts_per_page, $pids) {
$ccount = 0;
$output = "";
$this->query_args['number'] = $posts_per_page;
if (empty($pids)) {
$comments = get_comments(apply_filters('widget_comments_args', $this->query_args));
if ($comments) {
foreach ((array)$comments as $comment) {
$output.= '<li class="recentcomments">' . sprintf(esc_html__('%1$s on %2$s', 'empd-com') , get_comment_author_link($comment->comment_ID) , '<a href="' . esc_url(get_comment_link($comment->comment_ID)) . '">' . get_the_title($comment->comment_post_ID) . '</a>') . '</li>';
}
}
return $output;
}
foreach ($pids as $cpid) {
if ($ccount < $posts_per_page && $cpid != 0) {
$this->query_args['post_id'] = $cpid;
$comments = get_comments(apply_filters('widget_comments_args', $this->query_args));
if ($comments) {
foreach ((array)$comments as $comment) {
if ($ccount < $posts_per_page) {
$ccount++;
$output.= '<li class="recentcomments">' . sprintf(esc_html__('%1$s on %2$s', 'empd-com') , get_comment_author_link($comment->comment_ID) , '<a href="' . esc_url(get_comment_link($comment->comment_ID)) . '">' . get_the_title($comment->comment_post_ID) . '</a>') . '</li>';
}
}
}
}
}
return $output;
}
}