• Main navigation
登入區塊
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站資訊區塊
站務管理者

kiang
 

tokimeki
 

sam0228
 

morris
 

shiang
 

SoltyRain
 

廣告
   查看所有文章 (Thinkly)




比cakephp官方网站还方便的API在线帮助!
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10

發表日期:2009/5/21 9:48
應用擴展 工具箱


Cakephp自定义数据验证错误消息
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10
Cakephp提供了强大的自动验证机制,允许我们自定义一些自己的验证消息

我的一个用户注册登陆模块,用到了Auth组件,Auth组件的登陆控制几乎不用我们进行任何控制,我们这里看看如何注册一个用户,并进行用户数据验证

下面记录一个我的自定义数据验证错误的方法.

User控制器代码

function register(){
         
//检测用户是否已经登陆
    
if($this->Session->check('Auth.User')){
        
$this->redirect($this->Auth->loginRedirect);
    }

    if(!empty(
$this->data)){
        
$this->User->set($this->data);
                  
//这里验证用户的密码是否匹配
        
if($this->data['User']['password'] != $this->Auth->password($this->data['User']['repeatpassword'])){
            
$this->User->invalidate('repeatpass');
        }
                  
//这里验证用户密码长度
        
if(strlen($this->data['User']['repeatpassword']) < 3){
                           
//在这里我生成了一个自定义的错误字段,我们稍后在视图中要捕获它
            
$this->User->invalidate('password_too_short');
        }
                  
//这里转到模型的验证
        
if($this->User->validates()){
            
$this->User->create();
            if(
$this->User->save($this->data)){
                
$this->Auth->login($this->data);
                
$this->redirect($this->Auth->loginRedirect);
            }
        }
        
$this->Session->setFlash(__('Sorry ,There are some Errors ,Please retry',true));
    }

         
//这里验证没有通过后,要重置用户的密码,因为密码使用了Auth的password方法转义了
    
$this->data['User']['password'] = '';
    
$this->data['User']['repeatpassword'] = '';
}

User模型代码

class User extends AppModel{
    var 
$name 'User';

    var 
$hasMany = array(
        
'ReceivedNote' => array(
            
'className' => 'ReceivedNote',
            
'foreignKey' => 'receive_user_id'
        
),
        
'SentNote' => array(
            
'className' => 'SentNote',
            
'foreignKey' => 'send_user_id'
        
),
        
'Note'
    
);

    var 
$validate = array(
        
'name' => array(
            
'alphanumeric' => array(
                
'rule' => 'alphaNumeric',
                
'message' => 'Alphabets and numbers only'
            
),
            
'between' => array(
                
'rule' => array('between',6,20),
                
'message' => 'Between 6 to 20 characters'
            
)
        ),
        
'username' => array(
            
'alphanumeric' => array(
                
'rule' => 'alphaNumeric',
                
'message' => 'Alphabets and numbers only'
            
),
            
'between' => array(
                
'rule' => array('between',6,20),
                
'message' => 'Between 6 to 20 characters'
            
)
        ),
        
'password' => array(
            
'length' => array(
                
'rule' => array('between',40,40),
                
'message' => 'Must 40 characters'
            
)
        )
    );

    function 
beforeValidate(){
        if(!
$this->id){
            if(
$this->findCount(array('User.username' => $this->data['User']['username'])) > 0){
                                
//这里同样生成了一个自定义错误字段
                
$this->invalidate('username_unique');
                return 
false;
            }
            return 
true;
        }
    }
}

register视图代码
<?php
echo $form->create('User',array('action' => 'register'));
echo 
$form->input('User.name');
echo 
$form->input('User.username',array(
        
//这里捕获我们的自定义错误username_unique
    
'after' => $form->error(
        
'username_unique',
        
__('The name has exists ,Please change',true)
    )
));
echo 
$form->input('User.password',array(
        
//这里捕获自定义错误password_too_short
    
'after' => $form->error(
        
'password_too_short',
        
__('Password length must greater than 3 ',true)
    )
));
echo 
$form->input('User.repeatpassword',array(
    
'type' => 'password',
        
//同样的这里也捕获了repeatpass自定义错误
    
'after' => $form->error(
        
'repeatpass',
        
__('Repeat password do not match ,Please re-input the Password and RepeatPassword',true)
    )
));
echo 
$form->end(__('Submit',true));
?>

注意

在捕获自定义错误时,使用$form->error函数可以指定一个或两个参数

