Files
doitinpoland.com/wp-content/plugins/sitepress-multilingual-cms/addons/wpml-page-builders/classes/Integrations/BeaverBuilder/class-wpml-beaver-builder-translatable-nodes.php
2023-09-12 21:41:04 +02:00

517 lines
14 KiB
PHP

<?php
/**
* WPML_Beaver_Builder_Translatable_Nodes class file.
*
* @package wpml-page-builders-beaver-builder
*/
use WPML\PB\BeaverBuilder\Modules\ModuleWithItemsFromConfig;
/**
* Class WPML_Beaver_Builder_Translatable_Nodes
*/
class WPML_Beaver_Builder_Translatable_Nodes implements IWPML_Page_Builders_Translatable_Nodes {
/**
* Nodes to translate.
*
* @var array
*/
private $nodes_to_translate;
/**
* Get translatable node.
*
* @param string|int $node_id Node id.
* @param stdClass $settings Node settings.
*
* @return WPML_PB_String[]
*/
public function get( $node_id, $settings ) {
if ( ! $this->nodes_to_translate ) {
$this->initialize_nodes_to_translate();
}
$strings = array();
foreach ( $this->nodes_to_translate as $node_type => $node_data ) {
if ( $this->conditions_ok( $node_data, $settings ) ) {
foreach ( $node_data['fields'] as $field ) {
$field_key = $field['field'];
if ( isset( $settings->$field_key ) && trim( $settings->$field_key ) ) {
$string = new WPML_PB_String(
$settings->$field_key,
$this->get_string_name( $node_id, $field, $settings ),
$field['type'],
$field['editor_type'],
$this->get_wrap_tag( $settings )
);
$strings[] = $string;
}
}
foreach ( $this->get_integration_instances( $node_data ) as $node ) {
try {
$strings = $node->get( $node_id, $settings, $strings );
// phpcs:disable Generic.CodeAnalysis.EmptyStatement.DetectedCatch
} catch ( Exception $e ) {}
// phpcs:enable Generic.CodeAnalysis.EmptyStatement.DetectedCatch
}
}
}
return $strings;
}
/**
* Update translatable node.
*
* @param string $node_id Node id.
* @param stdClass $settings Node settings.
* @param WPML_PB_String $string String object.
*
* @return stdClass
*/
public function update( $node_id, $settings, WPML_PB_String $string ) {
if ( ! $this->nodes_to_translate ) {
$this->initialize_nodes_to_translate();
}
foreach ( $this->nodes_to_translate as $node_type => $node_data ) {
if ( $this->conditions_ok( $node_data, $settings ) ) {
foreach ( $node_data['fields'] as $field ) {
$field_key = $field['field'];
if ( $this->get_string_name( $node_id, $field, $settings ) === $string->get_name() ) {
$settings->$field_key = $string->get_value();
}
}
foreach ( $this->get_integration_instances( $node_data ) as $node ) {
try {
$node->update( $node_id, $settings, $string );
// phpcs:disable Generic.CodeAnalysis.EmptyStatement.DetectedCatch
} catch ( Exception $e ) {}
// phpcs:enable Generic.CodeAnalysis.EmptyStatement.DetectedCatch
}
}
}
return $settings;
}
/**
* @param array $node_data
*
* @return WPML_Beaver_Builder_Module_With_Items[]
*/
private function get_integration_instances( array $node_data ) {
$instances = [];
if ( isset( $node_data['integration-class'] ) ) {
try {
$instances[] = new $node_data['integration-class']();
// phpcs:disable Generic.CodeAnalysis.EmptyStatement.DetectedCatch
} catch ( Exception $e ) {}
// phpcs:enable Generic.CodeAnalysis.EmptyStatement.DetectedCatch
}
if ( isset( $node_data['fields_in_item'] ) ) {
foreach ( $node_data['fields_in_item'] as $item_of => $config ) {
$instances[] = new ModuleWithItemsFromConfig( $item_of, $config );
}
}
return array_filter( $instances );
}
/**
* Get string name.
*
* @param string $node_id Node id.
* @param array $field Page builder field.
* @param stdClass $settings Node settings.
*
* @return string
*/
public function get_string_name( $node_id, $field, $settings ) {
return $field['field'] . '-' . $settings->type . '-' . $node_id;
}
/**
* Get wrap tag for string.
* Used for SEO, can contain (h1...h6, etc.)
*
* @param stdClass $settings Field settings.
*
* @return string
*/
private function get_wrap_tag( $settings ) {
if ( isset( $settings->type ) && 'heading' === $settings->type && isset( $settings->tag ) ) {
return $settings->tag;
}
return '';
}
/**
* Check if node condition is ok.
*
* @param array $node_data Node data.
* @param stdClass $settings Node settings.
*
* @return bool
*/
private function conditions_ok( $node_data, $settings ) {
$conditions_meet = true;
foreach ( $node_data['conditions'] as $field_key => $field_value ) {
if ( ! isset( $settings->$field_key ) || $settings->$field_key !== $field_value ) {
$conditions_meet = false;
break;
}
}
return $conditions_meet;
}
/**
* @return array
*/
public static function get_nodes_to_translate() {
return array(
'button' => array(
'conditions' => array( 'type' => 'button' ),
'fields' => array(
array(
'field' => 'text',
'type' => __( 'Button: Text', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'link',
'type' => __( 'Button: Link', 'sitepress' ),
'editor_type' => 'LINK',
),
),
),
'heading' => array(
'conditions' => array( 'type' => 'heading' ),
'fields' => array(
array(
'field' => 'heading',
'type' => __( 'Heading', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'link',
'type' => __( 'Heading: Link', 'sitepress' ),
'editor_type' => 'LINK',
),
),
),
'html' => array(
'conditions' => array( 'type' => 'html' ),
'fields' => array(
array(
'field' => 'html',
'type' => __( 'HTML', 'sitepress' ),
'editor_type' => 'VISUAL',
),
),
),
'photo' => array(
'conditions' => array( 'type' => 'photo' ),
'fields' => array(
array(
'field' => 'link_url',
'type' => __( 'Photo: Link', 'sitepress' ),
'editor_type' => 'LINK',
),
),
),
'rich-text' => array(
'conditions' => array( 'type' => 'rich-text' ),
'fields' => array(
array(
'field' => 'text',
'type' => __( 'Text Editor', 'sitepress' ),
'editor_type' => 'VISUAL',
),
),
),
'accordion' => array(
'conditions' => array( 'type' => 'accordion' ),
'fields' => array(),
'integration-class' => 'WPML_Beaver_Builder_Accordion',
),
'pricing-table' => array(
'conditions' => array( 'type' => 'pricing-table' ),
'fields' => array(),
'integration-class' => 'WPML_Beaver_Builder_Pricing_Table',
),
'tabs' => array(
'conditions' => array( 'type' => 'tabs' ),
'fields' => array(),
'integration-class' => 'WPML_Beaver_Builder_Tab',
),
'callout' => array(
'conditions' => array( 'type' => 'callout' ),
'fields' => array(
array(
'field' => 'title',
'type' => __( 'Callout: Heading', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'text',
'type' => __( 'Callout: Text', 'sitepress' ),
'editor_type' => 'VISUAL',
),
array(
'field' => 'cta_text',
'type' => __( 'Callout: Call to action text', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'link',
'type' => __( 'Callout: Link', 'sitepress' ),
'editor_type' => 'LINK',
),
),
),
'contact-form' => array(
'conditions' => array( 'type' => 'contact-form' ),
'fields' => array(
array(
'field' => 'name_placeholder',
'type' => __( 'Contact Form: Name Field Placeholder', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'subject_placeholder',
'type' => __( 'Contact Form: Subject Field Placeholder', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'email_placeholder',
'type' => __( 'Contact Form: Email Field Placeholder', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'phone_placeholder',
'type' => __( 'Contact Form: Phone Field Placeholder', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'message_placeholder',
'type' => __( 'Contact Form: Your Message Placeholder', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'terms_checkbox_text',
'type' => __( 'Contact Form: Checkbox Text', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'terms_text',
'type' => __( 'Contact Form: Terms and Conditions', 'sitepress' ),
'editor_type' => 'VISUAL',
),
array(
'field' => 'success_message',
'type' => __( 'Contact Form: Success Message', 'sitepress' ),
'editor_type' => 'VISUAL',
),
array(
'field' => 'btn_text',
'type' => __( 'Contact Form: Button Text', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'success_url',
'type' => __( 'Contact Form: Redirect Link', 'sitepress' ),
'editor_type' => 'LINK',
),
),
),
'call-to-action' => array(
'conditions' => array( 'type' => 'cta' ),
'fields' => array(
array(
'field' => 'title',
'type' => __( 'Call to Action: Heading', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'text',
'type' => __( 'Call to Action: Text', 'sitepress' ),
'editor_type' => 'VISUAL',
),
array(
'field' => 'btn_text',
'type' => __( 'Call to Action: Button text', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'btn_link',
'type' => __( 'Call to Action: Button link', 'sitepress' ),
'editor_type' => 'LINK',
),
),
),
'subscribe-form' => array(
'conditions' => array( 'type' => 'subscribe-form' ),
'fields' => array(
array(
'field' => 'terms_checkbox_text',
'type' => __( 'Subscribe form: Checkbox Text', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'terms_text',
'type' => __( 'Subscribe form: Terms and Conditions', 'sitepress' ),
'editor_type' => 'VISUAL',
),
array(
'field' => 'custom_subject',
'type' => __( 'Subscribe form: Notification Subject', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'success_message',
'type' => __( 'Subscribe form: Success Message', 'sitepress' ),
'editor_type' => 'VISUAL',
),
array(
'field' => 'btn_text',
'type' => __( 'Subscribe form: Button Text', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'success_url',
'type' => __( 'Subscribe form: Redirect Link', 'sitepress' ),
'editor_type' => 'LINK',
),
),
),
'content-slider' => array(
'conditions' => array( 'type' => 'content-slider' ),
'fields' => array(),
'integration-class' => 'WPML_Beaver_Builder_Content_Slider',
),
'icon' => array(
'conditions' => array( 'type' => 'icon' ),
'fields' => array(
array(
'field' => 'text',
'type' => __( 'Icon: Text', 'sitepress' ),
'editor_type' => 'VISUAL',
),
array(
'field' => 'link',
'type' => __( 'Icon: Link', 'sitepress' ),
'editor_type' => 'LINK',
),
),
),
'icon-group' => array(
'conditions' => array( 'type' => 'icon-group' ),
'fields' => array(),
'integration-class' => 'WPML_Beaver_Builder_Icon_Group',
),
'map' => array(
'conditions' => array( 'type' => 'map' ),
'fields' => array(
array(
'field' => 'address',
'type' => __( 'Map: Address', 'sitepress' ),
'editor_type' => 'LINE',
),
),
),
'testimonials' => array(
'conditions' => array( 'type' => 'testimonials' ),
'fields' => array(
array(
'field' => 'heading',
'type' => __( 'Testimonial: Heading', 'sitepress' ),
'editor_type' => 'LINE',
),
),
'integration-class' => 'WPML_Beaver_Builder_Testimonials',
),
'numbers' => array(
'conditions' => array( 'type' => 'numbers' ),
'fields' => array(
array(
'field' => 'before_number_text',
'type' => __( 'Number Counter: Text before number', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'after_number_text',
'type' => __( 'Number Counter: Text after number', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'number_prefix',
'type' => __( 'Number Counter: Number Prefix', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'number_suffix',
'type' => __( 'Number Counter: Number Suffix', 'sitepress' ),
'editor_type' => 'LINE',
),
),
),
'post-grid' => array(
'conditions' => array( 'type' => 'post-grid' ),
'fields' => array(
array(
'field' => 'no_results_message',
'type' => __( 'Posts: No Results Message', 'sitepress' ),
'editor_type' => 'VISUAL',
),
array(
'field' => 'more_btn_text',
'type' => __( 'Posts: Button Text', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'terms_list_label',
'type' => __( 'Posts: Terms Label', 'sitepress' ),
'editor_type' => 'LINE',
),
array(
'field' => 'more_link_text',
'type' => __( 'Posts: More Link Text', 'sitepress' ),
'editor_type' => 'LINE',
),
),
),
'post-slider' => array(
'conditions' => array( 'type' => 'post-slider' ),
'fields' => array(
array(
'field' => 'more_link_text',
'type' => __( 'Posts Slider: More Link Text', 'sitepress' ),
'editor_type' => 'LINE',
),
),
),
);
}
/**
* Initialize translatable nodes.
*/
public function initialize_nodes_to_translate() {
$this->nodes_to_translate = apply_filters( 'wpml_beaver_builder_modules_to_translate', self::get_nodes_to_translate() );
}
}