2006年04月27日

今天留意了一下豆瓣和365key的用户添加内容时的区别。我这里说的添加内容,对豆瓣是添加一本书、一张唱片或者一部电影,对365key是指添加一篇文章(即网摘)。

先说豆瓣。导航上点读书、电影、音乐,只有音乐在音乐的首页显示了“添加豆瓣没有的唱片”,而读书和电影都必须先经过搜索才会显示添加链接。

为什么只有音乐直接显示了添加链接?谁能告诉我?

我猜经过搜索才显示添加地址是为了让用户知道是否已经有了他想添加的内容,避免无用的劳动。我尝试添加了一本书,书的ISBN号码是豆瓣中已经存在的,结果我在提交的时候就直接跳转到这本已经存在的书的编辑页面上了。

就是说,如果这本书已经存在,豆瓣不会让你再添加第2次,不管这本书最初是不是你添加的。

书有ISBN,电影有IMDB,音乐有ISRC,再确定内容的一致性上有着先天的便利,很容易确认是不是有重复的内容。

另外,豆瓣没有提供类似“我添加的书”这样的功能,你无法知道哪本书是你添加的,如果你添加了一本书,你也不能再删除掉。

因此,我觉得如果你在豆瓣添加了一本书,仅仅从添加这个操作来看,不是出于个人管理的需要,必须要在添加完成之后标志状态读过或者想读,才成为个人管理。之后,通过这个状态与其他人联系起来,才有了社会性。

豆瓣为什么不让管理不让删,或许是他把内容唯一化了,N个用户使用同一个内容源,当然不能把源删了。

下面说365key。365key添加的内容就是文章(网址),一篇文章在网络上可能被复制N遍,用户摘录的来自不同网址的文章有可能内容是完全相同的。有的文章可能复制的时候丢失了图片,我这里也把它们当作相同的文章来看待。

在365key中,只是把相同网址的文章看做同一文章,如果有多人收录同一地址的文章,365key就认为这些人收录的是同样的文章,这当然没错。不过,与豆瓣不同的是,如果A用户收录了www.365key.com,B用户再收录一次也是可以的,B用户收录过一次后,如果其再次收录,就会提示已经收录了。

从这里可以发现,365key不允许一个用户添加相同的网址,但是允许不同的用户添加相同的网址。

我做了个测试,收录了某个用户已经添加的一篇文章,并且tag和他标的一样,例如都标成3G,那么我就会在3G这个tag下面发现两篇(如果只有两人收录)这样的文章。假如有100个人收录,并且这100人里有80个都标了一个一样的tag(如果主题明确,这个可能性还是比较高),那么就会在这个tag下面发现80个主题。

这里再次和豆瓣比较,365key首先是个个人知识管理的工具,它的主要作用是记录用户摘录的信息,其次才是分享。既然是我的个人管理,那么添加、编辑、删除都应该是根据我个人的意愿,我才不管你这里是不是已经有了我摘录的文章。我觉得不妥,也随时可以删掉。

所以我觉得365key对相同网址的文章当作不同的记录添加是出于个人管理的考虑,没有去判断这个网址是不是已经存在。如果判断相同网址而不去添加新记录,那删起来会很麻烦,因为可能其他人也收录了。而多个记录有相同的网址也很容易判断出是谁收录了同一篇文章。

至于不同的网址可能会是完全相同的内容,比较起来太麻烦,技术成本太高,暂时不去考虑了。

2006年04月17日

自从知道有“谷歌”这个词后,不管是看还是读,我都觉得别扭,除了读音和google相似之外,再没什么关系了。

今天我在给renqi.com生成google sitemap的时候,猛地悟到了,我靠!

原来,我们这些累死累活做网站的,就像种稻谷的,谷子熟了,就等google这个地主来收租(爬虫),如果google不来,我们还得送过去(sitemap)。google收到好谷子,自然高兴,于是就唱起来了。。。

