Zend Framework路由器设置方法

路由是个过程,在这个过程中它取出URI的端点(跟着基本URL的URI的那部分)并把它分解成参数来决定哪个模块、哪个控制器和控制器中的哪个动作应该接受请求。模块、控制器、动作和其它参数被打包到Zend_Controller_Request_Http对象,接着这个对象由Zend_Controller_Dispatcher_Standard来处理。路由只发生一次:当请求最初被接收和第一个控制器被派遣之前。

一般地,更新配置文件比修改代码更方便。这个可能通过addConfig()方法来做。基本上,你创建一个Zend_Config-compatible配置,并在你的代码中读入然后传递给RewriteRouter。

本例中,使用INI文件进行路由器配置。下面为具体代码。

[php]
/*
* Bootstrap.php
*/

protected function _initRouter()
{
$router = Zend_Controller_Front::getInstance()->getRouter();
$config = new Zend_Config_Ini(APPLICATION_PATH.’/configs/route.ini’, ‘production’);
$router->addConfig($config, ‘routes’);
}
[/php]

[shell]
[production]
routes.archive.type = “Zend_Controller_Router_Route_Regex”
routes.archive.route = “archive/(\d+)”
routes.archive.defaults.controller = “archive”
routes.archive.defaults.action = “show”
routes.archive.map.1 = “year”
routes.archive.reverse = “archive/%d”
[/shell]

Zend Framework提供的路由器功能十分强大,设置起来非常灵活。对于路由器的各种用法,在Zend Framework参考手册中有非常详细的介绍,大家可以参看:
《标准路由器 – Zend Framework Manual》

Zend Form中如何将英文错误提示设置为中文错误提示(Zend_Form国际化)

可查看Zend Framework的官方参考手册:Internationalization of Zend_Form

Zend_Form表单验证的错误提示均默认为英文,下面介绍如何将英文错误提示设置为中文。

[php]
// application/Bootstrap.php

protected function _initForm()
{
$translate = new Zend_Translate(
array(
‘adapter’ => ‘csv’,
‘content’ => APPLICATION_PATH.’/configs/translation/error-message.csv’,
‘locale’ => ‘zh_CN’,
‘delimiter’ => ‘,’
)
);
Zend_Form::setDefaultTranslator($translate);
}
[/php]

[php]
// application/configs/translation/error-message.csv

