Archive for category 技术研究

Date: 九月 7th, 2011
Cate: PHP, 技术研究

漫谈yii预定义验证

在每一个Model中,总会一些自动生成的验证规则。它是入库前验证是否报错的先决条件。模型中,model的示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
			array('realname, gender, mobile, province, city, district, address, zipcode', 'required'),
			array('realname, mobile, province, city, district', 'length', 'max'=>30),
			array('address', 'length', 'max'=>300),
			array('zipcode', 'length', 'max'=>10),
			array('updated','default', 'value'=>date('Y-m-d H:i:s'), 'setOnEmpty'=>false, 'on'=>'update'),
            array('created, updated', 'default','value'=>date('Y-m-d H:i:s'), 'setOnEmpty'=>false, 'on'=>'insert'),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('id, user_id, realname, gender, mobile, province, city, district, address, zipcode, remark', 'safe', 'on'=>'search'),
		);
	}

上面即是一个典型的模型预定定验证规则。下面,我将能接触到的验证,细细的列出来。

  • boolean : CBooleanValidator 的别名, 确保属性的值是CBooleanValidator::trueValue 或 CBooleanValidator::falseValue 。
  • captcha : CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来的验证码。
  • compare : CCompareValidator 的别名, 确保了特性的值等于另一个特性或常量。
  • email : CEmailValidator 的别名,确保了特性的值是一个有效的电邮地址。
  • default : CDefaultValueValidator 的别名, 为特性指派了一个默认值。
  • exist : CExistValidator 的别名, 确保属性值存在于指定的数据表字段中。
  • file : CFileValidator 的别名, 确保了特性包含了一个上传文件的名称。
  • filter : CFilterValidator 的别名, 使用一个filter转换属性。
  • in : CRangeValidator 的别名, 确保了特性出现在一个预订的值列表里。
  • length : CStringValidator 的别名, 确保了特性的长度在指定的范围内。
  • match : CRegularExpressionValidator 的别名, 确保了特性匹配一个正则表达式。
  • numerical : CNumberValidator 的别名, 确保了特性是一个有效的数字。
  • required : CRequiredValidator 的别名, 确保了特性不为空。
  • type : CTypeValidator 的别名, 确保了特性为指定的数据类型。
  • unique : CUniqueValidator 的别名, 确保了特性在数据表字段中是唯一的。
  • url : CUrlValidator 的别名, 确保了特性是一个有效的路径。

如何实现验证功能 ?

事实上CModel.rules()+CActiveForm.validate的结合就实现验证功能了。下面看示例:

Mocdel的预定验证规定代码与上面一致,则在此略过。
Controller的动作action的相关代码:

1
2
3
4
5
6
7
8
9
10
11
$model=new ModelName;
if(isset($_POST['ModelName']))
{
    $model->attributes=$_POST['ModelName'];
 
   //注2:$model->validate()就是在调用model.rules进行验证
   if($model->validate() && $model->save()) 
   {
      $this->redirect(array('view','id'=>$model->id));
   }
}

视图view表单相关代码:

1
2
3
4
>?php beginWidget(‘CActiveForm’); ?>
>?php errorSummary($model); ?> //注1:这里显示出错时,报错的地方
……
>?php endWidget(); ?>
Date: 九月 5th, 2011
Cate: 前端, 技术研究

HTTP协议状态码的含义

HTTP状态码

1**:请求收到,继续处理
2**:操作成功收到,分析、接受
3**:完成此请求必须进一步处理
4**:请求包含一个错误语法或不能完成
5**:服务器执行一个完全有效请求失败

100——客户必须继续发出请求
101——客户要求服务器根据请求转换HTTP协议版本

200——交易成功
201——提示知道新文件的URL
202——接受和处理、但处理未完成
203——返回信息不确定或不完整
204——请求收到,但返回信息为空
205——服务器完成了请求,用户代理必须复位当前已经浏览过的文件
206——服务器已经完成了部分用户的GET请求

300——请求的资源可在多处得到
301——永久转移
302——在其他地址发现了请求数据
303——建议客户访问其他URL或访问方式
304——客户端已经执行了GET,但文件未变化
305——请求的资源必须从服务器指定的地址得到
306——前一版本HTTP中使用的代码,现行版本中不再使用
307——申明请求的资源临时性删除

400——错误请求,如语法错误
401——请求授权失败
402——保留有效ChargeTo头响应
403——请求不允许
404——没有发现文件、查询或URl
405——用户在Request-Line字段定义的方法不允许
406——根据用户发送的Accept拖,请求资源不可访问
407——类似401,用户必须首先在代理服务器上得到授权
408——客户端没有在用户指定的饿时间内完成请求
409——对当前资源状态,请求不能完成
410——服务器上不再有此资源且无进一步的参考地址
411——服务器拒绝用户定义的Content-Length属性请求
412——一个或多个请求头字段在当前请求中错误
413——请求的资源大于服务器允许的大小
414——请求的资源URL长于服务器允许的长度
415——请求资源不支持请求项目格式
416——请求中包含Range请求头字段,在当前请求资源范围内没有range指示值,请求也不包含If-Range请求头字段
417——服务器不满足请求Expect头字段指定的期望值,如果是代理服务器,可能是下一级服务器不能满足请求

500——服务器产生内部错误
501——服务器不支持请求的函数
502——服务器暂时不可用,有时是为了防止发生系统过载
503——服务器过载或暂停维修
504——关口过载,服务器使用另一个关口或服务来响应用户,等待时间设定值较长
505——服务器不支持或拒绝支请求头中指定的HTTP版本