第一个参数是自定义错误字段的ID

第二个参数是要显示给用户看的消息,这里我们使用了本地化方法__()函数
引用地址:http://www.thinkly.cn/index.php/archives/185

發表日期:2009/5/20 16:54
應用擴展 工具箱


Cakephp多表关联的从表查询笔记
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10
不可否认Cakephp对于查询的封装是有限制的,但是通过利用Cakephp的语法规则,可以很好的弥补这一点。

我们在应用中遇到的问题:

{查询Note的ID小于10的所有User,User表和Note表是一对多关联}

我们通常的做法是

$users 
$this->User->find('all',array(
    
'conditions' => array(
        
'Note.id <' => 10
    
)
));

注意:这种做法是错误的。

原因是:

Cakephp对于hasMany的关联,会生成下列的语句

SELECT 
`User`.`id`, `User`.`name`, `User`.`username`, `User`.`password`, `User`.`createdFROM `users` AS `UserWHERE `Note`.`id` < 10

可以看到,Note表并没有被Join到查询中,所以,MySql会提示

Unknown column 
'Note.id' in 'where clause'

我们应该怎样查询条件从属于关联表的记录呢?

简单介绍一下Cakephp的四种关联模式对应的从属关联条件的方法。

1. 最简单的hasOne和belongsTo关联

这类的关联我们可以直接写关联表的条件,而不会出现Unknow column的错误。

2. 稍稍复杂的hasMany关联(一对多关联)

就像你在上面看见的,hasMany关联是不能直接实现上述的查询条件的,但是我们可以变通一下,我们可以把hasMany关联查询转换为belongsTo关联查询,按照上面的条件,我们再试一试

$users 
$this->User->Note->find('all',array(
    
'conditions' => array(
        
'Note.id <' => 10
    
),
    
'contain' => array('User'),
    
'fields' => array(
        
'Note.id',
        
'User.id',
        
'User.name'
    
)
));

这次得到的结果类似于下面的数据

Array
(
    [
0] => Array
        (
            [
Note] => Array
                (
                    [
id] => 1
                
)
            [
User] => Array
                (
                    [
id] => 54
                    
[name] => Cole Cox
                
)
        )
    [
1] => Array
        (
            [
Note] => Array
                (
                    [
id] => 2
                
)
            [
User] => Array
                (
                    [
id] => 81
                    
[name] => Vincent Cobb
                
)
        )
)

OK,这就是我们想要的!

同样的方法还可以{查找一个User的所有Friend},请看下面的部分。。。

3. 不太好理解的hasAndBelongsToMany关联(多对多关联)

我们的数据表结构如下

--用户表