这个名字太贴切了,还蕴涵了这么深的意义,I服了U

2006年04月08日

首先感谢520hacker 同学友情提供WEB空间

门槛网地址是:http://www.menkan.com

现在是建站的初级阶段,这个阶段的主要任务就是收集WEB技术的参考资料,参考手册之类的东东。先从1.0做起,人都没有,一下子迈到2.0都不现实的。

今天还向ALEXA、GOOGLE和百度提交了数据。

2005年10月27日

TSYS的官方站点终于无法访问了,之前的一段时间里,也表现出来即将关闭的迹象,表现之一是部分图片无法显示了。我曾经考虑过要不要把整个站点抓下来,方便查资料的需要,但还是没有动手。等到站点真的无法访问了,才有一丝丝的后悔。

幸运的是绝大部分有价值的资料已经有网友备份出来了。在各大搜索引擎基本上可以找到,今天意外发现在google和baidu上搜“TSYS2.0”,我的BLOG都是第一位了,呵呵。

没有了官方的支持无所谓了,本来就形同虚设,在我开始用TSYS的时候,开发者就不知去向了。我完全是靠网站上的帖子、其他网友改进的版本和一些相关资料,还有加的两个QQ群一步步摸索学习的。通过这个过程,自身的能力也有所提高,非常值得。

目前TSYS还有许多地方需要改进,一些附加系统还没有完善,用户界面不友好,操作不便等等,我计划在这些方面进行改善。


2005年09月29日

Start AJAX

最近开始研究AJAX(Asynchronous JavaScript and XML),很幸运google到了这篇发表在Devmo上的AJAX: Getting Started。现把这篇简洁易懂的文章翻译如下,与大家共享,希望能对大家有所帮助!

这篇文章会使你对AJAX有一个基本了解,并给出两个容易上手的例子。

目录

  1. 什么是AJAX?
  2. 第一步:如何发出一个HTTP请求
  3. 第二步:处理服务器的响应
  4. 第三步:一个简单的例子
  5. 第四步:与XML响应协同工作

什么是AJAX

AJAX是一个新的合成术语,隐含了两个已经存在多年的JavaScript特性,但是直到最近,随着一些诸如Gmail、Google Suggest以及Google Maps的轰动,才被许多网络开发者所注意到。

我们所讨论的两个JavaScript的特性是你能够:

  • 向服务器发出请求而不需重新加载任何页面
  • 解析XML文档并且与之协同工作

AJAX是一个缩写,A是指"asynchronous"(异步的),它表示你可以在向服务器发出一个HTTP请求后,边做其他的事情,边等待服务器的响应。JA表示"JavaScript"X表示"XML"(可扩展标记语言)。

第一步:如何发出一个HTTP请求

为了用JavaScript向服务器发出一个HTTP请求,你需要一个类的实例来提供给你这种功能。这个类原本在IE里被作为一个ActiveX对象提出,叫XMLHTTP。然后,Mozilla、Safari以及一些其他的浏览器相继跟随,出现了一个XMLHttpRequest类,其支持微软的ActiveX对象原本的方法和属性。

所以,为了能够跨浏览器地创建这个类的对象,你需要这样:

if (window.XMLHttpRequest) { // Mozilla, Safari,
http_request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // IE
http_request = new ActiveXObject("Microsoft.XMLHTTP");
}

(以上例子中的代码,是一个用来构建XMLHTTP实例的简单版本,实际使用时的例子请参见本文的第三步)

如果服务器端的响应中没有包含XML的mime-type报头(header),有些版本的Mozilla浏览器可能不会处理。所以,为了安全起见,你可以用一个特殊的方法来给服务器端发出的响应强加上这个报头,以防其不是text/xml类型。

http_request = new XMLHttpRequest();
http_request.overrideMimeType('text/xml');

