147 lines
3.2 KiB
PHP
147 lines
3.2 KiB
PHP
<?php
|
|
|
|
/**
|
|
* Server-side user input validation manager.
|
|
*/
|
|
class WPCF7_Validation implements ArrayAccess {
|
|
private $invalid_fields = array();
|
|
private $container = array();
|
|
|
|
public function __construct() {
|
|
$this->container = array(
|
|
'valid' => true,
|
|
'reason' => array(),
|
|
'idref' => array(),
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
* Marks a form control as an invalid field.
|
|
*
|
|
* @param WPCF7_FormTag|array|string $context Context representing the
|
|
* target field.
|
|
* @param WP_Error|string $error The error of the field.
|
|
*/
|
|
public function invalidate( $context, $error ) {
|
|
if ( $context instanceof WPCF7_FormTag ) {
|
|
$tag = $context;
|
|
} elseif ( is_array( $context ) ) {
|
|
$tag = new WPCF7_FormTag( $context );
|
|
} elseif ( is_string( $context ) ) {
|
|
$tags = wpcf7_scan_form_tags( array( 'name' => trim( $context ) ) );
|
|
$tag = $tags ? new WPCF7_FormTag( $tags[0] ) : null;
|
|
}
|
|
|
|
$name = ! empty( $tag ) ? $tag->name : null;
|
|
|
|
if ( empty( $name )
|
|
or ! wpcf7_is_name( $name ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( is_wp_error( $error ) ) {
|
|
$message = $error->get_error_message();
|
|
} else {
|
|
$message = $error;
|
|
}
|
|
|
|
if ( $this->is_valid( $name ) ) {
|
|
$id = $tag->get_id_option();
|
|
|
|
if ( empty( $id )
|
|
or ! wpcf7_is_name( $id ) ) {
|
|
$id = null;
|
|
}
|
|
|
|
$this->invalid_fields[$name] = array(
|
|
'reason' => (string) $message,
|
|
'idref' => $id,
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns true if the target field is valid.
|
|
*
|
|
* @param string|null $name Optional. If specified, this is the name of
|
|
* the target field. Default null.
|
|
* @return bool True if the target field has no error. If no target is
|
|
* specified, returns true if all fields are valid.
|
|
* Otherwise false.
|
|
*/
|
|
public function is_valid( $name = null ) {
|
|
if ( ! empty( $name ) ) {
|
|
return ! isset( $this->invalid_fields[$name] );
|
|
} else {
|
|
return empty( $this->invalid_fields );
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Retrieves an associative array of invalid fields.
|
|
*
|
|
* @return array The associative array of invalid fields.
|
|
*/
|
|
public function get_invalid_fields() {
|
|
return $this->invalid_fields;
|
|
}
|
|
|
|
|
|
/**
|
|
* Assigns a value to the specified offset.
|
|
*
|
|
* @link https://www.php.net/manual/en/arrayaccess.offsetset.php
|
|
*/
|
|
#[ReturnTypeWillChange]
|
|
public function offsetSet( $offset, $value ) {
|
|
if ( isset( $this->container[$offset] ) ) {
|
|
$this->container[$offset] = $value;
|
|
}
|
|
|
|
if ( 'reason' == $offset
|
|
and is_array( $value ) ) {
|
|
foreach ( $value as $k => $v ) {
|
|
$this->invalidate( $k, $v );
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns the value at specified offset.
|
|
*
|
|
* @link https://www.php.net/manual/en/arrayaccess.offsetget.php
|
|
*/
|
|
#[ReturnTypeWillChange]
|
|
public function offsetGet( $offset ) {
|
|
if ( isset( $this->container[$offset] ) ) {
|
|
return $this->container[$offset];
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns true if the specified offset exists.
|
|
*
|
|
* @link https://www.php.net/manual/en/arrayaccess.offsetexists.php
|
|
*/
|
|
#[ReturnTypeWillChange]
|
|
public function offsetExists( $offset ) {
|
|
return isset( $this->container[$offset] );
|
|
}
|
|
|
|
|
|
/**
|
|
* Unsets an offset.
|
|
*
|
|
* @link https://www.php.net/manual/en/arrayaccess.offsetunset.php
|
|
*/
|
|
#[ReturnTypeWillChange]
|
|
public function offsetUnset( $offset ) {
|
|
}
|
|
|
|
}
|