“Value is required and can’t be empty”,”此项不可以为空”
“‘%value%’ has not only alphabetic and digit characters”,”‘%value%’不是字母或数字”
“‘%value%’ is an empty string”,”此项不可以为空”
“‘%value%’ has not only alphabetic characters”,”‘%value%’包含非英文字母的字符”
“isValid”,”错误”
“‘%value%’ must contain between 13 and 19 digits”,”‘%value%’必须是一个13到19位之间的数字”
“Luhn algorithm (mod-10 checksum) failed on ‘%value%'”,”Luhn algorithm (mod-10 checksum) failed on ‘%value%'”
“‘%value%’ is not between ‘%min%’ and ‘%max%’, inclusively”,”‘%value%’ 不在 ‘%min%’ 和 ‘%max%’之间”
“‘%value%’ is not strictly between ‘%min%’ and ‘%max%'”,”‘%value%’ 必须大于 ‘%min%’ ,小于 ‘%max%'”
“‘%value%’ is not of the format YYYY-MM-DD”,”‘%value%’ 必须是类似 YYYY-MM-DD 这样的日期格式”
“‘%value%’ does not appear to be a valid date”,”‘%value%’ 是一个错误的日期”
“‘%value%’ does not fit given date format”,”‘%value%’ 日期格式错误”
“‘%value%’ contains not only digit characters”,”‘%value%’ 不是数字”
“‘%value%’ is not a valid email address in the basic format [email=local-part@hostname]local-part@hostname[/email]”,”这不是一个电子邮件地址”
“‘%hostname%’ is not a valid hostname for email address ‘%value%'”,”这不是一个电子邮件地址”
“‘%hostname%’ does not appear to have a valid MX record for the email address ‘%value%'”,”这不是一个电子邮件地址”
“‘%localPart%’ not matched against dot-atom format”,”这不是一个电子邮件地址”
“‘%localPart%’ not matched against quoted-string format”,”这不是一个电子邮件地址”
“‘%localPart%’ is not a valid local part for email address ‘%value%'”,”这不是一个电子邮件地址”
“‘%value%’ exceeds the allowed length”,”‘%value%’不是一个电子邮件地址”
“‘%value%’ does not appear to be a float”,”‘%value%’不是一个浮点数”
“‘%value%’ is not greater than ‘%min%'”,”输入值必须大于 ‘%min%'”
“‘%value%’ has not only hexadecimal digit characters”,”输入值不是一个十六进制字符串”
“Tokens do not match”,”表单已过期,请重新提交”
“No token was provided to match against”,”表单已过期,请重新提交”
“‘%value%’ was not found in the haystack”,”‘%value%’不在可选范围之内”
“‘%value%’ does not appear to be an integer”,”‘%value%’ 不是一个整数”
“‘%value%’ does not appear to be a valid IP address”,”‘%value%’ 不是一个合法的IP地址”
“‘%value%’ is not less than ‘%max%'”,”输入值必须小于 ‘%max%'”
“‘%value%’ does not match against pattern ‘%pattern%'”,”‘%value%’ 不符合输入规则 ‘%pattern%'”
“‘%value%’ is less than %min% characters long”,”‘%value%’ 字符长度小于 %min% 位”
“‘%value%’ is greater than %max% characters long”,”‘%value%’ 字符长度超过 %max% 位”
“Captcha value is wrong”,”验证码错误”
“The two given tokens do not match”,”请勿直接刷新,表单已过期,请重新提交”
[/php]

Windows 2003 Server如何重装.NET Framework

服务器出了问题,aspx页面均无法访问。锁定错误处在了.Net Framework出了问题。

下载了.Net Framework 2.0的安装程序,但安装出错,提示与原有版本冲突。

因此,需要将原来的.Net Framework卸载干净。

方法就是利用微软提供的cleanup_tool.exe工具。

将这个工具放在了网盘里,大家可以通过下面的链接进行下载。

http://pan.baidu.com/s/1cgs1O

卸载后,即可重新运行安装程序。

安装中遇到错误提示,均选择“重试”即可。

.Net中将数据库结果转换为XML格式数据 —— 使用FOR XML AUTO控制XML输出

sql2005可以直接输出xml 查询结果返回一个xml字符串
在查询语句的末尾加上
FOR XML AUTO,TYPE
例如: select * from table 1 FOR XML AUTO,TYPE

然后用这句sql查询返回一个xml的string,用webservice直接让flash调用方法就好了

另 dataset 可以直接生成xml字符串,很方便
例如:DataSet ds=new DataSet();
string strXML=ds.GetXml();
就是多了一个中间环节,效率不高。
 

使用FOR XML AUTO控制XML输出

这篇文章描述如何通过使用FOR XML AUTO更好的控制XML输出格式。例如添加XML标记。用这个来替代难于理解的FOR XML EXPLICIT 语句。如果你在应用程序中即将反序列化输出的XML,你就会觉得这个信息对你有用。

在For XML从句中,您通常使用下列方式之一:

RAW

AUTO

EXPLICIT

PATH

如果你想完全掌控产生的XML,可以使用FOR XML EXPLICIT。但是它理解起来相当的困难,后面还要维护复杂的select语句。FOR XML AUTO能产生最可读的SELECT语句,但是它也有缺点,不容易控制生成的XML。但使用一些技巧,例如通过使用额外的PATH选项,你可以做一些超过你预期的事情。RAW选项是很少使用,因此不讨论。PATH 选项允许您很容易地混合属性和元素。现在,让我们来使用FOR XML AUTO

在这个例子中,我们使用的是1:N关系的两个简单的数据表。一个表(SalesOrder)包含客户信息的订单,例外一张表(Items)中包含的具体的项。一个订单可以有多个项,一个项往往只属于一个订单。

以最容易的开始。