下一步就是你来决定在服务器对你的请求作出响应后,你准备做什么。这一阶段,你只需要告诉HTTP请求对象(HTTP request object)用哪一个JavaScript函数来处理这一响应。这一步用设置该对象onreadystatechange属性为相应的JavaScript函数名来实现:

http_request.onreadystatechange = nameOfTheFunction;

注意,在函数名后面没有括号。另外如下定义处理响应的函数:

http_request.onreadystatechange = function(){
// 处理响应
};

接下来,既然你已经声明了在接到响应后干什么,你就需要去发出请求。你需要调用HTTP请求类的open()send()方法:

http_request.open('GET', 'http://www.example.org/some.file', true);
http_request.send(null);
  • open()方法的第一个参数是HTTP请求的方式——GET、POST、HEAD或者任何其它你想使用的,你的服务器支持的方式。方式的名称要大写,否则有些浏览器(如Firefox)可能就不会处理请求。可以去 W3C specs获取更多的你可以使用的HTTP请求方式的信息。
  • 第二个参数是你所请求页面的URL。
  • 第三个参数是用来设置请求是否为异步的。如果是TRUE,则在服务器尚未返回响应的时候,JavaScript的函数会继续执行。这也就是AJAX中的A的含义。

send()方法的参数可以使任何你希望传递给服务器的数据,数据应该为如下格式的查询串:

name=value&anothername=othervalue&so=on

第二步:处理服务器响应

记住,当你向服务器发出了一个请求,你也就发出了一个被设计用来处理响应的JavaScript函数的名字。

http_request.onreadystatechange = nameOfTheFunction;

我们来看看这个函数都应该做些什么。首先,其需要检查请求的状态,如果状态的值为4,那么就意味着全部的服务器响应都已接受完毕,你可以继续来处理了。

if (http_request.readyState == 4) {
// 一切就绪,相映已接受完成
} else {
//尚未就绪
}

readyState全部值的列表如下:

  • 0(未初始化/uninitialized)
  • 1(正在加载/loading)
  • 2(加载完毕/loaded)
  • 3(交互/interactive)
  • 4(完成/complete)

(来源)

下一步是检查HTTP服务器响应的情况代码。所有可能的代码都被列在了W3C的网站上。目前,我们只对200 OK响应感兴趣。

if (http_request.status == 200) {
// 棒极了!
} else {
// 请求出了些问题,
// 比如响应可能是404(Not Found),未找到
// 或者500,内部服务器错误
}

在你检查完请求的状态和HTTP响应情况后,你就可以自己决定对服务器发送给你的数据作什么样的处理了。你有两种途径来访问这些数据:

  • http_request.responseText将会把服务器的响应作为一个文本串返回
  • http_request.responseXML将把响应作为一个XMLDocument对象返回,你可以用JavaScript的文档对象模型(DOM)的函数来处理

第三步:一个简单的例子

我现在来做一个简单的HTTP请求。我们的JavaScript脚本将会请求一个HTML文档,test.html,其包含了一段文本——“这是一个测试。”——然后我们会alert() test.html的内容。

<script type="text/javascript" language="javascript">
var http_request = false;

