forecho 的独立博客

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

Code School 学习 Objective-C第一课笔记

2013年08月30日

学习地址是:http://tryobjectivec.codeschool.com/ 感觉非常有趣的体验,并且还能学习一下英文,英文单词都是比较简单的,我基本上都能看懂。 下面记录一下第一节课的笔记:

  • 申明数据类型都有NS字母开头。
  • 变量名称都有*符号开头。
  • 变量的值都有@符号开头。
  • 申明一个数组之后不能直接追加值。如果需要改变这个数组,需要重新赋值,可以参照12行代码。
  • 申明数组类型用[]符号,但是申明一个字典类型用的是{}符号。

Navicat for MySQL 11 Linux 破解方法

2013年08月28日

安装:解压后即可用。目录下的start_navicat文件为可执行文件。 破解:(找过好几个注册码都不能用,注册码生成器都是Windows平台的,Linux下不行) -—第一次执行start_navicat时,会在用户主目录下生成一个名为.navicat的隐藏文件夹。 -—把此文件夹删除后(删除文件夹命令是rm -rf .navicat),下次启动navicat 会重新生成此文件夹,30天试用期会按新的时间开始计算。

Yii中CLinkPager结合Bootstrap的样式分页

2013年08月09日

$this->widget(‘zii.widgets.CListView’, array( ‘dataProvider’=>$model->search(), ‘itemView’=>’_post’, ‘emptyText’=>’暂时没有数据’,
‘template’=>’{items}{pager}’, ‘pager’ => array( ‘header’=>false, ‘htmlOptions’=>array(‘class’=>’pagination’), ‘selectedPageCssClass’ => ‘active’,
‘hiddenPageCssClass’ => ‘disabled’, // ‘cssFile’=>false, // ‘maxButtonCount’=>25, // ‘selectedPageCssClass’=>’active’, // ‘hiddenPageCssClass’=>’disabled’, // ‘firstPageCssClass’=>’previous’, // ‘lastPageCssClass’=>’next’, // ‘firstPageLabel’=>’«’, // ‘lastPageLabel’=>’»’, // ‘prevPageLabel’=>’<’, // ‘nextPageLabel’=>’>’, ), ‘htmlOptions’=>array(‘class’=>’list-group’), ‘itemsTagName’=>’ol’, ‘itemsCssClass’=>’box-cell’, ‘pagerCssClass’=>’’, )); ?>

yii默认分页默认第一页是不显示首页和前一页的,加上上面的两行加亮代码就能解决这个问题。这样首页和上一页会总是显示。

Yii发邮件插件

2013年08月07日

一、Yii发邮件插件下载。 二,在配置文件/protected/config/main.php中载入组件,代码如下:

'components'=>array(
        'phpMailer'=>array(
            'class'=>'application.extensions.yiimailer.CPhpMailer',
            'host' => 'mail.myhost.com', //比如QQ的是smtp.qq.com
            'port' => 25,
            'from' => 'myname@myhost.com', //发件地址的用户名
            'fromName' => 'myname',//发件人
            'user' => 'username',//发件地址的用户名
            'pass' => 'password',//发件地址的密码
        ),
...

三、然后在控制器写入action,就可以发邮箱了,示例代码:

//发邮件
public function actionSendEmail()
{
    $mailer = Yii::app()->phpMailer->_mailer;
    $mailer->Subject = '人类已经阻止不了我发送邮件了';
    $mailer->Body = '<font color="red">hello, 我是葫芦娃</font>';
    $mailer->AddAddress('caizhenghai@gmail.com');
    //$mailer->AddAddress('xxx@gmail.com');
    $mailer->send();
}

  参考文章:http://www.yiichina.com/forum/topic/1417/ 其他yii发邮件插件以及方法:http://www.yiichina.com/forum/topic/63/

Yii 多表使用一个Model文件

2013年08月03日

表结构一样,现在需要把这些表全部都的数据都查出来,使用一个Model文件。 首先要声明三个私有变量:

private $tableName = 'fr_goods';//默认表名
private static $_models=array();
private $_md;

添加 构造函数:创建和初始化对象成员属性,代码如下:

public function __construct($scenario='search', $tableName = null)
{
    if($tableName !== null)
        $this->tableName = $tableName;
    parent::__construct($scenario);
}

把默认的function tableName() 改为如下:

public function tableName()
{
     return $this->tableName;

}

这个时候你调用的时候,输出tableName的时候,虽然成功了,但是数据还是没有变。 下面我们要改变数据元才行。   把默认生成的 function model(),改成如下代码:

public static function model($tableName = false, $className=__CLASS__)
{
    if($tableName === null) $className=null; // 这个字符串将节省内部CActiveRecord的功能
    if(!$tableName)
        return parent::model($className);

    if(isset(self::$_models[$tableName.$className]))
        return self::$_models[$tableName.$className];
    else
    {
        $model=self::$_models[$tableName.$className]=new $className(null);
        $model->tableName = $tableName;

        $model->_md=new CActiveRecordMetaData($model);
        $model->attachBehaviors($model->behaviors());

        return $model;
    }
}

最关键的是添加下面这行代码:

public function getMetaData()
{
    if($this->_md!==null)
        return $this->_md;
    else
        return $this->_md=static::model($this->tableName())->_md;
}

现在配置完成。下面我们写一个调用的小例子。 下面是Model的function search()代码:

public function search()
{
    // Warning: Please modify the following code to remove attributes that
    // should not be searched.

    $criteria=new CDbCriteria;

    $criteria->compare('id',$this->id,true);
    $criteria->compare('goods_sn',$this->goods_sn,true);
    $criteria->compare('language_ids',$this->language_ids,true);
    $criteria->compare('site_ids',$this->site_ids,true);

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

Controller文件代码如下:

public function actionAdmin()
{
    $model=new KindsGoods('search', 'es_goods');//es_goods表名
    $model->unsetAttributes();  // clear any default values
    if(isset($_GET['KindsGoods']))
        $model->attributes=$_GET['KindsGoods'];

    $this->render('admin',array(
        'model'=>$model,
    ));
}

这个时候输出的结果如果是es_goods表的数据,那就说明你成功了。   参考文章:http://stackoverflow.com/questions/16399561/yii-one-model-for-multiple-tables

Yii Ajax 表单验证

2013年07月30日

先在Views页面的表单开启这个功能:

<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'signup-form',
    'enableAjaxValidation' => true,//开启Ajax验证
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
)); ?>

...

<?php $this->endWidget(); ?>

然后再对应的Controller的action中加入代码:

//注册
public function actionSignup()
{   
    $model = new LoginForm('signup');
    // 开启Ajax验证
    if(isset($_POST['ajax']) && $_POST['ajax']==='signup-form')
    {
        echo CActiveForm::validate($model);
        Yii::app()->end();
    }
    if (isset($_POST['LoginForm'])) {
        $model->attributes=$_POST['LoginForm'];
        if($model->validate()){
            if($model->signup()){ 
               $this->redirect(array('login'));
            }
        }
    }

    $this->render('signup', array('model'=>$model));
}

需要注意的是:表单的ID 名字 要跟控制器中的一样。(此处我的是signup-form ==============补充 2014年01月12日============= 如果想让 ajax 的字段唯一,只需要在 Model 文件的 Rules 方法里面加上下面这行就可以了:

array('name', 'unique'),

Yii Select下拉菜单

2013年07月30日

Yii给下拉菜单一个添加一条数据: 一、不需要默认值

<?php echo $form->dropdownlist(
                    $model,
                    'parent_id',
                    CHtml::listData(Cat::model()->findAll(), 'id', 'name'),
                    array('prompt'=>'根目录')
); ?>

‘prompt’可以换成’empty’ 结果是:

<select name="Cat[parent_id]" id="cat_parent_id">
    <option value="">根目录</option>
    <option value="1">手机</option>
    <option value="2">婚纱</option>
</select>

  二、如果自己的添加的一个Option需要给定Value的话,只能用‘empty’来实现,示例如下:

<?php echo $form->dropdownlist(
                    $model,
                    'parent_id',
                    CHtml::listData(Cat::model()->findAll(), 'id', 'name'),
                    array('empty'=>array('10'=>'根目录'))
); ?>

结果是:

<select name="Cat[parent_id]" id="cat_parent_id">
    <option value="10">根目录</option>
    <option value="1">手机</option>
    <option value="2">婚纱</option>
</select>

  参考资料: http://www.yiichina.com/api/CHtml#activeDropDownList-detail http://stackoverflow.com/questions/16057637/yii-dropdown-list-empty-value-as-default

PHP MySQL Yii更新数据库时 字段值自增

2013年07月30日

PHP MySQL的实现方法是:

update tablename set fieldname = fieldname*2 where ...

Yii基本上有三种实现方法: 一、用save()方法。

//登录一次加5点
$user=User::model()->findByPk(Yii::app()->user->id);
$user->reputation=$user->reputation+'5';
$user->save(); // 将更改保存到数据库

二、用saveCounters方法。(要实现自减,只需把数值改成负数即可)

$postRecord=User::model()->findByPk(Yii::app()->user->id);
$postRecord->saveCounters(array('reputation'=>5));

三、用updateCounters?这个还没有成功,报错貌似是编码问题,待解。   参考资料:http://www.yiiframework.com/wiki/282/using-counters-with-activerecord/