/module.json). Loaded only from Divi 5's * dependency-tree hook, when Divi's classes exist. * * @package StreamSera */ namespace StreamSera\Integrations\Builders; use ET\Builder\Framework\DependencyManagement\Interfaces\DependencyInterface; use ET\Builder\FrontEnd\BlockParser\BlockParserStore; use ET\Builder\FrontEnd\Module\Style; use ET\Builder\Packages\Module\Module; use ET\Builder\Packages\Module\Options\Css\CssStyle; use ET\Builder\Packages\Module\Options\Element\ElementClassnames; use ET\Builder\Packages\ModuleLibrary\ModuleRegistration; if ( ! defined( 'ABSPATH' ) ) { exit; } class Divi5_Module implements DependencyInterface { /** * Element id. * * @var string */ private $id; /** * Constructor. * * @param string $id Element id. */ public function __construct( $id ) { $this->id = $id; } /** * Register the module. */ public function load(): void { ModuleRegistration::register_module( Divi5::folder( $this->id ), array( 'render_callback' => array( self::class, 'render_callback' ), ) ); } /** * Front-end render. * * @param array $attrs Module attributes. * @param string $content Inner content. * @param \WP_Block $block Block. * @param object $elements \ET\Builder\Packages\Module\Layout\Components\ModuleElements\ModuleElements. * @return string */ public static function render_callback( $attrs, $content, $block, $elements ) { $attrs = is_array( $attrs ) ? $attrs : array(); $id = substr( $block->name, strlen( Divi5::PREFIX ) ); $html = Divi5::render_element( $id, isset( $attrs['streamsera'] ) && is_array( $attrs['streamsera'] ) ? $attrs['streamsera'] : array() ); if ( '' === $html ) { return ''; } $parent = BlockParserStore::get_parent( $block->parsed_block['id'], $block->parsed_block['storeInstance'] ); return Module::render( array( 'orderIndex' => $block->parsed_block['orderIndex'], 'storeInstance' => $block->parsed_block['storeInstance'], 'attrs' => $attrs, 'elements' => $elements, 'id' => $block->parsed_block['id'], 'name' => $block->block_type->name, 'classnamesFunction' => array( self::class, 'classnames' ), 'moduleCategory' => $block->block_type->category, 'stylesComponent' => array( self::class, 'styles' ), 'scriptDataComponent' => array( self::class, 'script_data' ), 'parentAttrs' => $parent->attrs ?? array(), 'parentId' => $parent->id ?? '', 'parentName' => $parent->blockName ?? '', // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase 'children' => $elements->style_components( array( 'attrName' => 'module' ) ) . $html, ) ); } /** * Module classes (decoration options). * * @param array $args Args. */ public static function classnames( $args ) { $attrs = $args['attrs'] ?? array(); $args['classnamesInstance']->add( ElementClassnames::classnames( array( 'attrs' => array_merge( $attrs['module']['decoration'] ?? array(), array( 'link' => $attrs['module']['advanced']['link'] ?? array() ) ), ) ) ); } /** * Design-tab styles and custom CSS. * * @param array $args Args. */ public static function styles( $args ) { $attrs = $args['attrs'] ?? array(); $elements = $args['elements']; $settings = $args['settings'] ?? array(); Style::add( array( 'id' => $args['id'], 'name' => $args['name'], 'orderIndex' => $args['orderIndex'], 'storeInstance' => $args['storeInstance'], 'styles' => array( $elements->style( array( 'attrName' => 'module', 'styleProps' => array( 'disabledOn' => array( 'disabledModuleVisibility' => $settings['disabledModuleVisibility'] ?? null, ), ), ) ), CssStyle::style( array( 'selector' => $args['orderClass'], 'attr' => $attrs['css'] ?? array(), ) ), ), ) ); } /** * Script data (animations, scroll effects …). * * @param array $args Args. */ public static function script_data( $args ) { $args['elements']->script_data( array( 'attrName' => 'module' ) ); } }