function makeRequest(url) {

http_request = false;

if (window.XMLHttpRequest) { // Mozilla, Safari,...

http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {
http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}

if (!http_request) {
alert('Giving up :( Cannot create an XMLHTTP instance');
return false;
}
http_request.onreadystatechange = alertContents;
http_request.open('GET', url, true);
http_request.send(null);

}

function alertContents() {

if (http_request.readyState == 4) {
if (http_request.status == 200) {
alert(http_request.responseText);
} else {
alert('There was a problem with the request.');
}
}

}
</script>

<span
style="cursor: pointer; text-decoration: underline"
onclick="makeRequest('test.html')">
发出请求
</span>

在这个例子中:

  • 用户在浏览器里点击“发出请求”(make a request);
  • 这会调用makeRequest()函数,并且附有参数test.html,一个自阿同一目录下的HTML文档的名字。
  • 请求被发出,然后(onreadystatechange)操作被传递给alertContents()
  • alertContents()检查响应是否被接收和是否状态为“OK”,然后alert() test.html文件的内容。

你可以在这里测试这个例子,并且可以在这里看见测试文件。

与XML响应协同工作

在上个例子中,在HTTP响应被接收完毕后,我们和使用了请求对象的responseText属性,其包含了test.html文件的内容。现在,让我们试试responseXML属性。

让我们现在就创建一个有效的XML文档,这个文档稍后会被我们请求。文档(test.xml)包括:

<?xml version="1.0" encoding="utf-8" ?>
<root>
这是个测试.
</root>

我们只需要在脚本中用下面的内容替换请求行:

...
onclick="makeRequest('test.xml)">
...

然后在alertContents()里把alert()行替换成alert(http_request.responseText);,并且,在其上方写下:

var xmldoc = http_request.responseXML;
var root_node = xmldoc.getElementsByTagName('root').item(0);
alert(root_node.firstChild.data);

这样,我们获取了responseXML中的XMLDocument对象,并且用DOM方法来访问了XML文档中所包含的某些内容。你可以在这里浏览到test.xml,更新后的脚本可以在这里得到。

可以去Mozilla’s DOM implementation获取更多的DOM方法。

This article was originally written in April 2002, I’ve decided to fix and update it as the objects finally seem to be getting some popularity. The 2002 version is still available, as is the September 2004 version. This version August 2005.

Internet Explorer on Windows, Safari on Mac OS-X, Mozilla on all platforms, Konqueror in KDE, IceBrowser on Java, and Opera on all platforms including Symbian provide a method for client side javascript to make HTTP requests. From the humble begins as an oddly named object with few admirers, it’s blossomed to be the core technology in something called AJAX [1].

The Object makes many things easier and neater than they other would be, and introduces some things that were otherwise impossible such as HEAD requests to see when a resource was last modified, or to see if it even exists. It makes your scripting options more flexible allowing for POST requests without having the page change, and opens up the possibility of using PUT, DELETE etc. These methods are increasingly used to provide richer Web Applications like G-Mail that use lower bandwidth and offer snappier user interaction.
Why XML HTTP Request object?

Whilst the object is called the XML HTTP Request object it is not limited to being used with XML, it can request or send any type of document, although dealing with binary streams can be problematical in javascript.
Creating the object

In Internet Explorer, you create the object using new ActiveXObject("Msxml2.XMLHTTP") or new ActiveXObject("Microsoft.XMLHTTP") depending on the version of MSXML installed. In Mozilla and Safari (and likely in future UA’s that support it) you use new XMLHttpRequest()

This means that you need to show different script to different browsers, as what works in one, will error in another. The script below does this, and if it’s not supported, the variable is set to false to allow for appropriate error messages and recovery with degrading to more normal HTTP transaction methods when the object isn’t available. This degradation is important, even in IE the objects can often be blocked by slightly raised security settings (popular due to the commonly exploited holes of course). Where possible degrade, some approaches are talked about below, if you really can’t, I’d recommend providing an alternative page aswell. GMail for example has said they’ll be providing a less demanding version in the future, hopefully with no javascript at all, full degradation.

var xmlhttp=false;
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
// JScript gives us Conditional compilation, we can cope with old IE versions.
// and security blocked creation of the objects.
 try {
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
 } catch (e) {
  try {
   xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (E) {
   xmlhttp = false;
  }
 }
@end @*/
if (!xmlhttp && typeof XMLHttpRequest!=’undefined’) {
  xmlhttp = new XMLHttpRequest();
}

How do I make a request?

Making a HTTP request is very simple. You tell the XML HTTP request object what sort of HTTP request you want to make and which url you want to request. Provide a function to be called when as the request is being made, and finally what, (if any) information you want sent along in the body of the request.

The following script makes a GET request for the relative url "text.txt" (relative to the calling page) It provides the function, which checks the readyState property each time it’s called and when it has the value 4 – meaning the load is complete, it displays the responseText to the user with an alert.

 xmlhttp.open("GET", "test.txt",true);
 xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4) {
   alert(xmlhttp.responseText)
  }
 }
 xmlhttp.send(null)

