forecho 的独立博客

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

Mac OS X PHP环境下新增虚拟主机

2013年07月09日

注:这里只是新增,如果是第一次开启虚拟主机,请参考这篇文章。 1、运行sudo vim /etc/apache2/extra/httpd-vhosts.conf,就打开了配置虚拟主机文件httpd-vhost.conf,配置虚拟主机了。增加虚拟主机代码如下:

<VirtualHost *:80>
    DocumentRoot "/Users/[用户名]/Sites/site"
    ServerName www.site.com
    ErrorLog "/private/var/log/apache2/sites-error_log"
    CustomLog "/private/var/log/apache2/sites-access_log" common
    <Directory />
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order deny,allow
                Allow from all
      </Directory>
</VirtualHost>

2、保存退出,并重启Apache。

sudo apachectl restart

3、运行sudo vim /etc/hosts,打开hosts配置文件,加入”127.0.0.1 www.site.com”,这样就可以配置完成sites虚拟主机了,访问“http://www.site.com”就相当于访问/Users/[用户名]/Sites/site文件下面的项目了。   补充:Mac默认PHP配置文件在 /private/etc/php.ini

PHP去除二维数组中的空数组

2013年07月03日

关键是array_filter这个函数;例子: 原数组:

Array
(
    [0] => Array
        (
            [ExchangeNo] => ECR000033
            [CardNo] => Array
                (
                )

            [QTY] => 1
            [ExchangeDate] => 2013-06-13T18:55:23.84
            [Remark] => Array
                (
                )

        )

    [1] => Array
        (
            [ExchangeNo] => ECR000036
            [CardNo] => Array
                (
                )

            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:24:32.53
            [Remark] => Array
                (
                )

        )

    [2] => Array
        (
            [ExchangeNo] => ECR000037
            [CardNo] => Array
                (
                )

            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:28:23.14
            [Remark] => Array
                (
                )

        )

    [3] => Array
        (
            [ExchangeNo] => ECR000038
            [CardNo] => Array
                (
                )

            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:30:53.71
            [Remark] => Array
                (
                )

        )

)

去除空数组:

foreach ($array as $key=>$value){
	 $array[$key] = array_filter($value);
}

输出结果:

Array
(
    [0] => Array
        (
            [ExchangeNo] => ECR000033
            [QTY] => 1
            [ExchangeDate] => 2013-06-13T18:55:23.84
        )

    [1] => Array
        (
            [ExchangeNo] => ECR000036
            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:24:32.53
        )

    [2] => Array
        (
            [ExchangeNo] => ECR000037
            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:28:23.14
        )

    [3] => Array
        (
            [ExchangeNo] => ECR000038
            [QTY] => 20
            [ExchangeDate] => 2013-06-20T18:30:53.71
        )
)

iOS开发实例(七)- 标签栏与选取器

2013年07月02日

由于很多事给耽误了,半年都没碰iOS了,惭愧。希望现在继续还来得及。 其实 这篇文章教程写的很详细了:http://www.cnblogs.com/minglz/archive/2012/12/27/2828663.html 只要参照这个教程来基本上就没有什么问题了。 补充一个问题:Xcode 貌似在4.6版本之后在 New-> File->Cocoa Touch 的时候就没有「UIViewController Subclass」了。 解决办法就是直接用New-> File->Cocoa Touch ->Objective-C Class ,主要注意的是SubClass of 必须是 UIViewController

把项目移植到Ubuntu上遇到的一些坑 - PHP5.4降级到PHP5.3

2013年06月25日

其实在Ubuntu上搭建PHP环境不是很难,可以参考这篇文章-手把手教你在Ubuntu上安装Apache、MySql和PHP。 PHP 默认是没有开启报错信息的,需要手动开启,可以参考这篇文章-开启Ubuntu下的PHP错误提示。 环境搭建好之后,运行项目发现有很多错误,很多坑,有点莫名其妙的感觉。 Google问题之后也不知道如何解决,后来找到了这篇文章- PHP5.4中一个需要注意的变化(Chained string offsets) 。 这才发现可能是我的PHP 版本问题,Ubuntu默认安装的是PHP5.4版本,这个版本较之前的PHP5.3有一些改动。 于是找到了这篇文章-Ubuntu 12.10 php5.4 降级到 php5.3脚本。 大致就是先下载一个文件,然后修改这个文件的权限:

sudo chmod 755 php5_4_downgrade_5.3.sh

然后运行这个文件:

sudo sh php5_4_downgrade_5.3.sh

后面的选择,如果看不懂就直接选默认吧。最后降级成功,问题解决。

在Ubuntu(12.10/12.04/11.10/11.04)上安装RabbitVCS SVN,Git的客户端

2013年06月22日

1.首先安装一些环境:

$ sudo apt-get update
$ sudo apt-get install python-nautilus python-configobj python-gtk2 python-glade2 python-svn python-dbus python-dulwich subversion meld gconf-editor

2.将压缩包下载,解压并运行安装脚本:

$ wget http://rabbitvcs.googlecode.com/files/rabbitvcs-0.15.2.tar.bz2
$ tar jxvf rabbitvcs-0.15.2.tar.bz2
$ cd rabbitvcs-0.15.2/
$ sudo python setup.py install --install-layout=deb

cd到nautilus-3.0的客户端目录下和复制的RabbitVCS.py扩展目录:

$ cd clients/nautilus-3.0
$ sudo cp RabbitVCS.py /usr/share/nautilus-python/extensions/

注销并重新登录。现在创建一个文件夹,右键点击它,看看RabbitVCS菜单。 原英文地址:http://linuxdrops.com/install-rabbitvcs-svn-git-client-on-ubuntu-12-1012-0411-1011-04/ apt-get 自动安装:http://www.webupd8.org/2011/01/rabbitvcs-perfect-tortoisesvn.html

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 会话处理函数》 一章,了解更多详情。