forecho 的独立博客

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

iOS开发实例(二)-“美化iPhone图标”

2012年10月22日

1、iPhone图标一般都是.png格式文件。 2、一般都是57px57px,一般命名为icon.png;114px114px为Retina屏专用的,一般命名为icon@2x.png。 3、创建图标的时候为一般正方形图片即可,iPhone将自动为图标调整圆角边缘,并且自动加上玻璃质感的效果。   图标制作好之后,按照下面1-》2->3找到相应的位置: 把之前制作的.png文件拖到相应的位置即可(114px的文件放在右边窗口)。 然后两个图标文件会自动载入,为了方便起见我们可以把这两个文件拖到Supporting Files文件夹里。 我们可以在Hello_World_Info.plist能找到相应的配置,如下图:   PS:Bundle identifier(束标示符)标准命名规则是:顶级Internet域名,之后是点号,之后是公司名或者是组织名,再点号,最后是应用名。如果要改束标示符的话就在这里改。 未完待续————

iOS开发实例(一)-“Hello World”

2012年10月21日

本教程是根据《iOS基础教程》一书总结而来。 1、首先打开Xcode,然后创建一个项目,选择iOS-》Application-》Single View Application(一个最简单的模板) 点击Next,如下图所示: 2、然后会出现下图所示内容,你可以安装下图填好相应的资料。 简单的解释一下: 第一项:项目名。 第二项:组织名称。 第三项:公司标识。 Class Prefix:创建所有类的前缀。 Devices:指所适用的设备。 说下最后三个复选框。 第一个就是我们说的新特性之一,用storyboards管理布局文件。 第二个ARC(自动引用计数)机制。 第三个自动生成一个测试用例。 然后点Next。   3、然后我们得到如下结构的文件: 简单的说一下上图文件夹: Hello World:以项目名命名的文件夹,包含了大部分代码以及组成应用程序用户界面的文件 其中BIDViewController.xib:该文件包含特定于项目主试图控制器的用户界面元素。 Supporting Files:包含项目中所需的非Objective-C类的源代码文件和资源文件。(适用这个文件夹次数比较少?)。 Frameworks:一种特殊的类库。包含代码、图像、声音文件等资源。   4、点击BIDViewController.xib文件,然后出现的就是Interface Builder(整合到Xcode里面的界面设计工具),如下图:   5、然后你就可以在右下角的类库里面直接拖过来使用。找到Label,直接拖到用户界面任意位置,然后该文字为“Hello World”,OK,这时候基本上算是完成了,点击一下Xcode左上角的Run,然后自动会调用模拟器,然后界面会出现如下所示界面,代表你成功了。   6、回过头来,我们还可以在标签属性里面直接更改资料,然后保存,然后Run。   第一节完毕,整个过程我们还没有动过一个代码。(注意,网上有说对于新手来说最好不要用ARC来自动管理内存,因为到后面你会有很大的麻烦。但是本教程是根据《iOS基础教程》总结的,书上是这么使用的,对于新手来说的话,只能先这样了。)

PHP之无限极分类

2012年10月16日

用到今天发现一个严重的错误,在id超过两位数的时候,排序是有问题的。如下图错误的排序: 你会发现如果按照as出来的bpath排序的话,cid为55的排序错误,正确的情况是cid为55的应该在101前面,出错的原因是bpath是一个字符串,它会安装字符串来排序,以 “-”  为分节符第一位是0一位数,55的第二位为55两位数,101的第三位数为101三位数。位数不同导致排序不正确的BUG,解决办法就是让cid的位数固定下来,不够的前面填充0,这里我们就用到了MySQL的ZEROFILL

Zerofill

用于数字类型的定长显示是最适合不过了, 长度不够时,用0填充。

那么我们在MySQL里面执行下面的命令,改变表结构:

ALTER TABLE `category` CHANGE COLUMN `id` `id` INT(9) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT

现在你再执行查询,结果如下: 现在的补救方法要么就是把子类删除掉,要么就是手动添加path的0保证位数相同。(不要太在意上图的cid,其实就是等同于本文的id。只是换了个名字而已。) ============以上信息update 于2014年1月10日============ 目前写无限极分类的大致分为三种情况:

  1. 递归(效率太慢)
  2. ajax(不会的话,就写不出来)
  3. 继承关系(方法简单,实用) 数据库结构如下图:   主要思想是通过path这个字段通过MySQL 的concat 函数查询实现。示例代码如下:
SELECT id, path, name, CONCAT( path,  '-', id ) AS bpath FROM  `category` ORDER BY bpath