Try the example.
Making a HEAD request

With a HEAD request, a server will only return the headers of a resource, rather than the resource itself, this means you can find out the Content-Type or Last-Modified of a document, without downloading it itself.

A typical HEAD request might return something like this:

HTTP/1.1 200 OK
Server: Microsoft-IIS/4.0
Cache-Control: max-age=172800
Expires: Sat, 06 Apr 2002 11:34:01 GMT
Date: Thu, 04 Apr 2002 11:34:01 GMT
Content-Type: text/html
Accept-Ranges: bytes
Last-Modified: Thu, 14 Mar 2002 12:06:30 GMT
ETag: "0a7ccac50cbc11:1aad"
Content-Length: 52282

To make a HEAD request, you simply replace the first parameter with HEAD, and then extract the headers, either using getAllResponseHeaders or getResponseHeader("Name") to get an individual one.

 xmlhttp.open("HEAD", "/faq/index.html",true);
 xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4) {
   alert(xmlhttp.getAllResponseHeaders())
  }
 }
 xmlhttp.send(null)

Try the example.
Using HEAD requests, to find the Last-Modified of another file.

One use of HEAD requests, is to find out when a url was modified, extending the previous example, you get something like this:

 xmlhttp.open("HEAD", "/faq/index.html",true);
 xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4) {
   alert("File was last modified on – "+
    xmlhttp.getResponseHeader("Last-Modified"))
  }
 }
 xmlhttp.send(null)

Try the example.

To format the date differently, or use something other than alert, the javascript FAQ will tell you more.
Does a url exist?

Another simple use is finding if a url exists, in HTTP there are various status codes returned by both HEAD and GET requests, 200 means success, 404 means failure, and the others mean other things. See HTTP status codes for a full explanation. using the status property of the xmlhttp object provides you this status

 xmlhttp.open("HEAD", "/faq/index.html",true);
 xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4) {
   if (xmlhttp.status==200) alert("URL Exists!")
    else if (xmlhttp.status==404) alert("URL doesn’t exist!")
     else alert("Status is "+xmlhttp.status)
  }
 }
 xmlhttp.send(null)

Try the example: with a url that exists, with a url that does not exist
Calling a server-side Script without refreshing the page

Forms are the way to "call" serverside scripts in HTML, they force the page reload, and this is often not very user friendly. Using the HTTP Request, you can call the script without refreshing the page, and still have the form "fallback" to working when the XML HTTP Request Object is not available.

