diff --git a/Admin/Install/Media.install.json b/Admin/Install/Media.install.json new file mode 100644 index 0000000..0b42386 --- /dev/null +++ b/Admin/Install/Media.install.json @@ -0,0 +1,9 @@ +[ + { + "type": "collection", + "create_directory": true, + "name": "QA", + "virtualPath": "/Modules", + "user": 1 + } +] \ No newline at end of file diff --git a/Admin/Install/Media.php b/Admin/Install/Media.php new file mode 100644 index 0000000..e673b23 --- /dev/null +++ b/Admin/Install/Media.php @@ -0,0 +1,43 @@ + __DIR__ . '/Media.install.json']); + } +} diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 2f8a4bb..15e0aa9 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -72,6 +72,32 @@ } } }, + "qa_question_media": { + "name": "qa_question_media", + "fields": { + "qa_question_media_id": { + "name": "qa_question_media_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "qa_question_media_src": { + "name": "qa_question_media_src", + "type": "INT", + "null": false, + "foreignTable": "qa_question", + "foreignKey": "qa_question_id" + }, + "qa_question_media_dst": { + "name": "qa_question_media_dst", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" + } + } + }, "qa_question_vote": { "name": "qa_question_vote", "fields": { @@ -187,6 +213,32 @@ } } }, + "qa_answer_media": { + "name": "qa_answer_media", + "fields": { + "qa_answer_media_id": { + "name": "qa_answer_media_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "qa_answer_media_src": { + "name": "qa_answer_media_src", + "type": "INT", + "null": false, + "foreignTable": "qa_answer", + "foreignKey": "qa_answer_id" + }, + "qa_answer_media_dst": { + "name": "qa_answer_media_dst", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" + } + } + }, "qa_answer_vote": { "name": "qa_answer_vote", "fields": { diff --git a/Controller/ApiController.php b/Controller/ApiController.php index 81f40c2..b6f7c37 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -170,6 +170,20 @@ final class ApiController extends Controller } } + if (!empty($uploadedFiles = $request->getFiles() ?? [])) { + $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( + [''], + $uploadedFiles, + $request->header->account, + __DIR__ . '/../../../Modules/Media/Files/Modules/QA', + '/Modules/QA', + ); + + foreach ($uploaded as $media) { + $question->addMedia($media); + } + } + return $question; } @@ -247,6 +261,20 @@ final class ApiController extends Controller $answer->setStatus((int) $request->getData('status')); $answer->createdBy = new Profile(new NullAccount($request->header->account)); + if (!empty($uploadedFiles = $request->getFiles() ?? [])) { + $uploaded = $this->app->moduleManager->get('Media')->uploadFiles( + [''], + $uploadedFiles, + $request->header->account, + __DIR__ . '/../../../Modules/Media/Files/Modules/QA', + '/Modules/QA', + ); + + foreach ($uploaded as $media) { + $answer->addMedia($media); + } + } + return $answer; } diff --git a/Docs/Dev/img/er.png b/Docs/Dev/img/er.png new file mode 100644 index 0000000..e3af1ea Binary files /dev/null and b/Docs/Dev/img/er.png differ diff --git a/Models/QAAnswer.php b/Models/QAAnswer.php index fba0b5f..35e8e40 100755 --- a/Models/QAAnswer.php +++ b/Models/QAAnswer.php @@ -99,6 +99,14 @@ class QAAnswer implements \JsonSerializable */ private array $votes = []; + /** + * Media files + * + * @var array + * @since 1.0.0 + */ + protected array $media = []; + /** * Constructor. * @@ -252,6 +260,32 @@ class QAAnswer implements \JsonSerializable return 0; } + /** + * Get all media + * + * @return Media[] + * + * @since 1.0.0 + */ + public function getMedia() : array + { + return $this->media; + } + + /** + * Add media + * + * @param Media $media Media to add + * + * @return void + * + * @since 1.0.0 + */ + public function addMedia(Media $media) : void + { + $this->media[] = $media; + } + /** * {@inheritdoc} */ diff --git a/Models/QAAnswerMapper.php b/Models/QAAnswerMapper.php index e4218fc..14b94ce 100755 --- a/Models/QAAnswerMapper.php +++ b/Models/QAAnswerMapper.php @@ -16,6 +16,7 @@ namespace Modules\QA\Models; use Modules\Profile\Models\ProfileMapper; use phpOMS\DataStorage\Database\DataMapperAbstract; +use Modules\Media\Models\MediaMapper; /** * Mapper class. @@ -75,6 +76,12 @@ final class QAAnswerMapper extends DataMapperAbstract 'self' => 'qa_answer_vote_answer', 'external' => null, ], + 'media' => [ + 'mapper' => MediaMapper::class, + 'table' => 'qa_answer_media', + 'external' => 'qa_answer_media_dst', + 'self' => 'qa_answer_media_src', + ], ]; /** diff --git a/Models/QAQuestion.php b/Models/QAQuestion.php index b3725d2..d418f0c 100755 --- a/Models/QAQuestion.php +++ b/Models/QAQuestion.php @@ -122,6 +122,14 @@ class QAQuestion implements \JsonSerializable */ public QAApp $app; + /** + * Media files + * + * @var array + * @since 1.0.0 + */ + protected array $media = []; + /** * Constructor. * @@ -393,6 +401,32 @@ class QAQuestion implements \JsonSerializable $this->answers[] = $answer; } + /** + * Get all media + * + * @return Media[] + * + * @since 1.0.0 + */ + public function getMedia() : array + { + return $this->media; + } + + /** + * Add media + * + * @param Media $media Media to add + * + * @return void + * + * @since 1.0.0 + */ + public function addMedia(Media $media) : void + { + $this->media[] = $media; + } + /** * {@inheritdoc} */ diff --git a/Models/QAQuestionMapper.php b/Models/QAQuestionMapper.php index de1c2ff..f7c8a25 100755 --- a/Models/QAQuestionMapper.php +++ b/Models/QAQuestionMapper.php @@ -17,6 +17,7 @@ namespace Modules\QA\Models; use Modules\Profile\Models\ProfileMapper; use Modules\Tag\Models\TagMapper; use phpOMS\DataStorage\Database\DataMapperAbstract; +use Modules\Media\Models\MediaMapper; /** * Mapper class. @@ -71,6 +72,12 @@ final class QAQuestionMapper extends DataMapperAbstract 'self' => 'qa_tag_dst', 'external' => 'qa_tag_src', ], + 'media' => [ + 'mapper' => MediaMapper::class, + 'table' => 'qa_question_media', + 'external' => 'qa_question_media_dst', + 'self' => 'qa_question_media_src', + ], ]; /** diff --git a/Theme/Backend/qa-question.tpl.php b/Theme/Backend/qa-question.tpl.php index 552484f..2f456c8 100755 --- a/Theme/Backend/qa-question.tpl.php +++ b/Theme/Backend/qa-question.tpl.php @@ -56,6 +56,10 @@ echo $this->getData('nav')->render(); + getMedia(); foreach ($files as $file) : ?> + = $this->printHtml($file->name); ?> + + = $this->printHtml($question->createdBy->account->name2); ?>, = $this->printHtml($question->createdBy->account->name1); ?> @@ -90,13 +94,17 @@ echo $this->getData('nav')->render(); - + = $answer->answer; ?> + getMedia(); foreach ($files as $file) : ?> + = $this->printHtml($file->name); ?> + + = $this->printHtml($answer->createdBy->account->name2); ?> = $this->printHtml($answer->createdBy->account->name1); ?> diff --git a/info.json b/info.json index 48b9444..626ac0d 100755 --- a/info.json +++ b/info.json @@ -23,7 +23,8 @@ "Tools": "1.0.0" }, "providing": { - "Navigation": "*" + "Navigation": "*", + "Media": "*" }, "load": [ {