Open Monograph Press  3.3.0
SeriesForm.inc.php
1 <?php
2 
17 import('lib.pkp.controllers.grid.settings.sections.form.PKPSectionForm');
18 
19 class SeriesForm extends PKPSectionForm {
21  var $_pressId;
22 
28  function __construct($request, $seriesId = null) {
29  parent::__construct(
30  $request,
31  'controllers/grid/settings/series/form/seriesForm.tpl',
32  $seriesId
33  );
34 
35  $this->_pressId = $pressId = $request->getContext()->getId();
36 
37  // Validation checks for this form
38  $form = $this;
39  $this->addCheck(new FormValidatorLocale($this, 'title', 'required', 'manager.setup.form.series.nameRequired'));
40  $this->addCheck(new FormValidatorISSN($this, 'onlineIssn', 'optional', 'catalog.manage.series.issn.validation'));
41  $this->addCheck(new FormValidatorISSN($this, 'printIssn', 'optional', 'catalog.manage.series.issn.validation'));
42  $this->addCheck(new FormValidatorCustom($this, 'printIssn', 'optional', 'catalog.manage.series.issn.equalValidation', function($printIssn) use ($form) {
43  return !($form->getData('onlineIssn') != '' && $form->getData('onlineIssn') == $printIssn);
44  }));
45  $this->addCheck(new FormValidatorRegExp($this, 'path', 'required', 'grid.series.pathAlphaNumeric', '/^[a-zA-Z0-9\/._-]+$/'));
46  $this->addCheck(new FormValidatorCustom(
47  $this, 'path', 'required', 'grid.series.pathExists',
48  function($path) use ($form, $pressId) {
49  $seriesDao = DAORegistry::getDAO('SeriesDAO'); /* @var $seriesDao SeriesDAO */
50  return !$seriesDao->getByPath($path,$pressId) || ($form->getData('oldPath') != null && $form->getData('oldPath') == $path);
51  }));
52  }
53 
57  function initData() {
58  $request = Application::get()->getRequest();
59  $press = $request->getPress();
60 
61  $seriesDao = DAORegistry::getDAO('SeriesDAO'); /* @var $seriesDao SeriesDAO */
62  $seriesId = $this->getSeriesId();
63  if ($seriesId) {
64  $series = $seriesDao->getById($seriesId, $press->getId());
65  }
66 
67  $categories = $seriesDao->getCategories($seriesId, $press->getId());
68  $categoryIds = array();
69  while ($category = $categories->next()) {
70  $categoryIds[] = $category->getId();
71  }
72 
73  if (isset($series) ) {
74  $sortOption = $series->getSortOption() ? $series->getSortOption() : DAORegistry::getDAO('SubmissionDAO')->getDefaultSortOption();
75  $this->_data = array(
76  'seriesId' => $seriesId,
77  'title' => $series->getTitle(null, false),
78  'featured' => $series->getFeatured(),
79  'path' => $series->getPath(),
80  'description' => $series->getDescription(null),
81  'prefix' => $series->getPrefix(null),
82  'subtitle' => $series->getSubtitle(null),
83  'image' => $series->getImage(),
84  'restricted' => $series->getEditorRestricted(),
85  'isInactive' => $series->getIsInactive(),
86  'onlineIssn' => $series->getOnlineISSN(),
87  'printIssn' => $series->getPrintISSN(),
88  'sortOption' => $sortOption,
89  'categories' => $categoryIds,
90  );
91  }
92  }
93 
97  function validate($callHooks = true) {
98  if ($temporaryFileId = $this->getData('temporaryFileId')) {
99  import('lib.pkp.classes.file.TemporaryFileManager');
100  $temporaryFileManager = new TemporaryFileManager();
101  $temporaryFileDao = DAORegistry::getDAO('TemporaryFileDAO'); /* @var $temporaryFileDao TemporaryFileDAO */
102  $temporaryFile = $temporaryFileDao->getTemporaryFile($temporaryFileId, $this->_userId);
103  if ( !$temporaryFile ||
104  !($this->_imageExtension = $temporaryFileManager->getImageExtension($temporaryFile->getFileType())) ||
105  !($this->_sizeArray = getimagesize($temporaryFile->getFilePath())) ||
106  $this->_sizeArray[0] <= 0 || $this->_sizeArray[1] <= 0
107  ) {
108  $this->addError('temporaryFileId', __('form.invalidImage'));
109  return false;
110  }
111  }
112 
113  // Validate if it can be inactive
114  if ($this->getData('isInactive')) {
115  $request = Application::get()->getRequest();
116  $context = $request->getContext();
117  $seriesId = $this->getSeriesId();
118 
119  $seriesDao = DAORegistry::getDAO('SeriesDAO'); /* @var $seriesDao SeriesDAO */
120  $seriesIterator = $seriesDao->getByContextId($context->getId());
121  $activeSeriesCount = 0;
122  while ($series = $seriesIterator->next()) {
123  if (!$series->getIsInactive() && ($seriesId != $series->getId())) {
124  $activeSeriesCount++;
125  }
126  }
127  if ($activeSeriesCount < 1 && $this->getData('isInactive')) {
128  $this->addError('isInactive', __('manager.series.confirmDeactivateSeries.error'));
129  }
130  }
131 
132  return parent::validate($callHooks);
133  }
134 
138  function fetch($request, $template = null, $display = false) {
139  $templateMgr = TemplateManager::getManager($request);
140  $templateMgr->assign('seriesId', $this->getSeriesId());
141 
142  $context = $request->getContext();
143 
144  $categoryDao = DAORegistry::getDAO('CategoryDAO'); /* @var $categoryDao CategoryDAO */
145  $categoryCount = $categoryDao->getCountByContextId($context->getId());
146  $templateMgr->assign('categoryCount', $categoryCount);
147 
148  // Sort options.
149  $templateMgr->assign('sortOptions', DAORegistry::getDAO('SubmissionDAO')->getSortSelectOptions());
150 
151  // Series Editors
152  $usersIterator = Services::get('user')->getMany([
153  'contextId' => $context->getId(),
154  'roleIds' => ROLE_ID_SUB_EDITOR,
155  ]);
156  $availableSubeditors = [];
157  foreach ($usersIterator as $user) {
158  $availableSubeditors[(int) $user->getId()] = $user->getFullName();
159  }
160  $assignedToSeries = [];
161  if ($this->getSeriesId()) {
162  $assignedToSeries = Services::get('user')->getIds([
163  'contextId' => $context->getId(),
164  'roleIds' => ROLE_ID_SUB_EDITOR,
165  'assignedToSection' => (int) $this->getSeriesId(),
166  ]);
167  }
168 
169  // Categories list
170  $allCategories = [];
171  $categoryDao = DAORegistry::getDAO('CategoryDAO'); /* @var $categoryDao CategoryDAO */
172  $categoriesResult = $categoryDao->getByContextId($context->getId())->toAssociativeArray();
173  foreach ($categoriesResult as $category) {
174  $title = $category->getLocalizedTitle();
175  if ($category->getParentId()) {
176  $title = $categoriesResult[$category->getParentId()]->getLocalizedTitle() . ' > ' . $title;
177  }
178  $allCategories[(int) $category->getId()] = $title;
179  }
180 
181  $templateMgr->assign([
182  'availableSubeditors' => $availableSubeditors,
183  'assignedToSeries' => $assignedToSeries,
184  'allCategories' => $allCategories,
185  'selectedCategories' => (array) $this->getData('categories'),
186  ]);
187 
188  return parent::fetch($request, $template, $display);
189  }
190 
195  function readInputData() {
196  parent::readInputData();
197  $this->readUserVars(array('seriesId', 'path', 'featured', 'restricted', 'description', 'categories', 'prefix', 'subtitle', 'temporaryFileId', 'onlineIssn', 'printIssn', 'sortOption', 'isInactive'));
198  // For path duplicate checking; excuse the current path.
199  if ($seriesId = $this->getSeriesId()) {
200  $seriesDao = DAORegistry::getDAO('SeriesDAO'); /* @var $seriesDao SeriesDAO */
201  $series = $seriesDao->getById($seriesId, $this->_pressId);
202  $this->setData('oldPath', $series->getPath());
203  }
204  }
205 
209  function execute(...$functionParams) {
210  parent::execute(...$functionParams);
211 
212  $seriesDao = DAORegistry::getDAO('SeriesDAO'); /* @var $seriesDao SeriesDAO */
213  $request = Application::get()->getRequest();
214  $press = $request->getPress();
215 
216  // Get or create the series object
217  if ($this->getSeriesId()) {
218  $series = $seriesDao->getById($this->getSeriesId(), $press->getId());
219  } else {
220  $series = $seriesDao->newDataObject();
221  $series->setPressId($press->getId());
222  }
223 
224  // Populate/update the series object from the form
225  $series->setPath($this->getData('path'));
226  $series->setFeatured($this->getData('featured'));
227  $series->setTitle($this->getData('title'), null); // Localized
228  $series->setDescription($this->getData('description'), null); // Localized
229  $series->setPrefix($this->getData('prefix'), null); // Localized
230  $series->setSubtitle($this->getData('subtitle'), null); // Localized
231  $series->setEditorRestricted($this->getData('restricted'));
232  $series->setIsInactive($this->getData('isInactive') ? 1 : 0);
233  $series->setOnlineISSN($this->getData('onlineIssn'));
234  $series->setPrintISSN($this->getData('printIssn'));
235  $series->setSortOption($this->getData('sortOption'));
236 
237  // Insert or update the series in the DB
238  if ($this->getSeriesId()) {
239  $seriesDao->updateObject($series);
240  } else {
241  $this->setSeriesId($seriesDao->insertObject($series));
242  }
243 
244  // Handle the image upload if there was one.
245  if ($temporaryFileId = $this->getData('temporaryFileId')) {
246  // Fetch the temporary file storing the uploaded library file
247  $temporaryFileDao = DAORegistry::getDAO('TemporaryFileDAO'); /* @var $temporaryFileDao TemporaryFileDAO */
248 
249  $temporaryFile = $temporaryFileDao->getTemporaryFile($temporaryFileId, $this->_userId);
250  $temporaryFilePath = $temporaryFile->getFilePath();
251  import('lib.pkp.classes.file.ContextFileManager');
252  $pressFileManager = new ContextFileManager($press->getId());
253  $basePath = $pressFileManager->getBasePath() . '/series/';
254 
255  // Delete the old file if it exists
256  $oldSetting = $series->getImage();
257  if ($oldSetting) {
258  $pressFileManager->deleteByPath($basePath . $oldSetting['thumbnailName']);
259  $pressFileManager->deleteByPath($basePath . $oldSetting['name']);
260  }
261 
262  // The following variables were fetched in validation
263  assert($this->_sizeArray && $this->_imageExtension);
264 
265  // Generate the surrogate image.
266  switch ($this->_imageExtension) {
267  case '.jpg': $image = imagecreatefromjpeg($temporaryFilePath); break;
268  case '.png': $image = imagecreatefrompng($temporaryFilePath); break;
269  case '.gif': $image = imagecreatefromgif($temporaryFilePath); break;
270  default: $image = null; // Suppress warn
271  }
272  assert($image);
273 
274  $coverThumbnailsMaxWidth = $press->getSetting('coverThumbnailsMaxWidth');
275  $coverThumbnailsMaxHeight = $press->getSetting('coverThumbnailsMaxHeight');
276 
277  $thumbnailFilename = $series->getId() . '-series-thumbnail' . $this->_imageExtension;
278  $xRatio = min(1, $coverThumbnailsMaxWidth / $this->_sizeArray[0]);
279  $yRatio = min(1, $coverThumbnailsMaxHeight / $this->_sizeArray[1]);
280 
281  $ratio = min($xRatio, $yRatio);
282 
283  $thumbnailWidth = round($ratio * $this->_sizeArray[0]);
284  $thumbnailHeight = round($ratio * $this->_sizeArray[1]);
285  $thumbnail = imagecreatetruecolor($thumbnailWidth, $thumbnailHeight);
286  imagecopyresampled($thumbnail, $image, 0, 0, 0, 0, $thumbnailWidth, $thumbnailHeight, $this->_sizeArray[0], $this->_sizeArray[1]);
287 
288  // Copy the new file over
289  $filename = $series->getId() . '-series' . $this->_imageExtension;
290  $pressFileManager->copyFile($temporaryFile->getFilePath(), $basePath . $filename);
291 
292  switch ($this->_imageExtension) {
293  case '.jpg': imagejpeg($thumbnail, $basePath . $thumbnailFilename); break;
294  case '.png': imagepng($thumbnail, $basePath . $thumbnailFilename); break;
295  case '.gif': imagegif($thumbnail, $basePath . $thumbnailFilename); break;
296  }
297  imagedestroy($thumbnail);
298  imagedestroy($image);
299 
300  $series->setImage(array(
301  'name' => $filename,
302  'width' => $this->_sizeArray[0],
303  'height' => $this->_sizeArray[1],
304  'thumbnailName' => $thumbnailFilename,
305  'thumbnailWidth' => $thumbnailWidth,
306  'thumbnailHeight' => $thumbnailHeight,
307  'uploadName' => $temporaryFile->getOriginalFileName(),
308  'dateUploaded' => Core::getCurrentDate(),
309  ));
310 
311  // Clean up the temporary file
312  import('lib.pkp.classes.file.TemporaryFileManager');
313  $temporaryFileManager = new TemporaryFileManager();
314  $temporaryFileManager->deleteById($temporaryFileId, $this->_userId);
315  }
316 
317  // Update series object to store image information.
318  $seriesDao->updateObject($series);
319 
320  // Update series editors
321  $subEditorsDao = DAORegistry::getDAO('SubEditorsDAO'); /* @var $subEditorsDao SubEditorsDAO */
322  $subEditorsDao->deleteBySubmissionGroupId($series->getId(), ASSOC_TYPE_SERIES, $series->getContextId());
323  $subEditors = $this->getData('subEditors');
324  if (!empty($subEditors)) {
325  $roleDao = DAORegistry::getDAO('RoleDAO'); /* @var $roleDao RoleDAO */
326  foreach ($subEditors as $subEditor) {
327  if ($roleDao->userHasRole($series->getContextId(), $subEditor, ROLE_ID_SUB_EDITOR)) {
328  $subEditorsDao->insertEditor($series->getContextId(), $series->getId(), $subEditor, ASSOC_TYPE_SERIES);
329  }
330  }
331  }
332 
333  // Save the category associations.
334  $seriesDao = DAORegistry::getDAO('SeriesDAO'); /* @var $seriesDao SeriesDAO */
335  $seriesDao->removeCategories($this->getSeriesId());
336  $categoryIds = $this->getData('categories');
337  if (!empty($categoryIds)) {
338  foreach ($categoryIds as $categoryId) {
339  $seriesDao->addCategory($this->getSeriesId(), $categoryId);
340  }
341  }
342 
343  return true;
344  }
345 
350  function getSeriesId() {
351  return $this->getSectionId();
352  }
353 
358  function setSeriesId($seriesId) {
359  $this->setSectionId($seriesId);
360  }
361 }
SeriesForm\readInputData
readInputData()
Definition: SeriesForm.inc.php:198
TemporaryFileManager
Definition: TemporaryFileManager.inc.php:19
SeriesForm\execute
execute(... $functionParams)
Definition: SeriesForm.inc.php:212
PKPSectionForm
Form for adding/editing a section.
Definition: PKPSectionForm.inc.php:18
SeriesForm\getSeriesId
getSeriesId()
Definition: SeriesForm.inc.php:353
SeriesForm\fetch
fetch($request, $template=null, $display=false)
Definition: SeriesForm.inc.php:141
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
FormValidatorLocale
Class to represent a form validation check for localized fields.
Definition: FormValidatorLocale.inc.php:16
SeriesForm\__construct
__construct($request, $seriesId=null)
Definition: SeriesForm.inc.php:31
Form\setData
setData($key, $value=null)
Definition: Form.inc.php:229
Form\readUserVars
readUserVars($vars)
Definition: Form.inc.php:378
Form\getData
getData($key)
Definition: Form.inc.php:220
PKPSectionForm\$_imageExtension
$_imageExtension
Definition: PKPSectionForm.inc.php:32
SeriesForm\validate
validate($callHooks=true)
Definition: SeriesForm.inc.php:100
FormValidatorISSN
Form validation check for ISSNs.
Definition: FormValidatorISSN.inc.php:18
Form\addError
addError($field, $message)
Definition: Form.inc.php:404
SeriesForm\$_pressId
$_pressId
Definition: SeriesForm.inc.php:24
ContextFileManager
Class defining operations for private context file management.
Definition: ContextFileManager.inc.php:19
SeriesForm\setSeriesId
setSeriesId($seriesId)
Definition: SeriesForm.inc.php:361
PKPSectionForm\setSectionId
setSectionId($sectionId)
Definition: PKPSectionForm.inc.php:80
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
FormValidatorRegExp
Form validation check using a regular expression.
Definition: FormValidatorRegExp.inc.php:18
SeriesForm
Form for adding/edditing a series stores/retrieves from an associative array.
Definition: SeriesForm.inc.php:19
Core\getCurrentDate
static getCurrentDate($ts=null)
Definition: Core.inc.php:63
Form\addCheck
addCheck($formValidator)
Definition: Form.inc.php:395
SeriesForm\initData
initData()
Definition: SeriesForm.inc.php:60
PKPSectionForm\getSectionId
getSectionId()
Definition: PKPSectionForm.inc.php:72
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
FormValidatorCustom
Form validation check with a custom user function performing the validation check.
Definition: FormValidatorCustom.inc.php:18
PKPServices\get
static get($service)
Definition: PKPServices.inc.php:49