assets = new Assets();
$this->controls = new CHelper($this);
$this->widgets = new Widgets();
if (Helper::is_edit_mode()) {
$this->assets->editor_template_builder_style();
}
add_action('elementor/widgets/register', function ($widgets_manager) {
$options = array_merge(
(array) get_option('afeb-widgets-status', []),
(array) get_option('afeb-3rdpt-widgets-status', [])
);
$widgets = $this->widgets->get_template_builder_widgets();
$widgets = array_replace_recursive($widgets, $options);
$this->widgets->register_widgets($widgets, $widgets_manager, 'TemplateBuilder');
$post_id = !empty($_REQUEST['post']) ? intval($_REQUEST['post']) : -1;
$document_type = str_replace('-', '_', get_post_meta($post_id, '_afeb_document_type', true));
do_action("afeb/widgets/after_register_{$document_type}_widgets", $widgets_manager);
});
}
/**
* Get document name
*
* @since 1.3.0
*
* @return string Document name
*/
public function get_name()
{
return self::BUILDER_DOCUMENT;
}
/**
* Get document type
*
* @since 1.3.0
*
* @return string Document type
*/
public static function get_type()
{
return self::BUILDER_DOCUMENT;
}
/**
* Get document title
*
* @since 1.3.0
*
* @return string Document title
*/
public static function get_title()
{
return esc_html__('Builder', 'addons-for-elementor-builder');
}
/**
* Get document properties
*
* @since 1.3.0
*
* @return array Document properties
*/
public static function get_properties()
{
$properties = parent::get_properties();
$properties['admin_tab_group'] = '';
$properties['support_kit'] = true;
return $properties;
}
/**
* Get editor panel categories
*
* @since 1.3.0
*
* @return array Panel Categories
*/
protected static function get_editor_panel_categories()
{
$document_type = get_post_meta(get_the_ID(), '_afeb_document_type', true);
$categories = [];
switch ($document_type) {
case 'archive':
$categories['theme-elements-archive'] = ['title' => esc_html__('Archive', 'addons-for-elementor-builder')];
break;
case 'dynamic-loop-item':
$categories['recommended'] = ['title' => esc_html__('Recommended', 'addons-for-elementor-builder')];
break;
case 'footer':
case 'header':
$categories['theme-elements'] = ['title' => esc_html__('Site', 'addons-for-elementor-builder')];
break;
case 'single':
$categories['theme-elements-single'] = ['title' => esc_html__('Single', 'addons-for-elementor-builder')];
break;
}
return $categories + parent::get_editor_panel_categories();
}
/**
* Register Builder document controls
*
* @since 1.3.0
*/
protected function register_controls()
{
parent::register_controls();
/**
*
* Layout
*
*/
$this->controls->tab_settings_section('layout_content_section', [
'label' => esc_html__('Layout', 'addons-for-elementor-builder')
], function () {
$document_type = get_post_meta(get_the_ID(), '_afeb_document_type', true);
$select_items_groups = [];
$select_default_item = '';
if ($document_type != 'single') {
$select_items_groups['archive'] = [
'label' => esc_html__('Archives', 'addons-for-elementor-builder'),
'options' => [
'archive_post' => esc_html__('Posts Archive', 'addons-for-elementor-builder'),
'archive_author' => esc_html__('Author Archive', 'addons-for-elementor-builder'),
'archive_date' => esc_html__('Date Archive', 'addons-for-elementor-builder'),
'archive_search' => esc_html__('Search Results', 'addons-for-elementor-builder'),
],
];
$select_default_item = 'archive_author';
}
if ($document_type != 'archive') {
$select_items_groups['single'] = [
'label' => esc_html__('Single', 'addons-for-elementor-builder'),
'options' => [
'single_post' => esc_html__('Posts', 'addons-for-elementor-builder'),
'single_page' => esc_html__('Pages', 'addons-for-elementor-builder'),
],
];
$select_default_item = 'single_post';
}
$this->controls->select('preview_source', [
'label' => esc_html__('Preview Source', 'addons-for-elementor-builder'),
'groups' => $select_items_groups,
'default' => $select_default_item,
]);
$wp_users = Helper::get_users();
reset($wp_users);
$first_user_id = key($wp_users);
if ($document_type != 'single') {
$this->controls->select2('archive_author_source', [
'label' => esc_html__('Select Author', 'addons-for-elementor-builder'),
'options' => Helper::get_users(),
'default' => $first_user_id,
'separator' => 'before',
'condition' => ['preview_source' => 'archive_author']
]);
$this->controls->text('archive_search_source', [
'label' => esc_html__('Search Keyword', 'addons-for-elementor-builder'),
'separator' => 'before',
'dynamic' => ['active' => true,],
'ai' => ['active' => false,],
'condition' => ['preview_source' => 'archive_search',],
]);
}
if ($document_type != 'archive') {
$this->controls->dynamic_select('single_posts_source', [
'label' => esc_html__('Select Post', 'addons-for-elementor-builder'),
'options' => 'get_posts_by_type',
'query_slug' => 'post',
'default' => '',
'condition' => ['preview_source' => 'single_post',]
]);
$this->controls->dynamic_select('single_pages_source', [
'label' => esc_html__('Select Page', 'addons-for-elementor-builder'),
'options' => 'get_posts_by_type',
'query_slug' => 'page',
'default' => '',
'condition' => ['preview_source' => 'single_page',]
]);
}
$this->controls->raw_html('apply_preview', [
'raw' => sprintf(
'
%s',
esc_html__('Update changes to Preview', 'addons-for-elementor-builder'),
esc_html__('Apply', 'addons-for-elementor-builder')
),
]);
switch ($document_type) {
case 'archive':
case 'single':
/**
*
* Page Layout
*
*/
$this->controls->divider('separator_layout_section');
$this->controls->select('template_type', [
'label' => esc_html__('Page Layout', 'addons-for-elementor-builder'),
'options' => [
'default' => esc_html__('Default', 'addons-for-elementor-builder'),
'elementor_canvas' => esc_html__('Elementor Canvas', 'addons-for-elementor-builder'),
'elementor_header_footer' => esc_html__('Elementor Full Width', 'addons-for-elementor-builder'),
],
'default' => 'default',
]);
$this->controls->hidden('page_id', [
'default' => get_the_ID(),
]);
$this->controls->raw_html('canvas_description', [
'raw' => esc_html__('No header, no footer, just Elementor', 'addons-for-elementor-builder'),
'content_classes' => 'elementor-descriptor',
'condition' => [
'template_type' => 'elementor_canvas',
]
]);
$this->controls->raw_html('header_footer_description', [
'raw' => esc_html__('This template includes the header, full-width content and footer', 'addons-for-elementor-builder'),
'content_classes' => 'elementor-descriptor',
'condition' => [
'template_type' => 'elementor_header_footer',
]
]);
break;
}
switch ($document_type) {
case 'dynamic-loop-item':
$this->controls->slider('preview_width', [
'label' => esc_html__('Preview Width (vw)', 'addons-for-elementor-builder'),
'range' => ['px' => ['min' => 25, 'max' => 100,],],
'selectors' => ['{{WRAPPER}} .afeb-dynamic-loop-item-container' => 'width: {{SIZE}}vw',],
'separator' => 'before',
]);
break;
}
});
}
/**
* Get document query args
*
* @since 1.3.0
*
* @return array Query ARGS
*/
public function get_document_query_args()
{
$settings = $this->get_settings();
$source = $settings['preview_source'];
$default_args = ['post_type' => Builder_PostType::BUILDER_POST_TYPE, 'p' => get_the_ID()];
$args = $default_args;
$get_posts_args = [
'post_type' => 'post',
'numberposts' => 1,
'orderby' => 'date',
'order' => 'DESC',
'suppress_filters' => false,
];
$posts = get_posts($get_posts_args);
if (strpos($source, 'archive_') !== false) {
if ($source == 'archive_post') {
$archive_post = isset($posts[0]->ID) ? $posts[0]->ID : '';
if (is_int($archive_post))
$args = ['post_type' => 'post', 'p' => $archive_post];
} elseif ($source == 'archive_author') {
$args = ['author' => intval($settings['archive_author_source'])];
} elseif ($source == 'archive_date') {
$args = ['post_type' => 'date'];
} elseif ($source == 'archive_search') {
$args = ['s' => sanitize_text_field($settings['archive_search_source'])];
}
}
if (strpos($source, 'single_') !== false) {
$single_post = isset($posts[0]->ID) ? $posts[0]->ID : '';
if (is_int($single_post))
$args = ['post_type' => 'post', 'p' => $single_post];
switch ($source) {
case 'single_post':
$single_post = isset($posts[0]->ID) ? $posts[0]->ID : '';
$single_post = trim($settings['single_posts_source']) ? intval($settings['single_posts_source']) : $single_post;
if (is_int($single_post))
$args = ['post_type' => 'post', 'p' => $single_post];
break;
case 'single_page':
$pages = get_posts([
'post_type' => 'page',
'numberposts' => 1,
'orderby' => 'date',
'order' => 'DESC',
'suppress_filters' => false,
]);
$single_page = isset($pages[0]->ID) ? $pages[0]->ID : '';
$single_page = trim($settings['single_pages_source']) ? intval($settings['single_pages_source']) : $single_page;
$args = is_int($single_page) ? ['post_type' => 'page', 'p' => $single_page] : $default_args;
break;
}
}
return $args;
}
/**
* Switch to preview query
*
* @since 1.3.0
*/
public function switch_to_preview_query()
{
if (get_post_type(get_the_ID()) == Builder_PostType::BUILDER_POST_TYPE) {
$document = Plugin::instance()->documents->get_doc_or_auto_save(get_the_ID());
Plugin::instance()->db->switch_to_query($document->get_document_query_args());
}
}
/**
* Get Builder document content
*
* @since 1.3.0
*
* @return string document content
*/
public function get_content($with_css = false)
{
$this->switch_to_preview_query();
$content = parent::get_content($with_css);
Plugin::instance()->db->restore_current_query();
return $content;
}
/**
* Print Content
*
* @since 1.3.0
*/
public function print_content()
{
$plugin = Plugin::instance();
if ($plugin->preview->is_preview_mode($this->get_main_id())) echo '' . $plugin->preview->builder_wrapper(''); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
else echo '' . $this->get_content(); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
}
/**
* Get Builder document default preview
*
* @since 1.3.0
*
* @return string Default Preview Options
*/
public static function get_preview_as_default()
{
return '';
}
/**
* Get Builder document preview options
*
* @since 1.3.0
*
* @return array Preview Options
*/
public static function get_preview_as_options()
{
return [];
}
/**
* Get elements raw data
*
* @since 1.3.0
*
* @param null $data
* @param bool $with_html_content
*
* @return array
*/
public function get_elements_raw_data($data = null, $with_html_content = false)
{
$this->switch_to_preview_query();
$editor_data = parent::get_elements_raw_data($data, $with_html_content);
Plugin::instance()->db->restore_current_query();
return $editor_data;
}
/**
* Get elements raw data
*
* @since 1.3.0
*
* @param null $data
*
* @return string
*/
public function render_element($data)
{
$this->switch_to_preview_query();
$render_html = parent::render_element($data);
Plugin::instance()->db->restore_current_query();
return $render_html;
}
}