WidgetTriggers
Класс основывается на BaseTrigger и добавляет ему возможность вставки js кода триггеров в атрибуты виджетов. Триггеры работают с помощью обработки событий из Alpine.js
schedule_before_render и schedule_after_render
Данные методы запускают рендер Alpine атрибутов для обработки триггеров. После генерации атрибутов, они добавляются в html виджета перед data-id атрибутом, который ест ь у всех Elementor виджетов. Генерация работает с помощью метода generate_attribute
generate_attribute( Element_Base $element_base ): string
Метод получает настройки триггеров из виджета. Для каждого заданного триггера происходит последовательно несколько действий:
- Генерируется js код триггера - метод BaseTrigger::render_action
- Код оборачивается в опции - метод Options::apply_options
- Код оборачивается в условия - BaseTrigger::add_conditions
Так же каждый триггер может вернуть скрипт для инициализации, например, если требуется сохранить в оболочку курса стартовое значение переменной. Скрипт сохраняется в AdditionalPageTriggers и выводится в футере.
function get_event( string $event, Element_Base $element_base ): string
Функция преобразует имя триггера из настроек виджета в обработчик события Alpine.js самостоятельно, либо с помощью вызова вспомогательной функции:
'widget_click' => '@click',
'click_outside_the_widget' => '@click.outside',
'widget_hover' => '@mouseenter',
'hover_outside_the_widget' => '@mouseleave',
'frame_opened' => '@frameopened' . $widget_id . '.window',
'frame_passed' => '@framepassed' . $widget_id . '.window',
'question_opened' => '@questionopened' . $widget_id . '.window',
'form_saved' => sprintf(
'@elementorformsaved%s.window',
$element_base->get_settings_for_display( 'form_id' ) ?: $widget_id
),
'question_passed' => '@questionpassed' . $widget_id . '.window',
'quiz_passed' => QuizPassed::get_trigger( $widget_id, static::SLUG, $trigger_data ),
'widget_passed' => 'widget_passed',
'media_finished' => '@mediafinished' . $widget_id . '.window',
'viewport' => 'viewport',
default => throw new Exception( 'Unknown event' )
Список с краткими комментариями:
'@click'— дефолтное Alpine.js/DOM событие, клик по виджету.'@click.outside'— дефолтное Alpine.js событие, клик вне виджета.'@mouseenter'— дефолтное Alpine.js/DOM событие, курсор наведен на виджет.'@mouseleave'— дефолтное Alpine.js/DOM событие, курсор ушел с виджета.'@frameopened{ID}.window'— кастомное, открыт фрейм во фреймсете с этим ID.'@framepassed{ID}.window'— кастомное, фрейм с этим ID во фреймсете пройден (завершен).'@questionopened{ID}.window'— кастомное, открыт вопрос с этим ID в банке вопросов .'@elementorformsaved{ID}.window'— кастомное, сохранена форма Elementor с этим ID.'@questionpassed{ID}.window'— кастомное, вопрос с этим ID в бfmediaанке вопросов пройден.QuizPassed::get_trigger()— кастомное, одно из трех событий в зависимости от настроек quizpassedsuccessfully{ID}, quizpassedunsuccessfully{ID}, quizpassed{ID}.'widget_passed'— кастомное, виджет пройден. При рендере генерируется js код обрабатывающий виджеты типов quiz, media, forms, на основе js функции eventsWidgetPassed'@mediafinished{ID}.window'— кастомное, пр оигрывание медиа закончено для этого ID.'viewport'— кастомное, элемент появился во viewport (видим на экране). Событие устанавливается с помощью js функции observeElementVisibility