编JEECMS自定义栏目统计标签

查看JEECMS的源代码发现开发者版本还没有类似现成的统计标签,一种解决的办法是使用现有的JEECMS标签,像这样Struts( [@cms_content_list channel=id]${tag_list?size}[/@cms_content_list]) ,但是这样的做法非常地低效,原因是[@cms_content_list]标签会把所有当前栏目的文章内容对象查询出来,做全表查询!

为了网站访问效率,只好自己写一个统计标签[@cms_channel_statistic]为例说下如何在JEECMS加入自定义标签。

 

第一步:编写装载统计信息的Entity。

/** 
 * 频道统计实体类 
 * @author www.javake.net 
 */  
public class ChannelStatistics {  
    /** 
     * 文章总数 
     */  
    private long contentAllCount;  
    /** 
     * 待审核文章总数 
     */  
    private long contentCheckingCount;  
    /** 
     * 评论总数 
     */  
    private long commentCount;  
    /** 
     * 阅读总数 
     */  
    private long viewCount;  
    public long getContentAllCount() {  
        return contentAllCount;  
    }  
    public void setContentAllCount(long contentAllCount) {  
        this.contentAllCount = contentAllCount;  
    }  
    public long getContentCheckingCount() {  
        return contentCheckingCount;  
    }  
    public void setContentCheckingCount(long contentCheckingCount) {  
        this.contentCheckingCount = contentCheckingCount;  
    }  
    public long getCommentCount() {  
        return commentCount;  
    }  
    public void setCommentCount(long commentCount) {  
        this.commentCount = commentCount;  
    }  
    public long getViewCount() {  
        return viewCount;  
    }  
    public void setViewCount(long viewCount) {  
        this.viewCount = viewCount;  
    }  
}  

第二步:编写栏目信息统计的Dao接口。暂时只实现文章总数统计,待审核文章统计,评论总数 cop

/** 
 * 栏目信息统计Dao接口 
 * @author www.javake.net 
 */  
public interface CmsChannelStatisticDao {  
    /** 
     * 当前栏目文章统计 
     * @param restrictions 
     * @return 
     */  
    public long contentStatistic(Map restrictions);  
    /** 
     * 当前栏目待审核文章统计 
     * @param restrictions 
     * @return 
     */  
    public long contentCheckingStatistic(Map restrictions);  
    /** 
     * 当前栏目评论统计 
     * @param restrictions 
     * @return 
     */  
    public long commentStatistic(Map restrictions);  
}  

第三步:编写Dao接口的实现。

/** 
 * 栏目信息统计Dao实现类 
 * @author www.javake.net 
 */  
import static com.jeecms.cms.entity.main.Content.ContentStatus.passed;  
import static com.jeecms.cms.entity.main.Content.ContentStatus.prepared;  
import static com.jeecms.cms.entity.main.Content.ContentStatus.rejected;  
import static com.jeecms.cms.statistic.CmsStatistic.CHANNELID;  
import static com.jeecms.cms.statistic.CmsStatistic.ISREPLYED;  
import static com.jeecms.cms.statistic.CmsStatistic.SITEID;  
import java.util.Map;  
import org.springframework.stereotype.Repository;  
import com.jeecms.cms.entity.main.Content.ContentStatus;  
import com.jeecms.common.hibernate3.Finder;  
import com.jeecms.common.hibernate3.HibernateSimpleDao;  
@Repository  
public class CmsChannelStatisticDaoImpl extends HibernateSimpleDao  
            implements CmsChannelStatisticDao{  
    /** 
     * 获取文章总数 
     */  
    public long contentStatistic(Map restrictions) {  
        Finder f = createCacheableFinder("select count(*) from Content bean");  
        Integer channelId = (Integer) restrictions.get(CHANNELID);  
        if (channelId != null) {  
            f.append(" join bean.channel channel,Channel parent");  
            f.append(" where channel.lft between parent.lft and parent.rgt");  
            f.append(" and channel.site.id=parent.site.id");  
            f.append(" and parent.id=:parentId");  
            f.setParam("parentId", channelId);  
        } else {  
            f.append(" where bean.site.id=:siteId").setParam("siteId",  
                    restrictions.get(SITEID));  
        }  
        return (Long) find(f).iterator().next();  
    }  
      
    private long contentStatistic(Map restrictions,ContentStatus status) {  
        Finder f = createCacheableFinder("select count(*) from Content bean");  
        if (prepared == status || passed == status || rejected == status) {  
            f.append(" join bean.contentCheckSet check");  
        }  
        Integer channelId = (Integer) restrictions.get(CHANNELID);  
        if (channelId != null) {  
            f.append(" join bean.channel channel,Channel parent");  
            f.append(" where channel.lft between parent.lft and parent.rgt");  
            f.append(" and channel.site.id=parent.site.id");  
            f.append(" and parent.id=:parentId");  
            f.setParam("parentId", channelId);    
        } else {  
            f.append(" where bean.site.id=:siteId").setParam("siteId",  
                    restrictions.get(SITEID));  
        }  
        if (prepared == status || passed == status) {  
            f.append(" and check.rejected=false");  
        } else if (rejected == status) {  
            f.append(" and check.rejected=true");  
        }  
        return (Long) find(f).iterator().next();  
    }  
      
    /** 
     * 待审核文章总数 
     * @param restrictions 
     * @param status 
     * @return 
     */  
    public long contentCheckingStatistic(Map restrictions) {  
        return contentStatistic(restrictions,ContentStatus.prepared);  
    }  
    public long commentStatistic(Map restrictions) {  
        Finder f = createCacheableFinder("select count(*) from CmsComment bean ");  
        Integer channelId = (Integer) restrictions.get(CHANNELID);  
        if (channelId != null) {  
            f.append(" join bean.channel channel,Channel parent");  
            f.append(" where channel.lft between parent.lft and parent.rgt");  
            f.append(" and channel.site.id=parent.site.id");  
            f.append(" and parent.id=:parentId");  
            f.setParam("parentId", channelId);    
        } else {  
            f.append(" where bean.site.id=:siteId").setParam("siteId",  
                    restrictions.get(SITEID));  
        }  
        Boolean isReplyed = (Boolean) restrictions.get(ISREPLYED);  
        if (isReplyed != null) {  
            if (isReplyed) {  
                f.append(" and bean.replayTime is not null");  
            } else {  
                f.append(" and bean.replayTime is null");  
            }  
        }  
        return (Long) find(f).iterator().next();  
    }  
      
    private Finder createCacheableFinder(String hql) {  
        Finder finder = Finder.create(hql);  
        finder.setCacheable(true);  
        return finder;  
    }  
}  

