NeatCN(NeatStudio工作室) NeatStudio工作室

Archive for 三月, 2010

根据日期取得当前的星期

03.30.2010 · Posted in PHP开发

PHP的date函数是有时间范围区间的,即只能从1970~2038年,因此在这个区间范围之外的算法都是不准的。那倒底怎么算呢?其实是有一个公式的: 蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 公 式中的符号含义如下,w:星期;c:世纪-1;y:年(两位数);m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的 13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。(C是世纪数减一,y是年份后两位,M是月份,d是日数。1月和2月要按上一年的13月和 14月来算,这时C和y均按上一年取值。) 算出来的W除以7,余数是几就是星期几。如果余数是0,则为星期日。【膘叔备注,如果小于0,则先+7再取余数】 以2049年10月1日(100周年国庆)为例,用蔡勒(Zeller)公式进行计算,过程如下: 蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 =49+[49/4]+[20/4]-2×20+[26× (10+1)/10]+1-1 =49+[12.25]+5-40+[28.6] =49+12+5-40+28 =54 (除以7余5) 即2049年10月1日(100周年国庆)是星期5。 你的生日(出生时、今年、明年)是星期几?不妨试一试。 但其实上面的并不是特别准,我根据上面的公式写了一段代码。。。 //蔡勒(Zeller)公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1 function getDayofWeek ( $datetime , $delimiter = '-' ) { //其实这个explode,可以参考split函数,它的分隔支持类似正则的批量处理,比如split("[/.-]",$datetime),可以查一下手册 list($year,$month,$day) = explode( $delimiter, $datetime ); if(strLen( $year ) == 2 && $year < 50){ $century = 20; //世纪数为当前世纪数-1 }else{ $century = subStr( $year, ...

jQuery图片自动缩放

03.28.2010 · Posted in Javascript开发

