Umbraco CMS:如何制作命中计数器
本文关键字:计数器 何制作 CMS Umbraco | 更新日期: 2023-09-27 18:01:30
我需要为Umbraco CMS制作一个命中计数器。有办法吗?我想跟踪热门文章并在主页上显示它们
您必须自己实现,这不是现成的。你可以这样做:
首先你需要知道你想要计算什么:一个url被请求的次数?或者查看节点的次数(同一节点可能在多个url下可用)?点击或访问,如果用户重新加载页面,计数器是否应该上升?
对于实际的实现,您将需要三个部分:
1。客户端请求
当一个页面被查看时,它应该被跟踪,你需要触发一个请求到服务器,允许你为那个页面增加计数器。
有几种方法可以实现这一点,我建议通过包含图片请求 (1px transparent gif)来实现。 例如:<img src="/hits/4882/counter.gif" />
4882是文章页面的节点id,每个文章页面的节点id不同。
你应该在母版页(模板)中包含生成url的代码。
2。服务器端处理程序
在服务器端,您需要一个处理程序来响应图片请求。HttpHandler非常适合这项工作。你可以在一个单独的项目中创建它,将dll放到bin文件夹中,然后添加必要的web。配置设置。
处理程序必须完成以下操作:
- 确定图片请求来自哪个url/节点 -通过使用请求的
HTTP_REFERRER
头,或通过使用url中的信息(如我上面的例子中图像url中的节点id)。 - 增加该页面的计数器 -您需要向数据库添加一个表,简单地用一列表示url或节点id,一列表示应该执行的请求数。
- 发送回一个图像并确保客户端没有缓存它(设置过期头等)
3。显示最受欢迎的链接
为了在一个页面上显示最热门的文章,你需要一个Umbraco用户控件来查询数据库中的表并显示最受欢迎的链接。
天哪,又是90年代初吗?谷歌分析呢?
<%@ Control Language=" c# " AutoEventWireup="true" CodeFile="counter. asx .cs" Inherits="counter" %>
后面代码的代码:
c# protected void Page_Load(object sender, EventArgs e)
{
this.countMe();
DataSet tmpDs = new DataSet();
tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
lblCounter.Text = tmpDs.Tables[0].Rows[0]["hits"].ToString();
}
private void countMe()
{
DataSet tmpDs = new DataSet();
tmpDs.ReadXml(Server.MapPath("~/counter.xml"));
int hits = Int32.Parse(tmpDs.Tables[0].Rows[0]["hits"].ToString());
hits += 1;
tmpDs.Tables[0].Rows[0]["hits"] = hits.ToString();
tmpDs.WriteXml(Server.MapPath("~/counter.xml"));
}
VB。净
Protected Sub Page_Load(sender As Object, e As EventArgs)
Me.countMe()
Dim tmpDs As New DataSet()
tmpDs.ReadXml(Server.MapPath("~/counter.xml"))
lblCounter.Text = tmpDs.Tables(0).Rows(0)("hits").ToString()
End Sub
Private Sub countMe()
Dim tmpDs As New DataSet()
tmpDs.ReadXml(Server.MapPath("~/counter.xml"))
Dim hits As Integer = Int32.Parse(tmpDs.Tables(0).Rows(0)("hits").ToString())
hits += 1
tmpDs.Tables(0).Rows(0)("hits") = hits.ToString()
tmpDs.WriteXml(Server.MapPath("~/counter.xml"))
End Sub
然后,您需要在根目录中有一个xml文件,以使代码也能工作。XML文件看起来像这样:
<?xml version="1.0" encoding="utf-8" ?>
<counter>
<count>
<hits>0</hits>
</count>