forecho 的独立博客

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

使用Yii的 CMenu

2014年11月17日

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
$this->widget('zii.widgets.CMenu',array(
    'activeCssClass'=>'当前热点元素的样式',
    'firstItemCssClass'=>'第一个元素的样式',
    'lastItemCssClass'=>'最后一个元素的样式',
    'htmlOptions'=>array('class'=>'默认样式'),
    'items'=>array(
        array(
            'label'=>'网站概况',
            'url'=>array('/admin'),
            'itemOptions'=>array(
                'class'=>'li_status'
            ),
            'active'=>$this->id=='admin'?true:false
        ),
        array(
            'label'=>'图片管理',
            'url'=>array('/picture'),
            'template'=>'{menu}<span>this is additional infomation</span>',
            'itemOptions'=>array('class'=>'li_picture'),
            'active'=>$this->id=='picture'?true:false,
            'visible'=>true
        ),
        array('label'=>'管理员管理',
            'url'=>array('/manager'),
            'itemOptions'=>array('class'=>'li_manager'),
            'submenuOptions'=>array('class'=>'subclass'),
            'active'=>($this->id=='manager' && $this->action->id!='changepswd')?true:false,
            'visible'=>false
        ),
        array(
            'label'=>'密码修改',
            'url'=>array('/manager/changepswd'),
            'linkOptions'=>array('target'=>'_blank'),
            'itemOptions'=>array(
                'class'=>'li_changepswd'
            ),
            'items'=>array(
                array('label'=>'子栏目')
            ),
            'active'=>($this->id=='manager' && $this->action->id=='changepswd')?true:false,
            'visible'=>true
        ),
        array(
            'label'=>'登陆',
            'url'=>array('/site/login'),
            'itemOptions'=>array('class'=>'li_login'),
            'visible'=>Yii::app()->user->isGuest
        ),
        array(
            'label'=>'退出 ('.Yii::app()->user->name.')',
            'url'=>array('/site/logout'),
            'itemOptions'=>array('class'=>'li_login'),
            'visible'=>!Yii::app()->user->isGuest
        )
    ),
));

说明:

PHP MySQL 表非主键自增长

2014年11月13日

场景

一个活动表,一个活动记录表,活动记录表要根据活动 ID,记录每个人的活动分数和时间等用户参与信息,其中活动记录表有一个字段是用户的编号,每个活动的记录都要从1开始自增。现在的问题是怎么实现这个自增的效果?

表结构如下:

主要说一下活动记录表 activity_records 的 主要字段结构:

字段 注释
id 主键自增
activity_id 活动ID
user_id 用户 ID
number 活动记录编号

解决方案

MacBook 升级 Yosemite 之后 PHP 环境修复

2014年10月19日

Yosemite 终于发布了,我第一时间升级了。但是没想到 PHP 环境受到影响了,直到现在终于修复好了。 一、修复 Apache Apache 好像是换新版本了,升级完系统之后项目打不开了。之前设置好的虚拟主机都无效了。 首先打开 sudo vim /etc/apache2/httpd.conf  这个文件, 1. 开启虚拟主机功能,去掉下面代码的「#」注释:

#Include /private/etc/apache2/extra/httpd-vhosts.conf

改过的代码如下:

Include /private/etc/apache2/extra/httpd-vhosts.conf

2. 如果想开启伪静态,去掉下面代码的「#」注释:

#LoadModule rewrite_module libexec/apache2/mod_rewrite.so

改过的代码如下:

LoadModule rewrite_module libexec/apache2/mod_rewrite.so

3. 如果想使用系统自带的 PHP 版本的话,去掉下面代码的「#」注释:

#LoadModule php5_module libexec/apache2/libphp5.so

改过的代码如下:

LoadModule php5_module libexec/apache2/libphp5.so

  以上操作完了之后记得要重启Apache:

sudo apachectl restart

  二、修复虚拟主机 现在我们虽然能用虚拟主机了,但是好像不能解析 PHP 了,打开 /private/etc/apache2/extra/httpd-vhosts.conf 文件在每一个配置里面添加一行下面的代码就可以了: Require all granted 示例如下:

<Directory "/Users/$USER/Sites/">
Options Indexes MultiViews FollowSymLinks
AllowOverride All
Require all granted
</Directory>

记得要重启 Apache:

sudo apachectl restart