bpath:虚拟字段 内容字段如下:   视图主要代码如下:

<select name="id" class="small-input">
    <option value="0">根目录</option>
    <?php foreach($category as $row):?>
    <option value="<?php echo $row->id;?>">
        <?php
          $count = count(explode('-',$row->bpath));
          echo '|';
          for($i=1;$i<$count;$i++){
               echo '—';
           }   
          echo $row->name;?>
     </option>
    <?php endforeach;?>
</select>

  添加新栏目的话,主要思想是的把父级的path 和pid链接起来,组成新的path。 详细代码请参考我的gitbub 的Fecms项目,敬请期待。

使用表单验证插件 Validform

2012年10月16日

官方网址 先下载完整的示例文档。 调用如下两个文件(注意文件路径):

1
2
<script type="text/javascript" src="resources/scripts/jquery-1.6.2.min.js"></script>
<script type="text/javascript" src="resources/scripts/Validform_v5.1_min.js"></script>

然后添加javascript代码(此处我使用的是示例2):

1
2
3
4
5
6
7
8
9
<script type="text/javascript">
$(function(){
    //$(".registerform").Validform();  //就这一行代码!;

    $(".registerform").Validform({
        tiptype:2
    });
})
</script>

然后是表单的视图页面主要代码:

1
2
3
4
5
6
<p>
    <label>导航名称</label>
    <input class="text-input small-input" type="text" id="small-input" name="name" datatype="s2-10" errormsg="昵称至少2个字符,最多10个字符!" />
    <span class="Validform_checktip"></span>
    <br />
</p>

form表单的class是”registerform”。即:

1
class="registerform"

PS: 此处我表单的input与提示文字Validform_checktip 属于同一级标签,而官方给我们的是都有一个父级的td标签,所以我需要改官方的Validform_v5.1_min.js文件,找到下图代码 修改如下:

1
2
3
4
if(type==2 && o.obj){
o.obj.next(".Validform_checktip").html(msg);
    Validform.util.cssctl(o.obj.next(".Validform_checktip"),o.type);
}

即:删掉两处的parent和find。 更多的说明文档,请参考这里。   样式的话,只需调用如下三个即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/* 表单 */
.Validform_wrong {
    color: red;
    padding-left: 20px;
    white-space: nowrap;
    background: url(../images/error.png) no-repeat left center;
}
.Validform_right {
    color: #71B83D;
    padding-left: 20px;
    background: url(../images/right.png) no-repeat left center;
}
.Validform_checktip {
    margin-left: 8px;
    line-height: 20px;
    height: 20px;
    overflow: hidden;
    color: #999;
    font-size: 12px;
}

PHP最简单的方法调用kindeditor编辑器

2012年10月16日

先在这里直接下载编辑器代码。 插入javascript代码如下,

<script charset="utf-8" src="kindeditor/kindeditor.js"></script>
<script charset="utf-8" src="kindeditor/lang/zh_CN.js"></script>
<script>
        var editor;
        KindEditor.ready(function(K) {
                //editor = K.create('textarea[name="content"]');
                editor = K.create('#editor_id', {
                    allowFileManager : true  //开启浏览服务器文件功能,比方上传图片的图片空间
                });
        });
</script>

form表单代码如下:

<textarea id="editor_id" name="content" style="width:90%;height:450px;"></textarea>

Kindeditor内容区默认字体和字体的大小如何设置呢? 打开themes/default/default.css文件找到:.ke-dialog-loading-contentfont-size: 14px;改成font-size: 12px;保存即可。

第一站,成都

2012年10月15日

话说这次国庆放8天假,不好好出去玩,都对不起自己放的这8天假。

本着只想出去走走的心态,我就无所谓是什么目的地了,反正只要没去过就成,班长提议去成都,听说那里妹纸很多,我自然是不反对。这次旅行,是我的第一次,所以我的主要目标是找到那个旅行的感觉。

车票是在网上买的,怕人多,我们就选择了2号出发,运气还不错,买到了坐票,买票中间有点心惊胆战那也是难免的。我们分两拨过去的,我们三个是2号下午的火车从武昌出发,从宿舍出发一到车站直接上火车,时间真是算的准。火车上我们边车边聊了会儿,然后打了下扑克,看了下杂志,然后睡了下觉,然后3号早上8点多就到了。成都东的火车站还不错的说。出站的时候发现下了点下雨,但是对我们影响不大。由于班长是下午才到,所以我们三个的任务是先找到住宿的地方再说,在车站我们上了101奔到了西南交大,然后下车找宾馆,然后就想迫不及待的出去玩了,服务员妹纸说的那句话给我印象还蛮深的,“成都就是一个耍都,在这里你只要尽情的耍就好了”。后来证明我们选的宾馆地理位置还挺靠谱的,里风景区都不远。

