20 use \DAOResultFactory;
23 use \PKP\Services\interfaces\EntityPropertyInterface;
24 use \PKP\Services\interfaces\EntityReadInterface;
25 use \PKP\Services\interfaces\EntityWriteInterface;
26 use \APP\Services\QueryBuilders\ContextQueryBuilder;
28 import(
'lib.pkp.classes.db.DBResultRange');
30 abstract class PKPContextService implements EntityPropertyInterface, EntityReadInterface, EntityWriteInterface {
47 public function get($contextId) {
54 public function getCount($args = []) {
61 public function getIds($args = []) {
94 public function getMany($args = array()) {
96 if (isset($args[
'count'])) {
97 import(
'lib.pkp.classes.db.DBResultRange');
98 $range = new \DBResultRange($args[
'count'],
null, isset($args[
'offset']) ? $args[
'offset'] : 0);
102 if (isset($args[
'count'])) unset($args[
'count']);
103 if (isset($args[
'offset'])) unset($args[
'offset']);
106 $result = $contextDao->retrieveRange($contextListQO->toSql(), $contextListQO->getBindings(), $range);
109 return $queryResults->toIterator();
115 public function getMax($args = array()) {
117 if (isset($args[
'count'])) unset($args[
'count']);
118 if (isset($args[
'offset'])) unset($args[
'offset']);
128 $defaultArgs = array(
131 'searchPhrase' =>
null,
134 $args = array_merge($defaultArgs, $args);
138 ->filterByIsEnabled($args[
'isEnabled'])
139 ->filterByUserId($args[
'userId'])
140 ->searchPhrase($args[
'searchPhrase']);
144 return $contextListQB;
150 public function getProperties($context, $props, $args =
null) {
151 $slimRequest = $args[
'slimRequest'];
152 $request = $args[
'request'];
153 $dispatcher = $request->getDispatcher();
157 foreach ($props as $prop) {
160 $values[$prop] = $dispatcher->url(
167 $values[$prop] =
null;
168 if (!empty($slimRequest)) {
169 $route = $slimRequest->getAttribute(
'route');
170 $values[$prop] = $dispatcher->url(
173 $context->getData(
'urlPath'),
174 'contexts/' . $context->getId()
179 $values[$prop] = $context->getData($prop);
184 $supportedLocales = empty($args[
'supportedLocales']) ? $context->getSupportedFormLocales() : $args[
'supportedLocales'];
215 public function validate($action, $props, $allowedLocales, $primaryLocale) {
217 LOCALE_COMPONENT_PKP_ADMIN,
218 LOCALE_COMPONENT_APP_ADMIN,
219 LOCALE_COMPONENT_PKP_MANAGER,
220 LOCALE_COMPONENT_APP_MANAGER
224 import(
'lib.pkp.classes.validation.ValidatorFactory');
227 $schemaService->getValidationRules(
SCHEMA_CONTEXT, $allowedLocales),
229 'urlPath.regex' => __(
'admin.contexts.form.pathAlphaNumeric'),
230 'primaryLocale.regex' => __(
'validator.localeKey'),
231 'supportedFormLocales.regex' => __(
'validator.localeKey'),
232 'supportedLocales.regex' => __(
'validator.localeKey'),
233 'supportedSubmissionLocales.*.regex' => __(
'validator.localeKey'),
251 $validator->after(
function($validator) use ($action, $props) {
252 if (isset($props[
'urlPath']) && !$validator->errors()->get(
'urlPath')) {
253 $contextDao = Application::getContextDAO();
254 $contextWithPath = $contextDao->getByPath($props[
'urlPath']);
255 if ($contextWithPath) {
256 if (!($action === VALIDATE_ACTION_EDIT
257 && isset($props[
'id'])
258 && (int) $contextWithPath->getId() === $props[
'id'])) {
259 $validator->errors()->add(
'urlPath', __(
'admin.contexts.form.pathExists'));
270 [
'favicon',
'homepageImage',
'pageHeaderLogoImage',
'styleSheet'],
271 [
'favicon',
'homepageImage',
'pageHeaderLogoImage'],
274 $user ? $user->getId() :
null
279 $validator->after(
function($validator) use ($props) {
280 if (!empty($props[
'sidebar']) && !$validator->errors()->get(
'sidebar')) {
281 $plugins = \PluginRegistry::loadCategory(
'blocks', true);
282 foreach ($props[
'sidebar'] as $pluginName) {
283 if (empty($plugins[$pluginName])) {
284 $validator->errors()->add(
'sidebar', __(
'manager.setup.layout.sidebar.invalidBlock', [
'name' => $pluginName]));
291 $validator->after(
function($validator) use ($props) {
292 if (!empty($props[
'themePluginPath']) && !$validator->errors()->get(
'themePluginPath')) {
293 $plugins = \PluginRegistry::loadCategory(
'themes', true);
295 foreach ($plugins as $plugin) {
296 if ($props[
'themePluginPath'] === $plugin->getDirName()) {
302 $validator->errors()->add(
'themePluginPath', __(
'manager.setup.theme.notFound'));
307 if ($validator->fails()) {
308 $errors = $schemaService->formatValidationErrors($validator->errors(), $schemaService->get(SCHEMA_CONTEXT), $allowedLocales);
311 \HookRegistry::call(
'Context::validate', array(&$errors, $action, $props, $allowedLocales, $primaryLocale));
319 public function add($context, $request) {
320 $site = $request->getSite();
321 $currentUser = $request->getUser();
324 if (!$context->getData(
'primaryLocale')) {
325 $context->setData(
'primaryLocale', $site->getPrimaryLocale());
327 if (!$context->getData(
'supportedLocales')) {
328 $context->setData(
'supportedLocales', $site->getSupportedLocales());
332 $localeParams = array(
333 'indexUrl' => $request->getIndexUrl(),
334 'primaryLocale' => $context->getData(
'primaryLocale'),
335 'contextName' => $context->getData(
'name', $context->getPrimaryLocale()),
336 'contextPath' => $context->getData(
'urlPath'),
337 'contextUrl' => $request->getDispatcher()->url(
345 \HookRegistry::call(
'Context::defaults::localeParams', array(&$localeParams, $context, $request));
350 $context->getData(
'supportedLocales'),
351 $context->getData(
'primaryLocale'),
355 if (!$context->getData(
'supportedFormLocales')) {
356 $context->setData(
'supportedFormLocales', [$context->getData(
'primaryLocale')]);
358 if (!$context->getData(
'supportedSubmissionLocales')) {
359 $context->setData(
'supportedSubmissionLocales', [$context->getData(
'primaryLocale')]);
362 $contextDao->insertObject($context);
363 $contextDao->resequence();
365 $context = $this->
get($context->getId());
368 $supportedLocales = $context->getSupportedFormLocales();
369 $fileUploadProps = [
'favicon',
'homepageImage',
'pageHeaderLogoImage'];
371 foreach ($fileUploadProps as $fileUploadProp) {
372 $value = $context->getData($fileUploadProp);
376 foreach ($supportedLocales as $localeKey) {
377 if (!array_key_exists($localeKey, $value)) {
380 $value[$localeKey] = $this->_saveFileParam($context, $value[$localeKey], $fileUploadProp, $currentUser->getId(), $localeKey,
true);
382 $params[$fileUploadProp] = $value;
384 if (!empty($params[
'styleSheet'])) {
385 $params[
'styleSheet'] = $this->_saveFileParam($context, $params[
'styleSheet'],
'styleSheet', $userId);
387 $context = $this->edit($context, $params, $request);
390 $genreDao->installDefaults($context->getId(), $context->getData(
'supportedLocales'));
393 $userGroupDao->installSettings($context->getId(),
'registry/userGroups.xml');
395 $managerUserGroup = $userGroupDao->getDefaultByRoleId($context->getId(), ROLE_ID_MANAGER);
396 $userGroupDao->assignUserToGroup($currentUser->getId(), $managerUserGroup->getId());
398 import(
'lib.pkp.classes.file.FileManager');
399 $fileManager = new \FileManager();
400 foreach ($this->installFileDirs as $dir) {
401 $fileManager->mkdir(sprintf($dir, $this->contextsFileDirName, $context->getId()));
405 $navigationMenuDao->installSettings($context->getId(),
'registry/navigationMenus.xml');
418 public function edit($context, $params, $request) {
419 $contextDao = Application::getContextDao();
422 $userId = $request->getUser() ? $request->getUser()->getId() :
null;
423 $supportedLocales = $context->getSupportedFormLocales();
424 $fileUploadParams = [
'favicon',
'homepageImage',
'pageHeaderLogoImage'];
425 foreach ($fileUploadParams as $fileUploadParam) {
426 if (!array_key_exists($fileUploadParam, $params)) {
429 foreach ($supportedLocales as $localeKey) {
430 if (!array_key_exists($localeKey, $params[$fileUploadParam])) {
433 $params[$fileUploadParam][$localeKey] = $this->_saveFileParam($context, $params[$fileUploadParam][$localeKey], $fileUploadParam, $userId, $localeKey,
true);
436 if (array_key_exists(
'styleSheet', $params)) {
437 $params[
'styleSheet'] = $this->_saveFileParam($context, $params[
'styleSheet'],
'styleSheet', $userId);
440 $newContext = $contextDao->newDataObject();
441 $newContext->_data = array_merge($context->_data, $params);
445 $contextDao->updateObject($newContext);
446 $newContext = $this->
get($newContext->getId());
454 public function delete($context) {
457 $contextDao = Application::getContextDao();
458 $contextDao->deleteObject($context);
461 $userGroupDao->deleteAssignmentsByContextId($context->getId());
462 $userGroupDao->deleteByContextId($context->getId());
465 $genreDao->deleteByContextId($context->getId());
468 $announcementDao->deleteByAssoc($context->getAssocType(), $context->getId());
471 $announcementTypeDao->deleteByAssoc($context->getAssocType(), $context->getId());
473 Services::get(
'emailTemplate')->restoreDefaults($context->getId());
476 $pluginSettingsDao->deleteByContextId($context->getId());
479 $reviewFormDao->deleteByAssoc($context->getAssocType(), $context->getId());
482 $navigationMenuDao->deleteByContextId($context->getId());
485 $navigationMenuItemDao->deleteByContextId($context->getId());
487 import(
'lib.pkp.classes.file.FileManager');
488 $fileManager = new \FileManager($context->getId());
489 $contextPath =
\Config::getVar(
'files',
'files_dir') .
'/' . $this->contextsFileDirName .
'/' . $context->getId();
490 $fileManager->rmtree($contextPath);
507 public function restoreLocaleDefaults($context, $request, $locale) {
512 $localeParams = array(
513 'indexUrl' => $request->getIndexUrl(),
514 'journalPath' => $context->getData(
'urlPath'),
515 'primaryLocale' => $context->getData(
'primaryLocale'),
516 'journalName' => $context->getData(
'name', $locale),
517 'contextName' => $context->getData(
'name', $locale),
518 'contextUrl' => $request->getDispatcher()->url(
526 \HookRegistry::call(
'Context::restoreLocaleDefaults::localeParams', array(&$localeParams, $context, $request, $locale));
528 $localeDefaults =
Services::get(
'schema')->getLocaleDefaults(SCHEMA_CONTEXT, $locale, $localeParams);
531 foreach ($localeDefaults as $paramName => $value) {
532 $params[$paramName] = array_merge(
533 (array) $context->getData($paramName),
534 [$locale => $localeDefaults[$paramName]]
538 return $this->edit($context, $params, $request);
553 public function moveTemporaryFile($context, $temporaryFile, $fileNameBase, $userId, $localeKey =
'') {
554 import(
'classes.file.PublicFileManager');
555 $publicFileManager = new \PublicFileManager();
556 import(
'lib.pkp.classes.file.TemporaryFileManager');
557 $temporaryFileManager = new \TemporaryFileManager();
559 $fileName = $fileNameBase;
561 $fileName .=
'_' . $localeKey;
564 $extension = $publicFileManager->getDocumentExtension($temporaryFile->getFileType());
566 $extension = $publicFileManager->getImageExtension($temporaryFile->getFileType());
568 $fileName .= $extension;
570 $result = $publicFileManager->copyContextFile(
572 $temporaryFile->getFilePath(),
580 $temporaryFileManager->deleteById($temporaryFile->getId(), $userId);
608 protected function _saveFileParam($context, $value, $settingName, $userId, $localeKey =
'', $isImage =
false) {
609 import(
'lib.pkp.classes.file.TemporaryFileManager');
610 $temporaryFileManager = new \TemporaryFileManager();
613 if (is_null($value)) {
614 $setting = $context->getData($settingName, $localeKey);
616 $fileName = $isImage ? $setting[
'uploadName'] : $setting;
617 import(
'classes.file.PublicFileManager');
618 $publicFileManager = new \PublicFileManager();
619 $publicFileManager->removeContextFile($context->getId(), $fileName);
625 if (empty($value[
'temporaryFileId'])) {
629 $temporaryFile = $temporaryFileManager->getFile((
int) $value[
'temporaryFileId'], $userId);
630 $fileName = $this->moveTemporaryFile($context, $temporaryFile, $settingName, $userId, $localeKey);
635 import(
'classes.file.PublicFileManager');
636 $publicFileManager = new \PublicFileManager();
638 $filePath = $publicFileManager->getContextFilesPath($context->getId());
639 list($width, $height) = getimagesize($filePath .
'/' . $fileName);
640 $altText = !empty($value[
'altText']) ? $value[
'altText'] :
'';
643 'name' => $temporaryFile->getOriginalFileName(),
644 'uploadName' => $fileName,
648 'altText' => $altText,
652 'name' => $temporaryFile->getOriginalFileName(),
653 'uploadName' => $fileName,