第四步:编写栏目统计的FreeMarker标签类。这里可以输入两个参数,一个是id(栏目id),一个是siteId(站点id)。这两个参数可在使用标签的时候输入。

/** 
 * 栏目统计 
 * @author www.javake.net 
 */  
import static com.jeecms.common.web.freemarker.DirectiveUtils.OUT_BEAN;  
import static freemarker.template.ObjectWrapper.DEFAULT_WRAPPER;  
import static com.jeecms.cms.statistic.CmsStatistic.SITEID;  
import static com.jeecms.cms.statistic.CmsStatistic.ISREPLYED;  
import static com.jeecms.cms.statistic.CmsStatistic.USERID;  
import static com.jeecms.cms.statistic.CmsStatistic.CHANNELID;  
import java.io.IOException;  
import java.util.HashMap;  
import java.util.Map;  
import org.springframework.beans.factory.annotation.Autowired;  
import com.jeecms.cms.entity.main.ChannelStatistics;  
import com.jeecms.cms.entity.main.CmsSite;  
import com.jeecms.cms.statistic.CmsChannelStatisticDao;  
import com.jeecms.cms.web.FrontUtils;  
import com.jeecms.common.web.freemarker.DirectiveUtils;  
import freemarker.core.Environment;  
import freemarker.template.TemplateDirectiveBody;  
import freemarker.template.TemplateDirectiveModel;  
import freemarker.template.TemplateException;  
import freemarker.template.TemplateModel;  
public class CmsChannelStatisticsDirective implements TemplateDirectiveModel{  
    /** 
     * 输入参数,站点ID。存在时,获取该站点栏目,不存在时获取当前站点栏目。 
     */  
    public static final String PARAM_SITE_ID = "siteId";  
    /** 
     * 输入参数,栏目ID。 
     */  
    public static final String PARAM_ID = "id";  
    @SuppressWarnings("unchecked")  
    public void execute(Environment env, Map params, TemplateModel[] loopVars,  
            TemplateDirectiveBody body) throws TemplateException, IOException {  
        CmsSite site = FrontUtils.getSite(env);  
        Integer id = DirectiveUtils.getInt(PARAM_ID, params);  
        ChannelStatistics statistics = null;  
        Map restrictions = new HashMap();  
        Integer siteId = DirectiveUtils.getInt(PARAM_SITE_ID, params);  
        if (siteId == null) {  
            siteId = site.getId();  
        }  
        if (id != null ) {  
            restrictions.put(CHANNELID, id);          
        } else {  
            restrictions.put(SITEID, siteId);  
        }  
        long contentCount = channelSatistic.contentStatistic(restrictions);  
        long contentCheckingCount = channelSatistic.contentCheckingStatistic(restrictions);  
        long commentCount = channelSatistic.commentStatistic(restrictions);  
          
        statistics = new ChannelStatistics();  
        statistics.setCommentCount(commentCount);  
        statistics.setContentAllCount(contentCount);  
        statistics.setContentCheckingCount(contentCheckingCount);  
          
        Map paramWrap = new HashMap(  
                params);  
        paramWrap.put(OUT_BEAN, DEFAULT_WRAPPER.wrap(statistics));  
        Map origMap = DirectiveUtils  
                .addParamsToVariable(env, paramWrap);  
        body.render(env.getOut());  
        DirectiveUtils.removeParamsFromVariable(env, paramWrap, origMap);  
    }  
      
    @Autowired  
    private CmsChannelStatisticDao channelSatistic;  
  
    public void setChannelSatistic(CmsChannelStatisticDao channelSatistic) {  
        this.channelSatistic = channelSatistic;  
    }  
}  

第五步:在jeecms-context.xml文件中加入CmsChannelStatisticsDirective标签类的bean注入代码。





 


        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
 

第六步:在jeecms-servlet-front.xml文件中配置



        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        

第七步:到目前为止,核心代码和配置编写完毕!可以在栏目模板中使用标签了!


( [@cms_channel_statisticid=a.id]${tag_bean.contentAllCount}[/@cms_channel_statistic] )



你可能感兴趣的:(CMS)