SELECT * FROM salesorder

产生:

ordernumber customername customerstreet
——— ———— ————–
1 parker first av
2 lesley sec av

如果你想要使结果集是XML,我们添加FOR XML AUTO 语句:

SELECT * FROM salesorder FOR XML AUTO

它产生:

<salesorder ordernumber=”1″ customername=”parker” customerstreet=”first av”/>
<salesorder ordernumber=”2″ customername=”lesley” customerstreet=”sec av”/>

现在,字段是作属性的,大多数情况下希望他们是元素。为了做到这点,添加ELEMENTS 参数

SELECT * FROM salesorder FOR XML AUTO, ELEMENTS

它产生:

<salesorder>
<ordernumber>1</ordernumber>
<customername>parker</customername>
</salesorder>

如果你想要更改’salesorder‘ 标签,使用:

SELECT * FROM salesorder AS niceorder FOR XML AUTO, ELEMENTS

它产生:

<niceorder>
<ordernumber>1</ordernumber>
<customername>parker</customername>
</niceorder>

当然,这一招也适用的列名:

SELECT ordernumber AS order_no FROM salesorder WHERE ordernumber = 1 FOR XML AUTO, ELEMENTS

它产生:

<salesorder>
<order_no>1</order_no >
</salesorder>

如果你想添加其他标签或节点?例如,对有关客户信息添加’customer”标记?但对FOR XML AUTO来说,被证明是很困难的事件。一个可能的解决方案是使用SELF JOIN (join相同的表),但我找到一个更容易办法。经过一番摆弄和修订,我们使用子查询和有点滥用FOR XML PATH命令。

代码

SELECT
ordernumber,
(
SELECT customername ,
customerstreet
FOR XML PATH(),
TYPE, ELEMENTS)
as customer
FROM
salesorder
FOR XML AUTO, ELEMENTS

它产生:

代码

<salesorder>
<ordernumber>1</ordernumber>
<customer>
<customername>parker</customername>
<customerstreet>first av</customerstreet>
</customer>
</salesorder>
<salesorder>
<ordernumber>2</ordernumber>
<customer>
<customername>lesley</customername>
<customerstreet>sec av</customerstreet>
</customer>
</salesorder>

注意使用附加的’TYPE‘参数。这将确保子查询的结果将返回的是一个XML类型 (作为整个XML类型的结果的一部分),而不是NVARCHAR(MAX)类型。如果您要对整个结果添加外围标签,也是简单的小把戏:

SELECT(
SELECT
customername
FROM
salesorder
FOR XML AUTO, TYPE, ELEMENTS
)
AS orderrequest FOR XML PATH(), TYPE, ELEMENTS

它产生:

<orderrequest>
<salesorder>
<customername>parker</customername>
</salesorder>
<salesorder>
<customername>lesley</customername>
</salesorder>
</orderrequest>

为什么我们在子查询中不使用FOR XML AUTO?试试,它会产生一个错误。当子查询是查询一个实际的表时,您才能使用FOR XML AUTO(上述显然不是)。

如果您想对所生产的XML完全控制,子查询是条出路。比方说,我们希望,每个订单,客户的名字和所有的项都属于订单。为此,您使用这样的相关子查询:

SELECT
customername ,
(
SELECT * FROM item WHERE item.ordernumber =
salesorder.ordernumber
FOR XML AUTO, TYPE, ELEMENTS)
FROM
salesorder
FOR XML AUTO, ELEMENTS

它产生:

代码

<salesorder>
<customername>parker</customername>
<item>
<itemnumber>10</itemnumber>
<description>pen</description>
<ordernumber>1</ordernumber>
</item>
<item>
<itemnumber>11</itemnumber>
<description>paper</description>
<ordernumber>1</ordernumber>
</item>
</salesorder>