三、安装 PHP Mcrypt 扩展 这个花费我很长时间,主要是我本来还想用 brew 安装的,省事,但是还是没效果,最后没办法还是编译安装了。

cd ~/Downloads
wget https://github.com/php/php-src/archive/PHP-5.5.14.zip
unzip PHP-5.5.14.zip
cd php-src-PHP-5.5.14/ext/mcrypt/
/usr/bin/phpize
./configure
make
sudo make install

然后拷贝一份 php.ini 配置文件,重装系统这个文件没了:

sudo cp /etc/php.ini.default /etc/php.ini

然后记得在 php.ini 文件里面添加这个扩展,如下面代码: extension = mcrypt.so   以上操作完之后你的 PHP 环境应该又回来了。:) -—————-update 2014年11月02日—————- Yosemite 自带编译安装之后的 PHP 环境 GD 库不支持 png 和 FreeType ,会导致各种验证码出不来,坑。 一键解决办法如下(重新编译使用 PHP5.6):

curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6

  参考文章: Apache, MySQL & PHP on OS X Yosemite How to Manually Build & Install php-mcrypt on Mac OS X Installing and Configuring Apache, PHP and MySQL on OSX 10.10 Yosemite After upgrade, PHP no longer supports PNG operations

Comments

王晓: hi 博主,我用你上述所说的一键安装GD库,代码已经执行,可是半小时了,为什么还停留在这个界面?

王晓: 上图

ForEcho: 刚开始我也很疑惑,等了半天没反应,后来我发现那个包要100多兆,比较大而且这个服务器是放在国外的,条件允许的话,最好翻墙。

baocaixiong: 用brewHome保平安。

alinwei: 大神,在本地搭建hexo 然后,hexo s 可以正常访问,然后推送到github后,也是正常的,但是二级域名一直是404,等了一天还是,不知道问题出现在哪里,希望大神有时间帮看哈。项目地址:https://github.com/missyun/alinwei.github.io 感谢!!

Mac 升级 Yosemite 之后 PHP 环境修复

2014年10月19日

Yosemite 终于发布了,我第一时间升级了。但是没想到 PHP 环境受到影响了,直到现在终于修复好了。

修复 Apache

Apache 好像是换新版本了,升级完系统之后项目打不开了。之前设置好的虚拟主机都无效了。

首先打开 sudo vim /etc/apache2/httpd.conf 这个文件,

开启虚拟主机功能,去掉下面代码的「#」注释:

1
#Include /private/etc/apache2/extra/httpd-vhosts.conf

改过的代码如下:

1
Include /private/etc/apache2/extra/httpd-vhosts.conf

如果想开启伪静态,去掉下面代码的「#」注释:

1
#LoadModule rewrite_module libexec/apache2/mod_rewrite.so

改过的代码如下:

1
LoadModule rewrite_module libexec/apache2/mod_rewrite.so

### 如果想使用系统自带的 PHP 版本的话,去掉下面代码的「#」注释:

1
#LoadModule php5_module libexec/apache2/libphp5.so

改过的代码如下:

1
LoadModule php5_module libexec/apache2/libphp5.so

以上操作完了之后记得要重启Apache:

1
sudo apachectl restart

修复虚拟主机

PHP 裁剪数组

2014年09月05日

  • 用 array_splice 可以裁剪,原来的数组会被改变,键值会重组
  • 用 array_slice ,原来的数组不会改变,键值可以不用重组

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
echo '<pre>';
$arrayRaw = array('2' => 'c','3' => 'd', '4' => 'e', '5' => 'f');
echo "0", PHP_EOL;
print_r(array_splice($arrayRaw, 2));
echo "1", PHP_EOL;
print_r($arrayRaw);

$arrayRaw = array('2' => 'c','3' => 'd', '4' => 'e', '5' => 'f');
array_slice($arrayRaw, 0, 2, true);
echo "2", PHP_EOL;
print_r(array_slice($arrayRaw, 0, 2, true));
echo "3", PHP_EOL;
print_r($arrayRaw);
echo '</pre>';

CakePHP 使用插件导出 CSV 文件

2014年09月05日

插件地址:https://github.com/josegonzalez/cakephp-csvview

用法就不说了,上面写的很详细了,补充两点吧。

1. 是数字显示的问题

有时候数字很大,导出的文件打开,数字变成科学计数法显示了,这显然不是我们想要的,手动在每个值后面添加一个制表符「\t」就解决这个问题了。代码如下:

