forecho 的独立博客

把生命浪费在美好的事物上

Yii添加Ajax搜索

2013年06月08日

其实默认就有,只需要开启就好了。 首先先把列表写好。列表用'dataProvider'=>$product->search(40),//数据源 调用数据源 View页面: 添加Ajax:

<?php
Yii::app()->clientScript->registerScript('search', "
$('.search-form form').submit(function(){
	$.fn.yiiGridView.update('product-grid', {
		data: $(this).serialize()
	});
	return false;
});
");
?>

表单:

<div class="pro_filter c_f search-form">
<?php $form=$this->beginWidget('CActiveForm', array(
	'action'=>Yii::app()->createUrl($this->route),
	'method'=>'get',
)); ?>
<label>产品标题:</label>
<?php echo $form->textField($product,'name',array('class'=>'t_ipt w_180'))?>
<?php echo CHtml::submitButton('搜索',array('class'=>'mem_bgx mem_btn01'))?>
<?php $this->endWidget(); ?>
</div>

  Controller里面要有如下代码:

$product = New Product();
$product->unsetAttributes();//清空属性
$product->id = $id;
if(isset($_GET['Product'])){
	$product->attributes = $_GET['Product'];
}

model 基本是用的是Search 不需要改什么。注意:compare后面有参数true则为模糊搜索,实例:

$criteria->compare('name',$this->name,true);

jQuery Ajax This的问题

2013年06月05日

写了一个鼠标点击按钮Ajax效果,代码如下:

<script type="text/javascript">
//报名参加活动
$('.right a').bind('click',function(){
    var id = $(this).next('.d_n').text();
    $.ajax({
        url:"<?php echo Yii::app()->createUrl('/ajax/AjaxJoinActivity/') ?>",
        type:'POST',
        data:'id='+id,
        success:function(msg){
            $(this).html(msg);
        }
    });
})
</script>

但是这样写会有个问题,就是$(this)没有效果,Google找了一下解决方案,如下: 1、添加一行代码:context: this,修改之后的代码如下:

<script type="text/javascript">
//报名参加活动
$('.right a').bind('click',function(){
    var id = $(this).next('.d_n').text();
    $.ajax({
        context: this,
        url:"<?php echo Yii::app()->createUrl('/ajax/AjaxJoinActivity/') ?>",
        type:'POST',
        data:'id='+id,
        success:function(msg){
            $(this).html(msg);
        }
    });
})
</script>

2、转换一下this变量,重新定义。改过之后的代码如下:

<script type="text/javascript">
//报名参加活动
$('.right a').bind('click',function(){
    var id = $(this).next('.d_n').text();
    var that = this;
    $.ajax({
        url:"<?php echo Yii::app()->createUrl('/ajax/AjaxJoinActivity/') ?>",
        type:'POST',
        data:'id='+id,
        success:function(msg){
            $(that).html(msg);
        }
    });
})
</script>

以上都能解决问题,看你喜欢那种了。 参考资料如下: http://stackoverflow.com/questions/6394812/this-inside-of-ajax-success-not-working http://stackoverflow.com/questions/1570146/ajax-jquery-success-scope

Yii框架From表单验证

2013年06月03日

1.在控制器里面新建Helloworld控制器

class HelloworldController extends Controller{
    public function actionFeedback(){
        $model= new FeedbackForm;//实例化一个from
        $model->unsetAttributes();  // 清除默认值
        if(isset($_POST['FeedbackForm'])){//判断是否提交
            $model->attributes=$_POST['FeedbackForm'];//获得from表单的内容
            if($model->validate()){//进行验证(FeedbackForm方法里面的rules验证)
                $this->renderPartial('feedbackshow',array('model'=>$model));
            }else{
                var_dump($model->geterrors());//验证失败把失败原因打印出来
            } 
        }else{
            $this->renderPartial('feedback',array('model'=>$model));
        }
    }
}

2.在model下面新建FeedbackForm

class FeedbackForm extends CFormModel{
    public $name;
    public $email;
    public $subject;
    public $body;
    public function rules(){
        return array(
                array('name,email,subject,body','required'),//不能为空
                array('email','email'),//email格式验证
                );
    }
    public function attributeLabels()//给变量别名
    {
        return array(
            'subject'=>'主题',
            'name'=>'用户名',
            'email'=>'E-mail',
            'body'=>'内容'
        );
    }
}

3.在view里面新建Helloworld文件夹,在文件夹里面新建feedback、feedbackshow视图 feedback:

<?php header('Content-Type:text/html;charset=UTF-8');?>
<div>
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'feedback-form',
    'enableAjaxValidation'=>false,//是否使指定的属性的AJAX验证可用。默认值是false。
    'enableClientValidation'=>true,  //是否使客户端验证可用。默认值是false。 
    //下面是当表单被提交时是否执行AJAX验证。如果存在任何验证错误,表单的提交动作将被停止。默认值是false。   
    'clientOptions'=>array('validateOnSubmit'=>true),

)); ?>
<?php echo $form->hiddenField($model,'uid',array('value'=>Yii::app()->user->userid));//隐藏input示例 ?>
    <div>
        <?php echo $form->labelEx($model,'name');?>
        <?php echo $form->textField($model,'name');?>
        <?php echo $form->error($model,'name'); ?>
    </div>
    <div>
        <?php echo $form->labelEx($model,'email');?>
        <?php echo $form->textField($model,'email');?>
        <?php echo $form->error($model,'email'); ?>
    </div>
    <div>
        <?php echo $form->labelEx($model,'subject');?>
        <?php echo $form->textField($model,'subject',array('size'=>60,'maxlength'=>128));?>
        <?php echo $form->error($model,'subject'); ?>
    </div>
    <div>
        <?php echo $form->labelEx($model,'body');?>
        <?php echo $form->textArea($model,'body',array('rows'=>6,'cols'=>50));?>
        <?php echo $form->error($model,'body'); ?>
    </div>
    <div>
        <?php echo CHtml::submitButton('提交');?>
    </div>