当使用关联子查询,你可以使用规则的FOR XML AUTO, TYPE, ELEMENTS 语句。如果你想要在’items’外围有一个标签,只需在子查询后添加as,例如:

  • 代码

    SELECT
    customername ,
    (
    SELECT * FROM item WHERE item.ordernumber =
    salesorder.ordernumber
    FOR XML AUTO, TYPE, ELEMENTS)
    AS orderitems
    FROM
    salesorder
    FOR XML AUTO, ELEMENTS

    它产生:

    代码

    <salesorder>
    <customername>parker</customername>
    <orderitems>
    <item>
    <itemnumber>10</itemnumber>
    <description>pen</description>
    <ordernumber>1</ordernumber>
    </item>
    <item>
    <itemnumber>11</itemnumber>
    <description>paper</description>
    <ordernumber>1</ordernumber>
    </item>
    </orderitems>
    </salesorder>

    为什么我们不只是简单的连接item表和order表。这有时会导致不必要的和不可预测的情况,涉及到产生XML布局:

  • 例如:

  • SELECT
    item.description,
    salesorder.customername
    FROM
    salesorder
    INNER JOIN item ON item.ordernumber = salesorder.ordernumber
    FOR XML AUTO, ELEMENTS

    会产生这样的垃圾:

    代码

    <item>
    <description>pen</description>
    <salesorder>
    <customername>parker</customername>
    </salesorder>
    </item>
    <item>
    <description>paper</description>
    <salesorder>
    <customername>parker</customername>
    </salesorder>
    </item>

  • 此外,如果使用连接查询,你很难添加一个外围的标签。因此,对于大多数的控制,使用FOR XML AUTO和关联子查询。

 

浏览器的自动全屏模式 -kiosk

IE浏览器下的Kiosk模式其实是一种真正的全屏浏览模式,他的英文全称为Kiosk Mode(晕死,全称简称都一样!)。他不同于在IE浏览器下使用F11的全屏模式。
Kiosk Software广泛用于公共电脑或者嵌入系统,最常用的就是ATM机、自动服务机之类的系统了,其实他们很多都只是一个浏览器,虽然用Alt+Tab组合键就可以随意切换,但是一般的Kiosk系统不会给你这样的键盘滴。

在IE下设置成Kiosk模式也是十分简单的,方法如下:

  开始-运行-输入

  ”C:\Program Files\Internet Explorer\iexplore.exe” -k

  这样打开的就是一个真正意义上的全屏IE浏览器了!没有地址栏和工具栏等等,要输入网址就要用快捷键了,如果忘记了就直接按Alt+F4关闭了算了,哈哈。

  记住以下的快捷键哦:

  Ctrl+O:新建窗口(空白页上输入URL)

  Alt+Home:跳转到首页

  Alt+右箭头:前进

  Backspace:后退

  如果想玩玩就这样干一把,还有一个一劳永逸的方法,就是把IE的快捷键直接加上一个参数”-k”,这样每次打开IE都是这种模式了!

Chrome自动全屏模式Kiosk
Chrome终极全屏模式,可以用于播放演示页面,如幻灯片等。
进入Chrome终极全屏模式之后,没有退出浮动提示了,需要退出,请直接ALT+F4退出。
想要实现Chrome全屏Kiosk模式,需要先安装一个Chrome浏览器。
然后在桌面新建一个快捷方式,指向Chrome的可执行程序文件,即chrome.exe文件。
在快捷方式->属性->目标…chrome.exe后边加上参数。如:
“C:\Documents and Settings\Administrator\Local Settings\Application Data\Google\Chrome\Application\chrome.exe” http://www.baidu.com –kiosk
保存编辑结果。退出其它Chrome浏览器窗口,再点击刚才建立的窗口,即可进入全屏模式。

回收废旧电池该不该鼓励?

来源: 中国环境报

在辽宁省沈阳市皇姑区三台子街道梅江东社区,奶奶张慧梅和孙女刘一杨在居民楼中设立废旧电池回收处,3年时间回收了近500千克废旧电池,但是将这些废旧电池送往何处却成了一个大问题。

近年来,在全国各地有不少像张慧梅这样自觉收集废旧电池的市民,花费大量时间收集起来的废旧电池同样面临无处可去的尴尬境地。

