Form Validation(폼 검증 작업) 튜토리얼
폼 검증 구현을 위해 다음 세가지가 필요합니다.
1. form이 포함된 View 파일
2. 전송 성공 시 보여줄 "success" 메시지 (View 파일 내 존재)
3. 데이터 전송시 이를 받아 처리하는, controller 메소드
The Form (폼)
텍스트 에디터로 "myform.php" 파일을 만드십시오.
그리고 다음 코드를 붙여넣고 "application/views/" 폴더에 저장하십시오.
<html>
<head>
<title>My Form</title>
</head>
<body>
<?php echo validation_errors(); ?>
<?php echo form_open('form'); ?>
<h5>Username</h5>
<input type="text" name="username" value="" size="50" />
<h5>Password</h5>
<input type="text" name="password" value="" size="50" />
<h5>Password Confirm</h5>
<input type="text" name="passconf" value="" size="50" />
<h5>Email Address</h5>
<input type="text" name="email" value="" size="50" />
<div><input type="submit" value="Submit" /></div>
</form>
</body>
</html>
성공 페이지
텍스트 에디터로 "formsuccess.php" 파일을 만드십시오.
그리고 다음 코드를 붙여넣고 "application/views/" 폴더에 저장하십시오.
<html>
<head>
<title>My Form</title>
</head>
<body>
<h3>Your form was successfully submitted!</h3>
<p><?php echo anchor('form', 'Try it again!'); ?></p>
</body>
</html>
The Controller(컨트롤러)
텍스트 에디터로 "Form.php" 파일을 만드십시오.
그리고 다음 코드를 붙여넣고 "application/controllers/" 폴더에 저장하십시오.
<?php
class Form extends CI_Controller {
public function index()
{
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
}
시도해보십시오!
다음과 유사한 URL에 접속하여, 당신의 form을 테스트해보십시오.
example.com/index.php/form/
당신이 해당 폼을 전송하면, 단순히 form이 릴로드(새로고침)될 것입니다.
왜냐하면, 아직 검증 룰을 적용하지 않았기 때문입니다.
Form Validation 클래스에 검증할 어떤 것도 지정하지 않았다면, 기본적으로 FALSE를 반환할 것입니다.
당신이 적용한 룰에서 어떤 오류도 없이 성공적이라면, "The run()"메소드는 TRUE를 반환할 것입니다.
세부설명
위 페이지에서 몇 가지 점들을 발견했을 것입니다 :
"myform.php"는 몇가지 예외 사항이 담긴 표준 웹 폼입니다.
1. form 태그를 시작하기 위해 "form helper"를 사용했습니다.
기술적으로, 필수요소는 아닙니다. 당신은 표준 HTML로 form 태그를 만들 수도 있습니다.
그렇지만, helper를 사용할 때, "config 파일의 기본 URL"을 근거로 action URL을 생성할 수 있는 이점이 있습니다.
즉, URL이 바뀌는 이벤트 발생 시, 보다 유연하게 대처할 수 있는 장점이 있습니다.
2. form의 윗부분에 다음 함수를 호출하는 것을 보았을 것입니다 :
<?php echo validation_errors(); ?>
이 함수는 validator(검증자)로부터 에러 메시지를 받아올 것입니다.
에러 메시지가 없다면 빈 문자열을 반환할 것입니다.
컨트롤러(Form.php)는 하나의 메소드를 가집니다. : index()
이 메소드는 validation 클래스를 초기화하고, 당신의 view 파일에서 사용가능한 "form helper"및 "URL helper"를 로드합니다.
또한, 검증 루틴을 실행시킵니다.
그리고, 검증 성공 여부에 따라, form을 보여주거나, 성공 페이지를 보여줍니다.
검증 룰 설정
CodeIgniter는 당신이 여러 필드에 필요한 많은 수의 검증 룰을 설정할 수 있게 해 줍니다.
검증룰들을 순서대로 맞추고, 동시에 필드 데이터를 준비하며 프로세싱할 수 있게 해 줍니다.
검증 룰을 세팅하기 위해 "set_rules()" 메소드를 사용하십시오.
$this->form_validation->set_rules();
위 메소드는 세가지 인자를 가집니다. :
1. 필드명 - 폼 필드의 정확한 이름
2. 해당 필드에 적합한 "human" 이름, 에러 메시지를 이곳으로 삽입할 것입니다.
예를 들어, 필드명이 "user"라면, 당신은 "human" 이름으로 "Username"을 부여할 수 있습니다.
3. 해당 폼 필드를 위한 검증 룰
4. (선택사항) 현 필드를 위한 에러 메시지를 사용자가 정의할 수 있게 해줍니다.
기본 기능에서 제공하지 않는 경우, 이처럼 쓸 수 있습니다.
주의사항
만약, 필드명을 "language file"에 저장하고 싶은 경우, "필드명 변환" 항목을 참조하세요.
다음은 컨트롤러(Form.php)에서, 검증 초기화 메소드 작업을 보여주는 예입니다 :
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');
이제 당신의 컨트롤러는 다음과 같을 것입니다 :
<?php
class Form extends CI_Controller {
public function index()
{
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('username', 'Username', 'required');
$this->form_validation->set_rules('password', 'Password', 'required',
array('required' => 'You must provide a %s.')
);
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
}
이제, 해당 폼에서 필드를 비워둔 채 전송해보십시오.
그러면, 에러 메시지를 보게될 것입니다.
혹은, 모든 필드를 채워 제출한다면, 성공페이지를 보게될 것입니다.
주의사항
폼필드에서 에러가 발생했을 때, 해당 데이터를 다시 채우지 않을 것입니다.
우리는 그것을 간단히 다룰 것입니다.
배열을 통한 룰 설정
룰 세팅 메소드는 배열을 통해서도 실행될 수 있습니다.
한번의 실행으로 모든 룰을 설정하길 좋아한다면 그렇게 할 수 있습니다.
이와 같이 실행할 경우, 배열 키를 지정해야 합니다.
$config = array(
array(
'field' => 'username',
'label' => 'Username',
'rules' => 'required'
),
array(
'field' => 'password',
'label' => 'Password',
'rules' => 'required',
'errors' => array(
'required' => 'You must provide a %s.',
),
),
array(
'field' => 'passconf',
'label' => 'Password Confirmation',
'rules' => 'required'
),
array(
'field' => 'email',
'label' => 'Email',
'rules' => 'required'
)
);
$this->form_validation->set_rules($config);
중첩하여 사용되는 룰
CodeIgniter는 여러 룰을 중첩하여 사용할 수 있게 해줍니다.
그것을 테스트해보십시오. 룰 세팅 메소드의 세번째 인자를 다음처럼 바꿔 보십시오 :
$this->form_validation->set_rules(
'username', 'Username',
'required|min_length[5]|max_length[12]|is_unique[users.username]',
array(
'required' => 'You have not provided %s.',
'is_unique' => 'This %s already exists.'
)
);
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required|matches[password]');
$this->form_validation->set_rules('email', 'Email', 'required|valid_email|is_unique[users.email]');
위 코드는 다음 룰을 세팅합니다.
1. "username" 필드가 5자보다 작거나 12자보다 커선 안됩니다.
2. "password" 필드가 "password confirmation" 필드와 같아야 합니다.
3. "email" 필드가 유효한 이메일 주소여야 합니다.
이제 테스트해보십시오.
데이터를 올바로 입력하지 않았다면, 새로운 룰에 부합되는 새로운 에러메시지를 보게될 것입니다.
validation 레퍼런스에는 사용 가능한 다수의 rule이 있습니다.
주의사항
set_rules() 메소드의 룰로서, 문자열 대신 배열을 사용할 수도 있습니다.
다음은 그 예입니다 :
$this->form_validation->set_rules('username', 'Username', array('required', 'min_length[5]'));
데이터 준비 작업
또한, validation(검증) 메소드를 위에서처럼 사용할 경우, 여러 방법으로 데이터를 준비시킬 수 있습니다.
예를 들어, 다음처럼 룰을 세팅할 수 있습니다.
$this->form_validation->set_rules('username', 'Username', 'trim|required|min_length[5]|max_length[12]');
$this->form_validation->set_rules('password', 'Password', 'trim|required|min_length[8]');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'trim|required|matches[password]');
$this->form_validation->set_rules('email', 'Email', 'trim|required|valid_email');
위 예에서, 특정 필드의 공백을 제거할 수 있고, 글자 수를 체크할 수 있습니다.
또한 두 패스워드 필드가 동일한지 확인할 수도 있습니다.
어떤 기본 PHP 함수라도 룰로서 적용시킬 수 있습니다. 예를 들어, "htmlspecialchars()", "trim()" 등등을 사용할 수 있습니다.
주의사항
validation 룰을 적용시킨 후, 데이터 준비 함수를 사용하길 원할 수 있습니다.
하지만, 에러가 발생하면 폼 내 데이터는 원본 그대로를 보여줄 것입니다.
폼(form) 다시채우기
지금까지 에러와 관련해서만 다루었습니다.
이제 전송된 폼 필드 데이터를 다시채우는 과정을 설명합니다.
CodeIgniter는 이를 위해 몇몇 helper 함수를 제공합니다.
그 중 대표적인 한 가지는 다음과 같습니다 :
set_value('field name')
"myform.php" 파일을 열어, 각각의 필드 value 값을 업데이트하기 위해 set_value() 함수를 적용시키십시오. :
각각의 필드명에서 "set_value()" 함수 호출을 잊지 마십시오!
<html>
<head>
<title>My Form</title>
</head>
<body>
<?php echo validation_errors(); ?>
<?php echo form_open('form'); ?>
<h5>Username</h5>
<input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" />
<h5>Password</h5>
<input type="text" name="password" value="<?php echo set_value('password'); ?>" size="50" />
<h5>Password Confirm</h5>
<input type="text" name="passconf" value="<?php echo set_value('passconf'); ?>" size="50" />
<h5>Email Address</h5>
<input type="text" name="email" value="<?php echo set_value('email'); ?>" size="50" />
<div><input type="submit" value="Submit" /></div>
</form>
</body>
</html>
해당 웹페이지를 새로고침하고, 에러가 발생되도록 폼을 전송하십시오.
폼 필드 값들이 다시채워질 것입니다.
주의사항
Class 레퍼런스 섹션에서는 select 메뉴, radio 버튼, checkbox를 다시채울수 있도록 도와주는 메소드들이 설명됩니다.
중요내용
폼필드 이름으로 배열을 사용한다면, 해당 함수 역시 배열형태로 제공해야 합니다. 다음은 그 예입니다. :
<input type="text" name="colors[]" value="<?php echo set_value('colors[]'); ?>" size="50" />
더 자세한 점은, "필드명으로 배열 사용" 섹션을 참조하세요.
Callback(재호출) : 사용자 정의 Validation 메소드
validation 시스템은 사용자 정의 메소드를 통해 callback(재호출)을 제공합니다.
이것은 필요에 따라 validation 클래스를 확장하도록 도와줍니다.
예를 들어, 사용자가 선택한 이름이 고유한 값인지 알기 위해, 데이터베이스 쿼리 결과를 보기 원할 수 있습니다.
이 때, callback 메소드를 만들 수 있습니다. 다음은 그 예입니다.
당신의 컨트롤러에서, "username" 룰을 다음처럼 변경하십시오. :
$this->form_validation->set_rules('username', 'Username', 'callback_username_check');
다음은 컨트롤러에서 새 메소드인 "username_check()"을 호출하는 예입니다. :
<?php
class Form extends CI_Controller {
public function index()
{
$this->load->helper(array('form', 'url'));
$this->load->library('form_validation');
$this->form_validation->set_rules('username', 'Username', 'callback_username_check');
$this->form_validation->set_rules('password', 'Password', 'required');
$this->form_validation->set_rules('passconf', 'Password Confirmation', 'required');
$this->form_validation->set_rules('email', 'Email', 'required|is_unique[users.email]');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
public function username_check($str)
{
if ($str == 'test')
{
$this->form_validation->set_message('username_check', 'The {field} field can not be the word "test"');
return FALSE;
}
else
{
return TRUE;
}
}
}
해당 폼을 새로고침하고, "username" 칸에, "test"를 입력해보십시오.
해당 필드 데이터가, 당신이 작성한 callback 메소드를 통해 실행되는 걸 볼 수 있을 것입니다.
callback을 사용하려면, 룰에 메소드명 입력 시, 단순히 "callback_" 를 붙이면 됩니다.
만약, 당신의 callback 메소드에서 인자를 받고자 한다면, 다음처럼 메소드명 다음에 대괄호를 사용할 수 있습니다. : "callback_foo**[bar]**"
이렇게하면 당신의 callback 메소드의 두번째 인자로 전달될 것입니다.
주의사항
당신의 callback 메소드에 폼데이터를 넣을 수 있고, 또한 반환값을 받을 수 있습니다.
만약, callback 메소드가 TRUE나 FALSE값이 아닌 다른 값을 반환할 경우, 폼데이터가 새로이 처리되었다고 간주합니다.
호출용이성: 룰로서 무엇이든 사용할 수 있습니다.
만약, callback 룰이 당신에게 여의치않은 상황이라도 실망하지 마십시오.
(예를 들어, 당신의 컨트롤러에서 사용이 제한될지 모릅니다.)
사용자 정의 룰을 생성할 수 있는 방법이 있습니다.
"is_callable()"을 통해 무엇이든 사용가능합니다.
다음 예를 살펴보십시오 :
$this->form_validation->set_rules(
'username', 'Username',
array(
'required',
array($this->users_model, 'valid_username')
)
);
위 코드는 당신의 "Users_model"객체로부터 "valid_username()"메소드를 사용할 것입니다.
그리고, "models" 사용이 제한된 경우라도 특정 객체나 메소드를 활용할 수 있습니다.
이 때 첫번째 인자가 해당 필드값이 됩니다.
또한, PHP 5.3+를 사용중이라면 anonymous(익명) 함수를 사용할 수 있습니다.
다음은 그 예입니다 :
$this->form_validation->set_rules(
'username', 'Username',
array(
'required',
function($value)
{
// Check $value
}
)
);
Callable 룰은 문자열이 아니고, 룰 명칭도 아닙니다.
따라서, 이것을 통해 에러메시지를 세팅하는데 어려움이 따릅니다.
이 문제를 해결하기 위해, 배열의 두번째 인자에 그러한 룰을 넣을 수 있습니다.
다음은 그 예입니다 :
$this->form_validation->set_rules(
'username', 'Username',
array(
'required',
array('username_callable', array($this->users_model, 'valid_username'))
)
);
다음은 PHP 5.3+ 버전에서의 Anonymous(익명) 함수 예입니다.
$this->form_validation->set_rules(
'username', 'Username',
array(
'required',
array(
'username_callable',
function($str)
{
// Check validity of $str and return TRUE or FALSE
}
)
)
);
에러메시지 세팅
모든 기본 에러메시지는 다음 언어 파일에 위치합니다. :
system/language/english/form_validation_lang.php
룰로서 전역 사용자 정의 메시지를 세팅하려면
"application/language/english/form_validation_lang.php"을 만들어 기존 언어 파일을 대체하거나 확장할 수 있습니다.
(이에 대한 추가정보는 "Language Class"를 참조하십시오.)
또는 다음 메소드를 사용할 수 있습니다. :
$this->form_validation->set_message('rule', 'Error Message');
만약, 특정 필드에 몇몇 룰에서 사용자 정의 에러메시지를 세팅하여야 한다면, 다음처럼 set_rules() 메소드를 사용하십시오 :
$this->form_validation->set_rules('field_name', 'Field Label', 'rule1|rule2|rule3',
array('rule2' => 'Error Message on rule2 for this field_name')
);
특정 룰의 이름과 상응하여, 보여주길 원하는 적합한 에러메시지를 만들수 있습니다.
"human" 이름을 포함하거나, 룰로서 인자값을 포함시키길 원한다면(예를 들어, max_length (최대 길이)), {field} 또는 {param}태그를 추가할 수 있습니다.
다음은 그 예입니다 :
$this->form_validation->set_message('min_length', '{field} must have at least {param} characters.');
"human" 이름이 "Username"인 필드의 최소 길이(min_length)가 5자라면 다음 내용이 출력될 것입니다. :
"Username must have at least 5 characters."
주의사항
에러메시지로서 "%s"를 활용했던, 구버전 sprintf() 메소드 역시 작동할 것입니다.
하지만, 이것은 위 태그로 변경될 것입니다.
따라서, 둘 중 하나만을 선택해서 사용해야 합니다.
위에서 설명한 callback 메소드의 경우, 에러메시지는 메소드명으로 세팅될 것입니다.
("callback_" 접두사 없이 사용) :
$this->form_validation->set_message('username_check')
필드명 변환
"human" 이름을 set_rules() 메소드로 적용한 후, 언어 파일에 저장하고자 할 수 있습니다.
이 때, 해당 이름은 변환될 수 있습니다. 다음은 그 방법입니다 :
먼저, "human" 이름에 "lang:" 선행 문자열이 붙습니다. 다음은 예입니다 :
$this->form_validation->set_rules('first_name', 'lang:first_name', 'required');
또는, 언어 파일 배열 형태로 이름을 저장할 수 있습니다. (접두사 없이 사용) :
$lang['first_name'] = 'First Name';
주의사항
당신의 배열 아이템을 언어 파일에 저장한 경우, CodeIgniter에 의해 자동으로 로드되지 않습니다.
컨트롤러에서 다음처럼 로드해야 합니다. :
$this->lang->load('file_name');
언어 파일에 대해서는 "Language Class"를 참조하십시오.
에러 구분자 변경
기본적으로, "Form Validation class"는 보여지는 에러메시지마다 p 태그("<p>")로 둘러쌉니다.
이 구분자를 전역으로 또는 부분적으로 변경할 수 있으며, config 파일에서 기본값을 바꿀 수도 있습니다.
1. 에러 구분자를 전역으로 변경하길 원하면, 컨트롤러 메소드 내, "Form Validation class"가 호출된 후에 이 내용을 추가하십시오 :
$this->form_validation->set_error_delimiters('<div class="error">', '</div>');
이 예에서, div 태그를 사용하도록 바꾸었습니다.
2. 다음 두가지 에러 발생 함수에서 자신만의 구분자를 사용할 수 있습니다.
이와 같이 개별적으로 구분자를 변경할 수 있습니다 :
<?php echo form_error('field name', '<div class="error">', '</div>'); ?>
또는
<?php echo validation_errors('<div class="error">', '</div>'); ?>
3. config 파일에서 구분자를 설정하려면, "application/config/form_validation.php"에서 원하는 에러 구분자를 추가하십시오.
다음처럼 할 수 있습니다 :
$config['error_prefix'] = '<div class="error_prefix">';
$config['error_suffix'] = '</div>';
개별적으로 에러 보여주기
리스트 형식보다, 각각의 필드에서 개별적으로 에러메시지를 보여주길 원한다면 form_error() 함수를 사용할 수 있습니다.
테스트해보십시오! 당신의 폼(form)을 다음처럼 바꾸어 보십시오. :
<h5>Username</h5>
<?php echo form_error('username'); ?>
<input type="text" name="username" value="<?php echo set_value('username'); ?>" size="50" />
<h5>Password</h5>
<?php echo form_error('password'); ?>
<input type="text" name="password" value="<?php echo set_value('password'); ?>" size="50" />
<h5>Password Confirm</h5>
<?php echo form_error('passconf'); ?>
<input type="text" name="passconf" value="<?php echo set_value('passconf'); ?>" size="50" />
<h5>Email Address</h5>
<?php echo form_error('email'); ?>
<input type="text" name="email" value="<?php echo set_value('email'); ?>" size="50" />
에러가 없다면, 어떤 것도 출려되지 않을 것입니다.
반대로 에러가 있다면, 해당 메시지가 출력될 것입니다.
중요사항
폼필드명으로 배열을 사용한다면, 해당 함수도 배열형태로 제공해야 합니다. 다음은 그 예입니다 :
<?php echo form_error('options[size]'); ?>
<input type="text" name="options[size]" value="<?php echo set_value("options[size]"); ?>" size="50" />
더 자세한 점은, "필드명으로 배열 사용" 섹션을 참조하세요.
($_POST 형태가 아닌) 배열 형태로의 검증
때때로, $_POST 데이터에서 추출되지 않은 배열을 검증하고 싶을 수 있습니다.
이와 같은 경우, 검증하길 원하는 특정 배열을 지정할 수 있습니다 :
$data = array(
'username' => 'johndoe',
'password' => 'mypassword',
'passconf' => 'mypassword'
);
$this->form_validation->set_data($data);
중요사항
검증 룰을 정의하기 앞서 set_data 메소드를 호출하여야 합니다.
중요사항
한번의 실행으로 하나 이상의 배열을 검증하고자 한다면, reset_validation() 메소드를 호출할 수 있습니다.
이 메소드를, 새 배열 검증에 앞서 실행할 수 있습니다.
자세한 점은 "Class Reference"를 참조하세요.
Config 파일에 검증룰 설정 저장하기
Form Validation class의 좋은 점은, 당신의 애플리케이션 모든 곳에서 사용할 수 있도록, config 파일에 검증룰을 저장할 수 있다는 점입니다.
당신은 이것을 그룹 형태로 조직할 수 있습니다.
이러한 그룹은 컨트롤러/메소드가 호출되어 매치될 때, 자동으로 로드할 수 있습니다.
또는 수동으로 호출할 수도 있습니다.
룰(규칙) 저장 방법
당신의 검증룰을 저장하려면, "application/config/"폴더에 "form_validation.php" 파일을 만드십시오.
이 곳에 $config란 이름의 배열을 지정하십시오.
앞서 보여드린 것처럼, 검증 배열은 다음과 같은 형태를 지닙니다 :
$config = array(
array(
'field' => 'username',
'label' => 'Username',
'rules' => 'required'
),
array(
'field' => 'password',
'label' => 'Password',
'rules' => 'required'
),
array(
'field' => 'passconf',
'label' => 'Password Confirmation',
'rules' => 'required'
),
array(
'field' => 'email',
'label' => 'Email',
'rules' => 'required'
)
);
당신이 만든 검증룰 파일은 자동으로 로드될 것입니다.
그 후 run() 메소드를 실행하여 호출할 수 있습니다.
배열 변수 이름이 $config 임을 꼭 기억해야 합니다.
룰 세트 만들기
당신의 룰(규칙)을 세트형태로 조직하려면, 하위 배열 구조를 가져야 합니다.
다음 예는 두가지 룰 세트를 보여줍니다.
각각을 "signup"과 "email"이라고 정했습니다.
원하는 어떤 이름이라도 룰세트로 만들 수 있습니다. :
$config = array(
'signup' => array(
array(
'field' => 'username',
'label' => 'Username',
'rules' => 'required'
),
array(
'field' => 'password',
'label' => 'Password',
'rules' => 'required'
),
array(
'field' => 'passconf',
'label' => 'Password Confirmation',
'rules' => 'required'
),
array(
'field' => 'email',
'label' => 'Email',
'rules' => 'required'
)
),
'email' => array(
array(
'field' => 'emailaddress',
'label' => 'EmailAddress',
'rules' => 'required|valid_email'
),
array(
'field' => 'name',
'label' => 'Name',
'rules' => 'required|alpha'
),
array(
'field' => 'title',
'label' => 'Title',
'rules' => 'required'
),
array(
'field' => 'message',
'label' => 'MessageBody',
'rules' => 'required'
)
)
);
특정 룰 그룹 호출
특정 그룹을 호출하려면, run() 메소드의 인자로 넣어야 합니다.
다음 예는 "signup" 룰을 호출하는 예입니다. :
if ($this->form_validation->run('signup') == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
룰 그룹을 컨트롤러 메소드와 결부시킴
컨트롤러 클래스/메소드 이름과 룰 그룹 이름을 매치하여, 호출을 자동화할 수 있습니다.
예를 들어, "Member"라고 컨트롤러 이름을 정하고, 메소드명은 "signup"이라고 할 수 있습니다.
그에 따른 예제는 다음과 같습니다 :
<?php
class Member extends CI_Controller {
public function signup()
{
$this->load->library('form_validation');
if ($this->form_validation->run() == FALSE)
{
$this->load->view('myform');
}
else
{
$this->load->view('formsuccess');
}
}
}
검증 config 파일에서, 룰 그룹 이름을 "member/signup"으로 지정합니다 :
$config = array(
'member/signup' => array(
array(
'field' => 'username',
'label' => 'Username',
'rules' => 'required'
),
array(
'field' => 'password',
'label' => 'Password',
'rules' => 'required'
),
array(
'field' => 'passconf',
'label' => 'PasswordConfirmation',
'rules' => 'required'
),
array(
'field' => 'email',
'label' => 'Email',
'rules' => 'required'
)
)
);
룰 그룹이 컨트롤러 클래스/메소드 명과 매치되면, run() 메소드가 실행될 때 자동으로 룰 그룹이 실행될 것입니다.
필드명으로 배열 사용
Form Validation 클래스는 필드명으로 배열을 사용하도록 허용합니다.
다음 예를 살펴보십시오 :
<input type="text" name="options[]" value="" size="50" />
필드명으로 배열을 사용한다면, "Helper 함수" 또는 검증룰 필드명도 정확한 배열명을 써야 합니다.
예를 들어, 위 필드처럼 사용 중이라면, 다음과 같이 룰을 세팅할 수 있습니다. :
$this->form_validation->set_rules('options[]', 'Options', 'required');
또는, 위 필드처럼 사용 중일때, 다음처럼 에러메시지를 보여줄 수 있습니다. :
<?php echo form_error('options[]'); ?>
위 필드처럼 사용 중일때, 다음처럼 데이터를 다시 채울 수 있습니다. :
<input type="text" name="options[]" value="<?php echo set_value('options[]'); ?>" size="50" />
당신은 필드명으로 다차원 배열을 사용할 수 있습니다. 다음은 그 예입니다 :
<input type="text" name="options[size]" value="" size="50" />
혹은
<input type="text" name="sports[nba][basketball]" value="" size="50" />
첫 번째 예에서, "Helper 함수" 내 배열명을 정확히 일치하게 사용하여야 합니다.
<?php echo form_error('sports[nba][basketball]'); ?>
복수로 된 checkbox를 사용 중이라면, 각 option 마다 빈 괄호를 남기는 걸 잊지 마십시오.
이렇게 함으로, 모든 선택된 값들이 POST 배열로 추가될 것입니다. :
<input type="checkbox" name="options[]" value="red" />
<input type="checkbox" name="options[]" value="blue" />
<input type="checkbox" name="options[]" value="green" />
만약, 다차원 배열을 사용중이라면 다음처럼 하십시오 :
<?php echo form_error('options[color][]'); ?>
룰(규칙) 레퍼런스
다음 리스트는 사용가능한 모든 룰입니다.
룰 | 인자 | 설명 | 예제 |
required | 없음 | 해당요소가 빈값이면 FALSE를 반환합니다. | |
matches | 있음 | 해당요소의 인자값에 매치되지 않으면 FALSE를 반환합니다. | matches[form_item] |
regex_match | 있음 | 해당요소가 정규식 표현과 매치되지 않으면 FALSE를 반환합니다. | regex_match[/regex/] |
differs | 있음 | 해당요소의 인자값과 다르지 않다면 FALSE를 반환합니다. | differs[form_item] |
is_unique | 있음 | 해당요소의 인자값이 테이블및필드명 내 고유하지않다면 FALSE 반환 주의: 이 룰을 사용하려면 "Query Builder"가 요구됩니다. |
|
min_length | 있음 | 해당요소 값의 길이가 인수값보다 적은 경우 FALSE 반환 | min_length[3] |
max_length | 있음 | 해당요소 값의 길이가 인수값보다 큰 경우 FALSE 반환 | max_length[12] |
exact_length | 있음 | 해당요소 값의 길이가 인자값과 일치하지 않으면 FALSE 반환 | exact_length[8] |
greater_than | 있음 | 해당요소가 인자값과 같거나 적은 경우, 혹은 숫자형태가 아니면 FALSE 반환 |
greater_than[8] |
greater_than_equal_to | 있음 | 해당요소가 인자값보다 더 적은 경우, 혹은 숫자 형태가 아니라면 FALSE를 반환합니다. | greater_than_equal_to[8] |
less_than | 있음 | 해당요소가 인자값과 같거나 더 큰 경우, 혹은 숫자 형태가 아니라면 FALSE를 반환합니다. | less_than[8] |
less_than_equal_to | 있음 | 해당요소가 인자값보다 더 큰 경우, 혹은 숫자 형태가 아니라면 FALSE를 반환합니다. | less_than_equal_to[8] |
in_list | 있음 | 해당요소가 미리 결정된 목록 내 있지 않다면 FALSE를 반환합니다. | in_list[red,blue,green] |
alpha | 없음 | 해당요소가 알파벳 문자 외 어떤 것을 포함하고 있다면 FALSE를 반환합니다. | |
alpha_numeric | 없음 | 해당요소가 알파벳-숫자 외 어떤 것을 포함하고 있다면 FALSE를 반환합니다. | |
alpha_numeric_spaces | 없음 | 해당요소가 알파벳-숫자 및 공백 외 어떤 것을 포함하고 있다면 FALSE를 반환합니다. 앞뒤로 존재하는 공백문제를 해결하기 위해, trim 메소드(공백제거 메소드) 실행 후 사용해야합니다. |
|
alpha_dash | 없음 | 해당요소가 알파벳-숫자, 밑줄, 대시 외 어떤 것을 포함하고 있다면 FALSE를 반환합니다. | |
numeric | 없음 | 해당요소가 숫자 외 어떤 것을 포함하고 있다면 FALSE를 반환합니다. | |
integer | 없음 | 해당요소가 정수 외 어떤 것을 포함하고 있다면 FALSE를 반환합니다. | |
decimal | 없음 | 해당요소가 소수 외 어떤 것을 포함하고 있다면 FALSE를 반환합니다. | |
is_natural | 없음 | 해당요소가 자연수(0, 1, 2, 3 등) 외 어떤 것을 포함하고 있다면 FALSE를 반환합니다. | |
is_natural_no_zero | 없음 | 해당요소가 "0 제외 자연수(1, 2, 3 등)"가 아닌 어떤 것을 포함하고 있다면 FALSE를 반환합니다. | |
valid_url | 없음 | 해당요소가 URL 형식이 아니라면 FALSE를 반환합니다. | |
valid_email | 없음 | 해당요소가 이메일 어드레스 형식이 아니라면 FALSE를 반환합니다. | |
valid_emails | 없음 | 해당요소가 콤마를 구분자로 제공된 이메일 어드레스 리스트 형식이 아니라면 FALSE를 반환합니다. | |
valid_ip | 없음 | 해당요소가 IP 형식이 아니라면 FALSE를 반환합니다. 선택 인자로 "ipv4", "ipv6" 같은 IP 형식을 받아들입니다. | |
valid_base64 | 없음 | 해당요소가 Base64 문자열 형식 아닌 어떤 것을 포함하고 있다면, FALSE를 반환합니다. |
주의사항
이 룰들은 또한 개별적으로 (메소드 형태로) 실행될 수 있습니다.
다음은 그 예입니다 :
$this->form_validation->required($string);
주의사항
2개의 인자가 허용되는 PHP 함수는 무엇이든 사용할 수 있습니다.
그 중 하나는 필드 데이터를 받는 인자여야 합니다.
사전준비작업 레퍼런스
다음 리스트는 사용가능한 사전준비작업 레퍼런스 리스트입니다.
명칭 | 인자 | 설명 |
prep_for_form | 없음 | 더는 사용않게 될 예정입니다: HTML 데이터와 같은 특수 문자를 폼 필드 내에서 깨어지지 않도록 변환합니다. |
prep_url | 없음 | "http://" 문자열이 빠져있다면 추가합니다. |
strip_image_tags | 없음 | 원시 URL이 담긴 이미지 태그로부터 HTML을 제거합니다. |
encode_php_tags | 없음 | PHP 태그를 개체로 변환합니다. |
주의사항
또한, 하나의 인자가 허용되는 어떤 PHP 함수라도 사용가능합니다.
(예 - trim(), htmlspecialchars(), urldecode() 등등)
개요
데이터 검증을 위한 이상적인 시나리오는 다음과 같습니다.
1. 하나의 form을 보여줍니다.
2. 칸을 채우고 전송합니다.
3. 잘못 입력하거나, 필수 항목에 입력하지 않을 경우, 해당 form은 문제점을 에러메시지로 보여줍니다.
4. 해당 form에 문제가 없을 때까지 이 프로세스를 반복합니다.
완료되었을 경우, 스크립트 구문은 다음을 실행하여야 합니다.
1. 필수 데이터를 확인합니다.
2. 데이터 타입이 정확한지 확인합니다.
예를 들어, "이름" 항목이 전송될 경우, 허용된 문자로 이루어져있는지 확인합니다.
또한, 최소 글자수 및 최대 글자수를 넘어선 안됩니다.
그리고, 이미 사용되고 있는 이름이여선 안되며, 예약어 또한 안됩니다.
3. 데이터 보안을 확증합니다.
4. 필요 시, 데이터 사전 포맷팅을 실행합니다.
(공백을 제거하거나, HTML로 인코딩할 수 있습니다.)
5. 해당 데이터를 데이터베이스로 추가하기 앞서, 사전 준비시킵니다.
위에 설명된 프로세스가 매우 복잡한 건 아니지만, 에러 메시지를 출력하고, HTML Form 내 구조물을 제어하려면, 의미 있는 많은 양의 코드가 필요합니다.
Form Validation(폼 검증 작업)은 어렵진 않지만, 지루하고 어수선하게 만듭니다.