以下是引用 阿甲 于 2013/3/28 10:49:20 发表的文字:
在dp2circulation中的脚本中,尝试写了下面这一段:
===================
// 根据馆藏地判断可借与否
if (StringUtil.IsInList("红泥巴/典藏室", strItemLocation) == true)
{
strMessageText = "红泥巴典藏室不能外借";
return false;
}
strMessageText = "可借";
====================
大概实现了这样的效果,当借的书馆藏点在 红泥巴/典藏室 时,便会弹出窗口显示"红泥巴典藏室不能外借"
不知这么写是否有问题?
现在,有这样的需求:在 红泥巴/ 分馆下有N个馆藏点,但只有其中一个或两个馆藏点是可以外借的,这应该怎么写呢?比如只有 红泥巴/阅览室 和 红泥巴/绘本馆 这两个馆藏点是可以外借的,而在 红泥巴/ 以下的所有馆藏点都不能外借。同时,这样的限定不影响其他分馆。
还有一个问题由于条件所限没有测试过。就是A分馆的管理员在写脚本的时候,是否有可能影响B分馆。比如A分馆在限定自己的馆藏点外借问题的时候,不小心写到了涉及全局的脚本,是否会产生对全局或其他分馆的影响?
dp2circulation 里面的脚本很多,我猜测您说的是 dp2library 也就是服务器端的 library.xml 中的脚本,其中有这么一个函数:
public bool ItemCanBorrow(
bool bRenew,
Account account,
XmlDocument itemdom,
out string strMessageText)
这个函数一旦起作用,在 dp2circulation 中“系统管理窗”的“馆藏地”属性页的配置就失效了,系统认上述脚本函数的作用。
这个函数确实是能起到精确限定各种复杂的允许借阅的组合情况的作用。但缺点也是显而易见的,就是编写复杂,而且当分馆模式下,地点很多的时候,代码更会复杂。地点发生变动,代码也要及时修改,维护起来还是很麻烦的。
所以,最近我在琢磨一个类似的功能,就是根据分馆模式下常见的应用,用更简单配置文件或界面来设定这些规则,包括那个操作者不能负责借或者还某个地点的图书,不要用二次开发的脚本来弄。这个新功能能部分取代上述脚本功能。当然,这个新功能还没有出来以前,玩一玩这个服务器端脚本也是不错的。
> 在 红泥巴/ 分馆下有N个馆藏点,但只有其中一个或两个馆藏点是可以外借的,这应该怎么写呢?
可以在 if 探测到可以外借的地点字符串的时候,返回 true;其他情况简单返回 false 就可以了。
例如:
if (StringUtil.IsInList("红泥巴/阅览室", strItemLocation) == true || StringUtil.IsInList("红泥巴/绘本馆", strItemLocation) == true )
{
strMessageText = "可借";
return true;
}
strMessageText = strItemLocation + "不能外借";
return false;
当然,这还是针对一个分馆的情况判断语句。
> 同时,这样的限定不影响其他分馆。
可以把每个分馆的一段语句放在一个更大的 if 里面。这样,每个if 里面的逻辑修改,都不会影响到其他 if 内的逻辑了。
那这里就涉及到如何从 strItemLocation 中观察 左边部分,也就是分馆名的问题。系统有一些库函数可以达到这个效果。
首先,从册记录的 <location> 元素中获得字符串有一定的要求,因为这个元素内有时候可能是 "#reservation,分馆/阅览室"这样的形态,所以用下面语句得到比较可靠:
// 馆藏地点
string strLocation = DomUtil.GetElementText(item_dom.DocumentElement, "location");
// 去掉#reservation部分
strLocation = StringUtil.GetPureLocationString(strLocation);
注意,GetPureLocationString() 函数就是专门用来得到干净的字符串的,去掉了 # 部分。
然后,可以用下面的代码,将分馆部分和地点部分分离:
string strRoomName = ""; // 阅览室名
string strLibraryCode = ""; // 馆代码
// 解析
LibraryApplication.ParseCalendarName(strLocation,
out strLibraryCode,
out strRoomName);
这样,判断起来就方便了:
if (strLibraryCode == "红泥巴")
{
if (strRoomName == "阅览室")
{
....
}
....
}
if (strLibraryCode == "望湖小学")
{
if (strRoomName == "教师图书馆")
{
....
}
....
}
~~~
但是,您举例的应用实在太典型了,还不是真正要用 library.xml 中脚本的理由。
因为在 dp2circulation 中“系统管理窗”的“馆藏地”属性页的配置本来是完全可以的!所谓典型的应用,就是这个地点明确可以借,那个地点明确不能借。如果这么明确,用个对照表就可以配置,何必动用脚本。
我看了一下红泥巴数字平台服务器上目前的“馆藏地”属性页,应该是能奏效的(当然前提是要删除 ItemCanBorrow() 脚本函数)。
那么什么情况才是脚本适合应用的场合呢?比如,有个地点,对某些读者允许外借,对另外的读者不允许外借。比如,有个地点上午允许外借,下午不能外借。类似这种复杂的非常规的情况,才是值得用脚本的。后面如果有兴趣我们可以针对这些假想的情景做一些练习,这样以后一旦遇到复杂的情况,相关的经验就可以派上用场了。