asdasd
This commit is contained in:
@@ -58,11 +58,13 @@ Modulspezifische Assets:
|
|||||||
7) UI-Naming und Seitenaufbau
|
7) UI-Naming und Seitenaufbau
|
||||||
- `Seitenheader-Box`: oberste globale Header-Box mit Seitentitel, Login und Farbschema.
|
- `Seitenheader-Box`: oberste globale Header-Box mit Seitentitel, Login und Farbschema.
|
||||||
- `Submenü-Box`: Box direkt unter der Seitenheader-Box für modul- oder seitenbezogene Aktionen.
|
- `Submenü-Box`: Box direkt unter der Seitenheader-Box für modul- oder seitenbezogene Aktionen.
|
||||||
|
- `Submenü-Aktionen`: rechtsbündige Zusatzbuttons innerhalb der Submenü-Box, z.B. `Setup`, `Nexus Übersicht` oder `Zur Startseite`-Ersatz.
|
||||||
- `Bereichs-Box`: größere Inhaltsbox für einen zusammenhängenden Seitenbereich.
|
- `Bereichs-Box`: größere Inhaltsbox für einen zusammenhängenden Seitenbereich.
|
||||||
- `Karten-Box`: kleinere Karte auf derselben Ebene wie Bereichs-Boxen, meist in Grids.
|
- `Karten-Box`: kleinere Karte auf derselben Ebene wie Bereichs-Boxen, meist in Grids.
|
||||||
- Zentrale CSS-Klassen:
|
- Zentrale CSS-Klassen:
|
||||||
- `main-header-box`
|
- `main-header-box`
|
||||||
- `submenu-box`
|
- `submenu-box`
|
||||||
|
- `module-submenu-actions`
|
||||||
- `section-box`
|
- `section-box`
|
||||||
- `card-box`
|
- `card-box`
|
||||||
- Modulseiten sollen diesem Muster folgen:
|
- Modulseiten sollen diesem Muster folgen:
|
||||||
@@ -70,6 +72,7 @@ Modulspezifische Assets:
|
|||||||
- danach Submenü-Box
|
- danach Submenü-Box
|
||||||
- danach Bereichs-Boxen und/oder Karten-Boxen je nach Modul
|
- danach Bereichs-Boxen und/oder Karten-Boxen je nach Modul
|
||||||
- `Setup` gehört in Modulen grundsätzlich in die Submenü-Box.
|
- `Setup` gehört in Modulen grundsätzlich in die Submenü-Box.
|
||||||
|
- In Verwaltungsseiten soll `Nexus Übersicht` als fester Button in den Submenü-Aktionen vorhanden sein.
|
||||||
- Beispielstruktur:
|
- Beispielstruktur:
|
||||||
- Börsenchecker: Seitenheader-Box, Submenü-Box, Bereichs-Box, Karten-Boxen, Bereichs-Box
|
- Börsenchecker: Seitenheader-Box, Submenü-Box, Bereichs-Box, Karten-Boxen, Bereichs-Box
|
||||||
- FX-Rates: Seitenheader-Box, Submenü-Box, danach Bereichs-Boxen
|
- FX-Rates: Seitenheader-Box, Submenü-Box, danach Bereichs-Boxen
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ Für die Oberfläche gilt projektweit dieses Naming:
|
|||||||
|
|
||||||
- `Seitenheader-Box`: globaler Header mit Seitentitel, Login und Farbschema
|
- `Seitenheader-Box`: globaler Header mit Seitentitel, Login und Farbschema
|
||||||
- `Submenü-Box`: zusätzliche modul- oder seitenbezogene Aktionen direkt unter dem Seitenheader; `Setup` soll in Modulen immer vorhanden sein
|
- `Submenü-Box`: zusätzliche modul- oder seitenbezogene Aktionen direkt unter dem Seitenheader; `Setup` soll in Modulen immer vorhanden sein
|
||||||
|
- `Submenü-Aktionen`: rechtsbündige Zusatzbuttons innerhalb der Submenü-Box, z.B. `Setup` oder `Nexus Übersicht`
|
||||||
- `Bereichs-Box`: größere Inhaltsbox für einen zusammenhängenden Bereich; davon können beliebig viele untereinander folgen
|
- `Bereichs-Box`: größere Inhaltsbox für einen zusammenhängenden Bereich; davon können beliebig viele untereinander folgen
|
||||||
- `Karten-Box`: kleinere Inhaltskarte auf derselben Ebene wie Bereichs-Boxen, typischerweise innerhalb eines Grids für Kennzahlen, Statistiken oder Modulübersichten
|
- `Karten-Box`: kleinere Inhaltskarte auf derselben Ebene wie Bereichs-Boxen, typischerweise innerhalb eines Grids für Kennzahlen, Statistiken oder Modulübersichten
|
||||||
|
|
||||||
@@ -14,6 +15,7 @@ Zentrale CSS-Klassen für dieses Layout:
|
|||||||
|
|
||||||
- `main-header-box`
|
- `main-header-box`
|
||||||
- `submenu-box`
|
- `submenu-box`
|
||||||
|
- `module-submenu-actions`
|
||||||
- `section-box`
|
- `section-box`
|
||||||
- `card-box`
|
- `card-box`
|
||||||
|
|
||||||
|
|||||||
@@ -67,7 +67,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
<a class="module-button module-button--tab-active" href="/modules">Aktive Module</a>
|
<a class="module-button module-button--tab-active" href="/modules">Aktive Module</a>
|
||||||
<a class="module-button module-button--tab" href="/modules/install">Module installieren/aktivieren</a>
|
<a class="module-button module-button--tab" href="/modules/install">Module installieren/aktivieren</a>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="module-hero-actions">
|
<div class="module-submenu-actions">
|
||||||
|
<a class="module-button module-button--secondary module-button--small" href="/">Nexus Übersicht</a>
|
||||||
<a class="module-button module-button--secondary module-button--small" href="/modules/sql-import">Zentralen SQL-Import öffnen</a>
|
<a class="module-button module-button--secondary module-button--small" href="/modules/sql-import">Zentralen SQL-Import öffnen</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,6 +2,11 @@
|
|||||||
$modules = modules()->all();
|
$modules = modules()->all();
|
||||||
$error = null;
|
$error = null;
|
||||||
$notice = null;
|
$notice = null;
|
||||||
|
$GLOBALS['layout_header_base_title'] = 'Modulverwaltung';
|
||||||
|
$GLOBALS['layout_header_title'] = 'Modulverwaltung';
|
||||||
|
$GLOBALS['layout_header_context'] = 'Module installieren/aktivieren';
|
||||||
|
$GLOBALS['layout_header_text'] = '';
|
||||||
|
$GLOBALS['layout_header_actions'] = [];
|
||||||
|
|
||||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
require_admin();
|
require_admin();
|
||||||
@@ -31,25 +36,37 @@ foreach ($modules as $m) {
|
|||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<?php require_auth(); ?>
|
<?php require_auth(); ?>
|
||||||
<div class="card">
|
<div class="module-flow">
|
||||||
<div class="pill">Module</div>
|
|
||||||
<h1 style="margin-top:.75rem;">Module installieren/aktivieren</h1>
|
|
||||||
<p class="muted">Erkannte Module basieren auf Ordnern in <code>modules/</code>.</p>
|
|
||||||
<p style="margin-top:.75rem;">
|
|
||||||
<a class="nav-link" href="/modules/sql-import">Zentralen SQL-Import öffnen</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<?php if ($error): ?>
|
<?php if ($error): ?>
|
||||||
<div class="bg-red-900 border-l-4 border-red-500 text-red-100 p-4 mb-6" role="alert">
|
<div class="module-box-soft bg-red-900 border-l-4 border-red-500 text-red-100" role="alert">
|
||||||
<?= e($error) ?>
|
<?= e($error) ?>
|
||||||
</div>
|
</div>
|
||||||
<?php elseif ($notice): ?>
|
<?php elseif ($notice): ?>
|
||||||
<div class="card" style="margin-top:1rem; border-color:var(--accent-2);">
|
<div class="module-box-soft" style="border-color:var(--accent-2);">
|
||||||
<?= e($notice) ?>
|
<?= e($notice) ?>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
<h3 style="margin-top:1.25rem;">Aktive Module</h3>
|
<div class="submenu-box">
|
||||||
|
<div class="module-hero-top module-hero-top--compact">
|
||||||
|
<nav class="module-tabs" aria-label="Modulverwaltung">
|
||||||
|
<a class="module-button module-button--tab" href="/modules">Aktive Module</a>
|
||||||
|
<a class="module-button module-button--tab-active" href="/modules/install">Module installieren/aktivieren</a>
|
||||||
|
</nav>
|
||||||
|
<div class="module-submenu-actions">
|
||||||
|
<a class="module-button module-button--secondary module-button--small" href="/">Nexus Übersicht</a>
|
||||||
|
<a class="module-button module-button--secondary module-button--small" href="/modules/sql-import">Zentralen SQL-Import öffnen</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section class="section-box">
|
||||||
|
<div class="module-box-head">
|
||||||
|
<div>
|
||||||
|
<h2 class="module-box-title">Aktive Module</h2>
|
||||||
|
<p>Bereits aktivierte Module mit optionalen Migrationsschritten.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="module-admin-grid module-admin-grid--compact">
|
<div class="module-admin-grid module-admin-grid--compact">
|
||||||
<?php foreach ($active as $module): ?>
|
<?php foreach ($active as $module): ?>
|
||||||
<?php
|
<?php
|
||||||
@@ -59,7 +76,7 @@ foreach ($modules as $m) {
|
|||||||
? count($pendingMigrations) . ' ausstehend'
|
? count($pendingMigrations) . ' ausstehend'
|
||||||
: (($migrationStatus['available'] ?? 0) > 0 ? 'Schema aktuell' : 'Keine Migrationen');
|
: (($migrationStatus['available'] ?? 0) > 0 ? 'Schema aktuell' : 'Keine Migrationen');
|
||||||
?>
|
?>
|
||||||
<article class="module-admin-card">
|
<article class="card-box module-admin-card">
|
||||||
<div class="module-admin-card__head">
|
<div class="module-admin-card__head">
|
||||||
<div class="module-admin-card__title">
|
<div class="module-admin-card__title">
|
||||||
<h2><?= e($module['title']) ?></h2>
|
<h2><?= e($module['title']) ?></h2>
|
||||||
@@ -92,8 +109,15 @@ foreach ($modules as $m) {
|
|||||||
</article>
|
</article>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
<h3 style="margin-top:1.5rem;">Deaktivierte Module</h3>
|
<section class="section-box">
|
||||||
|
<div class="module-box-head">
|
||||||
|
<div>
|
||||||
|
<h2 class="module-box-title">Deaktivierte Module</h2>
|
||||||
|
<p>Erkannte Module basieren auf Ordnern in <code>modules/</code>.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<div class="module-admin-grid module-admin-grid--compact">
|
<div class="module-admin-grid module-admin-grid--compact">
|
||||||
<?php foreach ($inactive as $module): ?>
|
<?php foreach ($inactive as $module): ?>
|
||||||
<?php
|
<?php
|
||||||
@@ -103,7 +127,7 @@ foreach ($modules as $m) {
|
|||||||
? count($pendingMigrations) . ' ausstehend'
|
? count($pendingMigrations) . ' ausstehend'
|
||||||
: (($migrationStatus['available'] ?? 0) > 0 ? 'Schema aktuell' : 'Keine Migrationen');
|
: (($migrationStatus['available'] ?? 0) > 0 ? 'Schema aktuell' : 'Keine Migrationen');
|
||||||
?>
|
?>
|
||||||
<article class="module-admin-card">
|
<article class="card-box module-admin-card">
|
||||||
<div class="module-admin-card__head">
|
<div class="module-admin-card__head">
|
||||||
<div class="module-admin-card__title">
|
<div class="module-admin-card__title">
|
||||||
<h2><?= e($module['title']) ?></h2>
|
<h2><?= e($module['title']) ?></h2>
|
||||||
@@ -136,4 +160,5 @@ foreach ($modules as $m) {
|
|||||||
</article>
|
</article>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,12 @@
|
|||||||
<?php
|
<?php
|
||||||
require_admin();
|
require_admin();
|
||||||
|
|
||||||
|
$GLOBALS['layout_header_base_title'] = 'Modulverwaltung';
|
||||||
|
$GLOBALS['layout_header_title'] = 'Modulverwaltung';
|
||||||
|
$GLOBALS['layout_header_context'] = 'SQL-Import';
|
||||||
|
$GLOBALS['layout_header_text'] = '';
|
||||||
|
$GLOBALS['layout_header_actions'] = [];
|
||||||
|
|
||||||
$service = new \App\ModuleSqlImportService(modules());
|
$service = new \App\ModuleSqlImportService(modules());
|
||||||
$availableModules = $service->importableModules();
|
$availableModules = $service->importableModules();
|
||||||
$selectedModule = (string) ($_POST['module'] ?? ($_GET['module'] ?? ''));
|
$selectedModule = (string) ($_POST['module'] ?? ($_GET['module'] ?? ''));
|
||||||
@@ -11,7 +17,7 @@ $result = null;
|
|||||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||||
try {
|
try {
|
||||||
if (!isset($_FILES['sql_file']) || !is_array($_FILES['sql_file'])) {
|
if (!isset($_FILES['sql_file']) || !is_array($_FILES['sql_file'])) {
|
||||||
throw new RuntimeException('Bitte eine SQL-Datei auswaehlen.');
|
throw new RuntimeException('Bitte eine SQL-Datei auswählen.');
|
||||||
}
|
}
|
||||||
|
|
||||||
$result = $service->importUploadedFile($selectedModule, $_FILES['sql_file']);
|
$result = $service->importUploadedFile($selectedModule, $_FILES['sql_file']);
|
||||||
@@ -27,34 +33,49 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<div class="card">
|
<div class="module-flow">
|
||||||
<div class="pill">SQL Import</div>
|
|
||||||
<h1 style="margin-top:.75rem;">Zentraler SQL-Import fuer Module</h1>
|
|
||||||
<p class="muted">
|
|
||||||
Diese Seite ist eine gemeinsame Standard-Loesung. Module koennen sie direkt nutzen oder weiterhin einen eigenen spezialisierten Uploader bereitstellen.
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<?php if ($error): ?>
|
<?php if ($error): ?>
|
||||||
<div class="bg-red-900 border-l-4 border-red-500 text-red-100 p-4 mb-6" role="alert">
|
<div class="module-box-soft bg-red-900 border-l-4 border-red-500 text-red-100" role="alert">
|
||||||
<?= e($error) ?>
|
<?= e($error) ?>
|
||||||
</div>
|
</div>
|
||||||
<?php elseif ($notice): ?>
|
<?php elseif ($notice): ?>
|
||||||
<div class="card" style="margin-top:1rem; border-color:var(--accent-2);">
|
<div class="module-box-soft" style="border-color:var(--accent-2);">
|
||||||
<?= e($notice) ?>
|
<?= e($notice) ?>
|
||||||
</div>
|
</div>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
|
|
||||||
|
<div class="submenu-box">
|
||||||
|
<div class="module-hero-top module-hero-top--compact">
|
||||||
|
<nav class="module-tabs" aria-label="Modulverwaltung">
|
||||||
|
<a class="module-button module-button--tab" href="/modules">Aktive Module</a>
|
||||||
|
<a class="module-button module-button--tab" href="/modules/install">Module installieren/aktivieren</a>
|
||||||
|
<a class="module-button module-button--tab-active" href="/modules/sql-import">SQL-Import</a>
|
||||||
|
</nav>
|
||||||
|
<div class="module-submenu-actions">
|
||||||
|
<a class="module-button module-button--secondary module-button--small" href="/">Nexus Übersicht</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<section class="section-box">
|
||||||
|
<div class="module-box-head">
|
||||||
|
<div>
|
||||||
|
<h2 class="module-box-title">Zentraler SQL-Import</h2>
|
||||||
|
<p>Gemeinsame Standard-Lösung für Module mit SQL-Upload in die konfigurierte Ziel-Datenbank.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<?php if ($availableModules === []): ?>
|
<?php if ($availableModules === []): ?>
|
||||||
<div class="card" style="margin-top:1rem; background:var(--panel-2);">
|
<div class="card-box">
|
||||||
Aktuell ist kein Modul fuer den generischen SQL-Import vorbereitet.
|
Aktuell ist kein Modul für den generischen SQL-Import vorbereitet.
|
||||||
</div>
|
</div>
|
||||||
<?php else: ?>
|
<?php else: ?>
|
||||||
<form method="post" enctype="multipart/form-data" class="card" style="margin-top:1rem; background:var(--panel-2);">
|
<form method="post" enctype="multipart/form-data" class="section-box" style="padding:0; border:0; box-shadow:none; background:transparent;">
|
||||||
<div style="display:grid; gap:1rem;">
|
<div style="display:grid; gap:1rem;">
|
||||||
<label style="display:grid; gap:.35rem;">
|
<label style="display:grid; gap:.35rem;">
|
||||||
<span>Modul</span>
|
<span>Modul</span>
|
||||||
<select name="module" required>
|
<select name="module" required>
|
||||||
<option value="">Bitte waehlen</option>
|
<option value="">Bitte wählen</option>
|
||||||
<?php foreach ($availableModules as $module): ?>
|
<?php foreach ($availableModules as $module): ?>
|
||||||
<option value="<?= e($module['name']) ?>" <?= $selectedModule === $module['name'] ? 'selected' : '' ?>>
|
<option value="<?= e($module['name']) ?>" <?= $selectedModule === $module['name'] ? 'selected' : '' ?>>
|
||||||
<?= e($module['title']) ?>
|
<?= e($module['title']) ?>
|
||||||
@@ -69,26 +90,41 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|||||||
</label>
|
</label>
|
||||||
|
|
||||||
<div class="muted" style="font-size:.95rem;">
|
<div class="muted" style="font-size:.95rem;">
|
||||||
Der generische Import nutzt die Standard-Datenbankverbindung des Moduls oder einen optionalen Modul-Callback fuer Spezialfaelle.
|
Der generische Import nutzt die Standard-Datenbankverbindung des Moduls oder einen optionalen Modul-Callback für Spezialfälle.
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="display:flex; gap:10px; flex-wrap:wrap;">
|
<div style="display:flex; gap:10px; flex-wrap:wrap;">
|
||||||
<button class="cta-button" type="submit">SQL importieren</button>
|
<button class="cta-button" type="submit">SQL importieren</button>
|
||||||
<a class="nav-link" href="/modules/install">Zur Modulverwaltung</a>
|
<a class="nav-link" href="/modules">Aktive Module öffnen</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
<?php endif; ?>
|
||||||
|
</section>
|
||||||
|
|
||||||
<div style="margin-top:1.25rem;" class="grid">
|
<?php if ($availableModules !== []): ?>
|
||||||
|
<section class="section-box">
|
||||||
|
<div class="module-box-head">
|
||||||
|
<div>
|
||||||
|
<h2 class="module-box-title">Importierbare Module</h2>
|
||||||
|
<p>Schnelleinstieg für den Import mit bereits vorausgewähltem Modul.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="module-admin-grid module-admin-grid--compact">
|
||||||
<?php foreach ($availableModules as $module): ?>
|
<?php foreach ($availableModules as $module): ?>
|
||||||
<div class="card" style="background:var(--panel-2);">
|
<article class="card-box module-admin-card">
|
||||||
<strong><?= e($module['title']) ?></strong>
|
<div class="module-admin-card__head">
|
||||||
<div class="muted" style="font-size:.85rem;"><?= e($module['description']) ?></div>
|
<div class="module-admin-card__title">
|
||||||
<div style="margin-top:.75rem;">
|
<h2><?= e($module['title']) ?></h2>
|
||||||
<a class="nav-link" href="/modules/sql-import?module=<?= e($module['name']) ?>">Fuer dieses Modul importieren</a>
|
<p><?= e($module['description']) ?></p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="module-admin-actions">
|
||||||
|
<a class="nav-link" href="/modules/sql-import?module=<?= e($module['name']) ?>">Für dieses Modul importieren</a>
|
||||||
|
</div>
|
||||||
|
</article>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
</div>
|
</div>
|
||||||
|
</section>
|
||||||
<?php endif; ?>
|
<?php endif; ?>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1136,7 +1136,8 @@ body.has-modal-open {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.module-hero-copy,
|
.module-hero-copy,
|
||||||
.module-hero-actions {
|
.module-hero-actions,
|
||||||
|
.module-submenu-actions {
|
||||||
display: grid;
|
display: grid;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
}
|
}
|
||||||
@@ -1216,7 +1217,8 @@ body.has-modal-open {
|
|||||||
font-size: 0.92rem;
|
font-size: 0.92rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.module-hero-actions {
|
.module-hero-actions,
|
||||||
|
.module-submenu-actions {
|
||||||
justify-items: start;
|
justify-items: start;
|
||||||
align-content: start;
|
align-content: start;
|
||||||
width: min(240px, 100%);
|
width: min(240px, 100%);
|
||||||
@@ -1398,7 +1400,8 @@ body.has-modal-open {
|
|||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
.module-hero-actions {
|
.module-hero-actions,
|
||||||
|
.module-submenu-actions {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -403,7 +403,7 @@ function module_shell_header(string $module, array $options = []): string
|
|||||||
$html .= '</nav>';
|
$html .= '</nav>';
|
||||||
}
|
}
|
||||||
if ($actions !== []) {
|
if ($actions !== []) {
|
||||||
$html .= '<div class="module-hero-actions">' . $renderActions($actions) . '</div>';
|
$html .= '<div class="module-hero-actions module-submenu-actions">' . $renderActions($actions) . '</div>';
|
||||||
}
|
}
|
||||||
$html .= '</div>';
|
$html .= '</div>';
|
||||||
} elseif ($title !== '' || $description !== '' || !empty($options['show_eyebrow'])) {
|
} elseif ($title !== '' || $description !== '' || !empty($options['show_eyebrow'])) {
|
||||||
|
|||||||
Reference in New Issue
Block a user