Hey, ich habe folgenden Fall festgestellt, vielleicht kannst du es dir ansehen?
Entries-Boxen kollidieren mit Lexicon von VieCode
Entries-Plugin: 6.1.10
VieCode Lexicon: 7.1.17
WoltLab Suite: 6.1.16
PHP: 8.3.x
Fehlerbeschreibung:
Wenn Entries und VieCode Lexicon parallel installiert sind, verursachen Entries-Boxen auf Lexicon-Seiten einen Fatal Error, sobald diese gerendert werden (z. B. Kategorienliste, Kommentarliste, Eintragsliste).
Fehlermeldung:
unknown method 'getBoxesCategoryIDs'
Error Class: wcf\system\exception\SystemException
File: lib/data/DatabaseObjectDecorator.class.php (92)
Technischer Hintergrund:
Die Entries-Box-Templates greifen auf die globale Variable $category zu und rufen darauf getBoxesCategoryIDs() auf.
Diese Methode existiert nur auf EntriesCategory.
Auf Lexicon-Seiten stammt $category jedoch aus dem Wiki-Kontext (Lexicon-Kategorie). Dadurch wird eine Entries-spezifische Methode auf einem falschen Objekt aufgerufen, was zum Fehler führt.
Je nach Anpassung tritt zusätzlich auf:
wenn activeCategory von einzelnen Box-Controllern nicht an das Template übergeben wird.
Reproduktion
- WoltLab Suite 6.1
- Installierte Plugins:
- Entries 6.1.10
- VieCode Lexicon 7.1.17
- Eine Entries-Box so platzieren, dass sie auch auf Lexicon-Seiten angezeigt wird (z. B. Sidebar).
- Eine beliebige Lexicon-Seite aufrufen (z. B. /lexicon/entry/2-beispielartikel/).
Ergebnis: Fatal Error auf Lexicon-Seiten
Nicht betroffen: Reine Entries-Seiten
Lösungsvorschlag (Entries-seitig)
- In den Templates nicht den globalen $category-Kontext verwenden.
- Stattdessen ausschließlich $activeCategory (Entries-spezifisch) nutzen.
- Vor Verwendung prüfen, ob $activeCategory existiert.
- Alle Box-Controller, die diese Templates verwenden, sollten activeCategory an das Template übergeben (bei nicht-Entries-Requests z. B. null).
Beispielhafte Absicherung im Template (Smarty)
Die Bedingung stellt sicher, dass getBoxesCategoryIDs() nur aufgerufen wird, wenn eine Entries- activeCategory gesetzt ist
{if (($controllerName|isset && $controllerName === 'CategoryEntryList')
|| $templateName === 'entry')
&& ENTRIES_LIST_FILTER_BOXES_SEPARATELY
&& $activeCategory|isset
&& $activeCategory}
{assign var=categoryList value=$categoryTree->filterCategoryLists(
$activeCategory->getBoxesCategoryIDs()
)}
{/if}
Betroffene Templates (Auswahl)
- boxEntryCategoryList.tpl
- boxEntryCategories.tpl
- boxEntryList.tpl
- boxEntryStatistics.tpl
- boxSidebarCommentList.tpl
- boxMostActiveAuthors.tpl
Kurz gesagt:
Entries-Boxen rufen Entries-spezifische Methoden auf Lexicon-Kategorien auf.
Lösungsvorschlag: Verwendung von $activeCategory mit Existenzprüfung statt $category.