宾馆找到了,我们放心东西就先去了尽情的去玩了。这时候的太阳,无疑让我们心情更开心了。我们首先去的是宽窄巷子,怎么说呢?是一个风景区,吃的蛮多的,建筑风格也不错,有宽巷子也有窄巷子。还有真人铜像,我们还和他们合了几张影,还看了几张摄影展,拍的都很不错,还看到了成都一绝“掏耳朵”,他们的装备那是杠杠的。

然后下午吃了碗面,准备去武侯祠的干活。刚到站就发现人很多,然后转身一看,旁边的锦里人更多,我在武汉都没看到这样人贴人进去的,后来我们一想还是算了吧,就没进去了。然后就在周边随便逛了下我买了几个特产,都是很辣了那种准备带回去。然后就直奔回宾馆了,火车上还是没睡好,有点累的,回去洗了个澡,休息一下,迎接班长的到来。

天刚黑的时候班长来了,然后我们就要去吃火锅的干活,导航了一下周围的火锅店,然后看中了一家火锅店,打渔郎。花鲢鱼火锅,第一次吃,那鱼不是一般的嫩,并且鲢鱼鱼刺又很少,所以那个我们吃的很爽,我们还喝了点酒。后来我甚至还想过要不要在回武汉之前再去那吃一回再走。成都小吃还蛮多的,各种小吃,什么冒菜啊,串串香啊,到最后我都没吃过。

4号我们准备说是要早点起床,要在成都过早的,后来还是9点多才出门的,也还不算晚,周围不远就有老麻抄手。来成都晚当然就要吃特产了。吃完了还是觉得真是对得起这个名字,吃完了给人就一个感觉,就是麻,辣那都只能是第二感觉。然后我们商讨了下去哪玩,后来就去了杜甫草堂,在门口犹豫了一下,60块钱门票值不值。人也还算多,进去的话也只能看一下草堂,用班长的话说就是有地俗气了。但是又不知道去哪玩,最后还是进去了。然后我们就看到了各种草堂,然后各种和杜甫有关的东西,整个风景区还是有点点大的,但整个下来感觉挺没意思的,这是实话,太商业化了。逛完之后大家都饿了,我团购了一个火锅,刘一手火锅店。团购还是很划算的,4个人都吃的很饱,还不错。

然后下午就跟老钱一起去见成都的知友,然后我们一起做饭,我做了一个,但是有点失误没做好,而且买的材料有点多了,最后都没吃完…成都的女群主艺晴妹纸看得出来很会做饭。没看出来她的笑点比我还低,哈哈…小鱼妹纸还做了一个水煮鱼,步骤好复杂的说,佩服。韩冰同学竟然是唐山人。朱德文是从武汉读完大学,然后跑到成都去读研的。最后我们几个男生喝了一小瓶二锅头,大家一边吃饭,一边说笑,感觉甚好。

5号了,我们起床的第一件事就是在周围逛了一大圈找特产吃过早,结果找了大半圈,实在是没找到什么好吃的,后来就吃了一碗肥肠粉,还是不喜欢吃粉,有点坑了。吃饱了之后我们决定去成都周边玩一下,直奔火车站,准备去青城山或者都江堰的,后来发现没有票了,连明天的票都没有了,又不想包车去,怕晚上回不来,也怕那边人多。最后还是听从班长意见去了一下古镇,洛带。给人的感觉就是一条商业街,不是买商品就是卖吃的,只不过建筑风格是古代的而已。既然来了还是走了一圈,然后出来之后,爬了一个小山,然后时间差不多晚上了,打道回府,回去吃火锅,这次我们直奔早已看好的李雪牛杂火锅店,然后吃完了各种牛杂,牛肉,然后就回去洗澡看电视睡觉了。

6号这天要退房了,我们起床的比较晚,我提议去吃老麻抄手,大家都同意了。吃完回来收拾一下东西准备退房了,带着行李自然是有点不方便玩。我脑子里只想到了去青羊宫,但是到了门口又不是很想进去了,然后我们逛到了四川博物馆,本着打发时间的心态我们进去了,我们是晚上22点的火车,买的有点晚了。博物馆可以放行李,我们到处逛了下,直到闭馆我们才肯出来。然后我们就只能又进去前进了,走到地铁站出发去火车站,到了车站还发现成都的妹纸真多,火车站的工作人员大多数都是妹纸。火车上的人比我想想中的要少,我们聊天、睡觉、看杂志、吃东西、听歌、看窗外的风景。时间比我想想中的要好过。回来我们还有时间做了顿饭。

