Skip to content

Commit 907ac7c

Browse files
committed
Fix: iframe beim Deaktivieren sofort entladen, kein Reload beim Ausschalten
- PHP: leerer Panel-Body wenn deaktiviert (kein iframe im DOM beim Seitenaufruf) - JS: beim Ausschalten iframe auf about:blank + Bootstrap-Panel einklappen, kein Reload - JS: beim Einschalten Reload nach fetch (PHP rendert iframe frisch)
1 parent 8faec58 commit 907ac7c

File tree

2 files changed

+61
-4
lines changed

2 files changed

+61
-4
lines changed

assets/js/live_preview.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -715,6 +715,47 @@
715715
};
716716
}
717717

718+
// -------------------------------------------------------------------------
719+
// Panel Enable/Disable Toggle (per-User-Präferenz via API)
720+
// -------------------------------------------------------------------------
721+
722+
document.addEventListener('click', function (e) {
723+
// Verhindert, dass der Panel-Header (Bootstrap-Collapse) durch den Toggle-Klick getriggert wird
724+
if (e.target.closest('.rex-lp-header-toggle')) {
725+
e.stopPropagation();
726+
}
727+
}, true); // capture phase
728+
729+
document.addEventListener('change', function (e) {
730+
var toggle = e.target.closest('.rex-lp-enable-toggle');
731+
if (!toggle) { return; }
732+
var enabled = toggle.checked;
733+
734+
// Sofort: iframe entladen wenn deaktiviert
735+
var panel = document.getElementById('rex-lp-panel');
736+
if (!enabled && panel) {
737+
var iframe = panel.querySelector('#rex-lp-iframe');
738+
if (iframe) { iframe.src = 'about:blank'; }
739+
}
740+
741+
// Bootstrap-Panel kollabieren / aufklappen
742+
var section = toggle.closest('.panel');
743+
if (section) {
744+
var collapseEl = section.querySelector('.panel-collapse');
745+
if (collapseEl) {
746+
$(collapseEl).collapse(enabled ? 'show' : 'hide');
747+
}
748+
}
749+
750+
// Präferenz speichern
751+
// Beim Einschalten: reload, damit PHP den iframe frisch rendert
752+
// Beim Ausschalten: kein reload nötig (iframe ist bereits entladen)
753+
fetch(toggle.dataset.url + '&enabled=' + (enabled ? 1 : 0))
754+
.then(function () {
755+
if (enabled) { window.location.reload(); }
756+
});
757+
});
758+
718759
// -------------------------------------------------------------------------
719760
// Start – jQuery ist im REDAXO-Backend immer verfügbar
720761
// -------------------------------------------------------------------------

boot.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
rex_view::addCssFile($this->getAssetsUrl('css/live_preview.css'));
1111
rex_view::addJsFile($this->getAssetsUrl('js/live_preview.js'));
1212

13-
// Namespaced API-Klasse registrieren (seit REDAXO 5.17 unterstützt)
13+
// Namespaced API-Klassen registrieren (seit REDAXO 5.17 unterstützt)
1414
rex_api_function::register('live_preview_url', \FriendsOfREDAXO\LivePreview\LivePreviewUrlApi::class);
15+
rex_api_function::register('live_preview_toggle', \FriendsOfREDAXO\LivePreview\LivePreviewToggleApi::class);
1516

1617
// API-URL für JS bereitstellen
1718
rex_view::setJsProperty('livePreviewApiUrl', rex_url::backendController(['rex-api-call' => 'live_preview_url']));
@@ -65,12 +66,27 @@
6566
return (string) ob_get_clean();
6667
})();
6768

69+
// User-Präferenz für das Panel lesen (Default: aktiviert)
70+
$userId = rex::getUser()->getId();
71+
$livePreviewEnabled = (bool) rex_addon::get('live_preview')->getConfig('live_preview_enabled_' . $userId, true);
72+
$toggleUrl = rex_url::backendController(['rex-api-call' => 'live_preview_toggle']);
73+
$toggleChecked = $livePreviewEnabled ? ' checked="checked"' : '';
74+
75+
$panelTitle = '<i class="rex-icon fa-eye"></i> ' . rex_i18n::msg('live_preview_title')
76+
. '<label class="rex-lp-header-toggle rex-lp-toggle-pill" onclick="event.stopPropagation()" title="' . rex_escape(rex_i18n::msg('live_preview_toggle_title')) . '">'
77+
. '<input type="checkbox" class="rex-lp-enable-toggle"' . $toggleChecked . ' data-url="' . rex_escape($toggleUrl) . '">'
78+
. '<span class="rex-lp-toggle-slider"></span>'
79+
. '</label>';
80+
81+
// Wenn deaktiviert: leerer Body (kein iframe im DOM → lädt nicht)
82+
$fragmentBody = $livePreviewEnabled ? $panel : '';
83+
6884
// REDAXO-Standard-Panel (wie yrewrite)
6985
$fragment = new rex_fragment();
70-
$fragment->setVar('title', '<i class="rex-icon fa-eye"></i> ' . rex_i18n::msg('live_preview_title'), false);
71-
$fragment->setVar('body', $panel, false);
86+
$fragment->setVar('title', $panelTitle, false);
87+
$fragment->setVar('body', $fragmentBody, false);
7288
$fragment->setVar('collapse', true);
73-
$fragment->setVar('collapsed', false);
89+
$fragment->setVar('collapsed', !$livePreviewEnabled);
7490
$content = $fragment->parse('core/page/section.php');
7591

7692
return $subject . $content;

0 commit comments

Comments
 (0)