Open Journal Systems  3.3.0
ImmersionThemePlugin.inc.php
1 <?php
2 
16 import('lib.pkp.classes.plugins.ThemePlugin');
18 
19  public function init() {
20 
21  $this->addStyle(
22  'fonts',
23  'https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700,700i|Spectral:400,400i,700,700i',
24  array('baseUrl' => ''));
25 
26  // Adding styles (JQuery UI, Bootstrap, Tag-it)
27  $this->addStyle('app-css', 'resources/dist/app.min.css');
28  $this->addStyle('less', 'resources/less/import.less');
29 
30  // Styles for HTML galleys
31  $this->addStyle('htmlGalley', 'templates/plugins/generic/htmlArticleGalley/css/default.css', array('contexts' => 'htmlGalley'));
32 
33  // Adding scripts (JQuery, Popper, Bootstrap, JQuery UI, Tag-it, Theme's JS)
34  $this->addScript('app-js', 'resources/dist/app.min.js');
35 
36  // Add navigation menu areas for this theme
37  $this->addMenuArea(array('primary', 'user'));
38 
39  // Option to show section description on the journal's homepage; turned off by default
40  $this->addOption('sectionDescriptionSetting', 'FieldOptions', array(
41  'label' => __('plugins.themes.immersion.options.sectionDescription.label'),
42  'description' => __('plugins.themes.immersion.options.sectionDescription.description'),
43  'type' => 'radio',
44  'options' => array(
45  [
46  'value' => 'disable',
47  'label' => __('plugins.themes.immersion.options.sectionDescription.disable'),
48  ],
49  [
50  'value' => 'enable',
51  'label' => __('plugins.themes.immersion.options.sectionDescription.enable'),
52  ],
53  )
54  ));
55 
56  $this->addOption('journalDescription', 'FieldOptions', array(
57  'label' => __('plugins.themes.immersion.options.journalDescription.label'),
58  'description' => __('plugins.themes.immersion.options.journalDescription.description'),
59  'type' => 'radio',
60  'options' => array(
61  [
62  'value' => 0,
63  'label' => __('plugins.themes.immersion.options.journalDescription.disable'),
64  ],
65  [
66  'value' => 1,
67  'label' => __('plugins.themes.immersion.options.journalDescription.enable'),
68  ],
69  )
70  ));
71 
72  $this->addOption('journalDescriptionColour', 'FieldColor', array(
73  'label' => __('plugins.themes.immersion.options.journalDescriptionColour.label'),
74  'description' => __('plugins.themes.immersion.options.journalDescriptionColour.description'),
75  'default' => '#000',
76  ));
77 
78  $this->addOption('immersionAnnouncementsColor', 'FieldColor', array(
79  'label' => __('plugins.themes.immersion.announcements.colorPick'),
80  'default' => '#000',
81  ));
82 
83 
84  // Additional data to the templates
85  HookRegistry::register ('TemplateManager::display', array($this, 'addIssueTemplateData'));
86  HookRegistry::register ('TemplateManager::display', array($this, 'addSiteWideData'));
87  HookRegistry::register ('TemplateManager::display', array($this, 'homepageAnnouncements'));
88  HookRegistry::register ('TemplateManager::display', array($this, 'homepageJournalDescription'));
89  HookRegistry::register ('issueform::display', array($this, 'addToIssueForm'));
90 
91  // Check if CSS embedded to the HTML galley
92  HookRegistry::register('TemplateManager::display', array($this, 'hasEmbeddedCSS'));
93 
94  // Additional variable for the issue form
95  HookRegistry::register('issuedao::getAdditionalFieldNames', array($this, 'addIssueDAOFieldNames'));
96  HookRegistry::register('issueform::initdata', array($this, 'initDataIssueFormFields'));
97  HookRegistry::register('issueform::readuservars', array($this, 'readIssueFormFields'));
98  HookRegistry::register('issueform::execute', array($this, 'executeIssueFormFields'));
99 
100  // Load colorpicker on issue management page
101  $this->addStyle('spectrum', '/resources/dist/spectrum-1.8.0.css', [
102  'contexts' => 'backend-manageIssues',
103  ]);
104  $this->addScript('spectrum', '/resources/dist/spectrum-1.8.0.js', [
105  'contexts' => 'backend-manageIssues',
106  ]);
107  }
108 
113  public function getDisplayName() {
114  return __('plugins.themes.immersion.name');
115  }
116 
121  public function getDescription() {
122  return __('plugins.themes.immersion.description');
123  }
124 
134  public function addIssueTemplateData($hookname, $args) {
135 
136  /* @var $request Request
137  * @var $context Context
138  * @var $templateMgr TemplateManager
139  * @var $issueDao IssueDAO
140  * @var $issue Issue
141  * @var $publishedArticleDao PublishedArticleDAO
142  * @var $sectionDao SectionDAO
143  * @var $sections array
144  * @var $section Section
145  */
146 
147  $templateMgr = $args[0];
148  $template = $args[1];
149  $request = $this->getRequest();
150 
151  if ($template !== 'frontend/pages/issue.tpl' && $template !== 'frontend/pages/indexJournal.tpl') return false;
152 
153  $journal = $request->getJournal();
154 
155  $issueDao = DAORegistry::getDAO('IssueDAO');
156 
157  if ($template === 'frontend/pages/indexJournal.tpl') {
158  $issue = $issueDao->getCurrent($journal->getId(), true);
159  } else {
160  $issue = $templateMgr->get_template_vars('issue');
161  }
162 
163  if (!$issue) return false;
164 
165  $publishedSubmissionsInSection = $templateMgr->get_template_vars('publishedSubmissions');
166 
167  // Section color
168  $immersionSectionColors = $issue->getData('immersionSectionColor');
169  $sectionDao = DAORegistry::getDAO('SectionDAO');
170  $sections = $sectionDao->getByIssueId($issue->getId());
171  $lastSectionColor = null;
172 
173  // Section description; check if this option and BrowseBySection plugin is enabled
174  $sectionDescriptionSetting = $this->getOption('sectionDescriptionSetting');
175  $pluginSettingsDAO = DAORegistry::getDAO('PluginSettingsDAO');
177  $context = $request->getContext();
178  $contextId = $context ? $context->getId() : 0;
179  $browseBySectionSettings = $pluginSettingsDAO->getPluginSettings($contextId, 'browsebysectionplugin');
180  $locale = AppLocale::getLocale();
181 
182  foreach ($publishedSubmissionsInSection as $sectionId => $publishedArticlesBySection) {
183  foreach ($sections as $section) {
184  if ($section->getId() == $sectionId) {
185  // Set section and its background color
186  $publishedSubmissionsInSection[$sectionId]['section'] = $section;
187  $publishedSubmissionsInSection[$sectionId]['sectionColor'] = $immersionSectionColors[$sectionId];
188 
189  // Check if section background color is dark
190  $isSectionDark = false;
191  if ($immersionSectionColors[$sectionId] && $this->isColourDark($immersionSectionColors[$sectionId])) {
192  $isSectionDark = true;
193  }
194  $publishedSubmissionsInSection[$sectionId]['isSectionDark'] = $isSectionDark;
195 
196  // Section description
197  if ($sectionDescriptionSetting == 'enable' && $browseBySectionSettings['enabled'] && $section->getData('browseByDescription', $locale)) {
198  $publishedSubmissionsInSection[$sectionId]['sectionDescription'] = $section->getData('browseByDescription', $locale);
199  }
200 
201  // Need only the color of the last section that contains articles
202  if ($publishedSubmissionsInSection[$sectionId]['articles'] && $immersionSectionColors[$sectionId]) {
203  $lastSectionColor = $immersionSectionColors[$sectionId];
204  }
205  }
206  }
207  }
208 
209  $templateMgr->assign(array(
210  'publishedSubmissions' => $publishedSubmissionsInSection,
211  'lastSectionColor' => $lastSectionColor
212  ));
213  }
214 
224  public function homepageAnnouncements($hookname, $args) {
225 
226  $templateMgr = $args[0];
227  $template = $args[1];
228 
229  if ($template !== 'frontend/pages/indexJournal.tpl') return false;
230 
231  $request = $this->getRequest();
232  $journal = $request->getJournal();
233 
234  // Announcements on index journal page
235  $announcementsIntro = $journal->getLocalizedData('announcementsIntroduction');
236  $immersionAnnouncementsColor = $this->getOption('immersionAnnouncementsColor');
237 
238  $isAnnouncementDark = false;
239  if ($immersionAnnouncementsColor && $this->isColourDark($immersionAnnouncementsColor)) {
240  $isAnnouncementDark = true;
241  }
242 
243  $templateMgr->assign(array(
244  'announcementsIntroduction'=> $announcementsIntro,
245  'isAnnouncementDark' => $isAnnouncementDark,
246  'immersionAnnouncementsColor' => $immersionAnnouncementsColor
247  ));
248  }
249 
259  public function addSiteWideData($hookname, $args) {
260  $templateMgr = $args[0];
261 
262  $request = $this->getRequest();
263  $journal = $request->getJournal();
264 
265  if (!defined('SESSION_DISABLE_INIT')) {
266 
267  // Check locales
268  if ($journal) {
269  $locales = $journal->getSupportedLocaleNames();
270  } else {
271  $locales = $request->getSite()->getSupportedLocaleNames();
272  }
273 
274  // Load login form
275  $loginUrl = $request->url(null, 'login', 'signIn');
276  if (Config::getVar('security', 'force_login_ssl')) {
277  $loginUrl = PKPString::regexp_replace('/^http:/', 'https:', $loginUrl);
278  }
279 
280  $orcidImageUrl = $this->getPluginPath() . '/templates/images/orcid.png';
281 
282  if ($request->getContext()) {
283  $templateMgr->assign('immersionHomepageImage', $journal->getLocalizedSetting('homepageImage'));
284  }
285 
286  $templateMgr->assign(array(
287  'languageToggleLocales' => $locales,
288  'loginUrl' => $loginUrl,
289  'orcidImageUrl' => $orcidImageUrl
290  ));
291  }
292  }
293 
303  public function homepageJournalDescription($hookName, $args) {
304  $templateMgr = $args[0];
305  $template = $args[1];
306 
307  if ($template != "frontend/pages/indexJournal.tpl") return false;
308 
309  $journalDescriptionColour = $this->getOption('journalDescriptionColour');
310  $isJournalDescriptionDark = false;
311  if ($journalDescriptionColour && $this->isColourDark($journalDescriptionColour)) {
312  $isJournalDescriptionDark = true;
313  }
314 
315  $templateMgr->assign(array(
316  'showJournalDescription' => $this->getOption('journalDescription'),
317  'journalDescriptionColour' => $journalDescriptionColour,
318  'isJournalDescriptionDark' => $isJournalDescriptionDark
319  ));
320  }
321 
331  public function addIssueDAOFieldNames($hookName, $args) {
332  $fields =& $args[1];
333  $fields[] = 'immersionSectionColor';
334  }
335 
336 
345  public function initDataIssueFormFields($hookName, $args) {
346  $issueForm = $args[0];
347  $issueForm->setData('immersionSectionColor', $issueForm->issue->getData('immersionSectionColor'));
348  }
349 
359  public function readIssueFormFields($hookName, $args) {
360  $issueForm =& $args[0];
361  $request = $this->getRequest();
362 
363  $issueForm->setData('immersionSectionColor', $request->getUserVar('immersionSectionColor'));
364  }
365 
376  public function executeIssueFormFields($hookName, $args) {
377  $issueForm = $args[0];
378  $issue = $args[1];
379 
380  // The issueform::execute hook fires twice, once at the start of the
381  // method when no issue exists. Only update the object during the
382  // second request
383  if (!$issue) {
384  return;
385  }
386 
387  $issue->setData('immersionSectionColor', $issueForm->getData('immersionSectionColor'));
388 
389  $issueDao = DAORegistry::getDAO('IssueDAO');
390  $issueDao->updateObject($issue);
391  }
392 
402  public function addToIssueForm($hookName, $args) {
403  $issueForm = $args[0];
404 
405  // Display only if available as per IssueForm::fetch()
406  if ($issueForm->issue) {
407  $request = $this->getRequest();
408 
409  $sectionDao = DAORegistry::getDAO('SectionDAO');
410  $sections = $sectionDao->getByIssueId($issueForm->issue->getId());
411 
412  $templateMgr = TemplateManager::getManager($request);
413 
414  $templateMgr->assign('sections', $sections);
415  }
416  }
417 
425  public function hasEmbeddedCSS($hookName, $args) {
426  $templateMgr = $args[0];
427  $template = $args[1];
428  $request = $this->getRequest();
429 
430  // Return false if not a galley page
431  if ($template !== 'plugins/plugins/generic/htmlArticleGalley/generic/htmlArticleGalley:display.tpl') return false;
432 
433  $articleArrays = $templateMgr->get_template_vars('article');
434 
435  // Deafult styling for HTML galley
436  $boolEmbeddedCss = false;
437  foreach ($articleArrays->getGalleys() as $galley) {
438  if ($galley->getFileType() === 'text/html') {
439  $submissionFile = $galley->getFile();
440 
441  $submissionFileDao = DAORegistry::getDAO('SubmissionFileDAO');
442  import('lib.pkp.classes.submission.SubmissionFile'); // Constants
443  $embeddableFiles = array_merge(
444  $submissionFileDao->getLatestRevisions($submissionFile->getSubmissionId(), SUBMISSION_FILE_PROOF),
445  $submissionFileDao->getLatestRevisionsByAssocId(ASSOC_TYPE_SUBMISSION_FILE, $submissionFile->getFileId(), $submissionFile->getSubmissionId(), SUBMISSION_FILE_DEPENDENT)
446  );
447 
448  foreach ($embeddableFiles as $embeddableFile) {
449  if ($embeddableFile->getFileType() == 'text/css') {
450  $boolEmbeddedCss = true;
451  }
452  }
453  }
454 
455  }
456 
457  $templateMgr->assign(array(
458  'boolEmbeddedCss' => $boolEmbeddedCss,
459  'themePath' => $request->getBaseUrl() . "/" . $this->getPluginPath(),
460  ));
461  }
462 }
ThemePlugin
Abstract class for theme plugins.
Definition: ThemePlugin.inc.php:21
ThemePlugin\isColourDark
isColourDark($color, $limit=130)
Definition: ThemePlugin.inc.php:845
ImmersionThemePlugin\addSiteWideData
addSiteWideData($hookname, $args)
Assign additional data to Smarty templates.
Definition: ImmersionThemePlugin.inc.php:259
ThemePlugin\addMenuArea
addMenuArea($menuAreas)
Definition: ThemePlugin.inc.php:662
PKPString\regexp_replace
static regexp_replace($pattern, $replacement, $subject, $limit=-1)
Definition: PKPString.inc.php:279
Plugin\getRequest
& getRequest()
Definition: Plugin.inc.php:828
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
ImmersionThemePlugin\homepageAnnouncements
homepageAnnouncements($hookname, $args)
background color for announcements section on the journal index page
Definition: ImmersionThemePlugin.inc.php:224
ImmersionThemePlugin\executeIssueFormFields
executeIssueFormFields($hookName, $args)
Definition: ImmersionThemePlugin.inc.php:376
ImmersionThemePlugin\readIssueFormFields
readIssueFormFields($hookName, $args)
Definition: ImmersionThemePlugin.inc.php:359
ImmersionThemePlugin\initDataIssueFormFields
initDataIssueFormFields($hookName, $args)
Definition: ImmersionThemePlugin.inc.php:345
ImmersionThemePlugin\getDescription
getDescription()
Definition: ImmersionThemePlugin.inc.php:121
ThemePlugin\getOption
getOption($name)
Definition: ThemePlugin.inc.php:454
ThemePlugin\addScript
addScript($name, $script, $args=array())
Definition: ThemePlugin.inc.php:304
ThemePlugin\addOption
addOption($name, $type, $args=array())
Definition: ThemePlugin.inc.php:393
Config\getVar
static getVar($section, $key, $default=null)
Definition: Config.inc.php:35
ImmersionThemePlugin\init
init()
Definition: ImmersionThemePlugin.inc.php:19
ImmersionThemePlugin\getDisplayName
getDisplayName()
Definition: ImmersionThemePlugin.inc.php:113
ImmersionThemePlugin\addToIssueForm
addToIssueForm($hookName, $args)
Definition: ImmersionThemePlugin.inc.php:402
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
Plugin\getPluginPath
getPluginPath()
Definition: Plugin.inc.php:330
Plugin\$request
$request
Definition: Plugin.inc.php:68
ImmersionThemePlugin
Immersion theme.
Definition: ImmersionThemePlugin.inc.php:17
HookRegistry\register
static register($hookName, $callback, $hookSequence=HOOK_SEQUENCE_NORMAL)
Definition: HookRegistry.inc.php:70
ThemePlugin\addStyle
addStyle($name, $style, $args=array())
Definition: ThemePlugin.inc.php:191
PKPApplication\getRequest
getRequest()
Definition: PKPApplication.inc.php:270
AppLocale\getLocale
static getLocale()
Definition: env1/MockAppLocale.inc.php:40
ImmersionThemePlugin\homepageJournalDescription
homepageJournalDescription($hookName, $args)
Show Journal Description on the journal landing page depending on theme settings.
Definition: ImmersionThemePlugin.inc.php:303
ImmersionThemePlugin\addIssueTemplateData
addIssueTemplateData($hookname, $args)
Add section-specific data to the indexJournal and issue templates.
Definition: ImmersionThemePlugin.inc.php:134
ImmersionThemePlugin\addIssueDAOFieldNames
addIssueDAOFieldNames($hookName, $args)
Definition: ImmersionThemePlugin.inc.php:331
ImmersionThemePlugin\hasEmbeddedCSS
hasEmbeddedCSS($hookName, $args)
Definition: ImmersionThemePlugin.inc.php:425