<?php $this->endWidget();?>
</div>

feedbackshow:

<?php header('Content-Type:text/html;charset=UTF-8');?>
<div>
    <div>
        <?php echo "姓名:";?>
        <?php echo $model->name;?>
    </div>
    <div>
        <?php echo "E-mail:";?>
        <?php echo $model->email;?>
    </div>
    <div>
        <?php echo "主题:";?>
        <?php echo $model->subject;?>
    </div>
    <div>
        <?php echo "内容:";?>
        <?php echo $model->body;?>
    </div>
</div>

Yii全选删除

2013年05月30日

目前功能还是能用,但是删除不是Ajax操作的。等待下次完善。 Views:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<form action="/member/msglog/deleteordmsg" method="post" id="deleteForm">
	<?php
	    $this->widget('zii.widgets.CListView', array(
	        'dataProvider'=>$dataProvider,
	        'itemView'=>'_view',
	        'emptyText'=>'暂时没有数据',
	       	'template'=>'{items}{pager}',
	        'pager'=>array('class'=>'CLinksPager'),
	        'itemsTagName'=>'table',
	        'itemsOptions'=>array('class'=>'list_table', 'width'=>'100%'),
	        'buttonCssClass'=>'bg btn_page',
	        'batchItemOptions'=>array('class'=>"filter f_l"),
	        'batchItem'=>array(
	            //删除
	            '<input id="allcheckbox1" onchange="checkAll(\'select-on-check\',\'allcheckbox1\');" class="chk select-on-check" type="checkbox" name="">全选
                 <button class="mem_bgx link_btn mr5" onclick="$(\'#deleteForm\').submit();" title="">删除选中</button>'			        ),
	    ));
	?>
</form>

_view.php文件:

1
2
3
4
5
6
<tr>
	<td width="6%"><input class="select-on-check chk f_l" type="checkbox" name="ids[]" value="<?php echo $data->id; ?>" /></td>
    <td width="15%"><?php echo $data->fromMember->name;?></td>
    <td width="58%"><p class="pub_tit02"><?php echo CHtml::link($data->title, array('/member/msgLog/inboxDetail', 'id'=>$data->id));?></p></td>
    <td><?php echo date("Y-m-d H:i:m", $data->inputtime);?></td>
</tr>

*jQuery验证是否有选择:**

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<script type="text/javascript">
//表单验证
$('#deleteForm').bind('submit',function(){
	var data=new Array();
	$("input:checkbox[name='ids[]']").each(function ()
    	{
		if($(this).attr("checked")=='checked')
		{
			data.push($(this).val());
		}
	});
	if(data.length > 0)
	{
	return true;
    }else{
        return false;
    }
})
</script>

jQuery全选:

1
2
3
4
5
6
7
/*全选
classs:被选框class
selfid:全选框id
*/
function checkAll(classs,selfid){
	$('.'+classs).attr('checked',$('#'+selfid).attr('checked')?'checked':false);
}

Controller:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//删除选中
public function actionDeleteordmsg()
{
	if (Yii::app()->request->isPostRequest)
	{
		$criteria= new CDbCriteria;
		$criteria->addInCondition('id', $_POST['ids']);
		MsgLog::model()->deleteAll($criteria);

		if(isset(Yii::app()->request->isAjaxRequest)) {
			$message = '删除成功。';
			$path = '../index/success';
		} else{
			$message = '删除失败。';
			$path = '../index/error';
		}
	}
	$this->render($path,array(
			'message'=>$message,
		));
}

解决 Yii 1.12 中 Session 丢失的问题

2013年05月28日

(这篇文章是转载的,原文排版有问题,网页也错乱了,没办法我只有转载这篇文章了,来源。) Session 丢失的问题在运用一些框架来开发比较常见。原因是你对框架 Session 的机制不是很了解,它有可能运用了自己的一套机制。 情况一般是用 header 跳转后才发生的,因为在 header 之前还能够成功打印出来。 一般 Session 跨页面丢失的问题有以下几种情况: 1.客户端禁用 Cookie 。因为 Session 默认是基于 Cookie 的,因为找不到相应的 Cookie,所以 Session 会为空。 2.你在给 Session 赋值时,前面已经调用了 session_write_close() 函数。在原页面虽然能够成功打印,但是并没有成功保存 Session。 而这2中情况在 Yii 都不是,打开文件 yii\framework\web\auth\CWebUser.php #700

Yii::app()->getSession()->regenerateID(true);

把这个语句注释掉就可以了。它默认调用了PHP 自带的一个函数

bool session_regenerate_id ( [bool delete_old_session] )

按常理来说是不会出现 Session 丢失问题的。这可能和我的配置或者它内部实现 Seesion 的机制有关系。 你还可以查看PHP 手册 《Session 会话处理函数》 一章,了解更多详情。

Yii CListView使用方法

2013年05月22日

widget(‘zii.widgets.CListView’, array(          ’dataProvider’=>$model->search(20),          ’itemView’=>’_view’,            ’emptyText’=>’暂时没有数据’,         //’template’=>’{items}{pager}’,         ’pager’=>array(‘class’=>’CLinksPager’),         ’htmlOptions’=>array(‘class’=>’list-view pro_list bd’),         ’itemsTagName’=>’ul’,         ’itemsOptions’=>array(‘class’=>’list c_f’),         ’summaryText’=>’第 {start}-{end} 条, 共{count} 条   第{page}页/共{pages}页’,         ’pagerTemplate’=>’onlyPager’,         ’buttonCssClass’=>’bg_x btn_page’,         ’batchItemOptions’=>array(‘class’=>”f_l batchItem”),         ’batchItem’=>array(              //移动到分类              ’排序:’,              //添加到分类              CHtml::link(‘默认排序’,array(‘list’,’id’ => $model->catgory_id,’att’ =>$g_att,’sort’=>”),array(‘class’=>empty($model->list_order)?”default price”:”default”)),             CHtml::link(($model->list_order==4)?’价格’:’价格‘,array(‘list’,’id’ => $model->catgory_id,’att’ =>$g_att,’sort’=>($model->list_order==4)?6:4),array(‘class’=>($model->list_order==4||$model->list_order==6)?”bg_x price”:”bg_x”)),              CHtml::link(($model->list_order==5)?’销量’:’销量‘,array(‘list’,’id’ => $model->catgory_id,’att’ =>$g_att,’sort’=>($model->list_order==2)?5:2),array(‘class’=>($model->list_order==2||$model->list_order==5)?”bg_x price”:”bg_x”)),             CHtml::link(($model->list_order==7)?’上架时间’:’上架时间‘,array(‘list’,’id’ => $model->catgory_id,’att’ =>$g_att,’sort’=>($model->list_order==1)?7:1),array(‘class’=>($model->list_order==1||$model->list_order==7)?”bg_x price”:”bg_x”)),          ),          ));  ?>

简单说明: template是整个CListView的模板;

PHP中的单引号和双引号

2013年05月18日

被双引号的内容能被PHP检测其中的变量,并且自动转换变量,示例:

1
2
3
4
5
6
<?php
	$name = 'forecho';
	echo 'Hello world $name';
	echo '</br>';
	echo "Hello world $name";
?>

输出的结果就是:

1
2
Hello world $name
Hello world forecho

这样就可以得出结论,其实单引号更快,因为单引号不用去考虑变量问题,而是直接输出。

更多资料,请参考鸟哥的这篇文章。但是写HTML的时候,写页面一些属性的时候,W3C标准,还是要用双引号。

浅谈CSS的一些写法

2013年05月15日

开发网站的时候,DIV最好是先用上class,因为id的权限比class要高。 写class样式的的时候最好也要带上父级的class名称。比如:

.header .topbar{ padding-top:10px;}
.nav_bar .main_nav li{ float:left;}

写div的时候尽量少用float的,因为很多莫名其妙的兼容性问题都可能是浮动害的。 clear: both;是个好东西。 最重要的是写语义化的CSS,让人一看就能看出来是什么意思。比如:

.fl { float: left; }
.mt10 { margin-top: 10px; }
.w980 { width: 980px; }

这个语义化CSS很实用,就举这三个例子。 以后知道怎么用CSS了吧?

老罗和他的锤子

2013年05月05日

下面这段视频是『锤子智能手机操作系统发布会官方版』

知道罗永浩(下面简称「老罗」)这个人是在我大学大的时候,那时候刚配上电脑,那会儿网上他在各大学巡回演讲的视频,找了一个时间看了其中一个最火的,但是视频很长,记得那会儿只看了一半然后下午就跑去上课了,然后就没有然后了。只是记得他很牛,以前在新东方教英语,然后写了一本书叫「我的奋斗」(跟希特勒的书同名),只记得他说自己是个「理想主义者」。这事件过了之后就没怎么关注他了,貌似被我遗忘了。

后来新浪微博火了,开始玩微博了,后来罗永浩开始砸冰箱了,火了一阵子。我只是关注了一下。

记得那会儿我辞职很久了,在宿舍待着很久了,然后不知道什么原因,他们都去上班的时候,那天我就开始看老罗的视频了,没想到这家伙每年都会有一次的创业分享演讲,并且现在改为每半年一次了,那天我一口气看完了他的所以视频,顺序是倒着来的,看完我才发现:「他真的是说相声的,他有才了,很长的视频其实你听起来并不会感觉很无聊。」

老罗这一生注定是牛X的,他貌似连大学都没上过。然后开始在社会上混生活了,直到快30岁的时候都没什么钱,后来为了赚钱去做了当时他最讨厌的两件事-学英语和当老师。然后去当了新东方英语教师,直接给俞敏洪写的信,面试了三次才成功的。开始了忙碌的生活(周一到周五忙着又是打牌、旅游的,然后周末下午去教两个小时的英语)。后来辞职了之后,老罗做了一个牛博网,效益还不错,但是偶尔会被封掉,原因你懂得,每一次封掉之后再次开启的时候流量都会翻倍,但是这个牛博网确实没赚到钱,这个再次证明IT是苦逼的。后来老罗自己开了一家英语培训机构就叫「老罗英语培训学校」,

每张海报设计的都很赞。然后直到现在他开始做手机了,用他的话说就是「感觉自己被历史选中了」。

这个发布会可算是出来了,之前有「跳票」。老罗之前在微博上有说过大概这样一句话「使用我们出品的ROM之后,你还想用iPhone的话,你的终身手机费用我就给包了」。这样一来,大家的期望就变得很高了,当然也有很多人不看好。发布会的票卖的老贵了,然后还有「黄牛」倒票。发布会之后的结果其实是嘘声一片的。

其实我倒是觉得还不错的。

首先老罗把Mac上的拟物图标发挥出来了,然后结合Andriod的特色,把整个Andriod的图标都换了个新,有人笑称「老罗的锥子ROM就是一款主题」,其实这只是锤子ROM的其中一个特色。我觉得锤子ROM最大的特色就是人性化设计和语音助手以及老罗本身的个人情怀。

都有哪些人性化设计我就不说了,反正现在所有的设计都在追求人性化,老罗大体上研究了iPhone,把一些iPhone不人性化的设计都改进了,值得称赞。

iPhone的Siri可以说是改变了语音的使用,刚出来的时候可以说是很火。确实是非常了不起的功能,但是也确实如老罗所说,iPhone上的Siri实用性非常差,刚开始你可能无聊的时候,调戏过他,但是之后几乎你很少使用她,没人会在公共场合对着手机喊「给XXX打电话」,这确实是一件很傻逼的事情。但是老罗的设计真的很牛(具体怎么牛,你可以看上面的发布会视频),说不定未来可以让语音助手这个功能变得更加实用。

至于个人情怀,其实我是很喜欢的,比方说Mac百度输入法的产品经理就是一个有情怀的人。用Mac百度输入法可以很方便的使用「」作为引号,自从知乎上讨论过关于引号的使用问题的之后,我也是越来越喜欢用「」作为引号了。锤子ROM的这次也有个人情怀设计,至于什么我就不说了,自己看视频吧。

最后我不得不感叹一下移动应用以及智能手机的发展速度了,不敢相信Android的发展速度。Android绝对是个潜力股,也是Android改变了手机世界的格局,发展到现在国产手机也被人认同的格局,国产手机不再只是山寨机了。最后再次感叹一下Google觉对是一家伟大的公司,而中国正缺少这样的伟大公司,真希望若干年之后阿里巴巴也能算上?

最最后一起来期待 Smartisan OS (锤子系统)吧!

Django(二) - 视图和URL配置

2013年05月04日

Django的URl都是需要单独设计的,每个URL指定一个视图中的函数。 Django和URL配置背后的哲学:松耦合原则(决定URL返回哪个视图函数和实现这个视图函数是在两个不同的地方。 这使得开发人员可以修改一块而不会影响另一块。) 永远的Hello world 首先找到urls.py文件,代码修改为:

from django.conf.urls.defaults import *  #导入django.conf.urls.defaults下的所有模块
from views import hello  #从mysite/views.py模块中引入了hello视图。

#第二行调用 patterns() 函数并将返回结果保存到 urlpatterns 变量
urlpatterns = patterns('',
    (r'^hello/$', hello), #第一个元素是模式匹配字符串(正则表达式);第二个元素是那个模式将使用的视图函数。
)

注:正则表达式字符串的开头字母“r”。 它告诉Python这是个原始字符串,不需要处理里面的反斜杠(转义字符)。例如:“\n”是两个字符串:“\”和“n”。 然后新建一个views.py文件(跟urls.py同级目录),写入如下代码:

from django.http import HttpResponse  #从 django.http 模块导入(import) HttpResponse 类

#hello 的视图函数 每个视图函数至少要有一个参数,通常被叫作request。
def hello(request):
    return HttpResponse("Hello world")

运行命令行 python manage.py runserver 打开你的浏览器访问 http://127.0.0.1:8000/hello/ 如果你看到了 Hello world 页面,那就表示你成功了。 附件:正则表达式 正则表达式