整个旅行还是很成功的,下次如下想去名胜景地节假日就别去了,人特别多,即使去了也没意思。所以我们这次的旅行只要是吃,玩倒是其次。然后就是找经验找感觉,毕竟旅行一般都是去没有去过的地方。

现在我要做的事就是赚钱,只有努力赚钱才有可能去做很多事情。下一站,会是哪里?期待…

如果想看照片,请猛击~

Yii 调用KindEditor在线编辑器

2012年09月28日

  1. 先下载这个文件,然后解压,把editor 这个文件夹放在你项目的根目录里。
  2. 然后找_form.php这个文件,找到你的”content”(这里我的是名称是“news_content”),修改成如下代码:(被注释掉的是原来的代码,上面一行是新加上的。)
1
2
3
4
5
6
<div class="row">
    <?php echo $form->labelEx($model,'news_content'); ?>
    <?php echo $form->textArea($model,'news_content',array('style'=>'width:90%; height:500px')); ?>
    <?php // echo $form->textField($model,'news_content',array('size'=>60,'maxlength'=>8000)); ?>
    <?php echo $form->error($model,'news_content'); ?>
</div>

然后在_form.php这个文件开头,添加如下代码,调用编辑器样式。

1
2
3
<?php
    Yii::app()->clientScript->registerCssFile('./editor/themes/default/default.css');
?>

最后在_form.php这个文件结尾处,添加如下代码,调用编辑器的js文件以及调用js

1
2
3
4
5
6
7
8
9
10
11
12
<script charset="utf-8" src="./editor/kindeditor.js"></script>
<script type="text/javascript">
    KindEditor.ready(function(K) {
        editor = K.create('#News_news_content', {
            allowFileManager: true,
            resizeType: 1,
            newlineTag: 'p',
            //syncType: '',
            // uploadJson: '<?php echo $this->createUrl('news/upload') ?>'
        });
    });
</script>

yii学习笔记(五)-修改新建Create页面

2012年07月12日

我们可以用gii生成views里面的页面,很方便的,但是,并不是所有的东西都是我们所需要的,所以我们要学会修改代码,为我们所用。 改为下拉选项框 添加某个字段的时候,把手动输入的input表单改成下拉选项框。 首页,我们要在字段对应的表的m下写入一个方法。比方说我现在一个type_id字段对应的是news_type表。 那么我们在m文件夹中找到NewsType.php文件,在末尾加上这段代码:

// 获取type
public function getNewsTypeList()
{
    $newsTypeList = NewsType::model()->findAll();
    return CHtml::listData($newsTypeList,'id','news_type_name');

    //下面是用来验证的代码
    // $returnData = CHtml::listData($newsTypeList,'id','news_type_name');
    // print_r($returnData);
    // exit;
}

然后我们找到Create所在的页面,这里是Admin/views/news/_form.php文件。 找到这段代码:

<?php echo $form->textField($model,'type_id',array('size'=>10,'maxlength'=>10)); ?>

修改为:

<?php echo $form->dropDownList($model,'type_id',NewsType::model()->getNewsTypeList()); ?>

刷新一下就会得到我们想要的下拉选项效果。 系统默认添加的信息 那么有些情况下,我们会遇到一个字段是由系统自动帮我们添加的,比方说,添加新闻的人,时间。 我们先把_form.php文件里字段相应的代码删掉。 然后去找这个表的m文件,这里是News.php文件 在末尾加上这段代码:

//自动添加新闻时间、状态
protected function beforeSave()
{
    if (parent::beforeSave()) {
        if ($this->isNewRecord) {

        //如果是新的新闻

            $this->create_time = date('Y-m-d H:i:s');
            $this->create_user_id = Yii::app()->user->id;
        }else {
            $this->update_time = date('Y-m-d H:i:s');
            $this->update_user_id = Yii::app()->user->id;
        }
            return true;
        }else {
            return false;
    }

}

读取数据的时候转换 其实这个时候数据记录type_id字段的任然是数字,那么读取的时候我们还需要转换一下。 在读取页面的m对应的文件中修改代码,这里对应的是News.php文件 我们找到下面这段代码:

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    return array();
}

添加修改为:

