Merge branch 'refs/heads/develop' into feature/form_error_msgs

Conflicts:
	system/language/english/form_validation_lang.php
	user_guide_src/source/libraries/form_validation.rst

Signed-off-by: Eric Roberts <eric@cryode.com>
diff --git a/system/language/english/form_validation_lang.php b/system/language/english/form_validation_lang.php
index 8788f5d..47c6bbd 100644
--- a/system/language/english/form_validation_lang.php
+++ b/system/language/english/form_validation_lang.php
@@ -26,32 +26,32 @@
  */
 defined('BASEPATH') OR exit('No direct script access allowed');
 
-$lang['required']				= 'The %s field is required.';
-$lang['isset']					= 'The %s field must have a value.';
-$lang['valid_email']			= 'The %s field must contain a valid email address.';
-$lang['valid_emails']			= 'The %s field must contain all valid email addresses.';
-$lang['valid_url']				= 'The %s field must contain a valid URL.';
-$lang['valid_ip']				= 'The %s field must contain a valid IP.';
-$lang['min_length']				= 'The %s field must be at least %s characters in length.';
-$lang['max_length']				= 'The %s field cannot exceed %s characters in length.';
-$lang['exact_length']			= 'The %s field must be exactly %s characters in length.';
-$lang['alpha']					= 'The %s field may only contain alphabetical characters.';
-$lang['alpha_numeric']			= 'The %s field may only contain alpha-numeric characters.';
-$lang['alpha_dash']				= 'The %s field may only contain alpha-numeric characters, underscores, and dashes.';
-$lang['numeric']				= 'The %s field must contain only numbers.';
-$lang['is_numeric']				= 'The %s field must contain only numeric characters.';
-$lang['integer']				= 'The %s field must contain an integer.';
-$lang['regex_match']			= 'The %s field is not in the correct format.';
-$lang['matches']				= 'The %s field does not match the %s field.';
-$lang['differs']				= 'The %s field must differ from the %s field.';
-$lang['is_unique'] 				= 'The %s field must contain a unique value.';
-$lang['is_natural']				= 'The %s field must only contain digits.';
-$lang['is_natural_no_zero']		= 'The %s field must only contain digits and must be greater than zero.';
-$lang['decimal']				= 'The %s field must contain a decimal number.';
-$lang['less_than']				= 'The %s field must contain a number less than %s.';
-$lang['less_than_equal_to']		= 'The %s field must contain a number less than or equal to %s.';
-$lang['greater_than']			= 'The %s field must contain a number greater than %s.';
-$lang['greater_than_equal_to']	= 'The %s field must contain a number greater than or equal to %s.';
+$lang['required']				= 'The {field} field is required.';
+$lang['isset']					= 'The {field} field must have a value.';
+$lang['valid_email']			= 'The {field} field must contain a valid email address.';
+$lang['valid_emails']			= 'The {field} field must contain all valid email addresses.';
+$lang['valid_url']				= 'The {field} field must contain a valid URL.';
+$lang['valid_ip']				= 'The {field} field must contain a valid IP.';
+$lang['min_length']				= 'The {field} field must be at least {param} characters in length.';
+$lang['max_length']				= 'The {field} field cannot exceed {param} characters in length.';
+$lang['exact_length']			= 'The {field} field must be exactly {param} characters in length.';
+$lang['alpha']					= 'The {field} field may only contain alphabetical characters.';
+$lang['alpha_numeric']			= 'The {field} field may only contain alpha-numeric characters.';
+$lang['alpha_dash']				= 'The {field} field may only contain alpha-numeric characters, underscores, and dashes.';
+$lang['numeric']				= 'The {field} field must contain only numbers.';
+$lang['is_numeric']				= 'The {field} field must contain only numeric characters.';
+$lang['integer']				= 'The {field} field must contain an integer.';
+$lang['regex_match']			= 'The {field} field is not in the correct format.';
+$lang['matches']				= 'The {field} field does not match The {field} field.';
+$lang['differs']				= 'The {field} field must differ from The {field} field.';
+$lang['is_unique'] 				= 'The {field} field must contain a unique value.';
+$lang['is_natural']				= 'The {field} field must only contain digits.';
+$lang['is_natural_no_zero']		= 'The {field} field must only contain digits and must be greater than zero.';
+$lang['decimal']				= 'The {field} field must contain a decimal number.';
+$lang['less_than']				= 'The {field} field must contain a number less than {param}.';
+$lang['less_than_equal_to']		= 'The {field} field must contain a number less than or equal to {param}.';
+$lang['greater_than']			= 'The {field} field must contain a number greater than {param}.';
+$lang['greater_than_equal_to']	= 'The {field} field must contain a number greater than or equal to {param}.';
 
 /* End of file form_validation_lang.php */
 /* Location: ./system/language/english/form_validation_lang.php */
\ No newline at end of file
diff --git a/system/libraries/Form_validation.php b/system/libraries/Form_validation.php
index e4eac04..19041bd 100644
--- a/system/libraries/Form_validation.php
+++ b/system/libraries/Form_validation.php
@@ -615,7 +615,7 @@
 				}
 
 				// Build the error message
-				$message = sprintf($line, $this->_translate_fieldname($row['label']));
+				$message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label']));
 
 				// Save the error message
 				$this->_field_data[$row['field']]['error'] = $message;
@@ -767,7 +767,7 @@
 				}
 
 				// Build the error message
-				$message = sprintf($line, $this->_translate_fieldname($row['label']), $param);
+				$message = $this->_build_error_msg($line, $this->_translate_fieldname($row['label']), $param);
 
 				// Save the error message
 				$this->_field_data[$row['field']]['error'] = $message;
@@ -807,6 +807,27 @@
 	}
 
 	// --------------------------------------------------------------------
