Skip to content

Commit d8c4de9

Browse files
committed
Verknüpfungen anzeigen
1 parent 3d3e713 commit d8c4de9

13 files changed

+277
-1
lines changed

eventListener.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<data xmlns="http://www.woltlab.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.woltlab.com http://www.woltlab.com/XSD/6.0/eventListener.xsd">
3+
<import>
4+
<eventlistener name="databaseRelationRecordListener">
5+
<eventclassname>wcf\page\WsdbRecordPage</eventclassname>
6+
<eventname>assignVariables</eventname>
7+
<listenerclassname>wcf\system\wsdb\event\listener\DatabaseRelationRecordListener</listenerclassname>
8+
</eventlistener>
9+
</import>
10+
</data>

files/lib/bootstrap/dev.hanashi.wsdb.relation-option.php

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,21 @@
22

33
use wcf\event\form\option\FormOptionCollecting;
44
use wcf\event\form\option\SharedConfigurationFormFieldCollecting;
5+
use wcf\event\wsdb\option\OptionCreated;
6+
use wcf\event\wsdb\option\OptionDeleted;
7+
use wcf\event\wsdb\option\OptionDisabled;
8+
use wcf\event\wsdb\option\OptionEnabled;
9+
use wcf\event\wsdb\option\OptionUpdated;
10+
use wcf\event\wsdb\record\RecordCreated;
11+
use wcf\event\wsdb\record\RecordDeleted;
12+
use wcf\event\wsdb\record\RecordDisabled;
13+
use wcf\event\wsdb\record\RecordEnabled;
14+
use wcf\event\wsdb\record\RecordPublished;
15+
use wcf\event\wsdb\record\RecordRestored;
16+
use wcf\event\wsdb\record\RecordSoftDeleted;
17+
use wcf\event\wsdb\record\RecordUpdated;
518
use wcf\system\event\EventHandler;
19+
use wcf\system\wsdb\event\listener\DatabaseRelationRecordChangeListener;
620
use wcf\system\wsdb\event\listener\DatabaseRelationSharedConfigurationFormFieldListener;
721
use wcf\system\wsdb\form\option\DatabaseRelationOption;
822