半年前写的代码,现在看看也不算太差就放上来了 $(document).ready(function(){ $('div').autoResize({height:50}); //用法 }); jQuery.fn.autoResize = function(options) { var opts = { 'width' : 400, 'height': 300 } var opt = $.extend(true, {},opts,options || {}); width = opt.width; height = opt.height; $('img',this).each(function(){ var image = new Image(); image.src = $(this).attr('src'); //开始检查图片 if(image.width > 0 && image.height > 0 ){ var image_rate = 1; if( ...

为Zend的table加上prefix

03.24.2010 · Posted in PHP开发

我不知道别人是怎么做的。我做的很累啊。。。明明在继承Zend_Db_Table_Abstract的类中打印getAdapter方法时,有_config变量,但是,它是protected的,没有找到合适的方法调用。 于是没办法。到bootstrap.php文件里加了一个方法。 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { protected $_bootConfig; public function __construct( $application ) { parent::__construct($application); $this->_bootConfig = new Zend_Config_Ini( APPLICATION_PATH . '/configs/application.ini' ); Zend_Registry::set('config', $this->_bootConfig); } } 这样。我在bootstrap中也能直接使用 $this->_bootConfig 的变量。因为我使用了smarty,而且用的不是继承的方法。所以直接在__construct方法中把config变量赋值出来也有一定的方便之处。 就象这样: public function _initView() { require_once ('Smarty/Smarty.class.php'); $tpl = new Smarty(); $tplSettings = $this->_bootConfig->staging->smarty->toArray(); foreach( $tplSettings as $key=>$value){ $tpl->$key = $value; } Zend_Registry::set( 'tpl', ...

简单学习一下Zend_ACL

03.24.2010 · Posted in PHP开发

如果不想用rbac那么,简单权限管理ACL,应该是最方便的了。简要说一下原理吧。。 这个文件是放在/application/models/目录下的Acl.php,调用的时候就直接 $identity = Zend_Auth::getInstance()->getIdentity(); $acl = new Application_Model_Acl(); //然后判断 if( $acl->isAllowed( $identity['Role'] , 'xxxxx' ,'yyyy' )); //xxxx是controller名,yyyy是controller里的action名称。不用额外加action。。。 class Application_Model_Acl extends Zend_Acl { public function __construct() { /* * 第一次添加权限 "guest" ,支持查看所有的内容 */ $this->addRole(new Zend_Acl_Role('guest')); /* * 添加 'user' 组权限,权限大于 guest * 用户组能够发表回复 */ $this->addRole(new Zend_Acl_Role('user'), 'guest'); /* * 添加一个auth组 * auth用户权限基于user,并且可以发表文章 */ $this->addRole(new Zend_Acl_Role('auth'), ...

QeePHP中的优秀函数(三)

03.22.2010 · Posted in PHP开发

这几个函数还是来自于QeePHP的核心类Q中。不过,我是自认为,我的configure类有部分写的比他好,不过我没有考虑删除之类的。呵呵。 /** * 获取指定的设置内容 * * $option 参数指定要获取的设置名。 * 如果设置中找不到指定的选项,则返回由 $default 参数指定的值。 * * @code php * $option_value = Q::ini('my_option'); * @endcode * * 对于层次化的设置信息,可以通过在 $option 中使用“/”符号来指定。 * * 例如有一个名为 option_group 的设置项,其中包含三个子项目。 * 现在要查询其中的 my_option 设置项的内容。 * * @code php * // +--- option_group * // +-- my_option = this is my_option * // +-- ...

QeePHP中的优秀函数(二)

03.21.2010 · Posted in PHP开发

这两个函数来自于Helper_Array,我觉得是非常常用的方法,功能也比较强大。适合大家使用。 /** * 将一个平面的二维数组按照指定的字段转换为树状结构 * * 用法: * @code php * $rows = array( * array('id' => 1, 'value' => '1-1', 'parent' => 0), * array('id' => 2, 'value' => '2-1', 'parent' => 0), * array('id' => 3, 'value' => '3-1', 'parent' => 0), * * array('id' => 7, 'value' => '2-1-1', 'parent' => 2), ...

QeePHP中的优秀函数(一)

03.20.2010 · Posted in PHP开发

基类Q中的normalize。 /** * 对字符串或数组进行格式化,返回格式化后的数组 * * $input 参数如果是字符串,则首先以“,”为分隔符,将字符串转换为一个数组。 * 接下来对数组中每一个项目使用 trim() 方法去掉首尾的空白字符。最后过滤掉空字符串项目。 * * 该方法的主要用途是将诸如:“item1, item2, item3” 这样的字符串转换为数组。 * * @code php * $input = 'item1, item2, item3'; * $output = Q::normalize($input); * // $output 现在是一个数组,结果如下: * // $output = array( * // 'item1', * // 'item2', * // 'item3', * // ); * * ...

Google maps API开发(一)

03.17.2010 · Posted in Javascript开发

由于自己想在mzditu.com上运用google maps api进行开发,在看到这篇相对比较简单的介绍文章时,就下载下来进行了学习,现在贴上分析代码。 一、加载 Google maps API的JS文件 很明显的,你可以看到,我们加载的JS文件来自于http://ditu.google.com,而后面的apikey则需要到http://code.google.com/intl/zh-CN/apis/maps/signup.html注册申请。(因为,它需要绑定自己的域名,否则不能被正确使用) 二、创建一个简单的应用 1、加载Google地图 //声明一个GMap2全局变量 var map; function load() { //检查浏览器的兼容性. if (GBrowserIsCompatible()) { map = new GMap2(document.getElementById("map")); //加载地图 map.addControl(new GLargeMapControl()); //增加全功能控件 map.addControl(new GMapTypeControl()); //设置地图类型 map.enableScrollWheelZoom(); //设置地图支持滚轮 map.setCenter(new GLatLng(39.990168, 116.295304), 10); //设置地图的中心坐标 map.enableDoubleClickZoom(); //开启双击google map会自动放大. map.enableScrollWheelZoom(); //开启滚动鼠标自动放大和缩小. // } } 2、添加一个创建GMarker的方法 function createMarker(baseIcon, point, html) { var icon = ...

测试最简单的插件

03.16.2010 · Posted in News, Wordpress开发

尝试使用wordpress的时候,看了一下插件的简要信息,说白了,就是一个add_filter在调用相关信息。于是参照hello_dolly插件写了一个最简单的插件,也就是在文章内容后面加上一个版权信息。好象除了默认的模版外,其他就没有这样的提示了。所以,我就开始这样的尝试。 /** * @package NeatCN Copyright * @author neatcn / gouki * @version 0.1 */ /* Plugin Name: NeatCN WordPress Copyright Plugin URI: http://neatcn.com/# Description: 显示文章的版权信息 Author: NeatCN / gouki Version: 0.1 Author URI: http://neatcn.com/ */ function neatCopyRight ( $content ) { $content .= < ...

采用 CURL登录量子统计(二)

03.15.2010 · Posted in News, PHP开发

本文就全是代码了。。。 $cookiefile = tempnam( './log/' , 'cookie' );//设定cookie文件的路径 。 $ch = curl_init(); $header[]="Content-Type: application/x-www-form-urlencoded"; curl_setopt($ch, CURLOPT_URL, 'http://www.linezing.com/login.php'); //登录地址 curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //发送header ,其实这个header可以不发送 curl_setopt($ch, CURLOPT_POST, 1); //这是POST数据 curl_setopt($ch, CURLOPT_POSTFIELDS, 'referer=&webname=index&username=用户名&password=密码&submit=%E7%99%BB%E5%BD%95');//http_build_query( $postData)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //这个是代表curl_exec后取返回成字符串,而不是象WEB一样跳转 curl_setopt($ch, CURLOPT_HEADER, 0); //curl返回的时候,默认都是带有header信息的,所以这里设为0,代表返回的时候不要header信息 curl_setopt($ch, CURLOPT_ENCODING, 'gzip,deflate'); //这是在用sniff抓包的时候发现用了gzip,deflate的encoding, curl_setopt($ch, CURLOPT_REFERER, 'http://www.linezing.com/');//记录来源的Referer curl_setopt($ch, CURLOPT_COOKIEFILE,$cookiefile); curl_setopt($ch, CURLOPT_COOKIEJAR,$cookiefile); curl_exec($ch); //我这里并没有取返回值,主要是把cookie记录下来 curl_setopt($ch, CURLOPT_URL, 'http://www.linezing.com/router.php'); ...