addBehavior( 'initWidgets', ['lastpostsextendWidget', 'initWidget'] ); class lastpostsextendWidget { public static function initWidget($w) { # Create widget $w->create( 'lastpostsextend', __('Last entries (Extended)'), ['lastpostsextendWidget', 'parseWidget'], null, __('Extended list of entries') ); # Title $w->lastpostsextend->setting( 'title', __('Title:'), __('Last entries'), 'text' ); # type $posttypes = [ __('Post') => 'post', __('Page') => 'page', __('Gallery') => 'galitem' ]; # plugin muppet types if (dcCore::app()->plugins->moduleExists('muppet')) { $muppet_types = muppet::getPostTypes(); if(is_array($muppet_types) && !empty($muppet_types)) { foreach($muppet_types as $k => $v) { $posttypes[$v['name']] = $k; } } } $w->lastpostsextend->setting( 'posttype', __('Type:'), 'post', 'combo', $posttypes ); # Category (post and page have same category) $rs = dcCore::app()->blog->getCategories([ 'post_type' => 'post' ]); $categories = [ '' => '', __('Uncategorized') => 'null' ]; while ($rs->fetch()) { $categories[str_repeat( ' ', $rs->level-1 ) . '• ' . html::escapeHTML($rs->cat_title)] = $rs->cat_id; } $w->lastpostsextend->setting( 'category', __('Category:'), '', 'combo', $categories ); unset($rs, $categories); # Pasworded $w->lastpostsextend->setting( 'passworded', __('Protection:'), 'no', 'combo', [ __('all') => 'all', __('only without password') => 'no', __('only with password') => 'yes' ] ); # Status $w->lastpostsextend->setting( 'status', __('Status:'), '1', 'combo', [ __('all') => 'all', __('pending') => '-2', __('scheduled') => '-1', __('unpublished') => '0', __('published') => '1' ] ); # Selected entries only $w->lastpostsextend->setting( 'selectedonly', __('Selected entries only'), 0, 'check' ); # Updated entries only $w->lastpostsextend->setting( 'updatedonly', __('Updated entries only'), 0, 'check' ); # Tag if (dcCore::app()->plugins->moduleExists('tags')) { $w->lastpostsextend->setting( 'tag', __('Limit to tags:'), '', 'text' ); } # Search $w->lastpostsextend->setting( 'search', __('Limit to words:'), '', 'text' ); # Entries limit $w->lastpostsextend->setting( 'limit', __('Entries limit:'), 10, 'text' ); # Sort type $w->lastpostsextend->setting( 'sortby', __('Order by:'), 'date', 'combo', [ __('Date') => 'date', __('Title') => 'post_title', __('Comments') => 'nb_comment' ] ); # Sort order $w->lastpostsextend->setting( 'sort', __('Sort:'), 'desc', 'combo', [ __('Ascending') => 'asc', __('Descending') => 'desc' ] ); # First image $w->lastpostsextend->setting( 'firstimage', __('Show entries first image:'), '', 'combo', [ __('no') => '', __('square') => 'sq', __('thumbnail') => 't', __('small') => 's', __('medium') => 'm', __('original') => 'o' ] ); # With excerpt $w->lastpostsextend->setting( 'excerpt', __('Show entries excerpt'), 0, 'check' ); # Excerpt length $w->lastpostsextend->setting( 'excerptlen', __('Excerpt length:'), 100, 'text' ); # Comment count $w->lastpostsextend->setting( 'commentscount', __('Show comments count'), 0, 'check' ); # Home only $w->lastpostsextend->setting( 'homeonly', __('Display on:'), 0, 'combo', [ __('All pages') => 0, __('Home page only') => 1, __('Except on home page') => 2 ] ); # widget option - content only $w->lastpostsextend->setting( 'content_only', __('Content only'), 0, 'check' ); # widget option - additionnal CSS $w->lastpostsextend->setting( 'class', __('CSS class:'), '' ); # widget option - put offline $w->lastpostsextend->setting( 'offline', __('Offline'), 0, 'check' ); } public static function parseWidget($w) { $params = [ 'sql' => '', 'columns' => [], 'from' => '' ]; # Widget is offline if ($w->offline) { return; } # Home page only if ($w->homeonly == 1 && dcCore::app()->url->type != 'default' || $w->homeonly == 2 && dcCore::app()->url->type == 'default') { return null; } # Need posts excerpt if ($w->excerpt) { $params['columns'][] = 'post_excerpt'; } # Passworded if ($w->passworded == 'yes') { $params['sql'] .= 'AND post_password IS NOT NULL '; } elseif ($w->passworded == 'no') { $params['sql'] .= 'AND post_password IS NULL '; } # Status if ($w->status != 'all') { $params['post_status'] = $w->status; } # Search words if ('' != $w->search) { $params['search'] = $w->search; } # Updated posts only if ($w->updatedonly) { $params['sql'] .= "AND post_creadt < post_upddt " . "AND post_dt < post_upddt "; /* $params['sql'] .= "AND TIMESTAMP(post_creadt ,'DD-MM-YYYY HH24:MI:SS') < TIMESTAMP(post_upddt ,'DD-MM-YYYY HH24:MI:SS') ". "AND TIMESTAMP(post_dt ,'DD-MM-YYYY HH24:MI:SS') < TIMESTAMP(post_upddt ,'DD-MM-YYYY HH24:MI:SS') "; //*/ $params['order'] = $w->sortby == 'date' ? 'post_upddt ' : $w->sortby . ' '; } else { $params['order'] = $w->sortby == 'date' ? 'post_dt ' : $w->sortby . ' '; } $params['order'] .= $w->sort == 'asc' ? 'asc' : 'desc'; $params['limit'] = abs((integer) $w->limit); $params['no_content'] = true; # Selected posts only if ($w->selectedonly) { $params['post_selected'] = 1; } # Type $params['post_type'] = $w->posttype; # Category if ($w->category) { if ($w->category == 'null') { $params['sql'] .= ' AND P.cat_id IS NULL '; } elseif (is_numeric($w->category)) { $params['cat_id'] = (integer) $w->category; } else { $params['cat_url'] = $w->category; } } # Tags if (dcCore::app()->plugins->moduleExists('tags') && $w->tag) { $tags = explode(',', $w->tag); foreach($tags as $i => $tag) { $tags[$i] = trim($tag); } $params['from'] .= ', ' . dcCore::app()->prefix . 'meta META '; $params['sql'] .= 'AND META.post_id = P.post_id '; $params['sql'] .= "AND META.meta_id " . dcCore::app()->con->in($tags) . " "; $params['sql'] .= "AND META.meta_type = 'tag' "; } $rs = dcCore::app()->auth->sudo( [dcCore::app()->blog, 'getPosts'], $params, false ); # No result if ($rs->isEmpty()) { return null; } # Return $res = $w->title ? $w->renderTitle(html::escapeHTML($w->title)) : ''; while ($rs->fetch()) { $res .= '