<%
 a=+(Request.QueryString(‘a’)+”)
 b=+(Request.QueryString(‘b’)+”)
 if (isNaN(a) || isNaN(b)) {a=”;b=”;total=” }
  else {
   total=a+b
  }
 acc=Request.ServerVariables(‘HTTP_ACCEPT’)+”
 if (acc.indexOf(‘message/x-jl-formresult’)!=-1) {
  Response.Write(total)
 } else {
%>
<script src="xmlhttp.js" type="text/javascript"></script>
<script>
 function calc() {
  frm=document.forms[0]
  url="add.1?a="+frm.elements['a'].value+"&b="+frm.elements['b'].value
  xmlhttp.open("GET",url,true);
  xmlhttp.onreadystatechange=function() {
   if (xmlhttp.readyState==4) {
    document.forms[0].elements['total'].value=xmlhttp.responseText
   }
  }
 xmlhttp.setRequestHeader(‘Accept’,'message/x-jl-formresult’)
 xmlhttp.send()
 return false
}
</script>
<form action="add.1" method="get" onsubmit="return calc()">
<input type=text name=a value="<%=a%>"> + <input type=text name=b value="<%=b%>">
 = <input type=text name=total value="<%=total%>">
<input type=submit value="Calculate">
</form>
<%
}
%>

Try the example page

The example above uses JScript in ASP as the server side language, the HTTP ACCEPT header is used to tell the server which response to send back – either the full page or just the result. The HTTP ACCEPT header is used to tell servers what mime-types the client will accept, normally it says things like text/html etc. Here though we tell it we only accept "message/x-jl-formresult", so the server knows it is our client (or another client, who knows about "message/x-jl-formresult") making the request.

Other methods of identifying what to return may be appropriate depending on the type of data you send to the server, or you could simply use different urls for the form submission and xmlhttp request, whatever you do, remember to have sensible fallback to the non-xml http request browsers where possible.
Using JSON as the transfer language

Whilst XML can be used to encode the information you retrieve with the object and it will be available in the responseXML property, however xml is less well supported, some browsers require that the content type of the resource is one of only 2 possible XML mime-types text/xml or application/xml for the property to be populated, and there are always the normal well formness problems you always get with XML. JSON is a good alternative, it’s fast to parse, and much, much faster to access in script.

I use JSON in the Flight Routeplanner to look up information on airports, an Example with London Heathrow, you can easily parse the returned JSON into a script object using the new Function constructor, it checks the status as the script returns 404 if it fails to find an airport with that iata code.

 xmlhttp.open("GET","/routeplanner/airport.1?LHR",true);
 xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4) {
   if (xmlhttp.status!=404) {
    var local=new Function("return "+xmlhttp.responseText)();
    alert("Code – Name\n"+local[0].id+’ – ‘+local[0].name);
   } else {
    alert("Airport not found");
   }
  }
 }
 xmlhttp.send(null);

Try the example.
Using XMLHTTP with GOOGLE’s SOAP API

Google provides a SOAP interface to it’s database. You need to register for a key that lets you make 1000 a day, to make a request. You then need to parse the returned XML.

 search="Word"
 xmlhttp.open("POST", "http://api.google.com/search/beta2",true);
 xmlhttp.onreadystatechange=function() {
  if (xmlhttp.readyState==4) {
   alert(xmlhttp.responseText)
  }
 }
 xmlhttp.setRequestHeader("Man", "POST http://api.google.com/search/beta2 HTTP/1.1")
 xmlhttp.setRequestHeader("MessageType", "CALL")
 xmlhttp.setRequestHeader("Content-Type", "text/xml")

 xmlhttp.send("<?xml version=’1.0′ encoding=’UTF-8′?>"+"\n\n"+"<SOAP-ENV:Envelope"+
      ‘ xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"’+
      ‘ xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"’+
      ‘ xmlns:xsd="http://www.w3.org/1999/XMLSchema">’+
      ‘<SOAP-ENV:Body><ns1:doGoogleSearch’+
      ‘ xmlns:ns1="urn:GoogleSearch"’+
      ‘ SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">’+
      ‘<key xsi:type="xsd:string">GOOGLEKEY</key> <q’+
      ‘ xsi:type="xsd:string">’+search+’</q> <start’+
      ‘ xsi:type="xsd:int">0</start> <maxResults’+
      ‘ xsi:type="xsd:int">10</maxResults> <filter’+
      ‘ xsi:type="xsd:boolean">true</filter> <restrict’+
      ‘ xsi:type="xsd:string"></restrict> <safeSearch’+
      ‘ xsi:type="xsd:boolean">false</safeSearch> <lr’+
      ‘ xsi:type="xsd:string"></lr> <ie’+
      ‘ xsi:type="xsd:string">latin1</ie> <oe’+
      ‘ xsi:type="xsd:string">latin1</oe>’+
      ‘</ns1:doGoogleSearch>’+
    ‘</SOAP-ENV:Body></SOAP-ENV:Envelope>’)