+	
+	/**
+	 * Build an error message using the field and param.
+	 *
+	 * @param	string	The error message line
+	 * @param	string	A field's human name
+	 * @param	mixed	A rule's optional parameter
+	 * @return	string
+	 */
+	protected function _build_error_msg($line, $field = '', $param = '')
+	{
+		// Check for %s in the string for legacy support.
+		if (strpos($line, '%s') !== false)
+		{
+			return sprintf($line, $field, $param);
+		}
+		
+		return str_replace(array('{field}', '{param}'), array($field, $param), $line);
+	}
+
+	// --------------------------------------------------------------------
 
 	/**
 	 * Get the value from a form
@@ -1468,4 +1489,4 @@
 }
 
 /* End of file Form_validation.php */
-/* Location: ./system/libraries/Form_validation.php */
\ No newline at end of file
+/* Location: ./system/libraries/Form_validation.php */
diff --git a/user_guide_src/source/libraries/form_validation.rst b/user_guide_src/source/libraries/form_validation.rst
index 7478ca0..acf1e56 100644
--- a/user_guide_src/source/libraries/form_validation.rst
+++ b/user_guide_src/source/libraries/form_validation.rst
@@ -139,7 +139,6 @@
 			}
 		}
 	}
-	?>
 
 Try it!
 =======
@@ -240,7 +239,6 @@
 			}
 		}
 	}
-	?>
 
 Now submit the form with the fields blank and you should see the error
 messages. If you submit the form with all the fields populated you'll
@@ -436,7 +434,7 @@
 		{
 			if ($str == 'test')
 			{
-				$this->form_validation->set_message('username_check', 'The %s field can not be the word "test"');
+				$this->form_validation->set_message('username_check', 'The {field} field can not be the word "test"');
 				return FALSE;
 			}
 			else
@@ -446,7 +444,6 @@
 		}
 
 	}
-	?>
 
 Reload your form and submit it with the word "test" as the username. You
 can see that the form field data was passed to your callback function
@@ -469,7 +466,7 @@
 ======================
 
 All of the native error messages are located in the following language
-file: language/english/form_validation_lang.php
+file: /system/language/english/form_validation_lang.php
 
 To set your own custom message you can either edit that file, or use the
 following function::
@@ -479,30 +476,24 @@
 Where rule corresponds to the name of a particular rule, and Error
 Message is the text you would like displayed.
 
-If you include %s in your error string, it will be replaced with the
-"human" name you used for your field when you set your rules.
+If you'd like to include a field's "human" name, or the optional 
+parameter some rules allow for (such as max_length), you can add the 
+**{field}** and **{param}** tags to your message, respectively.
 
-In the "callback" example above, the error message was set by passing
-the name of the function::
+	$this->form_validation->set_message('min_length', '{field} must have at least {param} characters.');
+
+On a field with the human name Username and a rule of min_length[5], an
+error would display: "Username must have at least 5 characters."
+
+.. note:: The old method of using **%s** in your error messages will
+still work, however it will override the tags above. You should use
+one or the other.
+
+In the callback rule example above, the error message was set by passing
+the name of the function (without the "callback_" prefix)::
 
 	$this->form_validation->set_message('username_check')
 
-If you are using an error message that can accept two $s in your error string,
-such as:
-::
-
-	$this->form_validation->set_message('min_length', 'The $s field must contain at least $s characters.');
-
-Then you can also use %1$s and %2$s:
-::
-
-	$this->form_validation->set_message('min_length', 'This field must contain at least %2$s characters.');
-
-You can also override any error message found in the language file. For
-example, to change the message for the "required" rule you will do this::
-
-	$this->form_validation->set_message('required', 'Your custom message here');
-
 .. _translating-field-names:
 
 Translating Field Names
@@ -613,7 +604,7 @@
 
 	$this->form_validation->set_data($data);
 
-Creating validation rules, running the validation and retrieving error messages works the
+Creating validation rules, running the validation, and retrieving error messages works the
 same whether you are validating ``$_POST`` data or an array.
 
 **Important Note:** If you want to validate more than one array during a single execution, then you should	
@@ -678,56 +669,56 @@
 You can name your rules anything you want::
 
 	$config = array(
-	                 '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'
-	                                         )
-	                                    ),
-	                 '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'
-	                                         )
-	                                    )                          
-	               );
+		'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'
+			)
+		)
+	);
 
 Calling a Specific Rule Group
 =============================
 
-In order to call a specific group you will pass its name to the ``run()``
+In order to call a specific group, you will pass its name to the ``run()``
 method. For example, to call the signup rule you will do this::
 
 	if ($this->form_validation->run('signup') == FALSE)
@@ -770,29 +761,29 @@
 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'
-	                                         )
-	                                    )
-	               );
+		'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'
+			)
+		)
+	);
 
 When a rule group is named identically to a controller class/function it
 will be used automatically when the run() function is invoked from that
@@ -928,8 +919,8 @@
 **encode_php_tags**  No        Converts PHP tags to entities.
 ==================== ========= ===================================================================================================
 
-.. note:: You can also use any native PHP functions that permit one
-	parameter, like trim, htmlspecialchars, urldecode, etc.
+.. note:: You can also use any native PHP functions that permits one
+	parameter, like ``trim()``, ``htmlspecialchars()``, ``urldecode()``, etc.
 
 .. _function-reference:
 
@@ -1088,4 +1079,4 @@
 ::
 
 	<input type="radio" name="myradio" value="1" <?php echo  set_radio('myradio', '1', TRUE); ?> />
-	<input type="radio" name="myradio" value="2" <?php echo  set_radio('myradio', '2'); ?> />
\ No newline at end of file
+	<input type="radio" name="myradio" value="2" <?php echo  set_radio('myradio', '2'); ?> />