rebuildIndex();
return true;
}
/**
* For upgrade to 2.1.1: Designate original versions as review versions
* in all cases where review versions aren't designated. (#2144)
* @return boolean
*/
function designateReviewVersions() {
$journalDao =& DAORegistry::getDAO('JournalDAO');
$articleDao =& DAORegistry::getDAO('ArticleDAO');
$authorSubmissionDao =& DAORegistry::getDAO('AuthorSubmissionDAO');
import('classes.submission.author.AuthorAction');
$journals =& $journalDao->getJournals();
while ($journal =& $journals->next()) {
$articles =& $articleDao->getArticlesByJournalId($journal->getId());
while ($article =& $articles->next()) {
if (!$article->getReviewFileId() && $article->getSubmissionProgress() == 0) {
$authorSubmission =& $authorSubmissionDao->getAuthorSubmission($article->getId());
AuthorAction::designateReviewVersion($authorSubmission, true);
}
unset($article);
}
unset($journal);
}
return true;
}
/**
* For upgrade to 2.1.1: Migrate the RT settings from the rt_settings
* table to journal settings and drop the rt_settings table.
* @return boolean
*/
function migrateRtSettings() {
$rtDao =& DAORegistry::getDAO('RTDAO');
$journalDao =& DAORegistry::getDAO('JournalDAO');
// Bring in the comments constants.
$commentDao =& DAORegistry::getDao('CommentDAO');
$result =& $rtDao->retrieve('SELECT * FROM rt_settings');
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$journalId = $row['journal_id'];
$journal =& $journalDao->getById($journalId);
$rt = new JournalRT($journalId);
$rt->setEnabled(true); // No toggle in prior OJS; assume true
$rt->setVersion($row['version_id']);
$rt->setAbstract(true); // No toggle in prior OJS; assume true
$rt->setCaptureCite($row['capture_cite']);
$rt->setViewMetadata($row['view_metadata']);
$rt->setSupplementaryFiles($row['supplementary_files']);
$rt->setPrinterFriendly($row['printer_friendly']);
$rt->setDefineTerms($row['define_terms']);
$journal->updateSetting('enableComments', $row['add_comment']?COMMENTS_AUTHENTICATED:COMMENTS_DISABLED);
$rt->setEmailAuthor($row['email_author']);
$rt->setEmailOthers($row['email_others']);
$rtDao->updateJournalRT($rt);
unset($rt);
unset($journal);
$result->MoveNext();
}
$result->Close();
unset($result);
// Drop the table once all settings are migrated.
$rtDao->update('DROP TABLE rt_settings');
return true;
}
/**
* For upgrade to OJS 2.2.0: Migrate the currency settings so the
* currencies table can be dropped in favour of XML.
* @return boolean
*/
function correctCurrencies() {
$currencyDao =& DAORegistry::getDAO('CurrencyDAO');
$result =& $currencyDao->retrieve('SELECT st.type_id AS type_id, c.code_alpha AS code_alpha FROM subscription_types st LEFT JOIN currencies c ON (c.currency_id = st.currency_id)');
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$currencyDao->update('UPDATE subscription_types SET currency_code_alpha = ? WHERE type_id = ?', array($row['code_alpha'], $row['type_id']));
$result->MoveNext();
}
unset($result);
return true;
}
/**
* For upgrade to 2.2.0: Migrate the issue label column and values to the new
* show volume, show number, etc. columns and values. Migrate the publication
* format settings for the journal to the new issue label format. (#2291)
* @return boolean
*/
function migrateIssueLabelAndSettings() {
// First, migrate label_format values in issues table.
$issueDao =& DAORegistry::getDAO('IssueDAO');
$issueDao->update('UPDATE issues SET show_volume=0, show_number=0, show_year=0, show_title=1 WHERE label_format=4'); // ISSUE_LABEL_TITLE
$issueDao->update('UPDATE issues SET show_volume=0, show_number=0, show_year=1, show_title=0 WHERE label_format=3'); // ISSUE_LABEL_YEAR
$issueDao->update('UPDATE issues SET show_volume=1, show_number=0, show_year=1, show_title=0 WHERE label_format=2'); // ISSUE_LABEL_VOL_YEAR
$issueDao->update('UPDATE issues SET show_volume=1, show_number=1, show_year=1, show_title=0 WHERE label_format=1'); // ISSUE_LABEL_NUM_VOL_YEAR
// Drop the old label_format column once all values are migrated.
$issueDao->update('ALTER TABLE issues DROP COLUMN label_format');
// Migrate old publicationFormat journal setting to new journal settings.
$journalDao =& DAORegistry::getDAO('JournalDAO');
$journalSettingsDao =& DAORegistry::getDAO('JournalSettingsDAO');
$result =& $journalDao->retrieve('SELECT j.journal_id AS journal_id, js.setting_value FROM journals j LEFT JOIN journal_settings js ON (js.journal_id = j.journal_id AND js.setting_name = ?)', 'publicationFormat');
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$settings = array(
'publicationFormatVolume' => false,
'publicationFormatNumber' => false,
'publicationFormatYear' => false,
'publicationFormatTitle' => false
);
switch ($row['setting_value']) {
case 4: // ISSUE_LABEL_TITLE
$settings['publicationFormatTitle'] = true;
break;
case 3: // ISSUE_LABEL_YEAR
$settings['publicationFormatYear'] = true;
break;
case 2: // ISSUE_LABEL_VOL_YEAR
$settings['publicationFormatVolume'] = true;
$settings['publicationFormatYear'] = true;
break;
case 1: // ISSUE_LABEL_NUM_VOL_YEAR
default:
$settings['publicationFormatVolume'] = true;
$settings['publicationFormatNumber'] = true;
$settings['publicationFormatYear'] = true;
}
foreach ($settings as $name => $value) {
$journalDao->update('INSERT INTO journal_settings (journal_id, setting_name, setting_value, setting_type) VALUES (?, ?, ?, ?)', array($row['journal_id'], $name, $value?1:0, 'bool'));
}
$result->MoveNext();
}
$result->Close();
unset($result);
$journalDao->update('DELETE FROM journal_settings WHERE setting_name = ?', array('publicationFormat'));
return true;
}
/**
* For upgrade to 2.2: Move primary_locale from journal settings into
* dedicated column.
* @return boolean
*/
function setJournalPrimaryLocales() {
$journalDao =& DAORegistry::getDAO('JournalDAO');
$journalSettingsDao =& DAORegistry::getDAO('JournalSettingsDAO');
$result =& $journalSettingsDao->retrieve('SELECT journal_id, setting_value FROM journal_settings WHERE setting_name = ?', array('primaryLocale'));
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$journalDao->update('UPDATE journals SET primary_locale = ? WHERE journal_id = ?', array($row['setting_value'], $row['journal_id']));
$result->MoveNext();
}
$journalDao->update('UPDATE journals SET primary_locale = ? WHERE primary_locale IS NULL OR primary_locale = ?', array(INSTALLER_DEFAULT_LOCALE, ''));
$result->Close();
return true;
}
/**
* For upgrade to 2.2: Install default settings for block plugins.
* @return boolean
*/
function installBlockPlugins() {
$pluginSettingsDao =& DAORegistry::getDAO('PluginSettingsDAO');
$journalDao =& DAORegistry::getDAO('JournalDAO');
$journals =& $journalDao->getJournals();
// Get journal IDs for insertion, including 0 for site-level
$journalIds = array(0);
while ($journal =& $journals->next()) {
$journalIds[] = $journal->getId();
unset($journal);
}
$pluginNames = array(
'DevelopedByBlockPlugin',
'HelpBlockPlugin',
'UserBlockPlugin',
'RoleBlockPlugin',
'LanguageToggleBlockPlugin',
'NavigationBlockPlugin',
'FontSizeBlockPlugin',
'InformationBlockPlugin'
);
foreach ($journalIds as $journalId) {
$i = 0;
foreach ($pluginNames as $pluginName) {
$pluginSettingsDao->updateSetting($journalId, $pluginName, 'enabled', 'true', 'bool');
$pluginSettingsDao->updateSetting($journalId, $pluginName, 'seq', $i++, 'int');
$pluginSettingsDao->updateSetting($journalId, $pluginName, 'context', BLOCK_CONTEXT_RIGHT_SIDEBAR, 'int');
}
}
return true;
}
/**
* Clear the data cache files (needed because of direct tinkering
* with settings tables)
* @return boolean
*/
function clearDataCache() {
$cacheManager =& CacheManager::getManager();
$cacheManager->flush(null, CACHE_TYPE_FILE);
$cacheManager->flush(null, CACHE_TYPE_OBJECT);
return true;
}
/**
* For 2.2 upgrade: add locale data to existing journal settings that
* were not previously localized.
* @return boolean
*/
function localizeJournalSettings() {
$journalSettingsDao =& DAORegistry::getDAO('JournalSettingsDAO');
$journalDao =& DAORegistry::getDAO('JournalDAO');
$settingNames = array(
// Setup page 1
'title' => 'title',
'journalInitials' => 'initials', // Rename
'journalAbbreviation' => 'abbreviation', // Rename
'sponsorNote' => 'sponsorNote',
'publisherNote' => 'publisherNote',
'contributorNote' => 'contributorNote',
'searchDescription' => 'searchDescription',
'searchKeywords' => 'searchKeywords',
'customHeaders' => 'customHeaders',
// Setup page 2
'focusScopeDesc' => 'focusScopeDesc',
'reviewPolicy' => 'reviewPolicy',
'reviewGuidelines' => 'reviewGuidelines',
'privacyStatement' => 'privacyStatement',
'customAboutItems' => 'customAboutItems',
'lockssLicense' => 'lockssLicense',
// Setup page 3
'authorGuidelines' => 'authorGuidelines',
'submissionChecklist' => 'submissionChecklist',
'copyrightNotice' => 'copyrightNotice',
'metaDisciplineExamples' => 'metaDisciplineExamples',
'metaSubjectClassTitle' => 'metaSubjectClassTitle',
'metaSubjectClassUrl' => 'metaSubjectClassUrl',
'metaSubjectExamples' => 'metaSubjectExamples',
'metaCoverageGeoExamples' => 'metaCoverageGeoExamples',
'metaCoverageChronExamples' => 'metaCoverageChronExamples',
'metaCoverageResearchSampleExamples' => 'metaCoverageResearchSampleExamples',
'metaTypeExamples' => 'metaTypeExamples',
// Setup page 4
'pubFreqPolicy' => 'pubFreqPolicy',
'copyeditInstructions' => 'copyeditInstructions',
'layoutInstructions' => 'layoutInstructions',
'proofInstructions' => 'proofInstructions',
'openAccessPolicy' => 'openAccessPolicy',
'announcementsIntroduction' => 'announcementsIntroduction',
// Setup page 5
'homeHeaderLogoImage' => 'homeHeaderLogoImage',
'homeHeaderTitleType' => 'homeHeaderTitleType',
'homeHeaderTitle' => 'homeHeaderTitle',
'homeHeaderTitleImage' => 'homeHeaderTitleImage',
'pageHeaderTitleType' => 'pageHeaderTitleType',
'pageHeaderTitle' => 'pageHeaderTitle',
'pageHeaderTitleImage' => 'pageHeaderTitleImage',
'homepageImage' => 'homepageImage',
'readerInformation' => 'readerInformation',
'authorInformation' => 'authorInformation',
'librarianInformation' => 'librarianInformation',
'journalPageHeader' => 'journalPageHeader',
'journalPageFooter' => 'journalPageFooter',
'additionalHomeContent' => 'additionalHomeContent',
'description' => 'description',
'navItems' => 'navItems',
// Subscription policies
'subscriptionAdditionalInformation' => 'subscriptionAdditionalInformation',
'delayedOpenAccessPolicy' => 'delayedOpenAccessPolicy',
'authorSelfArchivePolicy' => 'authorSelfArchivePolicy'
);
foreach ($settingNames as $oldName => $newName) {
$result =& $journalDao->retrieve('SELECT j.journal_id, j.primary_locale FROM journals j, journal_settings js WHERE j.journal_id = js.journal_id AND js.setting_name = ? AND (js.locale IS NULL OR js.locale = ?)', array($oldName, ''));
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$journalSettingsDao->update('UPDATE journal_settings SET locale = ?, setting_name = ? WHERE journal_id = ? AND setting_name = ? AND (locale IS NULL OR locale = ?)', array($row['primary_locale'], $newName, $row['journal_id'], $oldName, ''));
$result->MoveNext();
}
$result->Close();
unset($result);
}
return true;
}
/**
* For 2.3 upgrade: add locale data to existing journal settings that
* were not previously localized.
* @return boolean
*/
function localizeMoreJournalSettings() {
$journalSettingsDao =& DAORegistry::getDAO('JournalSettingsDAO');
$journalDao =& DAORegistry::getDAO('JournalDAO');
$settingNames = array(
// Setup page 1
'contactTitle' => 'contactTitle',
'contactAffiliation' => 'contactAffiliation',
'contactMailingAddress' => 'contactMailingAddress'
);
foreach ($settingNames as $oldName => $newName) {
$result =& $journalDao->retrieve('SELECT j.journal_id, j.primary_locale FROM journals j, journal_settings js WHERE j.journal_id = js.journal_id AND js.setting_name = ? AND (js.locale IS NULL OR js.locale = ?)', array($oldName, ''));
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$journalSettingsDao->update('UPDATE journal_settings SET locale = ?, setting_name = ? WHERE journal_id = ? AND setting_name = ? AND (locale IS NULL OR locale = ?)', array($row['primary_locale'], $newName, $row['journal_id'], $oldName, ''));
$result->MoveNext();
}
$result->Close();
unset($result);
}
return true;
}
/**
* For 2.2 upgrade: Migrate the "publisher" setting from a serialized
* array into three localized settings: publisherUrl, publisherNote,
* and publisherInstitution.
* @return boolean
*/
function migratePublisher() {
$journalSettingsDao =& DAORegistry::getDAO('JournalSettingsDAO');
$result =& $journalSettingsDao->retrieve('SELECT j.primary_locale, s.setting_value, j.journal_id FROM journal_settings s, journals j WHERE s.journal_id = j.journal_id AND s.setting_name = ?', array('publisher'));
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$publisher = null;
$publisher = @unserialize($row['setting_value']);
foreach (array('note' => 'publisherNote', 'institution' => 'publisherInstitution', 'url' => 'publisherUrl') as $old => $new) {
if (isset($publisher[$old])) $journalSettingsDao->update(
'INSERT INTO journal_settings (journal_id, setting_name, setting_value, setting_type, locale) VALUES (?, ?, ?, ?, ?)',
array(
$row['journal_id'],
$new, $publisher[$old],
'string',
($new == 'publisherNote'?$row['primary_locale']:'')
)
);
}
$result->MoveNext();
}
$result->Close();
unset($result);
$journalSettingsDao->update('DELETE FROM journal_settings WHERE setting_name = ?', 'publisher');
return true;
}
/**
* For 2.2 upgrade: Set locales for galleys.
* @return boolean
*/
function setGalleyLocales() {
$articleGalleyDao =& DAORegistry::getDAO('ArticleGalleyDAO');
$journalDao =& DAORegistry::getDAO('JournalDAO');
$result =& $journalDao->retrieve('SELECT g.galley_id, j.primary_locale FROM journals j, articles a, article_galleys g WHERE a.journal_id = j.journal_id AND g.article_id = a.article_id AND (g.locale IS NULL OR g.locale = ?)', '');
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$articleGalleyDao->update('UPDATE article_galleys SET locale = ? WHERE galley_id = ?', array($row['primary_locale'], $row['galley_id']));
$result->MoveNext();
}
$result->Close();
unset($result);
return true;
}
/**
* For 2.2 upgrade: user_settings table has been renamed in order to
* apply the schema changes for localization. Migrate the settings from
* user_settings_old to user_settings now that the new schema has been
* applied.
*/
function migrateUserSettings() {
$userSettingsDao =& DAORegistry::getDAO('UserSettingsDAO');
$result =& $userSettingsDao->retrieve('SELECT u.user_id, u.setting_name, u.setting_value, u.setting_type, s.primary_locale FROM user_settings_old u, site s');
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$userSettingsDao->update('INSERT INTO user_settings (user_id, setting_name, assoc_id, setting_value, setting_type, locale) VALUES (?, ?, ?, ?, ?, ?)', array($row['user_id'], $row['setting_name'], (int) $row['journal_id'], $row['setting_value'], $row['setting_type'], $row['primary_locale']));
$result->MoveNext();
}
$result->Close();
unset($result);
return true;
}
/**
* For 2.2 upgrade: index handling changed away from using the
* syntax in schema descriptors in cases where AUTONUM columns were not
* used, in favour of specifically-named indexes using the
* syntax. For this, all indexes (including potentially duplicated
* indexes from before) on OJS tables should be dropped prior to the new
* schema being applied.
* @return boolean
*/
function dropAllIndexes() {
$siteDao =& DAORegistry::getDAO('SiteDAO');
$dict = NewDataDictionary($siteDao->getDataSource());
$dropIndexSql = array();
// This is a list of tables that were used in 2.1.1 (i.e.
// before the way indexes were used was changed). All indexes
// from these tables will be dropped.
$tables = array(
'versions', 'site', 'site_settings', 'scheduled_tasks',
'sessions', 'journal_settings',
'plugin_settings', 'roles',
'section_settings', 'section_editors', 'issue_settings',
'custom_issue_orders', 'custom_section_orders',
'article_settings', 'article_author_settings',
'article_supp_file_settings', 'review_rounds',
'article_html_galley_images',
'email_templates_default_data', 'email_templates_data',
'article_search_object_keywords',
'oai_resumption_tokens', 'subscription_type_settings',
'announcement_type_settings', 'announcement_settings',
'group_settings', 'group_memberships'
);
// Assemble a list of indexes to be dropped
foreach ($tables as $tableName) {
$indexes = $dict->MetaIndexes($tableName);
if (is_array($indexes)) foreach ($indexes as $indexName => $indexData) {
$dropIndexSql = array_merge($dropIndexSql, $dict->DropIndexSQL($indexName, $tableName));
}
}
// Execute the DROP INDEX statements.
foreach ($dropIndexSql as $sql) {
$siteDao->update($sql);
}
// Second run: Only return primary indexes. This is necessary
// so that primary indexes can be dropped by MySQL.
foreach ($tables as $tableName) {
$indexes = $dict->MetaIndexes($tableName, true);
if (!empty($indexes)) switch(Config::getVar('database', 'driver')) {
case 'mysql':
$siteDao->update("ALTER TABLE $tableName DROP PRIMARY KEY");
break;
}
}
return true;
}
/**
* The supportedLocales setting may be missing for journals; ensure
* that it is properly set.
*/
function ensureSupportedLocales() {
$journalDao =& DAORegistry::getDAO('JournalDAO');
$journalSettingsDao =& DAORegistry::getDAO('JournalSettingsDAO');
$result =& $journalDao->retrieve(
'SELECT j.journal_id,
j.primary_locale
FROM journals j
LEFT JOIN journal_settings js ON (js.journal_id = j.journal_id AND js.setting_name = ?)
WHERE js.setting_name IS NULL',
array('supportedLocales')
);
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$journalSettingsDao->updateSetting(
$row['journal_id'],
'supportedLocales',
array($row['primary_locale']),
'object',
false
);
$result->MoveNext();
}
$result->Close();
unset($result);
return true;
}
/**
* For 2.2.1 upgrade: Replace "payPerView" to "purchaseArticle" in settings.
* @return boolean
*/
function renamePayPerViewSettings() {
$journalSettingsDao =& DAORegistry::getDAO('JournalSettingsDAO');
$journalDao =& DAORegistry::getDAO('JournalDAO');
$settingNames = array(
'payPerViewFeeEnabled' => 'purchaseArticleFeeEnabled',
'payPerViewFee' => 'purchaseArticleFee',
'payPerViewFeeName' => 'purchaseArticleFeeName',
'payPerViewFeeDescription' => 'purchaseArticleFeeDescription'
);
foreach ($settingNames as $oldName => $newName) {
$journalSettingsDao->update('UPDATE journal_settings SET setting_name = ? WHERE setting_name = ?', array($newName, $oldName));
}
return true;
}
/**
* For 2.3 upgrade: Separate out individual and institutional subscriptions.
Also pull apart single ip range string into multiple, shorter strings.
* @return boolean
*/
function separateSubscriptions() {
import('classes.subscription.InstitutionalSubscription');
$subscriptionDao =& DAORegistry::getDAO('SubscriptionDAO');
// Retrieve all subscriptions from pre-2.3 subscriptions table
$result =& $subscriptionDao->retrieve('SELECT so.*, st.institutional FROM subscriptions_old so LEFT JOIN subscription_types st ON (so.type_id = st.type_id)');
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$subscriptionId = (int) $row['subscription_id'];
$membership = $row['membership'] ? $row['membership'] : '';
// Insert into new subscriptions table
$subscriptionDao->update('INSERT INTO subscriptions (subscription_id, journal_id, user_id, type_id, date_start, date_end, status, membership, reference_number, notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', array($subscriptionId, (int) $row['journal_id'], (int) $row['user_id'], (int) $row['type_id'], $row['date_start'], $row['date_end'], 1, $membership, '', ''));
// If institutional subscription, also add records to institutional_subscriptions
// and institutional_subscription_ip tables.
// Since institution name did not exist pre-2.3, use membership string as default for institution name
if ($row['institutional']) {
$subscriptionDao->update('INSERT INTO institutional_subscriptions (subscription_id, institution_name, mailing_address, domain) VALUES (?, ?, ?, ?)', array($subscriptionId, $membership, '', $row['domain']));
$ipRangeText = $row['ip_range'];
// Break apart pre-2.3 single ip range string which contained all ip ranges into
// multiple strings, each with exactly one ip range. See Bug #4117
$ipRanges = explode(';', $ipRangeText);
while (list(, $curIPString) = each($ipRanges)) {
$ipStart = null;
$ipEnd = null;
// Parse and check single IP string
if (strpos($curIPString, SUBSCRIPTION_IP_RANGE_RANGE) === false) {
// Check for wildcards in IP
if (strpos($curIPString, SUBSCRIPTION_IP_RANGE_WILDCARD) === false) {
// Get non-CIDR IP
if (strpos($curIPString, '/') === false) {
$ipStart = sprintf("%u", ip2long(trim($curIPString)));
// Convert CIDR IP to IP range
} else {
list($curIPString, $cidrBits) = explode('/', trim($curIPString));
if ($cidrBits == 0) {
$cidrMask = 0;
} else {
$cidrMask = (0xffffffff << (32 - $cidrBits));
}
$ipStart = sprintf('%u', ip2long($curIPString) & $cidrMask);
if ($cidrBits != 32) {
$ipEnd = sprintf('%u', ip2long($curIPString) | (~$cidrMask & 0xffffffff));
}
}
// Convert wildcard IP to IP range
} else {
$ipStart = sprintf('%u', ip2long(str_replace(SUBSCRIPTION_IP_RANGE_WILDCARD, '0', trim($curIPString))));
$ipEnd = sprintf('%u', ip2long(str_replace(SUBSCRIPTION_IP_RANGE_WILDCARD, '255', trim($curIPString))));
}
// Convert wildcard IP range to IP range
} else {
list($ipStart, $ipEnd) = explode(SUBSCRIPTION_IP_RANGE_RANGE, $curIPString);
// Replace wildcards in start and end of range
$ipStart = sprintf('%u', ip2long(str_replace(SUBSCRIPTION_IP_RANGE_WILDCARD, '0', trim($ipStart))));
$ipEnd = sprintf('%u', ip2long(str_replace(SUBSCRIPTION_IP_RANGE_WILDCARD, '255', trim($ipEnd))));
}
if ($ipStart != null) {
$subscriptionDao->update('INSERT INTO institutional_subscription_ip (subscription_id, ip_string, ip_start, ip_end) VALUES(?, ?, ?, ?)', array($subscriptionId, $curIPString, $ipStart, $ipEnd));
}
}
}
$result->MoveNext();
}
$result->Close();
unset($result);
return true;
}
/**
* For 2.3 upgrade: Add clean titles for every article title so sorting by title ignores punctuation.
* @return boolean
*/
function cleanTitles() {
$articleDao =& DAORegistry::getDAO('ArticleDAO');
$punctuation = array ("\"", "\'", ",", ".", "!", "?", "-", "$", "(", ")");
$result =& $articleDao->retrieve('SELECT article_id, locale, setting_value FROM article_settings WHERE setting_name = ?', "title");
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$cleanTitle = str_replace($punctuation, "", $row['setting_value']);
$articleDao->update('INSERT INTO article_settings (article_id, locale, setting_name, setting_value, setting_type) VALUES (?, ?, ?, ?, ?)', array((int) $row['article_id'], $row['locale'], "cleanTitle", $cleanTitle, "string"));
$result->MoveNext();
}
$result->Close();
unset($result);
return true;
}
/**
* For 2.3 upgrade: Move image alts for Journal Setup Step 5 from within the image
* settings into their own settings. (Improves usability of page 5 setup form and
* simplifies the code considerably.)
* @return boolean
*/
function cleanImageAlts() {
$imageSettings = array(
'homeHeaderTitleImage' => 'homeHeaderTitleImageAltText',
'homeHeaderLogoImage' => 'homeHeaderLogoImageAltText',
'homepageImage' => 'homepageImageAltText',
'pageHeaderTitleImage' => 'pageHeaderTitleImageAltText',
'pageHeaderLogoImage' => 'pageHeaderLogoImageAltText'
);
$journalDao =& DAORegistry::getDAO('JournalDAO');
$journals =& $journalDao->getJournals();
while ($journal =& $journals->next()) {
foreach ($imageSettings as $imageSettingName => $newSettingName) {
$imageSetting = $journal->getSetting($imageSettingName);
$newSetting = array();
if ($imageSetting) foreach ($imageSetting as $locale => $setting) {
if (isset($setting['altText'])) $newSetting[$locale] = $setting['altText'];
}
if (!empty($newSetting)) {
$journal->updateSetting($newSettingName, $newSetting, 'string', true);
}
}
unset($journal);
}
return true;
}
/**
* For 2.3.3 upgrade: Migrate reviewing interests from free text to controlled vocab structure
* @return boolean
*/
function migrateReviewingInterests() {
$userDao =& DAORegistry::getDAO('UserDAO');
$controlledVocabDao =& DAORegistry::getDAO('ControlledVocabDAO');
$result =& $userDao->retrieve('SELECT setting_value as interests, user_id FROM user_settings WHERE setting_name = ?', 'interests');
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
if(!empty($row['interests'])) {
$userId = $row['user_id'];
$interests = explode(',', $row['interests']);
if (empty($interests)) $interests = array();
elseif (!is_array($interests)) $interests = array($interests);
$controlledVocabDao->update(
sprintf('INSERT INTO controlled_vocabs (symbolic, assoc_type, assoc_id) VALUES (?, ?, ?)'),
array('interest', ROLE_ID_REVIEWER, $userId)
);
$controlledVocabId = $controlledVocabDao->getInsertId('controlled_vocabs', 'controlled_vocab_id');
foreach($interests as $interest) {
// Trim unnecessary whitespace
$interest = trim($interest);
$controlledVocabDao->update(
sprintf('INSERT INTO controlled_vocab_entries (controlled_vocab_id) VALUES (?)'),
array($controlledVocabId)
);
$controlledVocabEntryId = $controlledVocabDao->getInsertId('controlled_vocab_entries', 'controlled_vocab_entry_id');
$controlledVocabDao->update(
sprintf('INSERT INTO controlled_vocab_entry_settings (controlled_vocab_entry_id, setting_name, setting_value, setting_type) VALUES (?, ?, ?, ?)'),
array($controlledVocabEntryId, 'interest', $interest, 'string')
);
}
}
$result->MoveNext();
}
// Remove old interests from the user_setting table
$userDao->update('DELETE FROM user_settings WHERE setting_name = ?', 'interests');
return true;
}
/**
* For 2.4 Upgrade -- Overhaul notification structure
*/
function migrateNotifications() {
$notificationDao =& DAORegistry::getDAO('NotificationDAO');
// Retrieve all notifications from pre-2.4 notifications table
$result =& $notificationDao->retrieve('SELECT * FROM notifications_old');
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$type = $row['assoc_type'];
$url = $row['location'];
// Get the ID of the associated object from the URL and store in $matches.
// This value will not be set in all cases.
preg_match_all('/\d+/', $url, $matches);
// Set the base data for the notification
$notification = $notificationDao->newDataObject();
$notification->setId($row['notification_id']);
$notification->setUserId($row['user_id']);
$notification->setLevel(NOTIFICATION_LEVEL_NORMAL);
$notification->setDateCreated($notificationDao->datetimeFromDB($row['date_created']));
$notification->setDateRead($notificationDao->datetimeFromDB($row['date_read']));
$notification->setContextId($row['context']);
$notification->setType($type);
switch($type) {
case NOTIFICATION_TYPE_COPYEDIT_COMMENT:
case NOTIFICATION_TYPE_PROOFREAD_COMMENT:
case NOTIFICATION_TYPE_METADATA_MODIFIED:
case NOTIFICATION_TYPE_SUBMISSION_COMMENT:
case NOTIFICATION_TYPE_LAYOUT_COMMENT:
case NOTIFICATION_TYPE_ARTICLE_SUBMITTED:
case NOTIFICATION_TYPE_SUPP_FILE_MODIFIED:
case NOTIFICATION_TYPE_GALLEY_MODIFIED:
case NOTIFICATION_TYPE_REVIEWER_COMMENT:
case NOTIFICATION_TYPE_REVIEWER_FORM_COMMENT:
case NOTIFICATION_TYPE_EDITOR_DECISION_COMMENT:
$id = array_pop($matches[0]);
$notification->setAssocType(ASSOC_TYPE_ARTICLE);
$notification->setAssocId($id);
break;
case NOTIFICATION_TYPE_USER_COMMENT:
// Remove the last two elements of the array. They refer to the
// galley and parent, which we no longer use
$matches = array_slice($matches[0], -3);
$id = array_shift($matches);
$notification->setAssocType(ASSOC_TYPE_ARTICLE);
$notification->setAssocId($id);
$notification->setType(NOTIFICATION_TYPE_USER_COMMENT);
break;
case NOTIFICATION_TYPE_PUBLISHED_ISSUE:
// We do nothing here, as our URL points to the current issue
break;
case NOTIFICATION_TYPE_NEW_ANNOUNCEMENT:
$id = array_pop($matches[0]);
$notification->setAssocType(ASSOC_TYPE_ANNOUNCEMENT);
$notification->setAssocId($id);
$notification->setType(NOTIFICATION_TYPE_NEW_ANNOUNCEMENT);
break;
}
$notificationDao->update(
sprintf('INSERT INTO notifications
(user_id, level, date_created, date_read, context_id, type, assoc_type, assoc_id)
VALUES
(?, ?, %s, %s, ?, ?, ?, ?)',
$notificationDao->datetimeToDB($notification->getDateCreated()), $notificationDao->datetimeToDB($notification->getDateRead())),
array(
(int) $notification->getUserId(),
(int) $notification->getLevel(),
(int) $notification->getContextId(),
(int) $notification->getType(),
(int) $notification->getAssocType(),
(int) $notification->getAssocId()
)
);
unset($notification);
$result->MoveNext();
}
$result->Close();
unset($result);
// Retrieve all settings from pre-2.4 notification_settings table
$result =& $notificationDao->retrieve('SELECT * FROM notification_settings_old');
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$settingName = $row['setting_name'];
$contextId = $row['context'];
switch ($settingName) {
case 'email':
case 'notify':
$notificationType = $row['setting_value'];
$newSettingName = ($settingName == 'email' ? 'emailed_notification' : 'blocked_notification');
$userId = $row['user_id'];
$notificationDao->update(
'INSERT INTO notification_subscription_settings
(setting_name, setting_value, user_id, context, setting_type)
VALUES
(?, ?, ?, ?, ?)',
array(
$newSettingName,
(int) $notificationType,
(int) $userId,
(int) $contextId,
'int'
)
);
break;
case 'mailList':
case 'mailListUnconfirmed':
$confirmed = ($settingName == 'mailList') ? 1 : 0;
$email = $row['setting_value'];
$settingId = $row['setting_id'];
// Get the token from the access_keys table
$accessKeyDao =& DAORegistry::getDAO('AccessKeyDAO'); /* @var $accessKeyDao AccessKeyDAO */
$accessKey =& $accessKeyDao->getAccessKeyByUserId('MailListContext', $settingId);
if(!$accessKey) continue;
$token = $accessKey->getKeyHash();
// Delete the access key -- we don't need it anymore
$accessKeyDao->deleteObject($accessKey);
$notificationDao->update(
'INSERT INTO notification_mail_list
(email, context, token, confirmed)
VALUES
(?, ?, ?, ?)',
array(
$email,
(int) $contextId,
$token,
$confirmed
)
);
break;
}
$result->MoveNext();
}
$result->Close();
unset($result);
return true;
}
/**
* For 2.3.7 Upgrade -- Remove author revised file upload IDs erroneously added to copyedit signoff
*/
function removeAuthorRevisedFilesFromSignoffs() {
import('classes.article.Article');
$signoffDao =& DAORegistry::getDAO('SignoffDAO'); /* @var $signoffDao SignoffDAO */
$result =& $signoffDao->retrieve(
'SELECT DISTINCT s.signoff_id
FROM articles a
JOIN signoffs s ON (a.article_id = s.assoc_id)
WHERE s.symbolic = ?
AND s.file_id = a.revised_file_id',
'SIGNOFF_COPYEDITING_INITIAL'
);
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$signoff = $signoffDao->getById($row['signoff_id']); /* @var $signoff Signoff */
$signoff->setFileId(null);
$signoff->setFileRevision(null);
$signoffDao->updateObject($signoff);
$result->MoveNext();
}
return true;
}
/*
* For 2.3.7 upgrade: Improve reviewing interests storage structure
* @return boolean
*/
function migrateReviewingInterests2() {
$interestDao =& DAORegistry::getDAO('InterestDAO'); /* @var $interestDao InterestDAO */
$interestEntryDao =& DAORegistry::getDAO('InterestEntryDAO'); /* @var $interestEntryDao InterestEntryDAO */
// Check if this upgrade method has already been run to prevent data corruption on subsequent upgrade attempts
$idempotenceCheck =& $interestDao->retrieve('SELECT * FROM controlled_vocabs cv WHERE symbolic = ?', array('interest'));
$row = $idempotenceCheck->GetRowAssoc(false);
if ($idempotenceCheck->RecordCount() == 1 && $row['assoc_id'] == 0 && $row['assoc_type'] == 0) return true;
unset($idempotenceCheck);
// Get all interests for all users
$result =& $interestDao->retrieve(
'SELECT DISTINCT cves.setting_value as interest_keyword,
cv.assoc_id as user_id
FROM controlled_vocabs cv
LEFT JOIN controlled_vocab_entries cve ON (cve.controlled_vocab_id = cv.controlled_vocab_id)
LEFT JOIN controlled_vocab_entry_settings cves ON (cves.controlled_vocab_entry_id = cve.controlled_vocab_entry_id)
WHERE cv.symbolic = ?',
array('interest')
);
$oldEntries =& $interestDao->retrieve(
'SELECT controlled_vocab_entry_id
FROM controlled_vocab_entry_settings cves
WHERE cves.setting_name = ?',
array('interest')
);
while (!$oldEntries->EOF) {
$row = $oldEntries->GetRowAssoc(false);
$controlledVocabEntryId = (int) $row['controlled_vocab_entry_id'];
$interestDao->update('DELETE FROM controlled_vocab_entries WHERE controlled_vocab_entry_id = ?', $controlledVocabEntryId);
$interestDao->update('DELETE FROM controlled_vocab_entry_settings WHERE controlled_vocab_entry_id = ?', $controlledVocabEntryId);
$oldEntries->MoveNext();
}
$oldEntries->Close();
unset($oldEntries);
$controlledVocab = $interestDao->build();
// Insert the user interests using the new storage structure
while (!$result->EOF) {
$row = $result->GetRowAssoc(false);
$userId = (int) $row['user_id'];
$interest = $row['interest_keyword'];
$interestEntry = $interestEntryDao->getBySetting($interest, $controlledVocab->getSymbolic(),
$controlledVocab->getAssocId(), $controlledVocab->getAssocType(),
$controlledVocab->getSymbolic()
);
if(!$interestEntry) {
$interestEntry = $interestEntryDao->newDataObject(); /* @var $interestEntry InterestEntry */
$interestEntry->setInterest($interest);
$interestEntry->setControlledVocabId($controlledVocab->getId());
$interestEntryDao->insertObject($interestEntry);
}
$interestEntryDao->update(
'INSERT INTO user_interests (user_id, controlled_vocab_entry_id) VALUES (?, ?)',
array($userId, (int) $interestEntry->getId())
);
$result->MoveNext();
}
$result->Close();
unset($result);
// Remove the obsolete interest data
$interestDao->update('DELETE FROM controlled_vocabs WHERE symbolic = ? AND assoc_type > 0', array('interest'));
return true;
}
/**
* For 2.4 upgrade: migrate COUNTER statistics to the metrics table.
*/
function migrateCounterPluginUsageStatistics() {
$metricsDao =& DAORegistry::getDAO('MetricsDAO'); /* @var $metricsDao MetricsDAO */
$result =& $metricsDao->retrieve('SELECT * FROM counter_monthly_log');
if ($result->EOF) return true;
$loadId = '2.4.2-upgrade-counter';
$metricsDao->purgeLoadBatch($loadId);
$fileTypeCounts = array(
'count_html' => STATISTICS_FILE_TYPE_HTML,
'count_pdf' => STATISTICS_FILE_TYPE_PDF,
'count_other' => STATISTICS_FILE_TYPE_OTHER
);
while(!$result->EOF) {
$row =& $result->GetRowAssoc(false);
foreach ($fileTypeCounts as $countType => $fileType) {
$month = (string) $row['month'];
if (strlen($month) == 1) {
$month = '0' . $month;
}
if ($row[$countType]) {
$record = array(
'load_id' => $loadId,
'assoc_type' => ASSOC_TYPE_JOURNAL,
'assoc_id' => $row['journal_id'],
'metric_type' => OJS_METRIC_TYPE_LEGACY_COUNTER,
'metric' => $row[$countType],
'file_type' => $fileType,
'month' => $row['year'] . $month
);
$errorMsg = null;
$metricsDao->insertRecord($record, $errorMsg);
}
}
$result->MoveNext();
}
// Remove the plugin settings.
$metricsDao->update('delete from plugin_settings where plugin_name = ?', array('counterplugin'), false);
return true;
}
/**
* For 2.4 upgrade: migrate Timed views statistics to the metrics table.
*/
function migrateTimedViewsUsageStatistics() {
$metricsDao =& DAORegistry::getDAO('MetricsDAO'); /* @var $metricsDao MetricsDAO */
$result =& $metricsDao->retrieve('SELECT * FROM timed_views_log');
if ($result->EOF) return true;
$loadId = '2.4.2-upgrade-timedViews';
$metricsDao->purgeLoadBatch($loadId);
$plugin =& PluginRegistry::getPlugin('generic', 'usagestatsplugin');
$plugin->import('UsageStatsTemporaryRecordDAO');
$tempStatsDao = new UsageStatsTemporaryRecordDAO();
$tempStatsDao->deleteByLoadId($loadId);
import('plugins.generic.usageStats.GeoLocationTool');
$geoLocationTool = new GeoLocationTool();
$articleGalleyDao =& DAORegistry::getDAO('ArticleGalleyDAO'); /* @var $articleGalleyDao ArticleGalleyDAO */
while(!$result->EOF) {
$row =& $result->GetRowAssoc(false);
$result->MoveNext();
list($countryId, $cityName, $region) = $geoLocationTool->getGeoLocation($row['ip_address']);
$fileType = null;
if ($row['galley_id']) {
// Get the file type.
$galley =& $articleGalleyDao->getGalley($row['galley_id']);
if (is_a($galley, 'ArticleGalley')) {
if ($galley->isHTMLGalley()) $fileType = STATISTICS_FILE_TYPE_HTML;
if ($galley->isPdfGalley()) $fileType = STATISTICS_FILE_TYPE_PDF;
if (!$fileType) $fileType = STATISTICS_FILE_TYPE_OTHER;
} else {
// No galley.
continue;
}
$assocType = ASSOC_TYPE_GALLEY;
$assocId = $row['galley_id'];
} else {
$assocType = ASSOC_TYPE_ARTICLE;
$assocId = $row['article_id'];
};
$recordTimestamp = strtotime($row['date']);
$day = date('Ymd', $recordTimestamp);
$tempStatsDao->insert($assocType, $assocId, $day, $recordTimestamp, $countryId, $region, $cityName, $fileType, $loadId);
}
switch (Config::getVar('database', 'driver')) {
case 'mysql':
default:
$monthSql = 'extract(YEAR_MONTH from tr.day)';
break;
case 'postgres':
$monthSql = 'to_char(to_date(to_char(tr.day, \'99999999\'), \'YYYYMMDD\'), \'YYYYMM\')';
break;
}
// Articles.
$params = array(OJS_METRIC_TYPE_TIMED_VIEWS, $loadId, ASSOC_TYPE_ARTICLE);
$tempStatsDao->update(
'INSERT INTO metrics (load_id, metric_type, assoc_type, assoc_id, day, month, country_id, region, city, submission_id, metric, context_id, issue_id)
SELECT tr.load_id, ?, tr.assoc_type, tr.assoc_id, tr.day, ' . $monthSql . ', tr.country_id, tr.region, tr.city, tr.assoc_id, COUNT(tr.metric), a.journal_id, pa.issue_id
FROM usage_stats_temporary_records AS tr
JOIN articles AS a ON a.article_id = tr.assoc_id
JOIN published_articles AS pa ON pa.article_id = tr.assoc_id
WHERE tr.load_id = ? AND tr.assoc_type = ?
GROUP BY tr.assoc_type, tr.assoc_id, tr.day, tr.country_id, tr.region, tr.city, tr.file_type, tr.load_id, a.journal_id, pa.issue_id', $params
);
// Galleys.
$params = array(OJS_METRIC_TYPE_TIMED_VIEWS, $loadId, ASSOC_TYPE_GALLEY);
$tempStatsDao->update(
'INSERT INTO metrics (load_id, metric_type, assoc_type, assoc_id, day, month, country_id, region, city, submission_id, metric, context_id, issue_id, file_type)
SELECT tr.load_id, ?, tr.assoc_type, tr.assoc_id, tr.day, ' . $monthSql . ', tr.country_id, tr.region, tr.city, ag.article_id, COUNT(tr.metric), a.journal_id, pa.issue_id, tr.file_type
FROM usage_stats_temporary_records AS tr
JOIN article_galleys AS ag ON ag.galley_id = tr.assoc_id
JOIN articles AS a ON a.article_id = ag.article_id
JOIN published_articles AS pa ON pa.article_id = ag.article_id
WHERE tr.load_id = ? AND tr.assoc_type = ?
GROUP BY tr.assoc_type, tr.assoc_id, tr.day, tr.country_id, tr.region, tr.city, tr.file_type, tr.load_id, ag.article_id, a.journal_id, pa.issue_id', $params
);
$tempStatsDao->deleteByLoadId($loadId);
// Remove the plugin settings.
$metricsDao->update('delete from plugin_settings where plugin_name = ?', array('timedviewplugin'), false);
return true;
}
/**
* For 2.4 upgrade: migrate OJS default statistics to the metrics table.
*/
function migrateDefaultUsageStatistics() {
$loadId = '2.4.2-upgrade-ojsViews';
$metricsDao =& DAORegistry::getDAO('MetricsDAO');
$insertIntoClause = 'INSERT INTO metrics (file_type, load_id, metric_type, assoc_type, assoc_id, submission_id, metric, context_id, issue_id)';
// Galleys.
$galleyUpdateCases = array(
array('fileType' => STATISTICS_FILE_TYPE_PDF, 'isHtml' => false, 'assocType' => ASSOC_TYPE_GALLEY),
array('fileType' => STATISTICS_FILE_TYPE_HTML, 'isHtml' => true, 'assocType' => ASSOC_TYPE_GALLEY),
array('fileType' => STATISTICS_FILE_TYPE_OTHER, 'isHtml' => false, 'assocType' => ASSOC_TYPE_GALLEY)
);
if (Installer::tableExists('issue_galleys_stats_migration')) {
$galleyUpdateCases[] = array('fileType' => STATISTICS_FILE_TYPE_PDF, 'assocType' => ASSOC_TYPE_ISSUE_GALLEY);
$galleyUpdateCases[] = array('fileType' => STATISTICS_FILE_TYPE_OTHER, 'assocType' => ASSOC_TYPE_ISSUE_GALLEY);
}
foreach ($galleyUpdateCases as $case) {
$params = array();
if ($case['fileType'] == STATISTICS_FILE_TYPE_PDF) {
$pdfFileTypeWhereCheck = 'IN';
} else {
$pdfFileTypeWhereCheck = 'NOT IN';
}
$params = array($case['fileType'], $loadId, OJS_METRIC_TYPE_LEGACY_DEFAULT, $case['assocType']);
if ($case['assocType'] == ASSOC_TYPE_GALLEY) {
array_push($params, (int) $case['isHtml']);
$selectClause = ' SELECT ?, ?, ?, ?, ag.galley_id, ag.article_id, ag.views, a.journal_id, pa.issue_id
FROM article_galleys_stats_migration as ag
LEFT JOIN articles AS a ON ag.article_id = a.article_id
LEFT JOIN published_articles as pa on ag.article_id = pa.article_id
LEFT JOIN article_files as af on ag.file_id = af.file_id
WHERE a.article_id is not null AND ag.views > 0 AND ag.html_galley = ?
AND af.file_type ';
} else {
$selectClause = ' SELECT ?, ?, ?, ?, ig.galley_id, 0, ig.views, i.journal_id, ig.issue_id
FROM issue_galleys_stats_migration AS ig
LEFT JOIN issues AS i ON ig.issue_id = i.issue_id
LEFT JOIN issue_files AS ifi ON ig.file_id = ifi.file_id
WHERE ig.views > 0 AND i.issue_id is not null AND ifi.file_type ';
}
array_push($params, 'application/pdf', 'application/x-pdf', 'text/pdf', 'text/x-pdf');
$metricsDao->update($insertIntoClause . $selectClause . $pdfFileTypeWhereCheck . ' (?, ?, ?, ?)', $params, false);
}
// Published articles.
$params = array(null, $loadId, OJS_METRIC_TYPE_LEGACY_DEFAULT, ASSOC_TYPE_ARTICLE);
$metricsDao->update($insertIntoClause .
' SELECT ?, ?, ?, ?, pa.article_id, pa.article_id, pa.views, i.journal_id, pa.issue_id
FROM published_articles_stats_migration as pa
LEFT JOIN issues AS i ON pa.issue_id = i.issue_id
WHERE pa.views > 0 AND i.issue_id is not null;', $params, false);
// Set the site default metric type.
$siteSettingsDao =& DAORegistry::getDAO('SiteSettingsDAO'); /* @var $siteSettingsDao SiteSettingsDAO */
$siteSettingsDao->updateSetting('defaultMetricType', OJS_METRIC_TYPE_COUNTER);
return true;
}
/**
* For 2.4.6 upgrade: to enable localization of a CustomBlock,
* the blockContent values are converted from string to array (key: primary_language)
*/
function localizeCustomBlockSettings() {
$pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO');
$journalDao = DAORegistry::getDAO('JournalDAO');
$journals = $journalDao->getJournals();
while ($journal = $journals->next()) {
$journalId = $journal->getId();
$primaryLocale = $journal->getPrimaryLocale();
$blocks = $pluginSettingsDao->getSetting($journalId, 'customblockmanagerplugin', 'blocks');
if ($blocks) foreach ($blocks as $block) {
$blockContent = $pluginSettingsDao->getSetting($journalId, $block, 'blockContent');
if (!is_array($blockContent)) {
$pluginSettingsDao->updateSetting($journalId, $block, 'blockContent', array($primaryLocale => $blockContent));
}
}
unset($journal);
}
return true;
}
/**
* For 2.4.6 upgrade: Remove the "Custom Identifier" suffix option in the DOI and URN plugin and
* use the ctustom suffix pattern %x instead.
* @return boolean
*/
function removeCustomIdentifierSuffixOption() {
$pluginSettingsDao = DAORegistry::getDAO('PluginSettingsDAO');
$journalDao = DAORegistry::getDAO('JournalDAO');
$journals = $journalDao->getJournals();
while ($journal = $journals->next()) {
$journalId = $journal->getId();
// DOI plugin
$doiSuffixSetting = $pluginSettingsDao->getSetting($journalId, 'doipubidplugin', 'doiSuffix');
if ($doiSuffixSetting == 'publisherId') {
if ($pluginSettingsDao->getSetting($journalId, 'doipubidplugin', 'enableArticleDoi')) {
$pluginSettingsDao->updateSetting($journalId, 'doipubidplugin', 'doiArticleSuffixPattern', '%x', 'string');
}
if ($pluginSettingsDao->getSetting($journalId, 'doipubidplugin', 'enableGalleyDoi')) {
$pluginSettingsDao->updateSetting($journalId, 'doipubidplugin', 'doiGalleySuffixPattern', '%x', 'string');
}
if ($pluginSettingsDao->getSetting($journalId, 'doipubidplugin', 'enableIssueDoi')) {
$pluginSettingsDao->updateSetting($journalId, 'doipubidplugin', 'doiIssueSuffixPattern', '%x', 'string');
}
if ($pluginSettingsDao->getSetting($journalId, 'doipubidplugin', 'enableSuppFileDoi')) {
$pluginSettingsDao->updateSetting($journalId, 'doipubidplugin', 'doiSuppFileSuffixPattern', '%x', 'string');
}
$pluginSettingsDao->updateSetting($journalId, 'doipubidplugin', 'doiSuffix', 'pattern', 'string');
}
// URN plugin
$urnSuffixSetting = $pluginSettingsDao->getSetting($journalId, 'urnpubidplugin', 'urnSuffix');
if ($doiSuffixSetting == 'publisherId') {
if ($pluginSettingsDao->getSetting($journalId, 'urnpubidplugin', 'enableArticleURN')) {
$pluginSettingsDao->updateSetting($journalId, 'urnpubidplugin', 'urnArticleSuffixPattern', '%x', 'string');
}
if ($pluginSettingsDao->getSetting($journalId, 'urnpubidplugin', 'enableGalleyURN')) {
$pluginSettingsDao->updateSetting($journalId, 'urnpubidplugin', 'urnGalleySuffixPattern', '%x', 'string');
}
if ($pluginSettingsDao->getSetting($journalId, 'urnpubidplugin', 'enableIssueURN')) {
$pluginSettingsDao->updateSetting($journalId, 'urnpubidplugin', 'urnIssueSuffixPattern', '%x', 'string');
}
if ($pluginSettingsDao->getSetting($journalId, 'urnpubidplugin', 'enableSuppFileURN')) {
$pluginSettingsDao->updateSetting($journalId, 'urnpubidplugin', 'urnSuppFileSuffixPattern', '%x', 'string');
}
$pluginSettingsDao->updateSetting($journalId, 'urnpubidplugin', 'urnSuffix', 'pattern', 'string');
}
unset($journal);
}
return true;
}
}
?>