409 lines
10 KiB
PHP
409 lines
10 KiB
PHP
<?php
|
||
|
||
/**
|
||
* Setup panel.
|
||
*
|
||
* @since 1.0.0
|
||
* @since 1.6.8 Form Builder Refresh.
|
||
*/
|
||
class WPForms_Builder_Panel_Setup extends WPForms_Builder_Panel {
|
||
|
||
/**
|
||
* Addons data handler class instance.
|
||
*
|
||
* @since 1.6.8
|
||
*
|
||
* @var \WPForms\Admin\Addons\Addons
|
||
*/
|
||
private $addons_obj;
|
||
|
||
/**
|
||
* Is addon templates available?
|
||
*
|
||
* @since 1.6.9
|
||
*
|
||
* @var bool
|
||
*/
|
||
private $is_addon_templates_available = false;
|
||
|
||
/**
|
||
* Is custom templates available?
|
||
*
|
||
* @since 1.6.9
|
||
*
|
||
* @var bool
|
||
*/
|
||
private $is_custom_templates_available = false;
|
||
|
||
/**
|
||
* All systems go.
|
||
*
|
||
* @since 1.0.0
|
||
*/
|
||
public function init() {
|
||
|
||
// Define panel information.
|
||
$this->name = esc_html__( 'Setup', 'wpforms-lite' );
|
||
$this->slug = 'setup';
|
||
$this->icon = 'fa-cog';
|
||
$this->order = 5;
|
||
|
||
$this->addons_obj = wpforms()->get( 'addons' );
|
||
}
|
||
|
||
/**
|
||
* Enqueue assets for the Setup panel.
|
||
*
|
||
* @since 1.0.0
|
||
* @since 1.6.8 All the builder stylesheets enqueues moved to the `\WPForms_Builder::enqueues()`.
|
||
*/
|
||
public function enqueues() {
|
||
|
||
$min = wpforms_get_min_suffix();
|
||
|
||
wp_enqueue_script(
|
||
'wpforms-builder-setup',
|
||
WPFORMS_PLUGIN_URL . "assets/js/components/admin/builder/setup{$min}.js",
|
||
[ 'wpforms-builder', 'listjs' ],
|
||
WPFORMS_VERSION,
|
||
true
|
||
);
|
||
}
|
||
|
||
/**
|
||
* Get templates.
|
||
*
|
||
* @since 1.6.8
|
||
*
|
||
* @return array
|
||
*/
|
||
private function get_templates() {
|
||
/*
|
||
* Form templates available in the WPForms core plugin.
|
||
*
|
||
* @since 1.4.0
|
||
*
|
||
* @param array $templates Core templates data.
|
||
*/
|
||
$core_templates = apply_filters( 'wpforms_form_templates_core', [] );
|
||
|
||
/*
|
||
* Form templates available with the WPForms addons.
|
||
* Allows developers to provide additional templates with an addons.
|
||
*
|
||
* @since 1.4.0
|
||
*
|
||
* @param array $templates Addons templates data.
|
||
*/
|
||
$additional_templates = apply_filters( 'wpforms_form_templates', [] );
|
||
|
||
return array_merge( (array) $core_templates, (array) $additional_templates );
|
||
}
|
||
|
||
/**
|
||
* Output the Settings panel primary content.
|
||
*
|
||
* @since 1.0.0
|
||
*/
|
||
public function panel_content() {
|
||
|
||
?>
|
||
<div id="wpforms-setup-form-name">
|
||
<label for="wpforms-setup-name"><?php esc_html_e( 'Name Your Form', 'wpforms-lite' ); ?></label>
|
||
<input type="text" id="wpforms-setup-name" placeholder="<?php esc_attr_e( 'Enter your form name here…', 'wpforms-lite' ); ?>">
|
||
</div>
|
||
|
||
<div class="wpforms-setup-title">
|
||
<?php esc_html_e( 'Select a Template', 'wpforms-lite' ); ?>
|
||
<span class="wpforms-setup-title-after"></span>
|
||
</div>
|
||
|
||
<p class="wpforms-setup-desc secondary-text">
|
||
<?php
|
||
printf(
|
||
wp_kses( /* translators: %1$s - Create template doc link; %2$s - Contact us page link. */
|
||
__( 'To speed up the process you can select from one of our pre-made templates, start with a <a href="#" class="wpforms-trigger-blank">blank form</a> or <a href="%1$s" target="_blank" rel="noopener noreferrer">create your own</a>. Have a suggestion for a new template? <a href="%2$s" target="_blank" rel="noopener noreferrer">We’d love to hear it</a>!', 'wpforms-lite' ),
|
||
[
|
||
'strong' => [],
|
||
'a' => [
|
||
'href' => [],
|
||
'class' => [],
|
||
'target' => [],
|
||
'rel' => [],
|
||
],
|
||
]
|
||
),
|
||
'https://wpforms.com/docs/how-to-create-a-custom-form-template/',
|
||
'https://wpforms.com/form-template-suggestion/'
|
||
);
|
||
?>
|
||
</p>
|
||
|
||
<?php
|
||
ob_start();
|
||
$this->template_select_options( $this->get_templates() );
|
||
$templates = ob_get_clean();
|
||
?>
|
||
|
||
<div class="wpforms-setup-templates">
|
||
<div class="wpforms-setup-templates-sidebar">
|
||
|
||
<div class="wpforms-setup-templates-search-wrap">
|
||
<i class="fa fa-search"></i>
|
||
<input type="text" id="wpforms-setup-template-search" value="" placeholder="<?php esc_attr_e( 'Search Templates', 'wpforms-lite' ); ?>">
|
||
</div>
|
||
|
||
<ul class="wpforms-setup-templates-categories">
|
||
<?php $this->template_categories(); ?>
|
||
</ul>
|
||
|
||
</div>
|
||
|
||
<div id="wpforms-setup-templates-list">
|
||
<div class="list">
|
||
<?php echo $templates; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php
|
||
|
||
do_action( 'wpforms_setup_panel_after' );
|
||
}
|
||
|
||
/**
|
||
* Generate and display categories menu.
|
||
*
|
||
* @since 1.6.8
|
||
*/
|
||
private function template_categories() {
|
||
|
||
$common_categories = [
|
||
'all' => esc_html__( 'All Templates', 'wpforms-lite' ),
|
||
];
|
||
|
||
if ( $this->is_custom_templates_available ) {
|
||
$common_categories['custom'] = esc_html__( 'Custom Templates', 'wpforms-lite' );
|
||
}
|
||
|
||
if ( $this->is_addon_templates_available ) {
|
||
$common_categories['addons'] = esc_html__( 'Addon Templates', 'wpforms-lite' );
|
||
}
|
||
|
||
$categories = array_merge(
|
||
$common_categories,
|
||
wpforms()->get( 'builder_templates' )->get_categories()
|
||
);
|
||
|
||
foreach ( $categories as $slug => $name ) {
|
||
printf(
|
||
'<li data-category="%1$s"%2$s>%3$s</li>',
|
||
esc_attr( $slug ),
|
||
$slug === 'all' ? ' class="active"' : '',
|
||
esc_html( $name )
|
||
);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Generate a block of templates to choose from.
|
||
*
|
||
* @since 1.4.0
|
||
* @since 1.6.8 Refactor during the Form Builder Refresh. Deprecate second parameter `$slug`.
|
||
*
|
||
* @param array $templates Templates array.
|
||
* @param string $slug Deprecated.
|
||
*/
|
||
public function template_select_options( $templates, $slug = '' ) {
|
||
|
||
if ( empty( $templates ) ) {
|
||
return;
|
||
}
|
||
|
||
// Loop through each available template.
|
||
foreach ( $templates as $template ) {
|
||
|
||
echo wpforms_render( // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
|
||
'builder/templates-item',
|
||
$this->prepare_template_render_arguments( $template ),
|
||
true
|
||
);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Prepare arguments for rendering template item.
|
||
*
|
||
* @since 1.6.8
|
||
*
|
||
* @param array $template Template data.
|
||
*
|
||
* @return array Arguments.
|
||
*/
|
||
private function prepare_template_render_arguments( $template ) {
|
||
|
||
$template['plugin_dir'] = isset( $template['plugin_dir'] ) ? $template['plugin_dir'] : '';
|
||
$template['source'] = $this->get_template_source( $template );
|
||
$template['url'] = ! empty( $template['url'] ) ? $template['url'] : '';
|
||
$template['has_access'] = ! empty( $template['license'] ) ? $template['has_access'] : true;
|
||
|
||
$args = [];
|
||
|
||
$args['template_id'] = ! empty( $template['id'] ) ? $template['id'] : $template['slug'];
|
||
$args['categories'] = $this->get_template_categories( $template );
|
||
$args['demo_url'] = '';
|
||
|
||
if ( ! empty( $template['url'] ) ) {
|
||
$utm_campaign = wpforms()->pro ? 'plugin' : 'liteplugin';
|
||
$args['demo_url'] = add_query_arg(
|
||
[
|
||
'utm_content' => $template['name'],
|
||
],
|
||
$template['url'] . "?utm_source=WordPress&utm_campaign={$utm_campaign}&utm_medium=builder-templates"
|
||
);
|
||
}
|
||
|
||
$template_license = ! empty( $template['license'] ) ? $template['license'] : '';
|
||
$template_name = sprintf( /* translators: %s - Form template name. */
|
||
esc_html__( '%s template', 'wpforms-lite' ),
|
||
esc_html( $template['name'] )
|
||
);
|
||
|
||
$args['badge_text'] = '';
|
||
$args['license_class'] = '';
|
||
$args['education_class'] = '';
|
||
$args['education_attributes'] = '';
|
||
|
||
if ( $template['source'] === 'wpforms-addon' ) {
|
||
$args['badge_text'] = esc_html__( 'Addon', 'wpforms-lite' );
|
||
|
||
// At least one addon template available.
|
||
$this->is_addon_templates_available = true;
|
||
}
|
||
|
||
if ( empty( $template['has_access'] ) ) {
|
||
$args['license_class'] = ' pro';
|
||
$args['badge_text'] = $template_license;
|
||
$args['education_class'] = ' education-modal';
|
||
$args['education_attributes'] = sprintf(
|
||
' data-name="%1$s" data-license="%2$s" data-action="upgrade"',
|
||
esc_attr( $template_name ),
|
||
esc_attr( $template_license )
|
||
);
|
||
}
|
||
|
||
$args['addons_attributes'] = $this->prepare_addons_attributes( $template );
|
||
|
||
$args['selected'] = ! empty( $this->form_data['meta']['template'] ) && $this->form_data['meta']['template'] === $args['template_id'];
|
||
$args['selected_class'] = $args['selected'] ? ' selected' : '';
|
||
$args['badge_text'] = $args['selected'] ? esc_html__( 'Selected', 'wpforms-lite' ) : $args['badge_text'];
|
||
$args['template'] = $template;
|
||
|
||
return $args;
|
||
}
|
||
|
||
/**
|
||
* Generate addon attributes.
|
||
*
|
||
* @since 1.6.8
|
||
*
|
||
* @param array $template Template data.
|
||
*
|
||
* @return string Addon attributes.
|
||
*/
|
||
private function prepare_addons_attributes( $template ) {
|
||
|
||
$addons_attributes = '';
|
||
$required_addons = false;
|
||
|
||
if ( ! empty( $template['addons'] ) && is_array( $template['addons'] ) ) {
|
||
$required_addons = $this->addons_obj->get_by_slugs( $template['addons'] );
|
||
|
||
foreach ( $required_addons as $i => $addon ) {
|
||
if (
|
||
! isset( $addon['action'] ) ||
|
||
! isset( $addon['title'] ) ||
|
||
! isset( $addon['slug'] ) ||
|
||
! in_array( $addon['action'], [ 'install', 'activate' ], true )
|
||
) {
|
||
unset( $required_addons[ $i ] );
|
||
}
|
||
}
|
||
}
|
||
|
||
if ( ! empty( $required_addons ) ) {
|
||
$addons_names = implode( ', ', wp_list_pluck( $required_addons, 'title' ) );
|
||
$addons_slugs = implode( ',', wp_list_pluck( $required_addons, 'slug' ) );
|
||
|
||
$addons_attributes = sprintf(
|
||
' data-addons-names="%1$s" data-addons="%2$s"',
|
||
esc_attr( $addons_names ),
|
||
esc_attr( $addons_slugs )
|
||
);
|
||
}
|
||
|
||
return $addons_attributes;
|
||
}
|
||
|
||
/**
|
||
* Determine the template source.
|
||
*
|
||
* @since 1.6.9
|
||
*
|
||
* @param array $template Template data.
|
||
*
|
||
* @return string Template source.
|
||
*/
|
||
private function get_template_source( $template ) {
|
||
|
||
if ( ! empty( $template['source'] ) ) {
|
||
return $template['source'];
|
||
}
|
||
|
||
if ( $template['plugin_dir'] === 'wpforms' || $template['plugin_dir'] === 'wpforms-lite' ) {
|
||
return 'wpforms-core';
|
||
}
|
||
|
||
return 'wpforms-addon';
|
||
}
|
||
|
||
/**
|
||
* Determine the template categories.
|
||
*
|
||
* @since 1.6.9
|
||
*
|
||
* @param array $template Template data.
|
||
*
|
||
* @return string Template categories coma separated.
|
||
*/
|
||
private function get_template_categories( $template ) {
|
||
|
||
$categories = ! empty( $template['categories'] ) ? (array) $template['categories'] : [];
|
||
|
||
if ( isset( $template['source'] ) && $template['source'] === 'wpforms-addon' ) {
|
||
$categories[] = 'addons';
|
||
}
|
||
|
||
static $addons = null;
|
||
|
||
if ( $addons === null ) {
|
||
$addons = array_keys( $this->addons_obj->get_all() );
|
||
}
|
||
|
||
if (
|
||
isset( $template['source'] ) &&
|
||
$template['source'] !== 'wpforms-core' &&
|
||
$template['source'] !== 'wpforms-api' &&
|
||
! in_array( $template['plugin_dir'], $addons, true )
|
||
) {
|
||
$categories[] = 'custom';
|
||
|
||
// At least one custom template available.
|
||
$this->is_custom_templates_available = true;
|
||
}
|
||
|
||
return implode( ',', $categories );
|
||
}
|
||
}
|
||
|
||
new WPForms_Builder_Panel_Setup();
|