CREATE TABLE 
IF NOT EXISTS `users` (
  `
idint(11NOT NULL auto_increment,
  `
namevarchar(60collate utf8_unicode_ci NOT NULL,
  `
usernamevarchar(20collate utf8_unicode_ci NOT NULL,
  `
passwordvarchar(255collate utf8_unicode_ci NOT NULL,
  `
createddatetime NOT NULL,
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM;

--
用户和好友关联表

CREATE TABLE 
IF NOT EXISTS `friends_users` (
  `
idbigint(10NOT NULL auto_increment,
  `
user_idbigint(10NOT NULL,
  `
friend_idbigint(10NOT NULL,
  
PRIMARY KEY  (`id`)
ENGINE=MyISAM;

我们需要建立三个模型类

User模型,对应于users表,文件/app/models/user.php

class User extends AppModel{
    var 
$name 'User';

    var 
$hasAndBelongsToMany = array(
        
'Friend' => array('with' => 'FriendsUser')
    );

}

Friend模型,也对应users表(Friend和User共享数据),用来和users模型进行多对多关联

文件/app/models/friend.php

class Friend extends AppModel {
    var 
$name 'Friend';
    var 
$useTable 'users';
    var 
$hasAndBelongsTo = array(
        
'User' => array('with' => 'FriendsUser')
    );
}

FriendsUser模型,对应关联表friends_users,文件/app/models/friends_user.php

class FriendsUser extends AppModel {
    var 
$name 'FriendsUser';
    var 
$belongsTo = array('Friend','User');
}

好了,定义好模型,我们要查询User的所有Friend,在控制器中,要这样

class UsersController extends AppController {
    var 
$name 'Users';

    
//这里,我们要引入这三个模型,如果你有更多的模型,可以一起引入
    
var $uses = array('User','Friend','FriendsUser');

    function 
test(){
        
$conditions = array(
            
'User.id' => 1
        
);
        
$contain = array('User','Friend');
        
$fields = array(
            
'User.id',
            
'User.name',
            
'Friend.id',
            
'Friend.name'
        
);
        
$limit 5;

        
//我们使用了中间表FriendsUser,来查询,compact函数是cakephp提倡的用法
        
$data $this->FriendsUser->find('all',compact(
            
'conditions',
            
'contain',
            
'fields',
            
'limit'
        
));

        
debug($data);
        exit;
    }
}

查询的结果,可能类似下面的数据

Array
(
    [
0] => Array
        (
            [
User] => Array
                (
                    [
id] => 1
                    
[name] => Drake Duran
                
)

            [
Friend] => Array
                (
                    [
id] => 2
                    
[name] => Dane Knowles
                
)

        )

    [
1] => Array
        (
            [
User] => Array
                (
                    [
id] => 1
                    
[name] => Drake Duran
                
)

            [
Friend] => Array
                (
                    [
id] => 3
                    
[name] => Felix Kelley
                
)

        )

)

可以看到,这正是我们需要的数据。

总结一下

Cakephp关联表的从表查询,可以借助belongsTo关联来查询,只要我们做好模型的相互关联,查询是没有问题的!
原文地址为:http://www.thinkly.cn/index.php/archives/187

發表日期:2009/5/20 9:11
應用擴展 工具箱


回覆: Matt 免費提供 CakePHP進階版電子書
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10
哇!感谢分享!

發表日期:2009/5/15 14:13
_________________
Thinkly Blog Jack 和 David 的蛋糕!
應用擴展 工具箱


回覆: Cakephp查询关联表的方法总结
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10
谢谢Kiang!
您提供的方法已经通过验证!
以下是我们测试成功后的完整代码!
contorller:

$results 
$this->User->find('all',array(
                
'conditions' => array(
                    
'OR' => array(
                        
'User.name LIKE' => '%'.$this->data['User']['q'].'%',
                        
'Note.subject LIKE' => '%'.$this->data['User']['q'].'%',
                    ),
                ),
                
'joins' => array(
                    array(
                        
'table' => 'notes',
                        
'alias' => 'Note',
                        
'type' => 'LEFT',
                        
'conditions'=> array('User.id = Note.user_id'),
                    ),
                ),
                
'fields' => array(
                    
'User.name',
                    
'Note.subject',
                    
'Note.created'
                
)
            ));
            
$this->set('results',$results);

views:
<?php if(isset($results)){?>
  <?php foreach($results as $resu): ?>
  <tr>
      <td><?php echo $resu['User']['name'?></td>
      <td><?php echo $resu['Note']['subject'?></td>
      <td><?php echo $resu['Note']['created'?></td>
  </tr>
  <?php endforeach;?>
  <?php ?>

發表日期:2009/5/13 11:13
應用擴展 工具箱


回覆: 方便的除錯工具 - debug_kit
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10
我们写的使用debugkit的文章!http://www.thinkly.cn/index.php/archives/176

debug_kit.zip

發表日期:2009/5/13 10:52
應用擴展 工具箱


回覆: 方便的除錯工具 - debug_kit
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10
怎样在cakephp中使用呢?

發表日期:2009/5/13 8:43
應用擴展 工具箱


CakePHP四种模型关联的学习!
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10
Cakephp中model association(模型关联),意即模型关联另一模型。在模型之间设置正确的关联将允许把实体及其关联模型作为整体来处理,而不是单独处理。其关联方式有四种:

hasOne:

hasOne 关联告诉模型其中的每个实体都在另一个模型中有一个对应的实体。也就是我们通常所说的一一对应的关系,简称为1:1。(一个用户只有一个用户配置文件)

hasMany:

hasMany关联告诉模型其中的每个实体都在另一个模型中有多个对应的实体。也就是我们通常所说的一对多的关系,简称为1:N。(一个经销商有多个产品!)

belongsTo:

belongsTo诉模型其中的每个实体都指向另一个模型中的一个实体。这种关联与 hasOne 刚好相反,因此,一个示例是指向一个对应用户实体的配置文件实体。也就是我们通常所说的多对一的关系,简称为N:1。

hasAndBelongsToMany:

hasAndBelongsToMany关联告诉模型其中的多个实体都在另一个模型中有多个对应的实体。也就是我们通常所说的多对多的关系,简称为N:N。

如果文中的表述有错误,还请大家批评指正!请联系Jack和David!或者在评论中指出!谢谢!
原文网址:http://www.thinkly.cn/index.php/archives/169

發表日期:2009/5/12 17:15
應用擴展 工具箱


Cakephp查询关联表的方法总结
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10
Note项目的数据结构为例,我们要实现下面的操作:

我们可以采用下列几种方式实现

{查询指定User的Note中包含关键词keyword的所有信息}

1.SQL语句


SELECT 
FROM Users AS User
LEFT JOIN Notes 
AS Note ON User.id Note.user_id 
WHERE
User
.id = {$user_id
AND
Note.subject LIKE '%{keyword}%'


然后我们执行这个SQL语句,使用模型的query方法


$data 
$this->User->query($sql);


2.使用模型的bindModel()和unbindModel()方法

关于这两种方法的说明,请参照

http://api.cakephp.org/class/model

我们的做法是


//重新绑定关联指定查询条件 
 
$this->User->unbindModel('Note'); 
$this->User->bindModel(
    
'hasMany' => array( 
        
'Note' => array( 
            
'conditions' => array(
                
'Note.subject LIKE' => '%'.$keyword.'%'
            
)        
        )    
    )
);

//指定主表条件获取数据 
$data $this->User->find('all',array( 
    
'conditions' => array( 
        
'User.id' => $user_id
    

)); 

//或者 
 
$data $this->User->read(null,$user_id);


3. 使用Cakephp的核心行为(Behavior) Containable

我们先建立自己的AppModel类,建立文件/app/app_model.php


class AppModel extends Model 
    
//加载核心行为
    
var $actsAs = array('Containable'); 
}


然后我们在控制器中,可以通过这样的代码查询


$this
->User->contain('Note.subject LIKE' => '%'.$keyword.'%');

$data $this->User->find('all',array(
    
'conditions' => array(
        
'User.id' => $user_id
    
)
));


也可以直接写到find语句中,类似下面的


$data 
$this->User->find('all',array(
    
'conditions' => array(
        
'User.id' => $user_id
    
),
    
'contain' => array(
        
'Note' => array(
            
'conditions' => array(
                
'Note.subject LIKE' => '%'.$keyword.'%'
            
)
        )
    )
));


注意事项:

如果要查询{User.name或者Note.subject包含关键词keyword的所有记录}

此时,Cakephp的find方法无法实现这个查询,必须使用上面介绍的自定义SQL语句,如下:


SELECT 
*
FROM users AS User
LEFT JOIN notes 
AS Note ON User.id Note.user_id
WHERE
User
.name LIKE '%keyword%'
OR
Note.subject LIKE '%keyword%'




David 的文章 CakePHP从两个模型中获取数据!

發表日期:2009/5/12 10:13
應用擴展 工具箱


Cakephp学习小记—大小写,单复数!
Just popping in
註冊日期:
2009/5/12 8:55
文章: 10
接触cakephp并学习着使用它,也有些日子了!可是连些最基本的东西都不能顺利的书写出来!在此也把学习过程中经常发生错误的地方小记一下!希望大家在学习的过程中,能引起注意!

1.英语不好,单词写错,并且注意大小写!往往很不容易发现,所以大家要多学习些英语,多记忆些单词!

比如:Containable 不能写成containable(首字母大写) 和containabel(le->el);

class AppModel extends Model {
var $actsAs = array('Containable');
}

2.关于控制器,模型和视图的文件命名,大小写和单数复数等等!

个人认为在单复数中,控制器,数据表名,视图的文件夹命名都是复数的;模型的命名为单数!

文件名没有大小写,但是请注意下划线(_)这个东东!代码中有大小写!

控制器:文件名:received_notes_controller.php

代码为:

class ReceivedNotesController extends AppController{
var $name = 'ReceivedNotes';
}
url:http://192.168.11.150/cvs06/received_notes(控制器名称去掉controller部分)

模型:文件名:received_note.php

代码为:

class ReceivedNote extends AppModel{
var $name = 'ReceivedNote';
}
视图:文件夹名称为复数。如:“users”

请大家多体验下cakephp中的大小写,下划线,命名!一旦熟悉,将使自己在学习和开发中更顺利!祝你们好运!
引用地址:http://www.thinkly.cn/index.php/archives/140

發表日期:2009/5/12 9:22
應用擴展 工具箱