1
2
3
4
5
foreach ($data as $key => $value) {
    $item[$key]['username'] = $value['username']. "\t";
    $item[$key]['mobile']   = $value['mobile'] . "\t";
    $item[$key]['created']  = $value['created'] . "\t";
}

PHP - Isset 与 Empty 的区别

2014年09月05日

当一个变量没有声明的时候,第一个 if 会报错

1
2
3
4
5
6
7
8
9
if ($a) {
   echo $a.'1'.PHP_EOL;
}
if (!empty($a)) {
   echo $a.'2'.PHP_EOL;
}
if (isset($a)) {
   echo $a.'3'.PHP_EOL;
}

Hello Octopress

2014年08月31日

大名鼎鼎的 Octopress 总算安装成功了,但是 WordPress 里面的文章一直导入成功,但是显示不成功,详情页打开是空白的,哎,有时间再折腾吧。

至于搭建教程网上一搜一大把,我就不说了,本博客是搭建 GitCafe 上的,国内服务器网速快。

截取以xx结尾的词

2014年05月14日

1
2
3
4
5
6
7
8
9
function endsWith($haystack, $needle)
{
   $length = strlen($needle);
   if ($length == 0) {
       return true;
   }

   return (substr($haystack, -$length) === $needle);
}

最近我有话要说

2014年04月22日

清明节回来的第一个周五,公司搞了一次春游活动,去了一躺厦门玩。

厦门是个好地方,可以说是旅游有好地方,可以说一年四季没有淡季。这次是跟团去的,导游带着我们逛,感觉像赶场子一样,反正每去一个地方停留的时间不会太长,导致整个厦门游回来对景区什么的倒是没什么印象。导游说话挺有意思的,跟我们讲了很多关于厦门的历史,去的时候我是对厦门一无所知的,到现在对厦门历史还算有了很大的理解。

导游在车上讲历史的时候,喜欢问「你们知道为什么吗?」,有人就很无聊的「猜」,那种「插话」让人感觉到他很无知,会觉得他很讨厌。感觉知道的话会很博学多才,怎么说呢?反正就是第一次觉得懂得多的人其实是很重要,这一点直接导致我想看《历史是什么玩意儿》这本书了,并且昨天已经开始看了。并且以后还会继续通过看书来增长自己的见识的。

回来之后就开始忙工作了,因为有些活很急,回来之后加了两天很晚的班。因为微信支付接口。

「因为这个接口刚出来,除了看文档,没有其他资料了」、「因为我对这个项目不太熟,所以会比较慢」,好吧,这都不应该算借口。「没有过不去的火焰山」,同样也没有解决不了的问题。延期了一个星期,我们一边加班一边跟着总监的指导,总算最终过了这倒门槛,下面我来总结一下这个模块开发的教训:

  1. 先做 Demo。不论是不是做接口开发,能先写 Demo 的尽量先从 Demo 开始。然后慢慢的完善。这个就好比画画,我们要先画结构图,再慢慢的描,最好越画越细致。大多数我们拿到一个功能需求文档,第一件事是开始设计数据库,巴拉巴拉的,然后等开始写代码的时候就开始发现之前设计的数据库不够好,然后又要改。所以从 Demo 开始,这个习惯一定要养成。
  2. 尽量封装。能封装的模块,就封装,最好能写个接口给别人调用,然后返回给他要的数据就可以了。这样开发的好处就是可以给多个项目使用,有时候开发一个功能要考虑的周全一些。
  3. JavaScript 是不能跨域的。之前调试发货接口的时候老是跑不通,花了一天时间都毫无进展,直到最后发现发货这块是用 JavaScript 实现的,但是 JavaScript 是不能跨域的。
  4. 出了问题先从自身的代码找原因,不要轻易的下结论。
  5. 做事情要做100%,不要做80%。
  6. 出现问题,首先要立刻拿出问题的解决方案,而不是说「这块功能不是我写的,我不知道,改怎么处理」。

Comments

乔巴瑞: 厚积薄发~ 我也觉得跟团玩总是急匆匆的,以后我也想去厦门玩,但是会选择自由行的那种

ForEcho: 从公司的角度来说,报团可能是最好的的选择了。但是对我们个人来说,不跟团是最好的。我自己玩是不跟团的。