first commit
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\Components\Transformers;
|
||||
|
||||
use Elementor\Modules\AtomicWidgets\PropsResolver\Props_Resolver_Context;
|
||||
use Elementor\Modules\AtomicWidgets\PropsResolver\Transformer_Base;
|
||||
use Elementor\Plugin;
|
||||
use Elementor\Core\Base\Document as Component_Document;
|
||||
use Elementor\Modules\Components\Components_Repository;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Component_Instance_Transformer extends Transformer_Base {
|
||||
private static array $rendering_stack = [];
|
||||
private static $repository;
|
||||
|
||||
public static function reset_rendering_stack(): void {
|
||||
self::$rendering_stack = [];
|
||||
}
|
||||
|
||||
public function transform( $value, Props_Resolver_Context $context ) {
|
||||
$component_id = $value['component_id'];
|
||||
|
||||
if ( $this->is_circular_reference( $component_id ) ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
self::$rendering_stack[] = $component_id;
|
||||
$content = $this->get_rendered_content( $component_id );
|
||||
array_pop( self::$rendering_stack );
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
private function is_circular_reference( int $component_id ): bool {
|
||||
return in_array( $component_id, self::$rendering_stack, true );
|
||||
}
|
||||
|
||||
private function get_rendered_content( int $component_id ): string {
|
||||
$should_show_autosave = is_preview();
|
||||
$component = $this->get_repository()->get( $component_id, $should_show_autosave );
|
||||
|
||||
if ( ! $component || ! $this->should_render_content( $component ) ) {
|
||||
return '';
|
||||
}
|
||||
|
||||
Plugin::$instance->documents->switch_to_document( $component );
|
||||
|
||||
$data = $component->get_elements_data();
|
||||
|
||||
$data = apply_filters( 'elementor/frontend/builder_content_data', $data, $component_id );
|
||||
|
||||
$content = '';
|
||||
|
||||
if ( ! empty( $data ) ) {
|
||||
ob_start();
|
||||
|
||||
$component->print_elements( $data );
|
||||
|
||||
$content = ob_get_clean();
|
||||
|
||||
$content = apply_filters( 'elementor/frontend/the_content', $content );
|
||||
}
|
||||
|
||||
Plugin::$instance->documents->restore_document();
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
private function should_render_content( Component_Document $document ): bool {
|
||||
return ! $this->is_password_protected( $document ) &&
|
||||
$document->is_built_with_elementor();
|
||||
}
|
||||
|
||||
private function is_password_protected( $document ) {
|
||||
return post_password_required( $document->get_post()->ID );
|
||||
}
|
||||
|
||||
private function get_repository(): Components_Repository {
|
||||
if ( ! self::$repository ) {
|
||||
self::$repository = new Components_Repository();
|
||||
}
|
||||
|
||||
return self::$repository;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\Components\Transformers;
|
||||
|
||||
use Elementor\Modules\AtomicWidgets\PropsResolver\Props_Resolver_Context;
|
||||
use Elementor\Modules\AtomicWidgets\PropsResolver\Transformer_Base;
|
||||
use Elementor\Modules\AtomicWidgets\Elements\Base\Render_Context;
|
||||
use Elementor\Modules\Components\PropTypes\Override_Prop_Type;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Overridable_Transformer extends Transformer_Base {
|
||||
public function transform( $value, Props_Resolver_Context $context ) {
|
||||
[ 'override_key' => $override_key, 'origin_value' => $origin_value ] = $value;
|
||||
|
||||
$result = $origin_value;
|
||||
|
||||
$overrides = Render_Context::get( static::class )['overrides'] ?? [];
|
||||
|
||||
if ( isset( $overrides[ $override_key ] ) ) {
|
||||
$matching_override_value = $overrides[ $override_key ];
|
||||
|
||||
if ( $this->is_origin_value_override( $origin_value ) ) {
|
||||
$result = $this->transform_overridable_override( $origin_value, $matching_override_value, $context );
|
||||
} else {
|
||||
$result = $matching_override_value;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
private function is_origin_value_override( array $origin_value ): bool {
|
||||
return isset( $origin_value['$$type'] ) && Override_Prop_Type::get_key() === $origin_value['$$type'];
|
||||
}
|
||||
|
||||
private function transform_overridable_override( array $inner_override, array $outer_override_value, Props_Resolver_Context $context ): ?array {
|
||||
$override_transformer = new Override_Transformer();
|
||||
$transformed_inner_override = $override_transformer->transform( $inner_override['value'], $context );
|
||||
|
||||
return [
|
||||
'override_key' => $transformed_inner_override['override_key'],
|
||||
'override_value' => $outer_override_value,
|
||||
];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace Elementor\Modules\Components\Transformers;
|
||||
|
||||
use Elementor\Modules\AtomicWidgets\PropsResolver\Props_Resolver_Context;
|
||||
use Elementor\Modules\AtomicWidgets\PropsResolver\Transformer_Base;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Override_Transformer extends Transformer_Base {
|
||||
public function transform( $value, Props_Resolver_Context $context ) {
|
||||
return [
|
||||
'override_key' => $value['override_key'],
|
||||
'override_value' => $value['override_value'],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user