|
| 1 | +<?php |
| 2 | + |
| 3 | +namespace wcf\system\wsdb\event\listener; |
| 4 | + |
| 5 | +use wcf\data\file\File; |
| 6 | +use wcf\data\file\FileEditor; |
| 7 | +use wcf\data\media\Media; |
| 8 | +use wcf\data\object\type\ObjectTypeCache; |
| 9 | +use wcf\form\WsdbRecordAddForm; |
| 10 | +use wcf\system\event\listener\AbstractEventListener; |
| 11 | +use wcf\system\form\builder\container\FormContainer; |
| 12 | +use wcf\system\form\builder\data\processor\CustomFormDataProcessor; |
| 13 | +use wcf\system\form\builder\field\dependency\ValueFormFieldDependency; |
| 14 | +use wcf\system\form\builder\field\media\SingleMediaSelectionFormField; |
| 15 | +use wcf\system\form\builder\field\RadioButtonFormField; |
| 16 | +use wcf\system\form\builder\IFormDocument; |
| 17 | +use wcf\system\WCF; |
| 18 | + |
| 19 | +final class MediaCoverPhotoWsdbRecordAddListener extends AbstractEventListener |
| 20 | +{ |
| 21 | + protected function onCreateForm(WsdbRecordAddForm $eventObj): void |
| 22 | + { |
| 23 | + $generalSectionContainer = $eventObj->form->getNodeById('generalSection'); |
| 24 | + $coverPhotoIDFormField = $eventObj->form->getNodeById('coverPhotoID'); |
| 25 | + if ( |
| 26 | + !$eventObj->getDatabase()->enableCoverPhoto |
| 27 | + || !$eventObj->getDatabase()->enableMediaCoverPhoto |
| 28 | + || $generalSectionContainer === null |
| 29 | + || $coverPhotoIDFormField === null |
| 30 | + || !WCF::getSession()->getPermission('admin.content.cms.canUseMedia') |
| 31 | + ) { |
| 32 | + return; |
| 33 | + } |
| 34 | + \assert($generalSectionContainer instanceof FormContainer); |
| 35 | + |
| 36 | + $generalSectionContainer->insertBefore( |
| 37 | + RadioButtonFormField::create('coverPhotoType') |
| 38 | + ->label('Grundlage für Titelbild') |
| 39 | + ->options([ |
| 40 | + 'coverPhotoID' => 'Titelbild hochladen', |
| 41 | + 'coverMediaID' => 'Medienverwaltung', |
| 42 | + ]) |
| 43 | + ->value('coverPhotoID') |
| 44 | + ->required(), |
| 45 | + 'coverPhotoID' |
| 46 | + ); |
| 47 | + |
| 48 | + $coverPhotoIDFormField->addDependency( |
| 49 | + ValueFormFieldDependency::create('coverPhotoIDTypeDependency') |
| 50 | + ->fieldId('coverPhotoType') |
| 51 | + ->values(['coverPhotoID']) |
| 52 | + ); |
| 53 | + |
| 54 | + $generalSectionContainer->insertAfter( |
| 55 | + SingleMediaSelectionFormField::create('coverMediaID') |
| 56 | + ->label('Titelbild (Medienverwaltung)') |
| 57 | + ->imageOnly() |
| 58 | + ->addDependency( |
| 59 | + ValueFormFieldDependency::create('coverMediaIDTypeDependency') |
| 60 | + ->fieldId('coverPhotoType') |
| 61 | + ->values(['coverMediaID']) |
| 62 | + ), |
| 63 | + 'coverPhotoID' |
| 64 | + ); |
| 65 | + } |
| 66 | + |
| 67 | + protected function onBuildForm(WsdbRecordAddForm $eventObj): void |
| 68 | + { |
| 69 | + if ( |
| 70 | + !$eventObj->getDatabase()->enableCoverPhoto |
| 71 | + || !$eventObj->getDatabase()->enableMediaCoverPhoto |
| 72 | + || !WCF::getSession()->getPermission('admin.content.cms.canUseMedia') |
| 73 | + ) { |
| 74 | + return; |
| 75 | + } |
| 76 | + |
| 77 | + $eventObj->form->getDataHandler()->addProcessor( |
| 78 | + new CustomFormDataProcessor( |
| 79 | + 'coverFormField', |
| 80 | + function (IFormDocument $document, array $parameters): array { |
| 81 | + if ( |
| 82 | + $parameters['data']['coverPhotoType'] == 'coverMediaID' |
| 83 | + && isset($parameters['data']['coverMediaID']) |
| 84 | + && $parameters['data']['coverMediaID'] |
| 85 | + ) { |
| 86 | + $media = new Media($parameters['data']['coverMediaID']); |
| 87 | + if ($media->mediaID) { |
| 88 | + $fileID = $this->saveFile($media); |
| 89 | + if ($fileID !== null) { |
| 90 | + $parameters['data']['coverPhotoID'] = $fileID; |
| 91 | + } |
| 92 | + } |
| 93 | + } |
| 94 | + |
| 95 | + return $parameters; |
| 96 | + } |
| 97 | + ) |
| 98 | + ); |
| 99 | + } |
| 100 | + |
| 101 | + private function saveFile(Media $media): ?int |
| 102 | + { |
| 103 | + $fileID = $this->getFileIDByHash(\hash_file('sha256', $media->getLocation())); |
| 104 | + if ($fileID === null) { |
| 105 | + $file = FileEditor::createFromExistingFile( |
| 106 | + $media->getLocation(), |
| 107 | + $media->filename, |
| 108 | + 'com.woltlab.wsdb.coverPhoto', |
| 109 | + true, |
| 110 | + \TIME_NOW |
| 111 | + ); |
| 112 | + if ($file !== null) { |
| 113 | + $fileID = $file->fileID; |
| 114 | + } |
| 115 | + } |
| 116 | + |
| 117 | + return $fileID; |
| 118 | + } |
| 119 | + |
| 120 | + private function getFileIDByHash(string $hash): ?int |
| 121 | + { |
| 122 | + $objectType = ObjectTypeCache::getInstance()->getObjectTypeByName( |
| 123 | + 'com.woltlab.wcf.file', |
| 124 | + 'com.woltlab.wsdb.coverPhoto' |
| 125 | + ); |
| 126 | + if ($objectType === null) { |
| 127 | + return null; |
| 128 | + } |
| 129 | + |
| 130 | + $sql = " |
| 131 | + SELECT * |
| 132 | + FROM wcf1_file |
| 133 | + WHERE fileHash = ? |
| 134 | + AND objectTypeID = ? |
| 135 | + ORDER BY fileID |
| 136 | + LIMIT 1 |
| 137 | + "; |
| 138 | + $statement = WCF::getDB()->prepare($sql); |
| 139 | + $statement->execute([$hash, $objectType->objectTypeID]); |
| 140 | + |
| 141 | + $file = $statement->fetchObject(File::class); |
| 142 | + |
| 143 | + return $file->fileID ?? null; |
| 144 | + } |
| 145 | +} |
0 commit comments