⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 freelabel.cs

📁 最好用的站点内容管理系统 全部源代码都有
💻 CS
字号:
//======================================================
//==     (c)2008 aspxcms inc by NeTCMS v1.0              ==
//==          Forum:bbs.aspxcms.com                   ==
//==         Website:www.aspxcms.com                  ==
//======================================================
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Data;
using NetCMS.Config;

namespace NetCMS.Publish
{
    /// <summary>
    /// 自由标签
    /// </summary>
    public class FreeLabel : Label
    {
        /// <summary>
        /// 自由标签参数
        /// </summary>
        struct StParam
        {
            /// <summary>
            /// 参数名称
            /// </summary>
            public string name;
            /// <summary>
            /// 所在SQL语句的位置
            /// </summary>
            public int pos;
        }
        /// <summary>
        /// 自由标签的SQL语句
        /// </summary>
        private string LabelSQL = string.Empty;
        /// <summary>
        /// 自由标签样式
        /// </summary>
        private string LabelStyle = string.Empty;
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="labelname">自由标签名称</param>
        public FreeLabel(string labelname,LabelType labeltype)
            : base(labelname, labeltype)
        { }
        /// <summary>
        /// 从数据库取得自由标签内容
        /// </summary>
        /// <param name="cn">已打开的数据库连接</param>
        public override void GetContentFromDB()
        {
            IDataReader rd = CommonData.DalPublish.GetFreeLabelContent(_LabelName);
            if (rd.Read())
            {
                LabelSQL = rd.GetString(0);
                if (!rd.IsDBNull(1)) LabelStyle = rd.GetString(1);
            }
            rd.Close();
        }
        /// <summary>
        /// 生成最终的HTML代码
        /// </summary>
        /// <param name="cn"></param>
        public override void MakeHtmlCode()
        {
            if (LabelStyle == string.Empty)
            {
                this._FinalHtmlCode = string.Empty;
                return;
            }
            try
            {
                string FinalStr = this.LabelStyle;
                #region 时间处理
                string pattertm = @"\[\$[^\$]+\$\]";
                Regex regex = new Regex(pattertm, RegexOptions.Compiled);
                Match match = regex.Match(FinalStr);
                DateTime Now = DateTime.Now;
                while (match.Success)
                {
                    string tm;
                    string _tm = tm = match.Value;
                    _tm = Regex.Replace(_tm, @"^\[\$|\$\]$", "");
                    _tm = _tm.Replace("YY02", Now.Year.ToString().Remove(0, 2));
                    _tm = _tm.Replace("YY04", Now.Year.ToString());
                    _tm = _tm.Replace("MM", Now.Month.ToString());
                    _tm = _tm.Replace("DD", Now.Day.ToString());
                    _tm = _tm.Replace("HH", Now.Hour.ToString());
                    _tm = _tm.Replace("MI", Now.Minute.ToString());
                    _tm = _tm.Replace("SS", Now.Second.ToString());
                    FinalStr = FinalStr.Replace(tm, _tm);
                    match = regex.Match(FinalStr);
                }
                //[$YY02年MM月DD日$]日期格式:YY02代表2位的年份(如06表示2006年),YY04表示4位数的年份(2006),MM代表月,DD代表日,HH代表小时,MI代表分,SS代表秒。
                #endregion
                IList<StParam> FieldsList = ParseFields(FinalStr);
                DataTable dt = CommonData.DalPublish.ExecuteSql(LabelSQL);
                //记录不循环记录的编号
                List<int> UnLoopNum = new List<int>();
                #region 先找不循环
                string pattern = @"\{\*(?<n>\d+)(?<c>[\S\s]*?)\*\}";
                Regex reg = new Regex(pattern, RegexOptions.Compiled);
                Match m = reg.Match(FinalStr);
                while (m.Success)
                {
                    string rcd = m.Value;
                    string newrcd = m.Groups["c"].Value.Trim();
                    int rcdindex = Convert.ToInt32(m.Groups["n"].Value);
                    UnLoopNum.Add(rcdindex - 1);
                    if (FieldsList != null)
                    {
                        for (int i = 0; i < FieldsList.Count; i++)
                        {
                            string FieldName = FieldsList[i].name;
                            string FieldValue = string.Empty;
                            if (dt != null && dt.Rows.Count >= rcdindex && dt.Rows[rcdindex - 1][FieldsList[i].pos] != DBNull.Value)
                            {
                                FieldValue = dt.Rows[rcdindex - 1][FieldsList[i].pos].ToString();
                            }
                            newrcd = ReplaceField(newrcd, FieldName, FieldValue);
                        }
                    }
                    FinalStr = FinalStr.Replace(rcd, newrcd);
                    m = m.NextMatch();
                }
                #endregion 先找不循环
                #region 处理循环
                pattern = @"\{\#[\s\S]*?\#\}";
                Regex r = new Regex(pattern, RegexOptions.Compiled);
                m = r.Match(FinalStr);
                while (m.Success)
                {
                    string mstr = m.Value;
                    string _mstr = mstr.Substring(2, mstr.Length - 4);
                    string reslt = string.Empty;
                    if (dt != null)
                    {
                        for (int i = 0; i < dt.Rows.Count; i++)
                        {
                            if (UnLoopNum.Contains(i))
                                continue;
                            UnLoopNum.Add(i);
                            string valstr = _mstr;
                            if (FieldsList != null)
                            {
                                for (int j = 0; j < FieldsList.Count; j++)
                                {
                                    string FieldName = FieldsList[j].name;
                                    string FieldValue = string.Empty;
                                    if (dt.Rows[i][FieldsList[j].pos] != DBNull.Value)
                                    {
                                        FieldValue = dt.Rows[i][FieldsList[j].pos].ToString();
                                    }
                                    valstr = ReplaceField(valstr, FieldName, FieldValue);
                                }
                            }
                            reslt += valstr;
                        }
                    }
                    FinalStr = FinalStr.Replace(mstr, reslt);
                    m = m.NextMatch();
                }
                #endregion 处理循环
                FieldsList.Clear();
                dt.Clear();
                dt.Dispose();
                this._FinalHtmlCode = FinalStr;
            }
            catch
            {
                this._FinalHtmlCode = string.Empty;
            }
        }
       /// <summary>
        /// 解析SQL语句的字段位置
       /// </summary>
       /// <param name="Input"></param>
       /// <returns></returns>
        private IList<StParam> ParseFields(string Input)
        {
            string SqlFields = Regex.Match(LabelSQL, @"^select\ +(top\ +\d+\ +)?(?<flds>.+)\ +from\ +.+", RegexOptions.Compiled | RegexOptions.IgnoreCase).Groups["flds"].Value.Trim();
            if (SqlFields.Equals(string.Empty))
            {
                return null;
            }
            string[] Fields = null;
            if (SqlFields.IndexOf(",") > 0)
                Fields = SqlFields.Trim().Split(',');
            else
                Fields = new string[] { SqlFields };
            string pattern = @"\[\*(?<fld>[\s\S]+?)\*\]";
            IList<StParam> pms = new List<StParam>();
            Regex reg = new Regex(pattern, RegexOptions.Compiled);
            Match m = reg.Match(Input);
            while (m.Success)
            {
                StParam p;
                p.name = m.Groups["fld"].Value;
                p.pos = -1;
                bool flag = false;
                foreach (StParam sp in pms)
                {
                    if (sp.name.Equals(p.name))
                    {
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    for (int i = 0; i < Fields.Length; i++)
                    {
                        if (Fields[i].Trim().Equals(p.name.Trim()))
                        {
                            p.pos = i;
                            pms.Add(p);
                            break;
                        }
                    }
                }
                m = m.NextMatch();
            }
            return pms;
        }
        protected string ReplaceField(string Input,string FieldName,string FieldValue)
        {
            if (Input == null || Input.Trim() == string.Empty)
                return string.Empty;
            string RetVal = Input;
            string pattern = @"\(\#[Ll][Ee][Ff][Tt]\(\[\*" + Regex.Escape(FieldName) + @"\*\]\,(?<n>\d+)\)\#\)";
            Regex r = new Regex(pattern, RegexOptions.Compiled);
            Match mymatch = r.Match(Input);
            if (mymatch.Success)
            {
                int pos = int.Parse(mymatch.Groups["n"].Value);
                FieldValue = NetCMS.Common.Input.GetSubString(FieldValue, pos);
                RetVal = Regex.Replace(Input, pattern, FieldValue);
            }
            else
            {
                RetVal = Input.Replace("[*" + FieldName + "*]", FieldValue);
            }
            return RetVal;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -