AnsPress_Validation()
Description #
AnsPress form validation class.
Source #
File: includes/class/validation.php
class AnsPress_Validation
{
public $args = array();
private $errors = array();
private $fields = array();
/**
* Initialize the class
* @param array $args
*/
public function __construct($args = array()) {
if ( empty( $args ) ) {
return;
}
$this->args = $args;
$this->name_to_key();
$this->fields_to_include();
$this->actions();
}
/**
* Add name value as array key.
* @since 3.0.0
*/
private function name_to_key() {
foreach ( (array) $this->args as $k => $f ) {
if ( isset( $f['name'] ) ) {
$name = $f['name'];
unset( $f['name'] );
unset( $this->args[ $k ] );
$this->args[ $name ] = $f;
}
}
}
/**
* Check fields to process
* @return void
* @since 2.0.1
*/
private function fields_to_include() {
foreach ( (array) $this->args as $field => $actions ) {
$value = isset( $_REQUEST[ $field ] ) ? $_REQUEST[ $field ] : '';
$this->fields[ $field ] = $value;
}
}
/**
* Check if field is empty or not set
* @param string $field
* @return void
* @since 2.0.1
*/
public function required($field) {
if ( ! isset( $this->fields[$field] ) || '' == $this->fields[ $field ] ) {
$this->errors[ $field ] = __( 'This field is required', 'anspress-question-answer' );
}
}
/**
* Sanitize text fields
* @param string $field Field name.
* @return void
* @since 2.0.1
*/
private function sanitize_text_field( $field ) {
if ( isset( $this->fields[ $field ] ) ) {
$this->fields[ $field ] = sanitize_text_field( $this->fields[ $field ] );
}
}
/**
* Check length of a string, if less then specified then return error
* @param string $field
* @param string $param
* @return void
* @since 2.0
*/
private function length_check( $field, $param ) {
// Dont check if Administrator.
if ( current_user_can( 'manage_options' ) ) {
return;
}
if ( $param != 0 && ( ! isset( $this->fields[$field] ) || mb_strlen( strip_tags( $this->fields[$field] ) ) <= $param ) ) {
$this->errors[$field] = sprintf( __( 'Field value should be at least %d characters', 'anspress-question-answer' ), $param );
}
}
/**
* Count comma separated strings
* @param string $field
* @param string $param
* @return void
* @since 2.0
*/
private function comma_separted_count($field, $param) {
if ( isset( $this->fields[$field] ) ) {
$tags = $this->fields[$field];
if ( ! is_array( $tags ) ) {
$tags = explode( ',', $tags );
}
if ( count( $tags ) < $param ) {
$this->errors[$field] = sprintf( __( 'It must be minimum %d characters', 'anspress-question-answer' ), $param );
}
} elseif ( $param > 0 ) {
$this->errors[$field] = sprintf( __( 'It must be minimum %d characters', 'anspress-question-answer' ), $param );
}
}
/**
* @param string $field
*/
private function is_email($field) {
$email = is_email( $this->fields[$field] );
if ( ! $email ) {
$this->errors[$field] = __( 'Not a valid email address', 'anspress-question-answer' );
} else {
$this->fields[$field] = $email;
}
}
/**
* Sanitize as a boolean value
* @param string $field
* @return void
* @since 2.0.1
*/
private function only_boolean($field) {
$this->fields[$field] = (bool) $this->fields[$field];
}
/**
* Sanitize as a integer value
* @param string $field
* @return void
* @since 2.0.1
*/
private function only_int($field) {
$this->fields[$field] = (int) $this->fields[$field];
}
/**
* Sanitize field using wp_kses
* @param string $field
* @return void
* @since 2.0.1
*/
private function wp_kses($field) {
$this->fields[$field] = wp_kses( $this->fields[$field], ap_form_allowed_tags() );
}
/**
* Sanitize field using wp_kses
* @param string $field
* @return void
* @since 2.0.1
*/
private function sanitize_description($field) {
$this->fields[$field] = ap_sanitize_description_field( $this->fields[$field] );
}
/**
* Remove wordpress read more tag
* @param string $field
* @return void
* @since 2.0.1
*/
private function remove_more($field) {
$this->fields[$field] = str_replace( '<!--more-->', '', $this->fields[$field] );
}
/**
* Stripe shortcode tags
* @param string $field
* @return void
* @since 2.0.1
*/
private function strip_shortcodes($field) {
$this->fields[$field] = strip_shortcodes( $this->fields[$field] );
}
/**
* Encode contents inside pre and code tag
* @param string $field
* @return void
* @since 2.0.1
*/
private function encode_pre_code($field) {
$this->fields[$field] = preg_replace_callback( '/<pre.*?>(.*?)<\/pre>/imsu', array( $this, 'pre_content' ), $this->fields[$field] );
$this->fields[$field] = preg_replace_callback( '/<code.*?>(.*?)<\/code>/imsu', array( $this, 'code_content' ), $this->fields[$field] );
}
private function pre_content($matches) {
return '<pre>'.esc_html( $matches[1] ).'</pre>';
}
private function code_content($matches) {
return '<code>'.esc_html( $matches[1] ).'</code>';
}
/**
* Strip all tags
* @param string $field
* @return void
* @since 2.0
*/
private function strip_tags($field) {
$this->fields[$field] = strip_tags( $this->fields[$field] );
}
/**
* Santitize tags field
* @param string $field
* @return void
* @since 2.0
*/
private function sanitize_tags($field) {
$this->fields[$field] = $this->fields[$field];
$tags = $this->fields[$field];
if ( ! is_array( $tags ) ) {
$tags = explode( ',', $tags ); }
$sanitized_tags = '';
if ( is_array( $tags ) ) {
$count = count( $tags );
$i = 1;
foreach ( $tags as $tag ) {
$sanitized_tags .= sanitize_text_field( $tag );
if ( $count != $i ) {
$sanitized_tags .= ','; }
$i++;
}
}
$this->fields[$field] = $sanitized_tags;
}
/**
* Sanitize field based on actions passed
* @param string $field
* @param array $actions
* @return void
* @since 2.0.1
*/
private function sanitize($field, $actions) {
foreach ( $actions as $type ) {
switch ( $type ) {
case 'sanitize_text_field':
$this->sanitize_text_field( $field );
break;
case 'only_boolean':
$this->only_boolean( $field );
break;
case 'only_int':
$this->only_int( $field );
break;
case 'wp_kses':
$this->wp_kses( $field );
break;
case 'remove_more':
$this->remove_more( $field );
break;
case 'strip_shortcodes':
$this->strip_shortcodes( $field );
break;
case 'encode_pre_code':
$this->encode_pre_code( $field );
break;
case 'strip_tags':
$this->strip_tags( $field );
break;
case 'sanitize_tags':
$this->sanitize_tags( $field );
break;
case 'is_email':
$this->is_email( $field );
break;
case 'sanitize_description':
$this->sanitize_description( $field );
break;
default:
$this->fields[$field] = apply_filters( 'ap_validation_sanitize_field', $field, $actions );
break;
}
}
}
/**
* Validate a field based on actions passed
* @param string $field
* @param array $actions
* @return void
* @since 2.0.1
*/
private function validate($field, $actions) {
foreach ( $actions as $type => $param ) {
if ( isset( $this->errors[$field] ) ) {
return; }
switch ( $type ) {
case 'required':
$this->required( $field );
break;
case 'length_check':
$this->length_check( $field, $param );
break;
case 'comma_separted_count':
$this->comma_separted_count( $field, $param );
break;
case 'is_email':
$this->is_email( $field );
break;
default:
$this->errors[$field] = apply_filters( 'ap_validation_validate_field', $field, $actions );
break;
}
}
}
/**
* Append error to a field
* @param string $field field name.
* @param string $errors Error message.
*/
private function append_errors($field, $errors) {
$this->errors[$field] = $errors;
}
/**
* Field is being checked and sanitized
* @return void
* @since 2.0.1
*/
private function actions() {
foreach ( (array) $this->args as $field => $actions ) {
if ( isset( $actions['sanitize'] ) ) {
$this->sanitize( $field, $actions['sanitize'] );
}
if ( isset( $actions['validate'] ) ) {
$this->validate( $field, $actions['validate'] );
}
if ( isset( $actions['error'] ) ) {
$this->append_errors( $field, $actions['error'] );
}
}
}
/**
* Check if fields have any error
* @return boolean
* @since 2.0.1
*/
public function have_error() {
if ( count( $this->errors ) > 0 ) {
return true; }
return false;
}
/**
* Get all errors
* @return array | boolean
*/
public function get_errors() {
if ( count( $this->errors ) > 0 ) {
return $this->errors;
}
return false;
}
/**
* Return all sanitized fields
* @return array
* @since 2.0.1
*/
public function get_sanitized_fields() {
return $this->fields;
}
}
Expand full source code Collapse full source code View on GitHub: includes/class/validation.php:13
Add your comment