Google is using a SOAP interface, many people think SOAP has some serious issues worth considering. REST is probably a better model as it works with the current web framework, proxies, caches etc. So whilst we can use the XML HTTP Request object to talk soap, it’s probably best not to unless you have no control over what’s happening on the server end. (Thanks to Dan Schmierer for pointing out an error in my script.)

By default the object can only call back to the same server, in a reduced security environment (accessed from file:// say) IE can access any domain, Mozilla can also do that if you request and are granted the appropriate permissions see "a google thread I can’t get to offline!"

2005年09月09日

注掉的是原来的代码。修改的文件是:SliceUpdate_Process.asp,在编辑碎片时, 多个文件用","逗号隔开

dim n,fPath1
  fPath1=split(Rs("file_path"),",")
  for n=0 to ubound(fPath1)
        If  FLib.ChkPathType(fPath1(n)) = 1 Then
  ‘If  FLib.ChkPathType(Rs("file_path")) = 1 Then
             fPath = fpath1(n)
   ‘fPath = Rs("file_path")
        Else
             fPath = Server.MapPath(fpath1(n))
   ‘fPath = Server.MapPath(Rs("file_path"))
        End If
        SaveSliceContent fPath, Rs("start_flag"), Rs("end_flag"), tmpContent
  next
        Rs.MoveNext

原贴地址:

http://bbs.bpips.com/forum_posts.asp?TID=1360

此方法经测试有效

应用为多个文件后输入框最好能做相应修改,否则长度有限

建议把“,”分隔改为回车分隔,同时把输入框改为文本框,数据库对应字段改为备注类型

碎片三种类型:


三种类型分别是:动态、手工、静态。区别在于:“动态类型”是利用XML来调用数据库相关记录;“手工类型”是和TSYS1.1版的“页面内容替换”方式是一样的;“静态类型”是调用某一个文件里的内容。

 
碎片的更新原理:


打开“SliceUpdate_Process.asp”文件,细看第58行的“Function ExeCuteSliceById(IdList)”函数,它首先是打开“slice_list”表,通过“slice_type”(碎片类型)来将“slice_data” 赋于不同的变量:动态类型的交给“inc/SliceParser.class.asp”文件中的“Compile()”来处理;静态类型的交给“inc/ FunctionLib.class.asp”文件中的“ChkPathType()”来判断文件所使用的路径类型。无论是“动态类型”还是“静态类型”,其返回的结果都和“手工类型”一样,把结果赋于“tmpContent”变量。

下面接着是继续调用数据库取出“fPath”(要处理的文件名)、“start_flag”(起始标签)、“end_flag”(结束标签),将这四个变量都交给“SaveSliceContent()”函数来处理,下面接着看第116行“Function SaveSliceContent(fPath, sFlag, eFlag, strHtml)”。

在“SaveSliceContent()”中,开始以“Template.class.asp”中的过程声明一个对象:“Tpl”,上述四个变量都交给这个对象来处理了,其处理过程和TSYS1.1版的过程一样。大家感兴趣可以打开“Template.class.asp”文件看看。


碎片不足的地方:


大家在设置碎片的时候有没有发现,作用于文件的路径只能设置一个,如果一个碎片在多个文件中调用,是不是一样的碎片有设置多个。 其实在“SaveSliceContent()”函数中改改即可,偶的想法是判断出“Path”中一共有几个路径,然后设个循环依次处理。其处理方法完全参照TSYS1.1版来。


原贴地址:

http://bbs.bpips.com/forum_posts.asp?TID=998

在“碎片包列表”一栏里填写碎片的ID,用“,”分隔

如 20,21,22

则可一次更新多个碎片

2005年08月26日

发起人是Ly(colorbird.com),短短几天已经聚集了不少站长,蓝色也进来了,哈哈。

临时的成员列表页

http://www.52changsha.com

欢迎更多的站长参与我们的交流
QQ群:12671243
加入时请注明网址