@@ -18,4 +32,57 @@ static function (FormOptionCollecting $event): void {
1832
SharedConfigurationFormFieldCollecting::class,
1933
DatabaseRelationSharedConfigurationFormFieldListener::class
2034
);
35+
36+
EventHandler::getInstance()->register(
37+
RecordCreated::class,
38+
DatabaseRelationRecordChangeListener::class
39+
);
40+
EventHandler::getInstance()->register(
41+
RecordDeleted::class,
42+
DatabaseRelationRecordChangeListener::class
43+
);
44+
EventHandler::getInstance()->register(
45+
RecordDisabled::class,
46+
DatabaseRelationRecordChangeListener::class
47+
);
48+
EventHandler::getInstance()->register(
49+
RecordEnabled::class,
50+
DatabaseRelationRecordChangeListener::class
51+
);
52+
EventHandler::getInstance()->register(
53+
RecordPublished::class,
54+
DatabaseRelationRecordChangeListener::class
55+
);
56+
EventHandler::getInstance()->register(
57+
RecordRestored::class,
58+
DatabaseRelationRecordChangeListener::class
59+
);
60+
EventHandler::getInstance()->register(
61+
RecordSoftDeleted::class,
62+
DatabaseRelationRecordChangeListener::class
63+
);
64+
EventHandler::getInstance()->register(
65+
RecordUpdated::class,
66+
DatabaseRelationRecordChangeListener::class
67+
);
68+
EventHandler::getInstance()->register(
69+
OptionCreated::class,
70+
DatabaseRelationRecordChangeListener::class
71+
);
72+
EventHandler::getInstance()->register(
73+
OptionUpdated::class,
74+
DatabaseRelationRecordChangeListener::class
75+
);
76+
EventHandler::getInstance()->register(
77+
OptionDeleted::class,
78+
DatabaseRelationRecordChangeListener::class
79+
);
80+
EventHandler::getInstance()->register(
81+
OptionDisabled::class,
82+
DatabaseRelationRecordChangeListener::class
83+
);
84+
EventHandler::getInstance()->register(
85+
OptionEnabled::class,
86+
DatabaseRelationRecordChangeListener::class
87+
);
2188
};
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace wcf\system\wsdb\cache\eager;
4+
5+
use wcf\data\wsdb\option\OptionList;
6+
use wcf\system\cache\eager\AbstractEagerCache;
7+
use wcf\system\WCF;
8+
use wcf\system\wsdb\cache\eager\data\DatabaseRelationCacheData;
9+
10+
/**
11+
* @extends AbstractEagerCache<DatabaseRelationCacheData>
12+
*/
13+
final class DatabaseRelationCache extends AbstractEagerCache
14+
{
15+
#[\Override]
16+
protected function getCacheData(): DatabaseRelationCacheData
17+
{
18+
$optionList = new OptionList();
19+
$optionList->getConditionBuilder()->add('optionType = ?', ['databaseRelation']);
20+
$optionList->getConditionBuilder()->add('isDisabled = ?', [0]);
21+
$optionList->readObjects();
22+
23+
$references = [];
24+
foreach ($optionList as $option) {
25+
$sql = "
26+
SELECT recordID,
27+
option" . $option->optionID . " value
28+
FROM wcf1_wsdb_db" . $option->databaseID . "_record_data
29+
WHERE option" . $option->optionID . " IS NOT NULL
30+
AND option" . $option->optionID . " <> ?
31+
";
32+
$statement = WCF::getDB()->prepare($sql);
33+
$statement->execute(['']);
34+
35+
while ($row = $statement->fetch(\PDO::FETCH_ASSOC)) {
36+
$values = \explode(',', $row['value']);
37+
foreach ($values as $value) {
38+
$references[(int)$value][$option->databaseID][] = $row['recordID'];
39+
}
40+
}
41+
}
42+
43+
return new DatabaseRelationCacheData($references);
44+
}
45+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
namespace wcf\system\wsdb\cache\eager\data;
4+
5+
final class DatabaseRelationCacheData
6+
{
7+
/**
8+
* @param array<int, array<int, int[]>> $references
9+
*/
10+
public function __construct(private readonly array $references)
11+
{
12+
}
13+
14+
/**
15+
* @return array<int, int[]>
16+
*/
17+
public function getReferencedRecords(int $recordID): array
18+
{
19+
return $this->references[$recordID] ?? [];
20+
}
21+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace wcf\system\wsdb\event\listener;
4+
5+
use wcf\system\wsdb\cache\eager\DatabaseRelationCache;
6+
7+
final class DatabaseRelationRecordChangeListener
8+
{
9+
public function __invoke(): void
10+
{
11+
(new DatabaseRelationCache())->rebuild();
12+
}
13+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
namespace wcf\system\wsdb\event\listener;
4+
5+
use wcf\page\WsdbRecordPage;
6+
use wcf\system\event\listener\AbstractEventListener;
7+
use wcf\system\WCF;
8+
use wcf\system\wsdb\cache\eager\data\DatabaseCacheData;
9+
use wcf\system\wsdb\cache\eager\DatabaseRelationCache;
10+
use wcf\system\wsdb\cache\runtime\RecordRuntimeCache;
11+
12+
final class DatabaseRelationRecordListener extends AbstractEventListener
13+
{
14+
protected function onAssignVariables(WsdbRecordPage $eventObj): void
15+
{
16+
$references = (new DatabaseRelationCache())->getCache()->getReferencedRecords($eventObj->getRecord()->recordID);
17+
if ($references === []) {
18+
return;
19+
}
20+
21+
$recordIDs = \array_unique(\array_merge(...\array_values($references)));
22+
if ($recordIDs === []) {
23+
return;
24+
}
25+
26+
RecordRuntimeCache::getInstance()->cacheObjectIDs($recordIDs);
27+
28+
$referencedRecords = [];
29+
foreach ($references as $databaseID => $referencedRecordIDs) {
30+
$database = DatabaseCacheData::getSharedCache()->getDatabaseByID($databaseID);
31+
$records = [];
32+
foreach ($referencedRecordIDs as $recordID) {
33+
$record = RecordRuntimeCache::getInstance()->getObject($recordID);
34+
if ($record === null || !$record->canRead()) {
35+
continue;
36+
}
37+
$records[] = $record;
38+
}
39+
40+
if ($records !== []) {
41+
$referencedRecords[] = [
42+
'database' => $database->getPhrase(WCF::getLanguage()->languageID, 'recordPlural'),
43+
'enableCoverPhoto' => $database->enableCoverPhoto,
44+
'records' => $records,
45+
];
46+
}
47+
}
48+
49+
if ($referencedRecords === []) {
50+
return;
51+
}
52+
53+
WCF::getTPL()->assign([
54+
'referencedRecords' => $referencedRecords,
55+
]);
56+
}
57+
}

files/lib/system/wsdb/form/option/DatabaseRelationOption.class.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ private function getRecords(int $databaseID): array
119119

120120
$records = [];
121121
foreach ($recordList as $record) {
122+
if (!$record->canRead()) {
123+
continue;
124+
}
122125
$records[$record->databaseID][$record->recordID] = $record->getTitle();
123126
}
124127
$this->records = $records;

files/lib/system/wsdb/form/option/formatter/DatabaseRelationFormatter.class.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,19 @@ public function format(string $value, int $languageID, array $configuration): st
1616
{
1717
$values = \explode(',', $value);
1818
$records = $this->getRecords(ArrayUtil::toIntegerArray($values));
19+
$records = \array_filter($records, static fn (Record $record) => $record->canRead());
1920
if ($records === []) {
2021
return '';
2122
}
2223

2324
$recordLinks = \array_map(
2425
static function (Record $record): string {
25-
return StringUtil::getAnchorTag($record->getLink(), $record->getTitle(), true, true);
26+
return StringUtil::getAnchorTag(
27+
$record->getLink(),
28+
$record->getTitle(),
29+
true,
30+
(bool)$record->getDatabase()->enableUgc
31+
);
2632
},
2733
$records
2834
);

language/de.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<item name="dev.hanashi.wsdb.relation.crossLink"><![CDATA[Querverweise zwischen Einträgen]]></item>
1010
<item name="dev.hanashi.wsdb.relation.crossLink.description"><![CDATA[Durch Aktivieren dieser Option werden die Einträge dieser Datenbank in den Einträgen der Datenbank angezeigt, auf die sich der Verweis bezieht.]]></item>
1111
<item name="dev.hanashi.wsdb.relation.multipleSelection"><![CDATA[Mehrfachauswahl]]></item>
12+
<item name="dev.hanashi.wsdb.relation.connected"><![CDATA[Verknüpfte]]></item>
1213
</category>
1314
</import>
1415
</language>

language/en.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<item name="dev.hanashi.wsdb.relation.crossLink"><![CDATA[Cross link records]]></item>
1010
<item name="dev.hanashi.wsdb.relation.crossLink.description"><![CDATA[By activating this option, the entries in this database are displayed in the entries of the database to which the reference refers.]]></item>
1111
<item name="dev.hanashi.wsdb.relation.multipleSelection"><![CDATA[Multiple selection]]></item>
12+
<item name="dev.hanashi.wsdb.relation.connected"><![CDATA[Connected]]></item>
1213
</category>
1314
</import>
1415
</language>

0 commit comments

Comments
 (0)