Browsing articles in "Codeigniter"
十月
7
2013

GroceryCRUD密碼欄位的處理

當我們使用GroceryCRUD的時候,最簡單的設定密碼欄位方式

$crud->field_type('user_pass', 'password');

只要使用field_type進行設定,這個欄位就會變成密碼的樣式,但是卻會發生一個問題,就是進入到編輯頁面的時候,密碼欄位都會重新送出寫進資料庫,除非你的密碼沒有加密,直接使用明碼存放在資料庫裡面,不然就會發生密碼一直被修改,使用者會無法登入的慘劇。對了,如果你的密碼是明碼直接存放於資料庫,歡迎在下面留言,讓大家都知道,然後讓大家觀摩朝聖一下 😀

為了避免上述的慘劇發生,我使用下面的方法來處理

1. 我使用另外一種方式來表達密碼欄位,不使用原本的field_type的方式

$crud->callback_add_field('user_pass',array($this,'setPasswordToEmpty'));
$crud->callback_edit_field('user_pass',array($this,'setPasswordToEmpty'));

2. setPasswordToEmpty的內容

function setPasswordToEmpty() {
	return "<input type='password' name='user_pass' value='' />";
}

3. 我建立下面兩個callback來處理密碼欄位

$crud->callback_before_insert(array($this, 'userPassProcess'));
$crud->callback_before_update(array($this, 'userPassProcess'));

4. 現在開始寫userPassProcess的內容

function userPassProcess($postArray, $primaryKey=null)
{
	// 如果密碼欄位不等於空白
	if(!empty($postArray['user_pass']))
	{
		$postArray['user_pass'] = $this->_encryptPass($postArray['user_pass']);
	}
	// 如果密碼欄位是空白
	else if(empty($postArray['user_pass']))
	{
		// 如果沒有把密碼欄位從要傳送的array中移除,會發生密碼欄位被更新為空值的情況
		unset($postArray['user_pass']);
	}
	return $postArray;
}

5. 最後把必填欄位也順手處理一下

if($crud->getState() == 'add')
{
	$crud->required_fields('user_acct','user_pass');
}
else
{
	$crud->required_fields('user_acct');
}
十月
6
2013

GroceryCRUD中檢查表單欄位輸入的值是否重複

我們在設計表單的時候,有些欄位例如使用者帳號,我們會希望是唯一不重複的。GroceryCRUD其實有提供一個很簡單的方式達成我們這樣的需求,但是文件卻沒有寫,我原本想要自己寫一個,結果在讀原始碼的時候,發現作者早就做好這個功能了,下面跟大家分享一下怎麼使用。

首先,我們先把要檢查是否唯一不可重複的欄位設定為unique,這個使用phpMyAdmin來做應該不用另外教吧??
接下在controller裡面加上下面這行程式

$crud->unique_fields('user_account');

這樣就完成了,是不是相當的簡單呢?
如果要修改錯誤訊息的提示文字,請修改 $CI根目錄/application/language/$你的語系檔目錄/form_validation_lang.php 的$lang[‘is_unique’]就可以了