Sindbad~EG File Manager
<?php
/**
* Suppress inspection on private properties `frontend_obj` and `builder_obj`.
* They are used via getter `get_object()`.
*
* @noinspection PhpPropertyOnlyWrittenInspection
*/
use WPForms\Pro\Forms\Fields\Layout\Builder;
use WPForms\Pro\Forms\Fields\Layout\Frontend;
/**
* Layout field.
*
* @since 1.7.7
*/
class WPForms_Field_Layout extends WPForms_Field {
/**
* Handle name for `wp_register_styles`.
*
* @since 1.7.7
*
* @var string
*/
const STYLE_HANDLE = 'wpforms-layout';
/**
* Instance of the Builder class for Layout Field.
*
* @since 1.7.7
*
* @var Builder
*/
private $builder_obj;
/**
* Instance of the Frontend class for Layout Field.
*
* @since 1.7.7
*
* @var Frontend
*/
private $frontend_obj;
/**
* Layout presets.
*
* @since 1.7.7
*
* @var array
*/
const PRESETS = [
'50-50',
'67-33',
'33-67',
'33-33-33',
'50-25-25',
'25-25-50',
'25-50-25',
'25-25-25-25',
];
/**
* Field types that not allowed to drag into the column.
*
* @since 1.7.7
*
* @var array
*/
const NOT_ALLOWED_FIELDS = [
'layout',
'pagebreak',
'entry-preview',
];
/**
* Primary class constructor.
*
* @since 1.7.7
*/
public function init() {
// Define field type information.
$this->name = esc_html__( 'Layout', 'wpforms' );
$this->type = 'layout';
$this->icon = 'fa-columns';
$this->order = 150;
$this->group = 'fancy';
// Default settings.
$this->defaults = [
'label' => $this->name,
'name' => $this->name,
'description' => '',
'label_hide' => '1',
'size' => 'large',
'preset' => '50-50',
'columns' => [
0 => [
'width_custom' => '',
'width_preset' => '50',
'fields' => [],
],
1 => [
'width_custom' => '',
'width_preset' => '50',
'fields' => [],
],
],
];
$this->init_objects();
$this->hooks();
}
/**
* Hooks.
*
* @since 1.7.7
*/
private function hooks() {
add_filter( 'wpforms_field_new_default', [ $this, 'field_new_default' ] );
add_filter( 'wpforms_entry_single_data', [ $this, 'filter_fields_remove_layout' ], PHP_INT_MAX, 3 );
add_filter( "wpforms_pro_admin_entries_edit_is_field_displayable_{$this->type}", '__return_false' );
add_action( 'enqueue_block_editor_assets', [ $this, 'gutenberg_enqueues' ] );
add_filter( 'register_block_type_args', [ $this, 'register_block_type_args' ], 20, 2 );
add_filter( 'wpforms_conversational_form_detected', [ $this, 'cf_frontend_hooks' ], 10, 2 );
}
/**
* Initialize sub-objects.
*
* @since 1.7.7
*/
private function init_objects() {
$is_ajax = wp_doing_ajax();
if ( $is_ajax || wpforms_is_admin_page( 'builder' ) ) {
$this->builder_obj = $this->get_object( 'Builder' );
}
if ( $is_ajax || ! is_admin() ) {
$this->frontend_obj = $this->get_object( 'Frontend' );
}
}
/**
* Define new field defaults.
*
* @since 1.7.7
*
* @param array $field Field settings.
*
* @return array Field settings.
*/
public function field_new_default( $field ) {
if ( $field['type'] !== $this->type ) {
return $field;
}
return wp_parse_args( $field, $this->defaults );
}
/**
* Get filtered presets.
*
* @since 1.7.7
*
* @return array Presets array.
*/
public function get_presets() {
/**
* Filters the layout field presets list.
*
* @since 1.7.7
*
* @param array $presets An array of the layout field presets.
*/
return (array) apply_filters( 'wpforms_field_layout_get_presets', self::PRESETS );
}
/**
* Get filtered not allowed fields list.
*
* @since 1.7.7
*
* @return array Not allowed fields list.
*/
public function get_not_allowed_fields() {
/**
* Filters the list of the fields that not allowed to be placed inside the column.
*
* @since 1.7.7
*
* @param array $not_allowed_fields An array of the not allowed fields types.
*/
return (array) apply_filters( 'wpforms_field_layout_get_not_allowed_fields', self::NOT_ALLOWED_FIELDS );
}
/**
* Field options panel inside the builder.
*
* @since 1.7.7
*
* @param array $field Field settings.
*/
public function field_options( $field ) {
$this->get_object( 'Builder' )->field_options( $field );
}
/**
* Field preview inside the builder.
*
* @since 1.7.7
*
* @param array $field Field settings.
*/
public function field_preview( $field ) {
$this->get_object( 'Builder' )->field_preview( $field );
}
/**
* Field display on the form front-end.
*
* @since 1.7.7
*
* @param array $field Field settings.
* @param array $deprecated Deprecated.
* @param array $form_data Form data and settings.
*/
public function field_display( $field, $deprecated, $form_data ) {
$this->get_object( 'Frontend' )->field_display( $field, $form_data );
}
/**
* Filter base level fields.
*
* @since 1.7.7
*
* @param array $fields Form fields.
*
* @return array Form fields without the fields in the columns.
*/
public function filter_base_fields( $fields ) {
$fields_in_columns = [];
foreach ( $fields as $field ) {
if ( empty( $field['type'] ) || $field['type'] !== $this->type || empty( $field['columns'] ) ) {
continue;
}
foreach ( $field['columns'] as $column ) {
if ( empty( $column['fields'] ) || ! is_array( $column['fields'] ) ) {
continue;
}
array_push( $fields_in_columns, ...$column['fields'] );
}
}
foreach ( $fields_in_columns as $field_id ) {
unset( $fields[ $field_id ] );
}
return $fields;
}
/**
* Filter fields data. Remove the Layout fields from the fields list.
*
* @since 1.7.7
*
* @param array $fields Fields data.
* @param array $entry Entry data.
* @param array $form_data Form data.
*
* @return array Fields data without the layout fields.
*/
public function filter_fields_remove_layout( $fields, $entry, $form_data ) {
if ( empty( $fields ) ) {
return $fields;
}
foreach ( $fields as $id => $field ) {
if ( empty( $field['type'] ) || $field['type'] !== $this->type ) {
continue;
}
unset( $fields[ $id ] );
}
return $fields;
}
/**
* Hooks that must be registered only on the Conversational Forms Frontend page.
*
* @since 1.7.7
*
* @param array $form_data Form data.
* @param integer $form_id Form Id.
*/
public function cf_frontend_hooks( $form_data, $form_id ) { // phpcs:ignore WPForms.PHP.HooksMethod.InvalidPlaceForAddingHooks
// This filter is needed to remove the Layout fields from the CF frontend.
add_filter( 'wpforms_frontend_form_data', [ $this, 'filter_fields_remove_layout_cf' ] );
}
/**
* Filter fields data. Remove the Layout fields from the fields list in CF.
*
* @since 1.7.7
*
* @param array $form_data Form data.
*
* @return array Fields data without the layout fields.
*/
public function filter_fields_remove_layout_cf( $form_data ) {
$form_data['fields'] = $this->filter_fields_remove_layout( $form_data['fields'], [], $form_data );
return $form_data;
}
/**
* Load enqueues for the Gutenberg editor in WP version < 5.5.
*
* @since 1.7.7
*/
public function gutenberg_enqueues() {
if ( version_compare( get_bloginfo( 'version' ), '5.5', '>=' ) ) {
return;
}
$min = wpforms_get_min_suffix();
wp_enqueue_style(
self::STYLE_HANDLE,
WPFORMS_PLUGIN_URL . "assets/pro/css/fields/layout{$min}.css",
[],
WPFORMS_VERSION
);
}
/**
* Set editor style handle for block type editor.
*
* @since 1.7.7
*
* @param array $args Array of arguments for registering a block type.
* @param string $block_type Block type name including namespace.
*/
public function register_block_type_args( $args, $block_type ) {
if ( $block_type !== 'wpforms/form-selector' || ! is_admin() ) {
return $args;
}
$min = wpforms_get_min_suffix();
// CSS.
wp_register_style(
self::STYLE_HANDLE,
WPFORMS_PLUGIN_URL . "assets/pro/css/fields/layout{$min}.css",
[ $args['editor_style'] ],
WPFORMS_VERSION
);
$args['editor_style'] = self::STYLE_HANDLE;
return $args;
}
/**
* Get object.
*
* @since 1.7.7
*
* @param string $class Class name, `Builder` or `Frontend`.
*
* @return object
*/
private function get_object( $class ) {
$property = strtolower( $class ) . '_obj';
$fqdn_class = 'WPForms\Pro\Forms\Fields\Layout\\' . $class;
if ( ! is_a( $this->$property, $fqdn_class ) ) {
$this->$property = new $fqdn_class( $this );
}
return $this->$property;
}
}
new WPForms_Field_Layout();
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists