2011-02-07 74 views
0

我有表用戶,其中有字段用戶名,密碼和類型。該類型可以是這些員工,供應商和客戶的任何一個或組合,即用戶可以是供應商或客戶,也可以是其他組合。對於類型字段,我使用了多個複選框,請參閱下面的代碼。這是視圖/用戶/ add.ctp文件哪個cakephp回調方法可供選擇?

形式 - >創建( '用戶');?> 形式 - >輸入( '用戶名'); echo $ this-> Form-> input('password'); echo $ this-> Form-> input('type',array('type'=>'select','multiple'=>'checkbox','options'=> array( 'client'=>' ' ) ));''''''''' > 形式 - >端部(__( '提交',真));?>

這是我在模型文件中使用的代碼。回調方法beforeSave 應用/模型/ user.php的

功能beforeSave(){ 如果(!空(這 - $>數據[ '用戶'] [ '類型'])){$ 這 - > data ['User'] ['type'] = join(',',$ this-> data ['User'] ['type']); } return true; } 此代碼將多個值保存爲db中逗號分隔值。

當我編輯用戶時,主要問題出現了。如果用戶在創建用戶時選擇了多種類型,我無法找到爲該用戶類型檢查的複選框。

+0

我不熟悉cakephp,如果你在某處加載$ this-> data ['User'],那麼直接執行該操作後,應該運行`$ this-> data [ 'User'] ['type'] = explode(',',$ this-> data ['User'] ['type']);`然後它應該工作 – Jason 2011-02-07 05:03:33

+0

你知道我應該這樣編碼。但Iam困惑了我應該在哪種回調方法中編寫這段代碼。 – 2011-02-07 05:11:49

回答

3

你不應該在一個字段中保存序列化數據,json或csv。這使得你的生活在以後很難實現。

雖然habtm是一種做事的方法,但如果您的二進制數學是合理的,您可能需要爲此檢出位掩碼。這裏是一個偉大的交http://mark-story.com/posts/view/using-bitmasks-to-indicate-status

基礎將是 1 =僱員 2 =廠商 4 =客戶端 // 8 = next_type

然後,如果用戶是類型僱員&供應商提供的類型將是3 (1 + 2),如果它是一個供應商&客戶端類型將是6(2 + 4)

你可以看到有沒有辦法混合起來,並且按位在mysql中也很好,很容易。查看帖子獲取更多詳細信息

0

您應該有一個表types和一個連接表users_types
你在看什麼是HABTM relationship,所以你應該像一個處理它。
在加入UsersType模型中,您應該添加一個custom validation rule,用於檢查是否允許當前的類型組合。

+0

當我添加新用戶時,它對我的​​工作很好。但是當我編輯一個用戶時,我沒有檢查我爲該用戶選擇的類型的複選框。 – 2011-02-07 05:05:52

0

如果要在數據庫中找到數據後再修改數據,可以在模型中使用afterFind()回調。

所以你的情況,把這樣的事情是你的用戶模型:

function afterFind($results) { 
    $results['User']['type'] = explode(',', $results['User']['type']); 
    return $results; 
} 

有一個在CakePHP的手動more info on afterFind

也就是說,這可能是值得考慮的另一種方法,如上面首先建議的HABTM關係。