这些从居民手中回收来的废旧电池,绝大部分是日常生活中使用率比较高的干电池。而按照《废电池污染防治技术政策》规定,废一次电池的回收,应由回收责任单位审慎地开展。在缺乏有效回收的技术经济条件下,不鼓励集中收集已达到国家低汞或无汞要求的废一次电池。

仅从这一政策的字面意思理解,废旧干电池要不要回收,取决于两个方面:一是是否达到国家低汞或无汞要求,达到就不鼓励集中收集,没达到就需要由回收责任单位审慎地回收;二是具备有效回收的技术经济条件时可以回收,否则就缺乏可操作性。

目前来看,公众对废旧电池是否需要回收,仍有很多困惑:既然达标的废旧干电池不需要回收,那么为什么一些公共场所设置了废旧电池回收箱呢?废旧干电池虽然不含汞,但电池中锌、铁、锰等元素会不会污染环境呢?一些热心的组织与个人回收废旧电池后,有没有能力处理这些电池,会不会反而造成集中污染?

比以上问题更严峻的是,随着工业化和信息化进程的加快,人们的日常生活几乎被各种各样的电池所包围,遥控器、手机、电脑、数码相机、MP3、电动剃须刀、电子钟表、计算器、助听器、电动车等都要用电池。尽管普通干电池不存在镉、铅、砷等有毒的重金属,但是其他废旧电池要么是镍镉电池,要么是镍氢电池,要么是锂电池,它们都含有汞、镉、锂、锰、锌、银或铅酸。这些含有有毒物质的电池,又该如何收集,如何处理?

公众长期坚持收集废旧电池,说明老百姓的环境意识增强了,这种热心环保的精神,需要予以肯定和鼓励。如果政府不对其热情加以引导和保护,就会挫伤公众参与环保的积极性。

另一方面,公众往往缺乏专业知识,不知道哪些废旧电池需要收集,收集起来后又该交给谁处理,这些操作层面的问题,则迫切需要有关部门予以解决。

从目前的情况看,废旧电池领域的法律法规和技术政策仍原则性有余、操作性不强。如何增强可操作性,特别是在公众和处理机构之间架起沟通的桥梁,从收集、运输、处理到再利用都有合理的安排,是迫切需要解决的核心问题。

美国是在废旧电池污染管理方面立法最多、最细的一个国家,不仅建立了完善的废旧电池回收体系,而且建立了多家废旧电池处理厂,同时坚持不懈地向公众进行宣传教育,让公众自觉地支持和配合废旧电池的回收工作。

目前来看,需要认真思考并切实予以解决的,不仅是废旧电池问题,更需要延伸到整个电子垃圾领域。

我们希望,更加完备和规范的电子垃圾回收法律法规能够尽快出台,安全高效的电子垃圾回收、处理与再利用产业链条能够尽早形成。只有这样,公众的环保热情才不会再度付诸东流,环境质量的改善也才有更加坚实的基础。

-释疑

废旧电池毒性到底多大?

清华大学环境科学与工程系教授聂永丰撰文明确表示,普通干电池并不存在镉、铅、砷,但含有极微量的汞,全国每年消费电池所含汞加一起,也没有一个选矿企业一年所排废水中含的汞多,其毒害甚至可以忽略不计,况且我国2006年就实现了电池生产无汞化。

普通干电池是否适合集中回收?

聂永丰认为,镍镉电池(可充电500次以上)、铅酸电池(汽车常用)必须回收,其所含有毒物质量大、回收率高;而普通干电池,首先对环境影响微乎其微,其次,回收起来很不经济。从环境风险上看,集中回收对环境污染更大,每回收一吨干电池大约要赔几千元钱。国家已明确指出,现在不鼓励也不提倡集中收集、回收废旧电池。原因是二次污染代价较大。

如何处理废旧电池?

辽宁省铁岭市方盛环保科技有限公司负责人表示,如果废旧电池存放半年以上,就容易产生固化甚至漏液,最好的处理办法就是及时回收,及时清理。当废旧电池达到一定量的时候,才可能成为危险废物。只要回收迅速及时,设立电池回收箱才是环保行为。 作者:陈媛媛