public function relations()
{
    // NOTE: you may need to adjust the relation name and the related
    // class name for the relations automatically generated below.
    //表链接
    return array(
        'typeName'=>array(self::BELONGS_TO,'NewsType','type_id'),
        'statusName'=>array(self::BELONGS_TO,'StatusType','status_id'),
    );
}

然后去找到要显示的页面,这里是Admin/views/news/_view.php 找到这段代码:

<?php echo CHtml::encode($data->type_id); ?>

修改为:

<?php echo CHtml::encode($data->typeName->news_type_name); ?>

statusName也是这样修改。

Comments

桂林老医: :shock: 看不懂

Yii学习笔记(四)-用户登录

2012年07月10日

先在 \protected\components\文件夹里面找到UserIdentity.php

然后用gii的Model Generator生成User的Model

然后在UserIdentity.php找到这段代码:

public function authenticate()
{
    $users=array(
        // username => password
        'demo'=>'demo',
        'admin'=>'admin',
    );
    if(!isset($users[$this->username]))
        $this->errorCode=self::ERROR_USERNAME_INVALID;
    else if($users[$this->username]!==$this->password)
        $this->errorCode=self::ERROR_PASSWORD_INVALID;
    else
        $this->errorCode=self::ERROR_NONE;
    return !$this->errorCode;
}

替换为:

private $_id;

public function authenticate()
{
    //用户名转换为小写
    $username=strtolower($this->username);

    //$username作为条件进入数据库查询匹配
    $user=User::model()->find('LOWER(username)=?',array($username));

    //用户名不存在,报错
    if ($user===null) {
        $this-> errorCode=self::ERROR_USERNAME_INVALID;
    }else{

        //调用一个函数,匹配相应的密码
        if (!$user->validatePassword($this->password)) {
            $this->errorCode=self::ERROR_PASSWORD_INVALID;
        }else {

            //匹配成功,赋值
            $this->_id = $user->id;
            $this->username = $user->username;
            $this->errorCode=self::ERROR_NONE;
        }
    }
    return $this->errorCode === self::ERROR_NONE;
}

public function getId() {
    return $this->_id;
}

在Models里面的User.php添加两个新的方法。添加如下代码:

// 查询密码是否匹配
public function validatePassword($password)
{
    return $this->encrypt($password)===$this->password;
}

public function encrypt($pass)
{
    return md5($pass);
}

// 添加的密码进行MD5加密
protected function beforeSave() {
    if (parent::beforeSave()) {
        //判断是否是新的密码
        if ($this->isNewRecord) {
            $this->password = $this->encrypt($this->password);
        }
        return true;
    }else {
        return false;
    }
}

然后用gii的Crud Generator生成User的Controllers文件UserController.php 这个文件的下面代码是一个简单的权限系统

public function accessRules()
{
    return array(
        array('allow',  // allow all users to perform 'index' and 'view' actions
            'actions'=>array('index','view'),
            'users'=>array('*'),
        ),
        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions'=>array('create','update'),
            'users'=>array('@'),
        ),
        array('allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','delete'),
            'users'=>array('admin'),
        ),
        array('deny',  // deny all users
            'users'=>array('*'),
        ),
    );
}

注: - “ * ”—-任何人都可以访问。 - “ @ ”—-登录用户才能访问。 - “ admin ”—-是指只有admin用户才能访问。

Yii学习笔记(三)-gii的使用以及模块的使用

2012年07月10日

gii的使用 gii可以帮你生成很多文件,很方便。

访问:http://localhost/blog/index.php?r=gii  输入之前设置的密码,进入gii。

选择 Model Generator在Table Name下面输入数据库 表名称,然后点Preview 预览,点Generate 生成文件。

然后在左边再选择Crud Generator在Model Class 下面输入你刚才生成对应的controllers文件(也就是controllers文件夹对应的文件名,注意大小写要匹配),然后点Preview 预览,点Generate 生成文件。

模块的使用(就是使前后台分离)

在gii左边选择Module Generator 在Module ID下面输入Admin,然后点Preview 预览,点Generate 生成文件。这个时候你会发现protected文件夹下面自动生成了一个modules文件夹。

然后修改main.php配置文件。在gii这个数组下面添加:

1
2
3
'Admin'=>array(
    'class'=>'application.modules.Admin.AdminModule',
),

那么接下来就可以在gii中给Admin添加模块了。

在左边再选择Crud Generator在Model Class 下面输入对应的controllers文件(也就是controllers文件夹对应的文件名,注意大小写要匹配),但是注意要修改Controller ID的内容,要在前面加上 “Admin/” ,然后点Preview 预览,点Generate 生成文件。