Date: 九月 3rd, 2011
Cate: PHP, 技术研究

memcache在Yii中如何应用

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
  Memcache是danga的一个项目,最早是LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。
  Memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。
正确使用 memcache 的前提是先在 system/protected/config/main.php 中配置好组件 memcache。

1
2
3
4
5
6
7
8
9
10
 ......
 
    'cache' => array(
        'class'     => 'system.caching.CMemCache',
        'servers' => array(
            array('host' => '222.0.27.35', 'port' => 11213, 'weight' => 60),
         ),
    ),
 
    ......

使用就更简单了

1
2
3
4
5
6
//设置
Yii::app()->cache->set($key, $value, $expire);
// 获取
Yii::app()->cache->get($key);
 // 删除
Yii::app()->cache->deleteValue($key);
Date: 九月 1st, 2011
Cate: CSS
1 msg

去除按钮、链接中的虚线框

话说,对于去除虚线框,即使是一个前端开发工作者,也可能不知道所有的潜规则。因为很多情况下,它是一个视觉上的辅助,并且盲人们需要它(怎么个需要法,别问我),我们并不需要去掉。但在图片替换文字,或者虚线显示不规则的时候,去掉它对于一个产品来说会是更完美的。

如何去除虚线框

对于如何去除虚线框,有很多人推荐这样写:

a:focus, input[type=button] ,input[type=submit] {
        outline:none;
}

从这段代码来看,让我们小分析一下,有两点可能是需要我们注意的:

 

  1. 去除不全面IE6/7 并不支持 outline 属性, firefox 下 input 的虚线并没有去除
  2. 去除太多除 IE6/7 外的所有浏览器的按钮(firefox没去掉)和链接都被去掉虚线框

这是看起来矛盾的两个问题。其实不然,因为是两个现同性质的问题。从技术上,这个方法并不全面。从体验上,我想你也知道,我们只是去掉部分不需要的,去掉全部并不友好。所以,上面的写法个人并不推荐。

去除的方式 生效的浏览器
outline:none IE8 | Firefox | Webkit |Opera
hidefocus IE
:focus{outline:none;} IE8 | Firefox | Webkit | Opera
:active{outline:none;} 同上,但在tab的时候,IE将保留虚线框
::-moz-focus-inner{outline:none;} Firefox 存着bug,input 须要去这个伪状态下的边框

转载幸福收藏夹:http://sofish.de/1366

Date: 九月 1st, 2011
Cate: PHP, 技术研究

Yii表格输入研究

看完Yii表单表格输入后,发现,适合做批量提交。让我们一起来看看下面的代码。参考网址为:http://www.yiiframework.com/doc/guide/1.1/zh_cn/form.table

在上面是这么介绍的:

有时我们想通过批量模式收集用户输入。也就是说, 用户可以为多个模型实例输入信息并将它们一次性提交。 我们将此称为 表格输入(tabular input) ,因为这些输入项通常以 HTML 表格的形式呈现。

要使用表格输入,我们首先需要创建或填充一个模型实例数组,取决于我们是想插入还是更新数据。 然后我们从$_POST 变量中提取用户输入的数据并将其赋值到每个模型。和单模型输入稍有不同的一点就是: 我们要使用$_POST['ModelClass'][$i] 提取输入的数据而不是使用 $_POST['ModelClass']

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public function actionBatchUpdate()
{
    // 假设每一项(item)是一个 'Item' 类的实例,
    // 提取要通过批量模式更新的项
    $items=$this->getItemsToUpdate();
    if(isset($_POST['Item']))
    {
        $valid=true;
        foreach($items as $i=>$item)
        {
            if(isset($_POST['Item'][$i]))
                $item->attributes=$_POST['Item'][$i];
            $valid=$valid && $item->validate();
        }
        if($valid)  // 如果所有项目有效
            // ...则在此处做一些操作
    }
    // 显示视图收集表格输入
    $this->render('batchUpdate',array('items'=>$items));
}

准备好了这个动作,我们需要继续 batchUpdate 视图的工作以在一个 HTML 表格中显示输入项。

<div class="form">
<?php echo CHtml::beginForm(); ?>
<table>
<tr><th>Name</th><th>Price</th><th>Count</th><th>Description</th></tr>
<?php foreach($items as $i=>$item): ?>
<tr>
<td><?php echo CHtml::activeTextField($item,"[$i]name"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]price"); ?></td>
<td><?php echo CHtml::activeTextField($item,"[$i]count"); ?></td>
<td><?php echo CHtml::activeTextArea($item,"[$i]description"); ?></td>
</tr>
<?php endforeach; ?>
</table>

<?php echo CHtml::submitButton('Save'); ?>
<?php echo CHtml::endForm(); ?>
</div><!-- form -->

到这里,或多或少有点问题要问问。下面,我人解答大家的问题。

1
    $items=$this-&gt;getItemsToUpdate();

这一句内容如何产生?

这是唯一没有上下文联系的一个方法。下面我列出该方法内容。并给它带一个参数,以便更加用于实际。动态表单的用途,虽然很少能碰到。但在实际应用中,还是能碰到。尤其是你的原型设计员没有实际经验的设计之下。它碰到的机率大大上升。

1
2
3
4
public function getItemsToUpdate($cid = 0)
{
   return Model::model()->findAllByPk($cid);
}

你掌握了吗? 有什么问题,就提问吧。