205 lines
5.8 KiB
PHP
205 lines
5.8 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @file classes/context/ContextDAO.php
|
|
*
|
|
* Copyright (c) 2014-2021 Simon Fraser University
|
|
* Copyright (c) 2003-2021 John Willinsky
|
|
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
|
*
|
|
* @class ContextDAO
|
|
*
|
|
* @ingroup core
|
|
*
|
|
* @see DAO
|
|
*
|
|
* @brief Operations for retrieving and modifying context objects.
|
|
*/
|
|
|
|
namespace PKP\context;
|
|
|
|
use Illuminate\Support\Facades\DB;
|
|
use PKP\db\DAOResultFactory;
|
|
use PKP\db\SchemaDAO;
|
|
use PKP\security\Role;
|
|
|
|
/**
|
|
* @template T of Context
|
|
* @extends SchemaDAO<T>
|
|
*/
|
|
abstract class ContextDAO extends SchemaDAO
|
|
{
|
|
/**
|
|
* Retrieve the IDs and names of all contexts in an associative array.
|
|
*
|
|
* @param bool $enabledOnly true iff only enabled contexts are to be included
|
|
*
|
|
* @return array<int,string>
|
|
*/
|
|
public function getNames($enabledOnly = false)
|
|
{
|
|
$contexts = [];
|
|
$iterator = $this->getAll($enabledOnly);
|
|
while ($context = $iterator->next()) {
|
|
$contexts[$context->getId()] = $context->getLocalizedName();
|
|
}
|
|
return $contexts;
|
|
}
|
|
|
|
/**
|
|
* Get a list of localized settings.
|
|
*
|
|
* @return string[]
|
|
*/
|
|
public function getLocaleFieldNames()
|
|
{
|
|
return ['name', 'description'];
|
|
}
|
|
|
|
/**
|
|
* Check if a context exists
|
|
*/
|
|
public function exists(int $id): bool
|
|
{
|
|
return DB::table($this->tableName)
|
|
->where($this->primaryKeyColumn, '=', $id)
|
|
->exists();
|
|
}
|
|
|
|
/**
|
|
* Check if a context exists with a specified path.
|
|
*
|
|
* @param string $path the path for the context
|
|
*
|
|
* @return bool
|
|
*/
|
|
public function existsByPath($path)
|
|
{
|
|
$result = $this->retrieve(
|
|
'SELECT COUNT(*) AS row_count FROM ' . $this->tableName . ' WHERE path = ?',
|
|
[(string) $path]
|
|
);
|
|
$row = $result->current();
|
|
return $row ? (bool) $row->row_count : false;
|
|
}
|
|
|
|
/**
|
|
* Retrieve a context by path.
|
|
*
|
|
* @param string $path
|
|
*
|
|
* @return ?T
|
|
*/
|
|
public function getByPath($path)
|
|
{
|
|
$result = $this->retrieve(
|
|
'SELECT * FROM ' . $this->tableName . ' WHERE path = ?',
|
|
[(string) $path]
|
|
);
|
|
$row = (array) $result->current();
|
|
return $row ? $this->_fromRow($row) : null;
|
|
}
|
|
|
|
/**
|
|
* Retrieve all contexts.
|
|
*
|
|
* @param bool $enabledOnly true iff only enabled contexts should be included
|
|
* @param ?\PKP\db\DBResultRange $rangeInfo optional
|
|
*
|
|
* @return DAOResultFactory<T> containing matching Contexts
|
|
*/
|
|
public function getAll($enabledOnly = false, $rangeInfo = null)
|
|
{
|
|
$result = $this->retrieveRange(
|
|
'SELECT * FROM ' . $this->tableName .
|
|
($enabledOnly ? ' WHERE enabled = 1' : '') .
|
|
' ORDER BY seq',
|
|
[],
|
|
$rangeInfo
|
|
);
|
|
|
|
return new DAOResultFactory($result, $this, '_fromRow');
|
|
}
|
|
|
|
/**
|
|
* Retrieve available contexts.
|
|
* If user-based contexts, retrieve all contexts assigned by user group
|
|
* or all contexts for site admin
|
|
* If not user-based, retrieve all enabled contexts.
|
|
*
|
|
* @param ?int $userId Optional user ID to find available contexts for
|
|
* @param ?\PKP\db\DBResultRange $rangeInfo optional
|
|
*
|
|
* @return DAOResultFactory<T> containing matching Contexts
|
|
*/
|
|
public function getAvailable($userId = null, $rangeInfo = null)
|
|
{
|
|
$params = [];
|
|
if ($userId) {
|
|
$params = array_merge(
|
|
$params,
|
|
[(int) $userId, (int) $userId, (int) Role::ROLE_ID_SITE_ADMIN]
|
|
);
|
|
}
|
|
|
|
$result = $this->retrieveRange(
|
|
'SELECT c.* FROM ' . $this->tableName . ' c
|
|
WHERE ' .
|
|
($userId ?
|
|
'c.' . $this->primaryKeyColumn . ' IN (SELECT DISTINCT ug.context_id FROM user_groups ug JOIN user_user_groups uug ON (ug.user_group_id = uug.user_group_id) WHERE uug.user_id = ?)
|
|
OR ? IN (SELECT user_id FROM user_groups ug JOIN user_user_groups uug ON (ug.user_group_id = uug.user_group_id) WHERE ug.role_id = ?)'
|
|
: 'c.enabled = 1') .
|
|
' ORDER BY seq',
|
|
$params,
|
|
$rangeInfo
|
|
);
|
|
|
|
return new DAOResultFactory($result, $this, '_fromRow');
|
|
}
|
|
|
|
/**
|
|
* Get journals by setting.
|
|
*
|
|
* @param string $settingName
|
|
* @param ?int $contextId
|
|
*
|
|
* @return DAOResultFactory<T>
|
|
*/
|
|
public function getBySetting($settingName, $settingValue, $contextId = null)
|
|
{
|
|
$params = [$settingName, $settingValue];
|
|
if ($contextId) {
|
|
$params[] = $contextId;
|
|
}
|
|
|
|
$result = $this->retrieve(
|
|
'SELECT * FROM ' . $this->tableName . ' AS c
|
|
LEFT JOIN ' . $this->settingsTableName . ' AS cs
|
|
ON c.' . $this->primaryKeyColumn . ' = cs.' . $this->primaryKeyColumn .
|
|
' WHERE cs.setting_name = ? AND cs.setting_value = ?' .
|
|
($contextId ? ' AND c.' . $this->primaryKeyColumn . ' = ?' : ''),
|
|
$params
|
|
);
|
|
|
|
return new DAOResultFactory($result, $this, '_fromRow');
|
|
}
|
|
|
|
/**
|
|
* Sequentially renumber each context according to their sequence order.
|
|
*/
|
|
public function resequence()
|
|
{
|
|
$result = $this->retrieve('SELECT ' . $this->primaryKeyColumn . ' AS context_id FROM ' . $this->tableName . ' ORDER BY seq');
|
|
$i = 1;
|
|
for ($i = 1; $row = (array) $result->current(); $i += 2 && $result->next()) {
|
|
$this->update('UPDATE ' . $this->tableName . ' SET seq = ? WHERE ' . $this->primaryKeyColumn . ' = ?', [$i, $row['context_id']]);
|
|
$result->next();
|
|
$i += 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (!PKP_STRICT_MODE) {
|
|
class_alias('\PKP\context\ContextDAO', '\ContextDAO');
|
|
}
|