addBehavior( 'initWidgets', array('lastpostsextendWidget', 'initWidget') ); class lastpostsextendWidget { public static function initWidget($w) { global $core; # Create widget $w->create( 'lastpostsextend', __('Last entries (Extended)'), array('lastpostsextendWidget', 'parseWidget'), null, __('Extended list of entries') ); # Title $w->lastpostsextend->setting( 'title', __('Title:'), __('Last entries'), 'text' ); # type $posttypes = array( __('Post') => 'post', __('Page') => 'page', __('Gallery') => 'galitem' ); # plugin muppet types if ($core->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 = $core->blog->getCategories(array( 'post_type' => 'post' )); $categories = array( '' => '', __('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', array( __('all') => 'all', __('only without password') => 'no', __('only with password') => 'yes' ) ); # Status $w->lastpostsextend->setting( 'status', __('Status:'), '1', 'combo', array( __('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 ($core->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', array( __('Date') => 'date', __('Title') => 'post_title', __('Comments') => 'nb_comment' ) ); # Sort order $w->lastpostsextend->setting( 'sort', __('Sort:'), 'desc', 'combo', array( __('Ascending') => 'asc', __('Descending') => 'desc' ) ); # First image $w->lastpostsextend->setting( 'firstimage', __('Show entries first image:'), '', 'combo', array( __('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', array( __('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) { global $core; $params = array( 'sql' => '', 'columns' => array(), 'from' => '' ); # Widget is offline if ($w->offline) return; # Home page only if ($w->homeonly == 1 && $core->url->type != 'default' || $w->homeonly == 2 && $core->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 ($core->plugins->moduleExists('tags') && $w->tag) { $tags = explode(',', $w->tag); foreach($tags as $i => $tag) { $tags[$i] = trim($tag); } $params['from'] .= ', '.$core->prefix.'meta META '; $params['sql'] .= 'AND META.post_id = P.post_id '; $params['sql'] .= "AND META.meta_id ".$core->con->in($tags)." "; $params['sql'] .= "AND META.meta_type = 'tag' "; } $rs = $core->auth->sudo( array($core->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 .= '
  • '. '<'.($rs->post_status == 1 ? 'a href="'.$rs->getURL().'"' : 'span'). ' title="'. dt::dt2str( $core->blog->settings->system->date_format, $rs->post_upddt ).', '. dt::dt2str( $core->blog->settings->system->time_format, $rs->post_upddt ).'">'. html::escapeHTML($rs->post_title). 'post_status == 1 ? 'a' : 'span').'>'; # Nb comments if ($w->commentscount && $rs->post_status == 1) { $res .= ' ('.$rs->nb_comment.')'; } # First image if ($w->firstimage != '') { $res .= self::entryFirstImage( $core, $rs->post_type, $rs->post_id, $w->firstimage ); } # Excerpt if ($w->excerpt) { $excerpt = $rs->post_excerpt; if ($rs->post_format == 'wiki') { $core->initWikiComment(); $excerpt = $core->wikiTransform($excerpt); $excerpt = $core->HTMLfilter($excerpt); } if (strlen($excerpt) > 0) { $cut = text::cutString( $excerpt, abs((integer) $w->excerptlen) ); $res .= ' : '.$cut.(strlen($cut) < strlen($excerpt) ? '...' : ''); unset($cut); } } $res .= '
  • '; } return $w->renderDiv( $w->content_only, 'lastpostsextend '.$w->class, '', '' ); } private static function entryFirstImage($core, $type, $id, $size='s') { if (!in_array($type, array('post', 'page', 'galitem'))) { return ''; } $rs = $core->auth->sudo( array($core->blog, 'getPosts'), array('post_id' => $id, 'post_type' => $type), false ); if ($rs->isEmpty()) { return ''; } if (!preg_match('/^sq|t|s|m|o$/',$size)) { $size = 's'; } $p_url = $core->blog->settings->system->public_url; $p_site = preg_replace( '#^(.+?//.+?)/(.*)$#', '$1', $core->blog->url ); $p_root = $core->blog->public_path; $pattern = '(?:'.preg_quote($p_site, '/').')?'.preg_quote($p_url, '/'); $pattern = sprintf('/]+/msu', $pattern); $src = ''; $alt = ''; $subject = $rs->post_excerpt_xhtml.$rs->post_content_xhtml.$rs->cat_desc; if (preg_match_all($pattern, $subject, $m) > 0) { foreach ($m[1] as $i => $img) { if (($src = self::ContentFirstImageLookup($p_root, $img, $size)) !== false) { $src = $p_url.(dirname($img) != '/' ? dirname($img) : '').'/'.$src; if (preg_match('/alt="([^"]+)"/', $m[0][$i], $malt)) { $alt = $malt[1]; } break; } } } if (!$src) { return ''; } return '
    '. ''. "
    \n"; } private static function ContentFirstImageLookup($root,$img,$size) { # Get base name and extension $info = path::info($img); $base = $info['base']; if (preg_match('/^\.(.+)_(sq|t|s|m)$/',$base,$m)) { $base = $m[1]; } $res = false; if ($size != 'o' && file_exists($root.'/'.$info['dirname'].'/.'.$base.'_'.$size.'.jpg')) { $res = '.'.$base.'_'.$size.'.jpg'; } else { $f = $root.'/'.$info['dirname'].'/'.$base; if (file_exists($f.'.'.$info['extension'])) { $res = $base.'.'.$info['extension']; } elseif (file_exists($f.'.jpg')) { $res = $base.'.jpg'; } elseif (file_exists($f.'.png')) { $res = $base.'.png'; } elseif (file_exists($f.'.gif')) { $res = $base.'.gif'; } } return $res ? $res : false; } }