<?php
namespace WPForms\Admin\Tools\Views;
use WPForms\Logger\Log;
use WPForms\Logger\ListTable;
/**
* Class Logs.
*
* @since 1.6.6
*/
class Logs extends View {
/**
* View slug.
*
* @since 1.6.6
*
* @var string
*/
protected $slug = 'logs';
/**
* ListTable instance.
*
* @since 1.6.6
*
* @var ListTable
*/
private $list_table = [];
/**
* Init view.
*
* @since 1.6.6
*/
public function init() {
$this->logs_controller();
}
/**
* Get view label.
*
* @since 1.6.6
*
* @return string
*/
public function get_label() {
return esc_html__( 'Logs', 'wpforms-lite' );
}
/**
* Checking user capability to view.
*
* @since 1.6.6
*
* @return bool
*/
public function check_capability() {
return wpforms_current_user_can();
}
/**
* Get ListTable instance.
*
* @since 1.6.6
*
* @return ListTable
*/
private function get_list_table(): ListTable {
if ( empty( $this->list_table ) ) {
$log_obj = wpforms()->obj( 'log' );
if ( $log_obj ) {
$this->list_table = $log_obj->get_list_table();
}
}
return $this->list_table;
}
/**
* Display view content.
*
* @since 1.6.6
*/
public function display() {
?>
<form action="<?php echo esc_url( $this->get_link() ); ?>" method="POST">
<?php $this->nonce_field(); ?>
<div class="wpforms-setting-row tools">
<h4><?php esc_html_e( 'Log Settings', 'wpforms-lite' ); ?></h4>
<p><?php esc_html_e( 'Enable and configure the logging functionality while debugging behavior of various parts of the plugin, including form and entry processing.', 'wpforms-lite' ); ?></p>
</div>
<div class="wpforms-setting-row tools wpforms-setting-row-toggle wpforms-clear" id="wpforms-setting-row-logs-enable">
<div class="wpforms-setting-label">
<label for="wpforms-setting-logs-enable"><?php esc_html_e( 'Enable Logs', 'wpforms-lite' ); ?></label>
</div>
<div class="wpforms-setting-field">
<span class="wpforms-toggle-control">
<input type="checkbox" id="wpforms-setting-logs-enable" name="logs-enable" value="1" <?php checked( wpforms_setting( 'logs-enable' ) ); ?>>
<label class="wpforms-toggle-control-icon" for="wpforms-setting-logs-enable"></label>
<label for="wpforms-setting-logs-enable" class="wpforms-toggle-control-status" data-on="On" data-off="Off">
<?php wpforms_setting( 'logs-enable' ) ? esc_html_e( 'On', 'wpforms-lite' ) : esc_html_e( 'Off', 'wpforms-lite' ); ?>
</label>
</span>
<p class="desc">
<?php esc_html_e( 'Start logging WPForms-related events. This is recommended only while debugging.', 'wpforms-lite' ); ?>
</p>
</div>
</div>
<div class="wpforms-logs-settings <?php echo wpforms_setting( 'logs-enable' ) ? '' : 'wpforms-hidden'; ?>">
<?php
$this->types_block();
$this->user_roles_block();
$this->users_block();
?>
</div>
<p class="submit">
<button class="wpforms-btn wpforms-btn-md wpforms-btn-orange" name="wpforms-settings-submit">
<?php esc_html_e( 'Save Settings', 'wpforms-lite' ); ?>
</button>
</p>
</form>
<?php
$logs_list_table = $this->get_list_table();
if ( wpforms_setting( 'logs-enable' ) || $logs_list_table->get_total() ) {
$logs_list_table->display_page();
}
}
/**
* Types block.
*
* @since 1.6.6
*/
private function types_block() {
?>
<div
class="wpforms-setting-row tools wpforms-setting-row-select wpforms-clear"
id="wpforms-setting-row-log-types">
<div class="wpforms-setting-label">
<label for="wpforms-setting-logs-types"><?php esc_html_e( 'Log Types', 'wpforms-lite' ); ?></label>
</div>
<div class="wpforms-setting-field">
<span class="choicesjs-select-wrap">
<select id="wpforms-setting-logs-types" class="choicesjs-select" name="logs-types[]" multiple size="1">
<?php
$log_types = wpforms_setting( 'logs-types', [] );
foreach ( Log::get_log_types() as $slug => $name ) {
?>
<option value="<?php echo esc_attr( $slug ); ?>" <?php selected( in_array( $slug, $log_types, true ) ); ?> >
<?php echo esc_html( $name ); ?>
</option>
<?php } ?>
</select>
</span>
<p class="desc"><?php esc_html_e( 'Select the types of events you want to log. Everything is logged by default.', 'wpforms-lite' ); ?></p>
</div>
</div>
<?php
}
/**
* User roles block.
*
* @since 1.6.6
*/
private function user_roles_block() {
?>
<div
class="wpforms-setting-row tools wpforms-setting-row-select wpforms-clear"
id="wpforms-setting-row-log-user-roles">
<div class="wpforms-setting-label">
<label for="wpforms-setting-logs-user-roles"><?php esc_html_e( 'User Roles', 'wpforms-lite' ); ?></label>
</div>
<div class="wpforms-setting-field">
<span class="choicesjs-select-wrap">
<?php
$logs_user_roles = wpforms_setting( 'logs-user-roles', [] );
$roles = wp_list_pluck( get_editable_roles(), 'name' );
?>
<select id="wpforms-setting-logs-user-roles" class="choicesjs-select" name="logs-user-roles[]" multiple size="1">
<?php foreach ( $roles as $slug => $name ) { ?>
<option value="<?php echo esc_attr( $slug ); ?>" <?php selected( in_array( $slug, $logs_user_roles, true ) ); ?> >
<?php echo esc_html( $name ); ?>
</option>
<?php } ?>
</select>
<span class="hidden" id="wpforms-setting-logs-user-roles-selectform-spinner">
<i class="fa fa-cog fa-spin fa-lg"></i>
</span>
</span>
<p class="desc">
<?php esc_html_e( 'Select the user roles you want to log. All roles are logged by default.', 'wpforms-lite' ); ?>
</p>
</div>
</div>
<?php
}
/**
* Users block.
*
* @since 1.6.6
*/
private function users_block() {
?>
<div
class="wpforms-setting-row tools wpforms-setting-row-select wpforms-clear"
id="wpforms-setting-row-log-users">
<div class="wpforms-setting-label">
<label for="wpforms-setting-logs-users"><?php esc_html_e( 'Users', 'wpforms-lite' ); ?></label>
</div>
<div class="wpforms-setting-field">
<span class="choicesjs-select-wrap">
<select id="wpforms-setting-logs-users" class="choicesjs-select" name="logs-users[]" multiple size="1">
<?php
$users = get_users( [ 'fields' => [ 'ID', 'display_name' ] ] );
$users = wp_list_pluck( $users, 'display_name', 'ID' );
$logs_users = wpforms_setting( 'logs-users', [] );
foreach ( $users as $slug => $name ) {
?>
<option value="<?php echo esc_attr( $slug ); ?>" <?php selected( in_array( $slug, $logs_users, true ) ); ?> >
<?php echo esc_html( $name ); ?>
</option>
<?php } ?>
</select>
<span class="hidden" id="wpforms-setting-logs-users-selectform-spinner">
<i class="fa fa-cog fa-spin fa-lg"></i>
</span>
</span>
<p class="desc">
<?php esc_html_e( 'Log events for specific users only. All users are logged by default.', 'wpforms-lite' ); ?>
</p>
</div>
</div>
<?php
}
/**
* Controller.
*
* @since 1.6.6
*/
private function logs_controller() {
if ( $this->verify_nonce() ) {
$this->update_settings();
}
$logs_list_table = $this->get_list_table();
$logs_list_table->process_admin_ui();
}
/**
* Update settings.
*
* @since 1.8.7
*
* @return void
*/
public function update_settings() {
$settings = get_option( 'wpforms_settings' );
$was_enabled = ! empty( $settings['logs-enable'] ) ? $settings['logs-enable'] : 0;
$settings['logs-enable'] = filter_input( INPUT_POST, 'logs-enable', FILTER_VALIDATE_BOOLEAN );
$logs_types = filter_input( INPUT_POST, 'logs-types', FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_REQUIRE_ARRAY );
$logs_user_roles = filter_input( INPUT_POST, 'logs-user-roles', FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_REQUIRE_ARRAY );
$logs_users = filter_input( INPUT_POST, 'logs-users', FILTER_SANITIZE_NUMBER_INT, FILTER_REQUIRE_ARRAY );
if ( $was_enabled ) {
$settings['logs-types'] = $logs_types ? $logs_types : [];
$settings['logs-user-roles'] = $logs_user_roles ? $logs_user_roles : [];
$settings['logs-users'] = $logs_users ? array_map( 'absint', $logs_users ) : [];
}
wpforms_update_settings( $settings );
}
}