<?php
/**
* Suppress "error - 0 - No summary was found for this file" on phpdoc generation
*
* @package WPDataAccess\Simple_Form
*/
namespace WPDataAccess\Simple_Form {
use WPDataAccess\Utilities\WPDA_Message_Box;
/**
* Class WPDA_Simple_Form_Item_Enum
*
* Handles a database column of type enum and shows them as a listbox.
*
* @author Peter Schulz
* @since 2.5.0
*/
class WPDA_Simple_Form_Item_Enum extends WPDA_Simple_Form_Item {
/**
* WPDA_Simple_Form_Item_Enum constructor.
*
* @param array $args
*/
public function __construct( $args = array() ) {
parent::__construct( $args );
$this->data_type = 'enum';
$this->item_hide_icon = true;
}
/**
* Overwrite method show_item: create listbox from enum
*/
protected function show_item() {
if ( $this->is_key_column && ! $this->show_context_update_keys_allowed ) {
// PROBLEM
// Key columns are set to readonly. This will not work for listboxes.
// Therefor listboxes need to be set to disabled. Disabled values however
// are not available in a post ($_POST/$_REQUEST).
// SOLUTION
// Disable listbox (see JS when document is loaded) and add a hidden field
// holding the key value (HERE).
?>
<input type="hidden"
name="<?php echo esc_attr( $this->item_name ); ?>"
value="<?php echo esc_attr( $this->item_value ); ?>"
/>
<?php
}
// Enum column: show values in listbox.
?>
<select name="<?php echo esc_attr( $this->item_name ); ?>"
id="<?php echo esc_attr( $this->item_name ); ?>"
class="<?php echo esc_attr( $this->show_context_class_primary_key ); ?> <?php echo esc_attr( $this->item_class ); ?>"
<?php echo $this->is_readonly ? ' disabled="disabled"' : ''; ?>
<?php echo esc_attr( $this->show_context_item_events ); ?>
>
<?php
$enum_options = $this->item_enum_options;
$i = 0;
$list_values = array();
$list_values[ $this->item_value ] = true;
if ( 'new' === $this->show_context_action ) {
// Check if there is a default value.
if ( $this->item_default_value !== null &&
strtolower( $this->item_default_value ) !== 'null' ) {
$list_values[ $this->item_default_value ] = true;
}
}
if ( is_array( $this->item_enum ) ) {
foreach ( $this->item_enum as $value ) {
$selected = isset( $list_values[ '' !== $enum_options ? $enum_options[ $i ] : $value ] ) ? ' selected' : '';
?>
<option value="<?php echo esc_attr( '' !== $enum_options ? $enum_options[ $i ] : $value ); ?>"<?php echo esc_attr( $selected ); ?>><?php echo esc_attr( $value ); ?></option>
<?php
$i ++;
}
}
?>
</select>
<?php
}
/**
* Overwrite method
*
* @param $pre_insert
*
* @return bool
*/
public function is_valid( $pre_insert = false ) {
if ( ! parent::is_valid( $pre_insert ) ) {
return false;
}
if ( 'YES' === $this->is_nullable && ( '' === $this->item_value || null === $this->item_value ) ) {
return true;
}
if ( 'enum' === substr( $this->column_type, 0, 4 ) ) {
// Get enum from MySQL table.
$allowed_values = explode(
',',
str_replace(
'\'',
'',
substr( substr( (string) $this->column_type, 5 ), 0, - 1 )
)
);//phpcs:ignore - 8.1 proof
$value_found = false;
// Check if value is in enum.
foreach ( $allowed_values as $allowed_value ) {
if ( $allowed_value === $this->item_value ) {
$value_found = true; // Value allowed.
}
}
if ( ! $value_found ) {
// Value not in enum: inform user and set validation to failed.
$msg = new WPDA_Message_Box(
array(
'message_text' => 'Value for ' .
str_replace( '_', ' ', $this->item_name ) .
' ' . __( 'not allowed', 'wp-data-access' ),
'message_type' => 'error',
'message_is_dismissible' => false,
)
);
$msg->box();
return false;
}
} else {
// TODO: how can I test the values of a manually created enum?
}
return true;
}
}
}