Files
roi-theme/wp-content/plugins/thrive-ultimatum/inc/classes/class-tu-state-manager.php
root a22573bf0b Commit inicial - WordPress Análisis de Precios Unitarios
- WordPress core y plugins
- Tema Twenty Twenty-Four configurado
- Plugin allow-unfiltered-html.php simplificado
- .gitignore configurado para excluir wp-config.php y uploads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-03 21:04:30 -06:00

310 lines
7.7 KiB
PHP
Executable File

<?php
/**
* Handles AJAX calls related to design states
*
* Class TU_State_Manager
*/
class TU_State_Manager extends TU_Request_Handler {
/**
* @var $instance self
*/
protected static $instance = null;
/**
* Row from DB
*
* @var $design array always the main (default) state for a design
*/
protected $design = null;
/**
* TU_State_Manager constructor.
*
* @param $design
*/
private function __construct( $design ) {
$this->design = $design;
}
/**
* Returns the instance of the design
*
* @param $design array the design being edited - this is always the main (default) state for a design
*
* @return self
*/
public static function getInstance( $design ) {
if ( ! empty( self::$instance ) && self::$instance->design['id'] === $design['id'] ) {
return self::$instance;
}
if ( ! empty( $design ) && ! empty( $design['parent_id'] ) ) {
$design = tve_ult_get_design( $design['parent_id'] );
}
return new self( $design );
}
/**
* get the html for the state bar
*
* @param array $current_design the design currently being displayed
*
* @return string
*/
protected function state_bar( $current_design ) {
global $design;
ob_start();
$do_not_wrap = true;
include TVE_Ult_Const::plugin_path() . 'tcb-bridge/editor/states.php';
$state_bar = ob_get_contents();
ob_end_clean();
return $state_bar;
}
/**
* Compose all the data that's required on a page after the content has been changed
* (editor content / CSS links / fonts etc)
*
* @param array $current_design
*
* @return array
*/
public function state_data( $current_design ) {
global $design;
$design = $this->design;
$state_bar = $this->state_bar( $current_design );
$config = tve_ult_editor_get_template_config( $current_design[ TVE_Ult_Const::FIELD_TEMPLATE ] );
/** $css is an array with 2 keys fonts and css which need to be included in the page, if they do not already exist */
$css_links = array();
$enqueued_scripts = tve_ult_enqueue_design_scripts( $current_design );
foreach ( $enqueued_scripts ['fonts'] as $_id => $_font ) {
$css_links[ $_id ] = $_font;
}
foreach ( $enqueued_scripts ['css'] as $_id => $_css ) {
if ( $_id == 'tve_ult_design' ) {
continue;
}
$css_links[ $_id ] = $_css;
}
/** javascript global page data (that will overwrite parts of the global tve_path_params variable) */
$javascript_data = array(
'custom_post_data' => array(
TVE_Ult_Const::DESIGN_QUERY_KEY_NAME => $current_design['id'],
'design_id' => $current_design['id'],
),
'tve_globals' => isset( $design[ TVE_Ult_Const::FIELD_GLOBALS ] ) ? $design[ TVE_Ult_Const::FIELD_GLOBALS ] : array( 'e' => 1 ),
);
/** javascript global page data for the TU - editor part */
$editor_js = array(
TVE_Ult_Const::FIELD_GLOBALS => $current_design[ TVE_Ult_Const::FIELD_GLOBALS ],
'design_id' => $current_design['id'],
'current_css' => empty( $config['css'] ) ? '' : ( 'tve-ult-' . TU_Template_Manager::type( $current_design[ TVE_Ult_Const::FIELD_TEMPLATE ] ) . '-' . str_replace( '.css', '', $config['css'] ) ),
);
/**
* remember the latest edited for this design so that the next time the user will open the parent design
* we can show him directly this child
*/
update_post_meta( $current_design['post_parent'], TVE_Ult_Const::META_PREFIX_NAME_FOR_EDIT_STATE . $this->design['id'], $current_design['id'] );
ob_start();
tve_ult_editor_output_custom_css( $current_design, false );
$custom_css = ob_get_contents();
ob_end_clean();
return array(
'state_bar' => $state_bar,
'main_page_content' => trim( $this->render_ajax_content( $current_design ) ),
'custom_css' => $custom_css,
'css' => $css_links,
'tve_path_params' => $javascript_data,
'tve_ult_page_data' => $editor_js,
);
}
/**
* Renders the html contents for a new design to replace the previously edited one
*
* @param $current_design array
*
* @return string html
*/
public function render_ajax_content( $current_design ) {
global $design;
$design = $current_design;
list( $type, $key ) = TU_Template_Manager::tpl_type_key( $current_design[ TVE_Ult_Const::FIELD_TEMPLATE ] );
if ( $key === 'cloud' ) {
$type = TU_Template_Manager::get_cloud_type( $type );
}
ob_start();
$is_ajax_render = true;
include TVE_Ult_Const::plugin_path() . 'tcb-bridge/editor/campaign/' . $type . '.php';
$html = ob_get_contents();
ob_end_clean();
return $html;
}
/**
* API-calls after this point
* --------------------------------------------------------------------
*/
/**
* Add a new state
*/
public function api_add() {
$child = $this->design;
unset( $child['id'] );
$child[ TVE_Ult_Const::FIELD_USER_CSS ] = '';
$child['parent_id'] = $this->design['id'];
$child['post_title'] = $this->param( 'post_title' );
if ( ! ( $child = tve_ult_save_design( $child ) ) ) {
return array(
'error' => 'Could not save the new design',
);
}
return $this->state_data( $child );
}
/**
* Change the name for a state
*/
public function api_edit_name() {
if ( ! ( $state = tve_ult_get_design( $this->param( 'id' ) ) ) ) {
return array();
}
global $design;
$design = $this->design;
$state['post_title'] = $this->param( 'post_title' );
tve_ult_save_design( $state );
return array(
'state_bar' => $this->state_bar( tve_ult_get_design( $this->param( 'design_id' ) ) ),
);
}
/**
* display a state
*
* @return array
*/
public function api_display() {
if ( ! ( $id = $this->param( 'id' ) ) || ! ( $design = tve_ult_get_design( $id ) ) ) {
return $this->state_data( $this->design );
}
return $this->state_data( $design );
}
/**
* duplicate a state
*/
public function api_duplicate() {
if ( ! ( $id = $this->param( 'id' ) ) ) {
return $this->state_data( $this->design );
}
if ( ! ( $design = tve_ult_get_design( $id ) ) ) {
return array(
'error' => __( 'Design not found', 'thrive-ult' ),
);
}
$child = $design;
if ( empty( $child['parent_id'] ) ) {
/** if the default one gets duplicated, this means adding the new design as a child of the main one */
$child['parent_id'] = $design['id'];
}
unset( $child['id'] );
/**
* the user custom CSS is only saved in the parent state
*/
$child[ TVE_Ult_Const::FIELD_USER_CSS ] = '';
if ( ! ( $child = tve_ult_save_design( $child ) ) ) {
return array(
'error' => __( 'Design could not be saved', 'thrive-ult' ),
);
}
return $this->state_data( $child );
}
/**
* delete a child state
*/
public function api_delete() {
if ( ! ( $id = $this->param( 'id' ) ) ) {
return $this->state_data( $this->design );
}
$active_state = $this->param( 'design_id' );
$all = tve_ult_get_child_states( $this->design['id'] );
$to_display = $this->design;
$previous = $this->design;
/**
* handle designs like this, because we'll display the previous one if the user deletes the currently active state
*/
foreach ( $all as $v ) {
if ( $active_state == $v['id'] ) {
$active_state = $v;
}
/**
* make sure we don't delete the parent / default state for a design
*/
if ( $v['id'] == $id && ! empty( $v['parent_id'] ) ) {
tve_ult_delete_design( $v['id'] );
$to_display = $previous;
}
$previous = $v;
}
if ( ! is_array( $active_state ) ) {
/**
* this means the default state is currently displayed
*/
$to_display = $this->design;
} elseif ( $active_state['id'] != $id ) {
/**
* if we just deleted the active state, we need to display the previous one
*/
$to_display = $active_state;
}
return $this->state_data( $to_display );
}
}