diff --git a/api/v1/vocabs/PKPVocabController.php b/api/v1/vocabs/PKPVocabController.php index 133f2addb32..55dda0f32f3 100644 --- a/api/v1/vocabs/PKPVocabController.php +++ b/api/v1/vocabs/PKPVocabController.php @@ -32,9 +32,9 @@ use PKP\security\authorization\UserRolesRequiredPolicy; use PKP\security\Role; use PKP\submission\SubmissionAgencyVocab; -use PKP\submission\SubmissionDisciplineDAO; -use PKP\submission\SubmissionKeywordDAO; -use PKP\submission\SubmissionSubjectDAO; +use PKP\submission\SubmissionDisciplineVocab; +use PKP\submission\SubmissionKeywordVocab; +use PKP\submission\SubmissionSubjectVocab; class PKPVocabController extends PKPBaseController { @@ -114,15 +114,15 @@ public function getMany(Request $illuminateRequest): JsonResponse } switch ($vocab) { - case SubmissionKeywordDAO::CONTROLLED_VOCAB_SUBMISSION_KEYWORD: + case SubmissionKeywordVocab::CONTROLLED_VOCAB_SUBMISSION_KEYWORD: $submissionKeywordEntryDao = DAORegistry::getDAO('SubmissionKeywordEntryDAO'); /** @var \PKP\submission\SubmissionKeywordEntryDAO $submissionKeywordEntryDao */ $entries = $submissionKeywordEntryDao->getByContextId($vocab, $context->getId(), $locale, $term)->toArray(); break; - case SubmissionSubjectDAO::CONTROLLED_VOCAB_SUBMISSION_SUBJECT: + case SubmissionSubjectVocab::CONTROLLED_VOCAB_SUBMISSION_SUBJECT: $submissionSubjectEntryDao = DAORegistry::getDAO('SubmissionSubjectEntryDAO'); /** @var \PKP\submission\SubmissionSubjectEntryDAO $submissionSubjectEntryDao */ $entries = $submissionSubjectEntryDao->getByContextId($vocab, $context->getId(), $locale, $term)->toArray(); break; - case SubmissionDisciplineDAO::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE: + case SubmissionDisciplineVocab::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE: $submissionDisciplineEntryDao = DAORegistry::getDAO('SubmissionDisciplineEntryDAO'); /** @var \PKP\submission\SubmissionDisciplineEntryDAO $submissionDisciplineEntryDao */ $entries = $submissionDisciplineEntryDao->getByContextId($vocab, $context->getId(), $locale, $term)->toArray(); break; diff --git a/classes/components/forms/publication/Details.php b/classes/components/forms/publication/Details.php index 67f56471329..b03b3d7bed8 100644 --- a/classes/components/forms/publication/Details.php +++ b/classes/components/forms/publication/Details.php @@ -18,7 +18,7 @@ use APP\publication\Publication; use PKP\components\forms\FieldControlledVocab; use PKP\context\Context; -use PKP\submission\SubmissionKeywordDAO; +use PKP\submission\SubmissionKeywordVocab; class Details extends TitleAbstractForm { @@ -46,7 +46,7 @@ public function __construct( 'label' => __('common.keywords'), 'description' => __('manager.setup.metadata.keywords.description'), 'isMultilingual' => true, - 'apiUrl' => str_replace('__vocab__', SubmissionKeywordDAO::CONTROLLED_VOCAB_SUBMISSION_KEYWORD, $suggestionUrlBase), + 'apiUrl' => str_replace('__vocab__', SubmissionKeywordVocab::CONTROLLED_VOCAB_SUBMISSION_KEYWORD, $suggestionUrlBase), 'locales' => $this->locales, 'value' => (array) $publication->getData('keywords'), 'isRequired' => $context->getData('keywords') === Context::METADATA_REQUIRE ? true : false, diff --git a/classes/components/forms/publication/PKPMetadataForm.php b/classes/components/forms/publication/PKPMetadataForm.php index ae65c61ce6b..c7dd0f8ade9 100644 --- a/classes/components/forms/publication/PKPMetadataForm.php +++ b/classes/components/forms/publication/PKPMetadataForm.php @@ -22,9 +22,9 @@ use PKP\components\forms\FormComponent; use PKP\context\Context; use PKP\submission\SubmissionAgencyVocab; -use PKP\submission\SubmissionDisciplineDAO; -use PKP\submission\SubmissionKeywordDAO; -use PKP\submission\SubmissionSubjectDAO; +use PKP\submission\SubmissionDisciplineVocab; +use PKP\submission\SubmissionKeywordVocab; +use PKP\submission\SubmissionSubjectVocab; class PKPMetadataForm extends FormComponent { @@ -55,7 +55,7 @@ public function __construct(string $action, array $locales, Publication $publica 'label' => __('common.keywords'), 'tooltip' => __('manager.setup.metadata.keywords.description'), 'isMultilingual' => true, - 'apiUrl' => str_replace('__vocab__', SubmissionKeywordDAO::CONTROLLED_VOCAB_SUBMISSION_KEYWORD, $suggestionUrlBase), + 'apiUrl' => str_replace('__vocab__', SubmissionKeywordVocab::CONTROLLED_VOCAB_SUBMISSION_KEYWORD, $suggestionUrlBase), 'locales' => $this->locales, 'value' => (array) $publication->getData('keywords'), ])); @@ -66,7 +66,7 @@ public function __construct(string $action, array $locales, Publication $publica 'label' => __('common.subjects'), 'tooltip' => __('manager.setup.metadata.subjects.description'), 'isMultilingual' => true, - 'apiUrl' => str_replace('__vocab__', SubmissionSubjectDAO::CONTROLLED_VOCAB_SUBMISSION_SUBJECT, $suggestionUrlBase), + 'apiUrl' => str_replace('__vocab__', SubmissionSubjectVocab::CONTROLLED_VOCAB_SUBMISSION_SUBJECT, $suggestionUrlBase), 'locales' => $this->locales, 'value' => (array) $publication->getData('subjects'), ])); @@ -77,7 +77,7 @@ public function __construct(string $action, array $locales, Publication $publica 'label' => __('search.discipline'), 'tooltip' => __('manager.setup.metadata.disciplines.description'), 'isMultilingual' => true, - 'apiUrl' => str_replace('__vocab__', SubmissionDisciplineDAO::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE, $suggestionUrlBase), + 'apiUrl' => str_replace('__vocab__', SubmissionDisciplineVocab::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE, $suggestionUrlBase), 'locales' => $this->locales, 'value' => (array) $publication->getData('disciplines'), ])); diff --git a/classes/controlledVocab/ControlledVocab.php b/classes/controlledVocab/ControlledVocab.php index c1afdf7b9e0..485541a2e8a 100644 --- a/classes/controlledVocab/ControlledVocab.php +++ b/classes/controlledVocab/ControlledVocab.php @@ -36,6 +36,13 @@ class ControlledVocab extends Model 'controlled_vocab_id', ]; + /** + * Indicates if the model should be timestamped. + * + * @var bool + */ + public $timestamps = false; + protected function casts(): array { return [ @@ -81,7 +88,7 @@ public function getData(?string $field): mixed */ public function scopeWithSymbolic(Builder $query, string $symbolic): Builder { - return $query->where(DB::raw('lower(symbolic)'), strtolower($symbolic)); + return $query->where(DB::raw('LOWER(symbolic)'), strtolower($symbolic)); } /** @@ -103,31 +110,38 @@ public function scopeWithAssoc(Builder $query, int $assocType, int $assocId): Bu public function enumerate(string $settingName = 'name'): array { return DB::table('controlled_vocab_entries AS e') - ->leftJoin('controlled_vocab_entry_settings AS l', fn (JoinClause $join) => $join - ->on('l.controlled_vocab_entry_id', '=', 'e.controlled_vocab_entry_id') - ->where('l.setting_name', '=', $settingName) - ->where('l.locale', '=', Locale::getLocale()) + ->leftJoin( + 'controlled_vocab_entry_settings AS l', + fn (JoinClause $join) => $join + ->on('l.controlled_vocab_entry_id', '=', 'e.controlled_vocab_entry_id') + ->where('l.setting_name', $settingName) + ->where('l.locale', Locale::getLocale()) ) - ->leftJoin('controlled_vocab_entry_settings AS p', fn (JoinClause $join) => $join + ->leftJoin( + 'controlled_vocab_entry_settings AS p', + fn (JoinClause $join) => $join ->on('p.controlled_vocab_entry_id', '=', 'e.controlled_vocab_entry_id') - ->where('p.setting_name', '=', $settingName) - ->where('p.locale', '=', Locale::getPrimaryLocale()) + ->where('p.setting_name', $settingName) + ->where('p.locale', Locale::getPrimaryLocale()) ) - ->leftJoin('controlled_vocab_entry_settings AS n', fn (JoinClause $join) => $join + ->leftJoin( + 'controlled_vocab_entry_settings AS n', + fn (JoinClause $join) => $join ->on('n.controlled_vocab_entry_id', '=', 'e.controlled_vocab_entry_id') - ->where('n.setting_name', '=', $settingName) - ->where('n.locale', '=', '') + ->where('n.setting_name', $settingName) + ->where('n.locale', '') ) ->select([ 'e.controlled_vocab_entry_id', DB::raw( - 'coalesce (l.setting_value, p.setting_value, n.setting_value) as setting_value' + 'COALESCE (l.setting_value, p.setting_value, n.setting_value) as setting_value' ), DB::raw( - 'coalesce (l.setting_type, p.setting_type, n.setting_type) as setting_type' + 'COALESCE (l.setting_type, p.setting_type, n.setting_type) as setting_type' ), ]) - ->where('e.controlled_vocab_id', '=', $this->id) + ->where('e.controlled_vocab_id', $this->id) + ->orderBy('e.seq') ->get() ->pluck('setting_value', 'controlled_vocab_entry_id') ->toArray(); diff --git a/classes/controlledVocab/Repository.php b/classes/controlledVocab/Repository.php index cc8c5ab07bf..43f15ad513a 100644 --- a/classes/controlledVocab/Repository.php +++ b/classes/controlledVocab/Repository.php @@ -2,8 +2,12 @@ namespace PKP\controlledVocab; -use PKP\db\DAORegistry; +use APP\facades\Repo; use Illuminate\Support\Facades\DB; +use PKP\db\DAORegistry; +use PKP\user\UserInterest; +use PKP\user\InterestEntry; +use PKP\user\InterestEntryDAO; use PKP\controlledVocab\ControlledVocab; use PKP\controlledVocab\ControlledVocabEntryDAO; @@ -44,7 +48,8 @@ public function getBySymbolic( int $assocType, int $assocId, array $locales = [], - ?string $entryDaoClassName = null): array + ?string $entryDaoClassName = null + ): array { $result = []; @@ -92,7 +97,8 @@ public function insertBySymbolic( int $assocType, int $assocId, bool $deleteFirst = true, - ?string $entryDaoClassName = null): void + ?string $entryDaoClassName = null + ): void { /** @var ControlledVocabEntryDAO $entryDao */ $entryDao = $entryDaoClassName @@ -124,4 +130,49 @@ public function insertBySymbolic( } } } + + /** + * Update a user's set of interests + */ + public function setUserInterests(array $interests, int $userId): void + { + $controlledVocab = Repo::controlledVocab()->build( + UserInterest::CONTROLLED_VOCAB_INTEREST + ); + + /** @var InterestEntryDAO $interestEntryDao */ + $interestEntryDao = DAORegistry::getDAO('InterestEntryDAO'); + + DB::beginTransaction(); + + // Delete the existing interests association. + UserInterest::withUserId($userId)->delete(); + + collect($interests) + ->map(fn (string $interest): string => trim($interest)) + ->unique() + ->each(function (string $interest) use ($controlledVocab, $interestEntryDao, $userId): void { + $interestEntry = $interestEntryDao->getBySetting( + $interest, + $controlledVocab->symbolic, + $controlledVocab->assocId, + $controlledVocab->assocType, + $controlledVocab->symbolic + ); + + if (!$interestEntry) { + $interestEntry = $interestEntryDao->newDataObject(); /** @var InterestEntry $interestEntry */ + $interestEntry->setInterest($interest); + $interestEntry->setControlledVocabId($controlledVocab->id); + $interestEntry->setId($interestEntryDao->insertObject($interestEntry)); + } + + UserInterest::create([ + 'userId' => $userId, + 'controlledVocabEntryId' => $interestEntry->getId(), + ]); + }); + + DB::commit(); + } } diff --git a/classes/core/PKPApplication.php b/classes/core/PKPApplication.php index 1cf24d11fa3..ae3b04290d1 100644 --- a/classes/core/PKPApplication.php +++ b/classes/core/PKPApplication.php @@ -479,7 +479,6 @@ public function getDAOMap() 'FilterDAO' => 'PKP\filter\FilterDAO', 'FilterGroupDAO' => 'PKP\filter\FilterGroupDAO', 'GenreDAO' => 'PKP\submission\GenreDAO', - 'InterestDAO' => 'PKP\user\InterestDAO', 'InterestEntryDAO' => 'PKP\user\InterestEntryDAO', 'LibraryFileDAO' => 'PKP\context\LibraryFileDAO', 'NavigationMenuDAO' => 'PKP\navigationMenu\NavigationMenuDAO', @@ -500,12 +499,9 @@ public function getDAOMap() 'SubEditorsDAO' => 'PKP\context\SubEditorsDAO', 'SubmissionAgencyEntryDAO' => 'PKP\submission\SubmissionAgencyEntryDAO', 'SubmissionCommentDAO' => 'PKP\submission\SubmissionCommentDAO', - 'SubmissionDisciplineDAO' => 'PKP\submission\SubmissionDisciplineDAO', 'SubmissionDisciplineEntryDAO' => 'PKP\submission\SubmissionDisciplineEntryDAO', 'QueryDAO' => 'PKP\query\QueryDAO', - 'SubmissionKeywordDAO' => 'PKP\submission\SubmissionKeywordDAO', 'SubmissionKeywordEntryDAO' => 'PKP\submission\SubmissionKeywordEntryDAO', - 'SubmissionSubjectDAO' => 'PKP\submission\SubmissionSubjectDAO', 'SubmissionSubjectEntryDAO' => 'PKP\submission\SubmissionSubjectEntryDAO', 'TemporaryFileDAO' => 'PKP\file\TemporaryFileDAO', 'TemporaryInstitutionsDAO' => 'PKP\statistics\TemporaryInstitutionsDAO', diff --git a/classes/publication/DAO.php b/classes/publication/DAO.php index 7b4a49e782f..dee019ed0d7 100644 --- a/classes/publication/DAO.php +++ b/classes/publication/DAO.php @@ -24,9 +24,9 @@ use PKP\core\traits\EntityWithParent; use PKP\services\PKPSchemaService; use PKP\submission\SubmissionAgencyVocab; -use PKP\submission\SubmissionDisciplineDAO; -use PKP\submission\SubmissionKeywordDAO; -use PKP\submission\SubmissionSubjectDAO; +use PKP\submission\SubmissionDisciplineVocab; +use PKP\submission\SubmissionKeywordVocab; +use PKP\submission\SubmissionSubjectVocab; /** * @template T of Publication @@ -49,33 +49,16 @@ class DAO extends EntityDAO /** @copydoc EntityDAO::$primaryKeyColumn */ public $primaryKeyColumn = 'publication_id'; - /** @var SubmissionKeywordDAO */ - public $submissionKeywordDao; - - /** @var SubmissionSubjectDAO */ - public $submissionSubjectDao; - - /** @var SubmissionDisciplineDAO */ - public $submissionDisciplineDao; - /** @var CitationDAO */ public $citationDao; /** * Constructor */ - public function __construct( - SubmissionKeywordDAO $submissionKeywordDao, - SubmissionSubjectDAO $submissionSubjectDao, - SubmissionDisciplineDAO $submissionDisciplineDao, - CitationDAO $citationDao, - PKPSchemaService $schemaService - ) { + public function __construct(CitationDAO $citationDao, PKPSchemaService $schemaService) + { parent::__construct($schemaService); - $this->submissionKeywordDao = $submissionKeywordDao; - $this->submissionSubjectDao = $submissionSubjectDao; - $this->submissionDisciplineDao = $submissionDisciplineDao; $this->citationDao = $citationDao; } @@ -365,9 +348,9 @@ protected function deleteAuthors(int $publicationId) */ protected function setControlledVocab(Publication $publication) { - $publication->setData('keywords', $this->submissionKeywordDao->getKeywords($publication->getId())); - $publication->setData('subjects', $this->submissionSubjectDao->getSubjects($publication->getId())); - $publication->setData('disciplines', $this->submissionDisciplineDao->getDisciplines($publication->getId())); + $publication->setData('keywords', SubmissionKeywordVocab::getKeywords($publication->getId())); + $publication->setData('subjects', SubmissionSubjectVocab::getSubjects($publication->getId())); + $publication->setData('disciplines', SubmissionDisciplineVocab::getDisciplines($publication->getId())); $publication->setData('supportingAgencies', SubmissionAgencyVocab::getAgencies($publication->getId())); } @@ -405,20 +388,12 @@ protected function saveControlledVocab(array $values, int $publicationId) { // Update controlled vocabularly for which we have props foreach ($values as $prop => $value) { - switch ($prop) { - case 'keywords': - $this->submissionKeywordDao->insertKeywords($value, $publicationId); - break; - case 'subjects': - $this->submissionSubjectDao->insertSubjects($value, $publicationId); - break; - case 'disciplines': - $this->submissionDisciplineDao->insertDisciplines($value, $publicationId); - break; - case 'supportingAgencies': - SubmissionAgencyVocab::insertAgencies($value, $publicationId); - break; - } + match ($prop) { + 'keywords' => SubmissionKeywordVocab::insertKeywords($value, $publicationId), + 'subjects' => SubmissionSubjectVocab::insertSubjects($value, $publicationId), + 'disciplines' => SubmissionDisciplineVocab::insertDisciplines($value, $publicationId), + 'supportingAgencies' => SubmissionAgencyVocab::insertAgencies($value, $publicationId), + }; } } @@ -427,9 +402,9 @@ protected function saveControlledVocab(array $values, int $publicationId) */ protected function deleteControlledVocab(int $publicationId) { - $this->submissionKeywordDao->insertKeywords([], $publicationId); - $this->submissionSubjectDao->insertSubjects([], $publicationId); - $this->submissionDisciplineDao->insertDisciplines([], $publicationId); + SubmissionKeywordVocab::insertKeywords([], $publicationId); + SubmissionSubjectVocab::insertSubjects([], $publicationId); + SubmissionDisciplineVocab::insertDisciplines([], $publicationId); SubmissionAgencyVocab::insertAgencies([], $publicationId); } diff --git a/classes/submission/SubmissionAgencyVocab.php b/classes/submission/SubmissionAgencyVocab.php index 8a83d54ef63..4ba5d1c6a7e 100644 --- a/classes/submission/SubmissionAgencyVocab.php +++ b/classes/submission/SubmissionAgencyVocab.php @@ -15,6 +15,7 @@ namespace PKP\submission; use APP\facades\Repo; +use Illuminate\Database\Eloquent\Builder; use PKP\controlledVocab\ControlledVocab; use PKP\core\PKPApplication; @@ -26,7 +27,7 @@ class SubmissionAgencyVocab extends ControlledVocab /** * Get the list of localized additional fields to store. */ - public function scopeGetLocaleFieldNames(): array + public function scopeGetLocaleFieldNames(Builder $query): array { return ['submissionAgency']; } @@ -37,7 +38,12 @@ public function scopeGetLocaleFieldNames(): array * @param int $assocType DO NOT USE: For <3.1 to 3.x migration pkp/pkp-lib#6213 * */ - public function scopeGetAgencies(int $publicationId, array $locales = [], $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION): array + public function scopeGetAgencies( + Builder $query, + int $publicationId, + array $locales = [], + int $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION + ): array { return Repo::controlledVocab()->getBySymbolic( static::CONTROLLED_VOCAB_SUBMISSION_AGENCY, @@ -50,7 +56,7 @@ public function scopeGetAgencies(int $publicationId, array $locales = [], $assoc /** * Get an array of all of the submission's agencies */ - public function scoprGetAllUniqueAgencies():array + public function scoprGetAllUniqueAgencies(Builder $query):array { return Repo::controlledVocab()->getAllUniqueBySymbolic( static::CONTROLLED_VOCAB_SUBMISSION_AGENCY @@ -65,7 +71,13 @@ public function scoprGetAllUniqueAgencies():array * @param bool $deleteFirst True iff existing agencies should be removed first. * @param int $assocType DO NOT USE: For <3.1 to 3.x migration pkp/pkp-lib#3572 pkp/pkp-lib#6213 */ - public function scoprInsertAgencies(array $agencies, int $publicationId, bool $deleteFirst = true, int $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION): void + public function scoprInsertAgencies( + Builder $query, + array $agencies, + int $publicationId, + bool $deleteFirst = true, + int $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION + ): void { Repo::controlledVocab()->insertBySymbolic( static::CONTROLLED_VOCAB_SUBMISSION_AGENCY, diff --git a/classes/submission/SubmissionDisciplineDAO.php b/classes/submission/SubmissionDisciplineDAO.php deleted file mode 100644 index 58cbc58d48d..00000000000 --- a/classes/submission/SubmissionDisciplineDAO.php +++ /dev/null @@ -1,140 +0,0 @@ -build($publicationId, $assocType); - $submissionDisciplineEntryDao = DAORegistry::getDAO('SubmissionDisciplineEntryDAO'); /** @var SubmissionDisciplineEntryDAO $submissionDisciplineEntryDao */ - $submissionDisciplines = $submissionDisciplineEntryDao->getByControlledVocabId($disciplines->getId()); - while ($disciplineEntry = $submissionDisciplines->next()) { - $discipline = $disciplineEntry->getDiscipline(); - foreach ($discipline as $locale => $value) { - if (empty($locales) || in_array($locale, $locales)) { - $result[$locale][] = $value; - } - } - } - - return $result; - } - - /** - * Get an array of all of the submission's disciplines - * - * @return array - */ - public function getAllUniqueDisciplines() - { - $result = $this->retrieve('SELECT DISTINCT setting_value FROM controlled_vocab_entry_settings WHERE setting_name = ?', [self::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE]); - - $disciplines = []; - foreach ($result as $row) { - $disciplines[] = $row->setting_value; - } - return $disciplines; - } - - /** - * Add an array of disciplines - * - * @param array $disciplines - * @param int $publicationId - * @param bool $deleteFirst - * @param int $assocType DO NOT USE: For <3.1 to 3.x migration pkp/pkp-lib#3572 pkp/pkp-lib#6213 - */ - public function insertDisciplines($disciplines, $publicationId, $deleteFirst = true, $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION) - { - $disciplineDao = DAORegistry::getDAO('SubmissionDisciplineDAO'); /** @var SubmissionDisciplineDAO $disciplineDao */ - $submissionDisciplineEntryDao = DAORegistry::getDAO('SubmissionDisciplineEntryDAO'); /** @var SubmissionDisciplineEntryDAO $submissionDisciplineEntryDao */ - $currentDisciplines = $this->build($publicationId, $assocType); - - if ($deleteFirst) { - $existingEntries = $disciplineDao->enumerate($currentDisciplines->getId(), self::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE); - - foreach ($existingEntries as $id => $entry) { - $entry = trim($entry); - $submissionDisciplineEntryDao->deleteObjectById($id); - } - } - if (is_array($disciplines)) { // localized, array of arrays - foreach ($disciplines as $locale => $list) { - if (is_array($list)) { - $list = array_unique($list); // Remove any duplicate keywords - $i = 1; - foreach ($list as $discipline) { - $disciplineEntry = $submissionDisciplineEntryDao->newDataObject(); - $disciplineEntry->setControlledVocabId($currentDisciplines->getId()); - $disciplineEntry->setDiscipline($discipline, $locale); - $disciplineEntry->setSequence($i); - $i++; - $submissionDisciplineEntryDao->insertObject($disciplineEntry); - } - } - } - } - } -} - -if (!PKP_STRICT_MODE) { - class_alias('\PKP\submission\SubmissionDisciplineDAO', '\SubmissionDisciplineDAO'); - define('CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE', SubmissionDisciplineDAO::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE); -} diff --git a/classes/submission/SubmissionDisciplineVocab.php b/classes/submission/SubmissionDisciplineVocab.php new file mode 100644 index 00000000000..42217ff74f0 --- /dev/null +++ b/classes/submission/SubmissionDisciplineVocab.php @@ -0,0 +1,92 @@ +getBySymbolic( + static::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE, + $assocType, + $publicationId, + $locales + ); + } + + /** + * Get an array of all of the submission's disciplines + */ + public function scopeGetAllUniqueDisciplines(Builder $query): array + { + return Repo::controlledVocab()->getAllUniqueBySymbolic( + static::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE + ); + } + + /** + * Add an array of disciplines + * + * @param array $disciplines + * @param int $publicationId + * @param bool $deleteFirst + * @param int $assocType DO NOT USE: For <3.1 to 3.x migration pkp/pkp-lib#3572 pkp/pkp-lib#6213 + */ + public function scopeInsertDisciplines( + Builder $query, + array $disciplines, + int $publicationId, + bool $deleteFirst = true, + int $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION): void + { + Repo::controlledVocab()->insertBySymbolic( + static::CONTROLLED_VOCAB_SUBMISSION_DISCIPLINE, + $disciplines, + $assocType, + $publicationId, + $deleteFirst + ); + } +} diff --git a/classes/submission/SubmissionKeywordDAO.php b/classes/submission/SubmissionKeywordDAO.php deleted file mode 100644 index cfc420ea416..00000000000 --- a/classes/submission/SubmissionKeywordDAO.php +++ /dev/null @@ -1,161 +0,0 @@ -build($publicationId, $assocType); - $submissionKeywordEntryDao = DAORegistry::getDAO('SubmissionKeywordEntryDAO'); /** @var SubmissionKeywordEntryDAO $submissionKeywordEntryDao */ - $submissionKeywords = $submissionKeywordEntryDao->getByControlledVocabId($keywords->getId()); - while ($keywordEntry = $submissionKeywords->next()) { - $keyword = $keywordEntry->getKeyword(); - if ($keyword) { - foreach ($keyword as $locale => $value) { - if (empty($locales) || in_array($locale, $locales)) { - if (!array_key_exists($locale, $result)) { - $result[$locale] = []; - } - $result[$locale][] = $value; - } - } - } - } - - return $result; - } - - /** - * Get an array of all of the submission's keywords - * - * @return array - */ - public function getAllUniqueKeywords() - { - $result = $this->retrieve('SELECT DISTINCT setting_value FROM controlled_vocab_entry_settings WHERE setting_name = ?', [self::CONTROLLED_VOCAB_SUBMISSION_KEYWORD]); - - $keywords = []; - foreach ($result as $row) { - $keywords[] = $row->setting_value; - } - return $keywords; - } - - /** - * Add an array of keywords - * - * @param array $keywords - * @param int $publicationId - * @param bool $deleteFirst - * @param int $assocType DO NOT USE: For <3.1 to 3.x migration pkp/pkp-lib#3572 pkp/pkp-lib#6213 - */ - public function insertKeywords($keywords, $publicationId, $deleteFirst = true, $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION) - { - $submissionKeywordEntryDao = DAORegistry::getDAO('SubmissionKeywordEntryDAO'); /** @var SubmissionKeywordEntryDAO $submissionKeywordEntryDao */ - - if ($deleteFirst) { - $currentKeywords = $this->deleteByPublicationId($publicationId); - } else { - $currentKeywords = $this->build($publicationId, $assocType); - } - if (is_array($keywords)) { // localized, array of arrays - foreach ($keywords as $locale => $list) { - if (is_array($list)) { - $list = array_unique($list); // Remove any duplicate keywords - $i = 1; - foreach ($list as $keyword) { - $keywordEntry = $submissionKeywordEntryDao->newDataObject(); - $keywordEntry->setControlledVocabId($currentKeywords->getId()); - $keywordEntry->setKeyword($keyword, $locale); - $keywordEntry->setSequence($i); - $i++; - $submissionKeywordEntryDao->insertObject($keywordEntry); - } - } - } - } - } - - /** - * Delete keywords by publication ID - * - * @return ControlledVocab Controlled Vocab - */ - public function deleteByPublicationId($publicationId) - { - $keywordDao = DAORegistry::getDAO('SubmissionKeywordDAO'); /** @var SubmissionKeywordDAO $keywordDao */ - $submissionKeywordEntryDao = DAORegistry::getDAO('SubmissionKeywordEntryDAO'); /** @var SubmissionKeywordEntryDAO $submissionKeywordEntryDao */ - $currentKeywords = $this->build($publicationId); - - $existingEntries = $keywordDao->enumerate($currentKeywords->getId(), self::CONTROLLED_VOCAB_SUBMISSION_KEYWORD); - foreach ($existingEntries as $id => $entry) { - $entry = trim($entry); - $entryObj = $submissionKeywordEntryDao->getById($id); - $submissionKeywordEntryDao->deleteObjectById($id); - } - - return $currentKeywords; - } -} - -if (!PKP_STRICT_MODE) { - class_alias('\PKP\submission\SubmissionKeywordDAO', '\SubmissionKeywordDAO'); - define('CONTROLLED_VOCAB_SUBMISSION_KEYWORD', SubmissionKeywordDAO::CONTROLLED_VOCAB_SUBMISSION_KEYWORD); -} diff --git a/classes/submission/SubmissionKeywordVocab.php b/classes/submission/SubmissionKeywordVocab.php new file mode 100644 index 00000000000..6a371e9809e --- /dev/null +++ b/classes/submission/SubmissionKeywordVocab.php @@ -0,0 +1,94 @@ +getBySymbolic( + static::CONTROLLED_VOCAB_SUBMISSION_KEYWORD, + $assocType, + $publicationId, + $locales + ); + } + + /** + * Get an array of all of the submission's keywords + * + * @return array + */ + public function scopeGetAllUniqueKeywords(Builder $query): array + { + return Repo::controlledVocab()->getAllUniqueBySymbolic( + static::CONTROLLED_VOCAB_SUBMISSION_KEYWORD + ); + } + + /** + * Add an array of keywords + * + * @param array $keywords + * @param int $publicationId + * @param bool $deleteFirst + * @param int $assocType DO NOT USE: For <3.1 to 3.x migration pkp/pkp-lib#3572 pkp/pkp-lib#6213 + */ + public function scopeInsertKeywords( + Builder $query, + array $keywords, + int $publicationId, + bool $deleteFirst = true, + int $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION + ): void + { + Repo::controlledVocab()->insertBySymbolic( + static::CONTROLLED_VOCAB_SUBMISSION_KEYWORD, + $keywords, + $assocType, + $publicationId, + $deleteFirst + ); + } +} diff --git a/classes/submission/SubmissionLanguageDAO.php b/classes/submission/SubmissionLanguageDAO.php deleted file mode 100644 index 9f531504c8c..00000000000 --- a/classes/submission/SubmissionLanguageDAO.php +++ /dev/null @@ -1,141 +0,0 @@ -build($publicationId, $assocType); - $submissionLanguageEntryDao = DAORegistry::getDAO('SubmissionLanguageEntryDAO'); /** @var SubmissionLanguageEntryDAO $submissionLanguageEntryDao */ - $submissionLanguages = $submissionLanguageEntryDao->getByControlledVocabId($languages->getId()); - while ($languageEntry = $submissionLanguages->next()) { - $language = $languageEntry->getLanguage(); - foreach ($language as $locale => $value) { - if (empty($locales) || in_array($locale, $locales)) { - $result[$locale][] = $value; - } - } - } - - return $result; - } - - /** - * Get an array of all of the submission's Languages - * - * @return array - */ - public function getAllUniqueLanguages() - { - $result = $this->retrieve('SELECT DISTINCT setting_value FROM controlled_vocab_entry_settings WHERE setting_name = ?', [self::CONTROLLED_VOCAB_SUBMISSION_LANGUAGE]); - - $languages = []; - foreach ($result as $row) { - $languages[] = $row->setting_value; - } - return $languages; - } - - /** - * Add an array of languages - * - * @param array $languages - * @param int $publicationId - * @param bool $deleteFirst - * @param int $assocType DO NOT USE: For <3.1 to 3.x migration pkp/pkp-lib#3572 pkp/pkp-lib#6213 - */ - public function insertLanguages($languages, $publicationId, $deleteFirst = true, $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION) - { - $languageDao = DAORegistry::getDAO('SubmissionLanguageDAO'); /** @var SubmissionLanguageDAO $languageDao */ - $submissionLanguageEntryDao = DAORegistry::getDAO('SubmissionLanguageEntryDAO'); /** @var SubmissionLanguageEntryDAO $submissionLanguageEntryDao */ - $currentLanguages = $this->build($publicationId, $assocType); - - if ($deleteFirst) { - $existingEntries = $languageDao->enumerate($currentLanguages->getId(), self::CONTROLLED_VOCAB_SUBMISSION_LANGUAGE); - - foreach ($existingEntries as $id => $entry) { - $entry = trim($entry); - $submissionLanguageEntryDao->deleteObjectById($id); - } - } - if (is_array($languages)) { // localized, array of arrays - foreach ($languages as $locale => $list) { - if (is_array($list)) { - $list = array_unique($list); // Remove any duplicate Languages - $i = 1; - foreach ($list as $language) { - $languageEntry = $submissionLanguageEntryDao->newDataObject(); - $languageEntry->setControlledVocabId($currentLanguages->getId()); - $languageEntry->setLanguage($language, $locale); - $languageEntry->setSequence($i); - $i++; - $submissionLanguageEntryDao->insertObject($languageEntry); - } - } - } - } - } -} - -if (!PKP_STRICT_MODE) { - class_alias('\PKP\submission\SubmissionLanguageDAO', '\SubmissionLanguageDAO'); - define('CONTROLLED_VOCAB_SUBMISSION_LANGUAGE', SubmissionLanguageDAO::CONTROLLED_VOCAB_SUBMISSION_LANGUAGE); -} diff --git a/classes/submission/SubmissionSubjectDAO.php b/classes/submission/SubmissionSubjectDAO.php deleted file mode 100644 index c8ed091b6ab..00000000000 --- a/classes/submission/SubmissionSubjectDAO.php +++ /dev/null @@ -1,141 +0,0 @@ -build($publicationId, $assocType); - $submissionSubjectEntryDao = DAORegistry::getDAO('SubmissionSubjectEntryDAO'); /** @var SubmissionSubjectEntryDAO $submissionSubjectEntryDao */ - $submissionSubjects = $submissionSubjectEntryDao->getByControlledVocabId($subjects->getId()); - /** @var SubmissionSubject */ - foreach ($submissionSubjects->toIterator() as $subjectEntry) { - $subject = $subjectEntry->getSubject(); - foreach ($subject as $locale => $value) { - if (empty($locales) || in_array($locale, $locales)) { - $result[$locale][] = $value; - } - } - } - - return $result; - } - - /** - * Get an array of all of the submission's Subjects - * - * @return array - */ - public function getAllUniqueSubjects() - { - $result = $this->retrieve('SELECT DISTINCT setting_value FROM controlled_vocab_entry_settings WHERE setting_name = ?', [SubmissionSubjectDAO::CONTROLLED_VOCAB_SUBMISSION_SUBJECT]); - - $subjects = []; - foreach ($result as $row) { - $subjects[] = $row->setting_value; - } - return $subjects; - } - - /** - * Add an array of subjects - * - * @param array $subjects - * @param int $publicationId - * @param bool $deleteFirst - * @param int $assocType DO NOT USE: For <3.1 to 3.x migration pkp/pkp-lib#3572 pkp/pkp-lib#6213 - */ - public function insertSubjects($subjects, $publicationId, $deleteFirst = true, $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION) - { - $subjectDao = DAORegistry::getDAO('SubmissionSubjectDAO'); /** @var SubmissionSubjectDAO $subjectDao */ - $submissionSubjectEntryDao = DAORegistry::getDAO('SubmissionSubjectEntryDAO'); /** @var SubmissionSubjectEntryDAO $submissionSubjectEntryDao */ - $currentSubjects = $this->build($publicationId, $assocType); - - if ($deleteFirst) { - $existingEntries = $subjectDao->enumerate($currentSubjects->getId(), SubmissionSubjectDAO::CONTROLLED_VOCAB_SUBMISSION_SUBJECT); - - foreach ($existingEntries as $id => $entry) { - $entry = trim($entry); - $submissionSubjectEntryDao->deleteObjectById($id); - } - } - if (is_array($subjects)) { // localized, array of arrays - foreach ($subjects as $locale => $list) { - if (is_array($list)) { - $list = array_unique($list); // Remove any duplicate Subjects - $i = 1; - foreach ($list as $subject) { - $subjectEntry = $submissionSubjectEntryDao->newDataObject(); - $subjectEntry->setControlledVocabId($currentSubjects->getId()); - $subjectEntry->setSubject($subject, $locale); - $subjectEntry->setSequence($i); - $i++; - $submissionSubjectEntryDao->insertObject($subjectEntry); - } - } - } - } - } -} - -if (!PKP_STRICT_MODE) { - class_alias('\PKP\submission\SubmissionSubjectDAO', '\SubmissionSubjectDAO'); - define('CONTROLLED_VOCAB_SUBMISSION_SUBJECT', SubmissionSubjectDAO::CONTROLLED_VOCAB_SUBMISSION_SUBJECT); -} diff --git a/classes/submission/SubmissionSubjectVocab.php b/classes/submission/SubmissionSubjectVocab.php new file mode 100644 index 00000000000..63bb8a09469 --- /dev/null +++ b/classes/submission/SubmissionSubjectVocab.php @@ -0,0 +1,90 @@ +getBySymbolic( + static::CONTROLLED_VOCAB_SUBMISSION_SUBJECT, + $assocType, + $publicationId, + $locales + ); + } + + /** + * Get an array of all of the submission's Subjects + */ + public function scopeGetAllUniqueSubjects(Builder $query): array + { + return Repo::controlledVocab()->getAllUniqueBySymbolic( + static::CONTROLLED_VOCAB_SUBMISSION_SUBJECT + ); + } + + /** + * Add an array of subjects + * + * @param array $subjects + * @param int $publicationId + * @param bool $deleteFirst + * @param int $assocType DO NOT USE: For <3.1 to 3.x migration pkp/pkp-lib#3572 pkp/pkp-lib#6213 + */ + public function scopeInsertSubjects( + Builder $query, + array $subjects, + int $publicationId, + bool $deleteFirst = true, + int $assocType = PKPApplication::ASSOC_TYPE_PUBLICATION + ): void + { + Repo::controlledVocab()->insertBySymbolic( + static::CONTROLLED_VOCAB_SUBMISSION_SUBJECT, + $subjects, + $assocType, + $publicationId, + $deleteFirst + ); + } +} diff --git a/classes/user/InterestEntry.php b/classes/user/InterestEntry.php index 29b857902ce..f87ac7c0b2b 100644 --- a/classes/user/InterestEntry.php +++ b/classes/user/InterestEntry.php @@ -9,10 +9,6 @@ * * @class Interest * - * @ingroup user - * - * @see InterestDAO - * * @brief Basic class describing a reviewer interest */ diff --git a/classes/user/InterestManager.php b/classes/user/InterestManager.php index 84559853854..0090c978201 100644 --- a/classes/user/InterestManager.php +++ b/classes/user/InterestManager.php @@ -3,43 +3,30 @@ /** * @file classes/user/InterestManager.php * - * Copyright (c) 2014-2021 Simon Fraser University - * Copyright (c) 2000-2021 John Willinsky + * Copyright (c) 2014-2024 Simon Fraser University + * Copyright (c) 2000-2024 John Willinsky * Distributed under the GNU GPL v3. For full terms see the file docs/COPYING. * * @class InterestManager * - * @ingroup user - * - * @see InterestDAO - * * @brief Handle user interest functions. */ namespace PKP\user; +use APP\facades\Repo; use PKP\db\DAORegistry; +use PKP\user\User; +use PKP\user\UserInterest; class InterestManager { - /** - * Constructor. - */ - public function __construct() - { - } - /** * Get all interests for all users in the system - * - * @param string $filter - * - * @return array */ - public function getAllInterests($filter = null) + public function getAllInterests(?string $filter = null): array { - $interestDao = DAORegistry::getDAO('InterestDAO'); /** @var InterestDAO $interestDao */ - $interests = $interestDao->getAllInterests($filter); + $interests = UserInterest::getAllInterests($filter); $interestReturner = []; while ($interest = $interests->next()) { @@ -56,14 +43,14 @@ public function getInterestsForUser(User $user): array { static $interestsCache = []; $interests = []; - $interestDao = DAORegistry::getDAO('InterestDAO'); /** @var InterestDAO $interestDao */ $interestEntryDao = DAORegistry::getDAO('InterestEntryDAO'); /** @var InterestEntryDAO $interestEntryDao */ - $controlledVocab = $interestDao->build(); - foreach ($interestDao->getUserInterestIds($user->getId()) as $interestEntryId) { + $controlledVocab = Repo::controlledVocab()->build(UserInterest::CONTROLLED_VOCAB_INTEREST); + + foreach (UserInterest::getUserInterestIds($user->getId()) as $interestEntryId) { /** @var InterestEntry */ $interestEntry = $interestsCache[$interestEntryId] ??= $interestEntryDao->getById( $interestEntryId, - $controlledVocab->getId() + $controlledVocab->id ); if ($interestEntry) { $interests[] = $interestEntry->getInterest(); @@ -75,12 +62,8 @@ public function getInterestsForUser(User $user): array /** * Returns a comma separated string of a user's interests - * - * @param User $user - * - * @return string */ - public function getInterestsString($user) + public function getInterestsString(User $user): string { $interests = $this->getInterestsForUser($user); @@ -89,14 +72,14 @@ public function getInterestsString($user) /** * Set a user's interests - * - * @param User $user */ - public function setInterestsForUser($user, $interests) + public function setInterestsForUser(User $user, string|array|null $interests = null): void { - $interestDao = DAORegistry::getDAO('InterestDAO'); /** @var InterestDAO $interestDao */ - $interests = is_array($interests) ? $interests : (empty($interests) ? null : explode(',', $interests)); - $interestDao->setUserInterests($interests, $user->getId()); + $interests = is_array($interests) + ? $interests + : (empty($interests) ? [] : explode(',', $interests)); + + Repo::controlledVocab()->setUserInterests($interests, $user->getId()); } } diff --git a/classes/user/UserInterest.php b/classes/user/UserInterest.php new file mode 100644 index 00000000000..67d23d01b41 --- /dev/null +++ b/classes/user/UserInterest.php @@ -0,0 +1,161 @@ + 'integer', + 'controlled_vocab_entry_id' => 'integer', + ]; + } + + /** + * Accessor and Mutator for primary key => id + */ + protected function id(): Attribute + { + return Attribute::make( + get: fn($value, $attributes) => $attributes[$this->primaryKey] ?? null, + set: fn($value) => [$this->primaryKey => $value], + ); + } + + /** + * Compatibility function for including note IDs in grids. + * + * @deprecated 3.5.0 Use $model->id instead. Can be removed once the DataObject pattern is removed. + */ + public function getId(): int + { + return $this->id; + } + + /** + * Compatibility function for including notes in grids. + * + * @deprecated 3.5. Use $model or $model->$field instead. Can be removed once the DataObject pattern is removed. + */ + public function getData(?string $field): mixed + { + return $field ? $this->$field : $this; + } + + /** + * Scope a query to only include notes with a specific assoc type and assoc ID. + */ + public function scopeWithUserId(Builder $query, int $userId): Builder + { + return $query->where('user_id', $userId); + } + + /** + * Get a list of controlled vocabulary entry IDs (corresponding to interest keywords) + * attributed to a user + */ + public static function getUserInterestIds(int $userId): array + { + $controlledVocab = Repo::controlledVocab()->build( + static::CONTROLLED_VOCAB_INTEREST + ); + + return DB::table('controlled_vocab_entries AS cve') + ->select(['cve.controlled_vocab_entry_id']) + ->join( + 'user_interests AS ui', + fn (JoinClause $join) => $join + ->on('cve.controlled_vocab_entry_id', '=', 'ui.controlled_vocab_entry_id') + ->where('ui.user_id', $userId) + ) + ->where('controlled_vocab_id', $controlledVocab->id) + ->get() + ->pluck('controlled_vocab_entry_id') + ->toArray(); + } + + /** + * Get a list of user IDs attributed to an interest + */ + public static function getUserIdsByInterest(string $interest): array + { + return DB::table('user_interests AS ui') + ->select('ui.user_id') + ->join( + 'controlled_vocab_entry_settings AS cves', + fn (JoinClause $join) => $join + ->on('cves.controlled_vocab_entry_id', '=', 'ui.controlled_vocab_entry_id') + ->where('cves.setting_name', STATIC::CONTROLLED_VOCAB_INTEREST) + ->where(DB::raw('LOWER(cves.setting_value)'), trim(strtolower($interest))) + ) + ->get() + ->pluck('user_id') + ->toArray(); + } + + + /** + * Get all user's interests + */ + public static function getAllInterests(?string $filter = null): object + { + $controlledVocab = Repo::controlledVocab()->build( + static::CONTROLLED_VOCAB_INTEREST + ); + + $interestEntryDao = DAORegistry::getDAO('InterestEntryDAO'); /** @var InterestEntryDAO $interestEntryDao */ + $iterator = $interestEntryDao->getByControlledVocabId($controlledVocab->id, null, $filter); + + // Sort by name. + $interests = $iterator->toArray(); + usort($interests, function ($s1, $s2) { + return strcmp($s1->getInterest(), $s2->getInterest()); + }); + + // Turn back into an iterator. + return new ArrayItemIterator($interests); + } +} diff --git a/classes/user/maps/Schema.php b/classes/user/maps/Schema.php index 182e1accde8..dd8858c1aeb 100644 --- a/classes/user/maps/Schema.php +++ b/classes/user/maps/Schema.php @@ -15,6 +15,7 @@ use APP\facades\Repo; use Illuminate\Support\Enumerable; +use PKP\user\UserInterest; use PKP\db\DAORegistry; use PKP\plugins\Hook; use PKP\services\PKPSchemaService; @@ -166,13 +167,12 @@ protected function mapByProperties(array $props, User $user): array case 'interests': $output[$prop] = []; if ($this->context) { - $interestDao = DAORegistry::getDAO('InterestDAO'); /** @var \PKP\user\InterestDAO $interestDao */ - $interestEntryIds = $interestDao->getUserInterestIds($user->getId()); + $interestEntryIds = UserInterest::getUserInterestIds($user->getId()); if (!empty($interestEntryIds)) { $interestEntryDao = DAORegistry::getDAO('InterestEntryDAO'); /** @var \PKP\user\InterestEntryDAO $interestEntryDao */ $results = $interestEntryDao->getByIds($interestEntryIds); $output[$prop] = []; - while ($interest = $results->next()) { + while ($interest = $results->next()) { /** @var \PKP\user\InterestEntry $interest */ $output[$prop][] = [ 'id' => (int) $interest->getId(), 'interest' => $interest->getInterest(), diff --git a/plugins/importexport/native/filter/NativeXmlPKPPublicationFilter.php b/plugins/importexport/native/filter/NativeXmlPKPPublicationFilter.php index dc0af8d14dc..ec753b9a9af 100644 --- a/plugins/importexport/native/filter/NativeXmlPKPPublicationFilter.php +++ b/plugins/importexport/native/filter/NativeXmlPKPPublicationFilter.php @@ -315,10 +315,10 @@ public function _getLocalizedPublicationFields() public function _getControlledVocabulariesMappings() { return [ - 'keywords' => ['SubmissionKeywordDAO', 'insertKeywords'], + 'keywords' => ['SubmissionKeywordVocab', 'insertKeywords'], 'agencies' => ['SubmissionAgencyVocab', 'insertAgencies'], - 'disciplines' => ['SubmissionDisciplineDAO', 'insertDisciplines'], - 'subjects' => ['SubmissionSubjectDAO', 'insertSubjects'], + 'disciplines' => ['SubmissionDisciplineVocab', 'insertDisciplines'], + 'subjects' => ['SubmissionSubjectVocab', 'insertSubjects'], ]; } diff --git a/plugins/importexport/native/filter/PKPPublicationNativeXmlFilter.php b/plugins/importexport/native/filter/PKPPublicationNativeXmlFilter.php index ced091e7c89..9e5a37106cb 100644 --- a/plugins/importexport/native/filter/PKPPublicationNativeXmlFilter.php +++ b/plugins/importexport/native/filter/PKPPublicationNativeXmlFilter.php @@ -304,10 +304,10 @@ public function addRepresentations($doc, $entityNode, $entity) public function _getControlledVocabulariesMappings() { return [ - 'keywords' => ['SubmissionKeywordDAO', 'getKeywords', 'keyword'], + 'keywords' => ['SubmissionKeywordVocab', 'getKeywords', 'keyword'], 'agencies' => ['SubmissionAgencyVocab', 'getAgencies', 'agency'], - 'disciplines' => ['SubmissionDisciplineDAO', 'getDisciplines', 'discipline'], - 'subjects' => ['SubmissionSubjectDAO', 'getSubjects', 'subject'], + 'disciplines' => ['SubmissionDisciplineVocab', 'getDisciplines', 'discipline'], + 'subjects' => ['SubmissionSubjectVocab', 'getSubjects', 'subject'], ]; } diff --git a/tests/classes/form/validation/FormValidatorControlledVocabTest.php b/tests/classes/form/validation/FormValidatorControlledVocabTest.php index f93ac5a062e..6d88820df87 100644 --- a/tests/classes/form/validation/FormValidatorControlledVocabTest.php +++ b/tests/classes/form/validation/FormValidatorControlledVocabTest.php @@ -37,7 +37,7 @@ class FormValidatorControlledVocabTest extends PKPTestCase */ protected function getMockedDAOs(): array { - return [...parent::getMockedDAOs(), 'ControlledVocabDAO']; + return [...parent::getMockedDAOs()]; } public function testIsValid() @@ -74,7 +74,15 @@ public function testIsValid() DAORegistry::registerDAO('ControlledVocabDAO', $mockControlledVocabDao); // Instantiate validator - $validator = new \PKP\form\validation\FormValidatorControlledVocab($form, 'testData', FormValidator::FORM_VALIDATOR_REQUIRED_VALUE, 'some.message.key', 'testVocab', Application::ASSOC_TYPE_CITATION, 333); + $validator = new FormValidatorControlledVocab( + $form, + 'testData', + FormValidator::FORM_VALIDATOR_REQUIRED_VALUE, + 'some.message.key', + 'testVocab', + Application::ASSOC_TYPE_CITATION, + 333 + ); $form->setData('testData', '1'); self::assertTrue($validator->isValid()); diff --git a/tests/classes/publication/PublicationTest.php b/tests/classes/publication/PublicationTest.php index d6f329f5f58..31c92cd8bff 100644 --- a/tests/classes/publication/PublicationTest.php +++ b/tests/classes/publication/PublicationTest.php @@ -22,9 +22,9 @@ use PKP\citation\CitationDAO; use PKP\services\PKPSchemaService; use PKP\submission\SubmissionAgencyVocab; -use PKP\submission\SubmissionDisciplineDAO; -use PKP\submission\SubmissionKeywordDAO; -use PKP\submission\SubmissionSubjectDAO; +use PKP\submission\SubmissionDisciplineVocab; +use PKP\submission\SubmissionKeywordVocab; +use PKP\submission\SubmissionSubjectVocab; use PKP\tests\PKPTestCase; use PHPUnit\Framework\Attributes\CoversClass; @@ -40,9 +40,6 @@ protected function setUp(): void { parent::setUp(); $this->publication = (new DAO( - new SubmissionKeywordDAO(), - new SubmissionSubjectDAO(), - new SubmissionDisciplineDAO(), new CitationDAO(), new PKPSchemaService() ))->newDataObject();