/**
  * Display object metadata on the article abstract pages.
  * @param $hookName string (Templates::Article::MoreInfo)
  * @param $args array
  * @return boolean false to continue processing subsequent hooks
  */
 function displayAbstract($hookName, $params)
 {
     $smarty =& $params[1];
     $output =& $params[2];
     // Get the journal and the article
     $journal =& Request::getJournal();
     $journalId = $journal->getId();
     $article = $smarty->get_template_vars('article');
     $pubObject = $smarty->get_template_vars('pubObject');
     // Only consider the abstract page
     if ($article && is_a($pubObject, 'Article')) {
         // Get the assignemnts for this article
         $objectsForReview = array();
         $ofrDao =& DAORegistry::getDAO('ObjectForReviewDAO');
         $ofrAssignmentDao =& DAORegistry::getDAO('ObjectForReviewAssignmentDAO');
         $objectForReviewAssignments =& $ofrAssignmentDao->getAllBySubmissionId($article->getId());
         foreach ($objectForReviewAssignments as $objectForReviewAssignment) {
             $objectForReview = $ofrDao->getById($objectForReviewAssignment->getObjectId(), $journalId);
             $objectsForReview[] = $objectForReview;
         }
         if (!empty($objectsForReview)) {
             // Get metadata for the review type
             $reviewObjectTypeDao =& DAORegistry::getDAO('ReviewObjectTypeDAO');
             $allTypes =& $reviewObjectTypeDao->getTypeIdsAlphabetizedByContext($journalId);
             $reviewObjectMetadataDao =& DAORegistry::getDAO('ReviewObjectMetadataDAO');
             $allReviewObjectsMetadata = array();
             foreach ($allTypes as $type) {
                 $typeId = $type['typeId'];
                 $typeMetadata = $reviewObjectMetadataDao->getArrayByReviewObjectTypeId($typeId);
                 $allReviewObjectsMetadata[$typeId] = $typeMetadata;
             }
             $publicFileManager = new PublicFileManager();
             $coverPagePath = Request::getBaseUrl() . '/';
             $coverPagePath .= $publicFileManager->getJournalFilesPath($journalId) . '/';
             $smarty->assign('coverPagePath', $coverPagePath);
             $smarty->assign('objectsForReview', $objectsForReview);
             $smarty->assign('allReviewObjectsMetadata', $allReviewObjectsMetadata);
             $smarty->assign('multipleOptionsTypes', ReviewObjectMetadata::getMultipleOptionsTypes());
             $smarty->assign('ofrListing', true);
             $smarty->assign('ofrTemplatePath', $this->getTemplatePath());
             $output .= $smarty->fetch($this->getTemplatePath() . 'articleObjectsForReview.tpl');
         }
     }
     return false;
 }
 /**
  * Public view object for review details.
  * @param $args array
  * @param $request PKPRequest
  */
 function viewObjectForReview($args, &$request)
 {
     // Ensure the args (object ID) exists
     $objectId = array_shift($args);
     if (!$objectId) {
         $request->redirect(null, 'objectsForReview');
     }
     $journal =& $request->getJournal();
     $journalId = $journal->getId();
     // Ensure the object exists
     $ofrDao =& DAORegistry::getDAO('ObjectForReviewDAO');
     $objectForReview =& $ofrDao->getById($objectId, $journalId);
     if (!isset($objectForReview)) {
         $request->redirect(null, 'objectsForReview');
     }
     // If object is available
     if ($objectForReview->getAvailable()) {
         // Get all metadata for the objects for review
         $reviewObjectTypeDao =& DAORegistry::getDAO('ReviewObjectTypeDAO');
         $allTypes =& $reviewObjectTypeDao->getTypeIdsAlphabetizedByContext($journalId);
         $reviewObjectMetadataDao =& DAORegistry::getDAO('ReviewObjectMetadataDAO');
         $allReviewObjectsMetadata = array();
         foreach ($allTypes as $type) {
             $typeId = $type['typeId'];
             $typeMetadata = $reviewObjectMetadataDao->getArrayByReviewObjectTypeId($typeId);
             $allReviewObjectsMetadata[$typeId] = $typeMetadata;
         }
         // If the user is an author get her/his assignments
         $isAuthor = Validation::isAuthor();
         if ($isAuthor) {
             $user =& $request->getUser();
             $ofrAssignmentDao =& DAORegistry::getDAO('ObjectForReviewAssignmentDAO');
             $authorAssignments = $ofrAssignmentDao->getObjectIds($user->getId());
         }
         $this->setupTemplate($request, true);
         $templateMgr =& TemplateManager::getManager($request);
         $templateMgr->assign('objectForReview', $objectForReview);
         $templateMgr->assign('allReviewObjectsMetadata', $allReviewObjectsMetadata);
         $templateMgr->assign('isAuthor', $isAuthor);
         $templateMgr->assign('authorAssignments', $authorAssignments);
         // Cover page path
         import('classes.file.PublicFileManager');
         $publicFileManager = new PublicFileManager();
         $coverPagePath = $request->getBaseUrl() . '/';
         $coverPagePath .= $publicFileManager->getJournalFilesPath($journalId) . '/';
         $templateMgr->assign('coverPagePath', $coverPagePath);
         $ofrPlugin =& $this->_getObjectsForReviewPlugin();
         $ofrPlugin->import('classes.ReviewObjectMetadata');
         $templateMgr->assign('multipleOptionsTypes', ReviewObjectMetadata::getMultipleOptionsTypes());
         $templateMgr->assign('locale', AppLocale::getLocale());
         $templateMgr->assign('ofrListing', false);
         $templateMgr->assign('ofrTemplatePath', $ofrPlugin->getTemplatePath());
         $templateMgr->display($ofrPlugin->getTemplatePath() . 'objectForReview.tpl');
     } else {
         $request->redirect(null, 'objectsForReview');
     }
 }
 /**
  * @see Form::execute()
  */
 function execute()
 {
     $ofrPlugin =& PluginRegistry::getPlugin('generic', $this->parentPluginName);
     $journal =& Request::getJournal();
     $journalId = $journal->getId();
     $ofrPlugin->import('classes.ReviewObjectType');
     $reviewObjectTypeDao =& DAORegistry::getDAO('ReviewObjectTypeDAO');
     if ($this->reviewObjectType == null) {
         $reviewObjectType = $reviewObjectTypeDao->newDataObject();
         $reviewObjectType->setContextId($journalId);
         $reviewObjectType->setActive(0);
     } else {
         $reviewObjectType =& $this->reviewObjectType;
     }
     $reviewObjectType->setName($this->getData('name'), null);
     // Localized
     $reviewObjectType->setDescription($this->getData('description'), null);
     // Localized
     if ($reviewObjectType->getId() != null) {
         $reviewObjectTypeDao->updateObject($reviewObjectType);
     } else {
         //install common metadata
         $ofrPlugin->import('classes.ReviewObjectMetadata');
         $multipleOptionsTypes = ReviewObjectMetadata::getMultipleOptionsTypes();
         $dtdTypes = ReviewObjectMetadata::getMetadataDTDTypes();
         $reviewObjectMetadataDao =& DAORegistry::getDAO('ReviewObjectMetadataDAO');
         $reviewObjectMetadataArray = array();
         $availableLocales = $journal->getSupportedLocaleNames();
         foreach ($availableLocales as $locale => $localeName) {
             $xmlDao = new XMLDAO();
             $commonDataPath = $ofrPlugin->getPluginPath() . DIRECTORY_SEPARATOR . 'xml' . DIRECTORY_SEPARATOR . 'commonMetadata.xml';
             $commonData = $xmlDao->parse($commonDataPath);
             $commonMetadata = $commonData->getChildByName('objectMetadata');
             foreach ($commonMetadata->getChildren() as $metadataNode) {
                 $key = $metadataNode->getAttribute('key');
                 if (array_key_exists($key, $reviewObjectMetadataArray)) {
                     $reviewObjectMetadata = $reviewObjectMetadataArray[$key];
                 } else {
                     $reviewObjectMetadata = $reviewObjectMetadataDao->newDataObject();
                     $reviewObjectMetadata->setSequence(REALLY_BIG_NUMBER);
                     $metadataType = $dtdTypes[$metadataNode->getAttribute('type')];
                     $reviewObjectMetadata->setMetadataType($metadataType);
                     $required = $metadataNode->getAttribute('required');
                     $reviewObjectMetadata->setRequired($required == 'true' ? 1 : 0);
                     $display = $metadataNode->getAttribute('display');
                     $reviewObjectMetadata->setDisplay($display == 'true' ? 1 : 0);
                 }
                 $name = __($metadataNode->getChildValue('name'), array(), $locale);
                 $reviewObjectMetadata->setName($name, $locale);
                 if ($key == 'role') {
                     $reviewObjectMetadata->setPossibleOptions($this->getData('possibleOptions'), null);
                     // Localized
                 } else {
                     if (in_array($reviewObjectMetadata->getMetadataType(), $multipleOptionsTypes)) {
                         $selectionOptions = $metadataNode->getChildByName('selectionOptions');
                         $possibleOptions = array();
                         $index = 1;
                         foreach ($selectionOptions->getChildren() as $selectionOptionNode) {
                             $possibleOptions[] = array('order' => $index, 'content' => __($selectionOptionNode->getValue(), array(), $locale));
                             $index++;
                         }
                         $reviewObjectMetadata->setPossibleOptions($possibleOptions, $locale);
                     } else {
                         $reviewObjectMetadata->setPossibleOptions(null, null);
                     }
                 }
                 $reviewObjectMetadataArray[$key] = $reviewObjectMetadata;
             }
         }
         $reviewObjectTypeId = $reviewObjectTypeDao->insertObject($reviewObjectType);
         // insert review object metadata
         foreach ($reviewObjectMetadataArray as $key => $reviewObjectMetadata) {
             $reviewObjectMetadata->setReviewObjectTypeId($reviewObjectTypeId);
             $reviewObjectMetadata->setKey($key);
             $reviewObjectMetadataDao->insertObject($reviewObjectMetadata);
             $reviewObjectMetadataDao->resequence($reviewObjectTypeId);
         }
     }
 }
 /**
  * @see Form::execute()
  */
 function execute()
 {
     $ofrPlugin =& PluginRegistry::getPlugin('generic', $this->parentPluginName);
     $journal =& Request::getJournal();
     $journalId = $journal->getId();
     $ofrPlugin->import('classes.ReviewObjectMetadata');
     $reviewObjectMetadataDao =& DAORegistry::getDAO('ReviewObjectMetadataDAO');
     if ($this->reviewObjectMetadata == null) {
         $reviewObjectMetadata = $reviewObjectMetadataDao->newDataObject();
         $reviewObjectMetadata->setReviewObjectTypeId($this->reviewObjectTypeId);
         $reviewObjectMetadata->setSequence(REALLY_BIG_NUMBER);
     } else {
         $reviewObjectMetadata =& $this->reviewObjectMetadata;
     }
     $reviewObjectMetadata->setName($this->getData('name'), null);
     // Localized
     $reviewObjectMetadata->setRequired($this->getData('required') ? 1 : 0);
     $reviewObjectMetadata->setDisplay($this->getData('display') ? 1 : 0);
     $reviewObjectMetadata->setMetadataType($this->getData('metadataType'));
     if (in_array($this->getData('metadataType'), ReviewObjectMetadata::getMultipleOptionsTypes())) {
         $reviewObjectMetadata->setPossibleOptions($this->getData('possibleOptions'), null);
         // Localized
     } else {
         $reviewObjectMetadata->setPossibleOptions(null, null);
     }
     if ($reviewObjectMetadata->getId() != null) {
         $reviewObjectMetadataDao->deleteSetting($reviewObjectMetadata->getId(), 'possibleOptions');
         $reviewObjectMetadataDao->updateObject($reviewObjectMetadata);
     } else {
         $reviewObjectMetadataDao->insertObject($reviewObjectMetadata);
         $reviewObjectMetadataDao->resequence($this->reviewObjectTypeId);
     }
 }
 /**
  * Update or install review objects
  * @param $journal Journal
  * @param $reviewObjects array of review object types keys or ids
  * @param $locales array of locales
  * @param $action string (install or update)
  */
 function _updateOrInstallReviewObjectTypes($journal, $reviewObjects, $locales, $action)
 {
     $plugin =& $this->_getObjectsForReviewPlugin();
     if (!isset($journal) || !isset($reviewObjects) || !isset($locales) || !isset($action)) {
         return false;
     }
     $journalId = $journal->getId();
     $plugin->import('classes.ReviewObjectType');
     $plugin->import('classes.ReviewObjectMetadata');
     $reviewObjectTypeDao =& DAORegistry::getDAO('ReviewObjectTypeDAO');
     $reviewObjectMetadataDao =& DAORegistry::getDAO('ReviewObjectMetadataDAO');
     $onlyCommonMetadata = false;
     foreach ($reviewObjects as $keyOrId) {
         if ($action == 'install') {
             // Create a new review object type
             $reviewObjectType = $reviewObjectTypeDao->newDataObject();
             $reviewObjectType->setContextId($journalId);
             $reviewObjectType->setActive(0);
             $reviewObjectType->setKey($keyOrId);
         } elseif ($action == 'update') {
             // Get the review object type
             $reviewObjectType =& $reviewObjectTypeDao->getById($keyOrId, $journalId);
             if (!isset($reviewObjectType)) {
                 return false;
             }
             // If the type was created by the user, update only the common metadata
             if ($reviewObjectType->getKey() == NULL) {
                 $onlyCommonMetadata = true;
             }
         }
         // Callect the metadata in the array
         $reviewObjectMetadataArray = array();
         // For all languages
         foreach ($locales as $locale) {
             // Register the locale/translation file
             $localePath = $plugin->getPluginPath() . '/locale/' . $locale . '/locale.xml';
             AppLocale::registerLocaleFile($locale, $localePath, true);
             $xmlDao = new XMLDAO();
             // Get common metadata
             $commonDataPath = $plugin->getPluginPath() . '/xml/commonMetadata.xml';
             $commonData = $xmlDao->parse($commonDataPath);
             $commonMetadata = $commonData->getChildByName('objectMetadata');
             $allMetadataChildren = $commonMetadata->getChildren();
             // Get the object metadata
             if (!$onlyCommonMetadata) {
                 // Parse the review object XML file
                 $itemPath = $plugin->getPluginPath() . '/xml/reviewObjects/' . $reviewObjectType->getKey() . '.xml';
                 $data = $xmlDao->parse($itemPath);
                 if (!$data) {
                     return false;
                 }
                 // Set the review object name
                 $itemTypeName = __($data->getChildValue('objectType'), array(), $locale);
                 $reviewObjectType->setName($itemTypeName, $locale);
                 // $reviewObjectType->setDescription($itemTypeNameDescription, $locale);
                 // Get the review object role selection options
                 $roleSelectionOptions = $data->getChildByName('roleSelectionOptions');
                 // Handle Metadata
                 // Get multiple options metadata types
                 $multipleOptionsTypes = ReviewObjectMetadata::getMultipleOptionsTypes();
                 // Get metadata types defined in DTD
                 $dtdTypes = ReviewObjectMetadata::getMetadataDTDTypes();
                 // Get the review object metadata
                 $itemMetadata = $data->getChildByName('objectMetadata');
                 // Merge all (common + review objec) metadata
                 $allMetadataChildren = array_merge($commonMetadata->getChildren(), $itemMetadata->getChildren());
             }
             // Go through the metadata
             foreach ($allMetadataChildren as $metadataNode) {
                 $key = $metadataNode->getAttribute('key');
                 // If we have already went througt, collected/considered the metadata
                 if (array_key_exists($key, $reviewObjectMetadataArray)) {
                     $reviewObjectMetadata = $reviewObjectMetadataArray[$key];
                 } else {
                     if ($action == 'update') {
                         // Get the metadata
                         $reviewObjectMetadata = $reviewObjectMetadataDao->getByKey($key, $reviewObjectType->getId());
                     }
                     if ($action == 'install' || !isset($reviewObjectMetadata)) {
                         // Create a new metadata
                         $reviewObjectMetadata = $reviewObjectMetadataDao->newDataObject();
                         $reviewObjectMetadata->setSequence(REALLY_BIG_NUMBER);
                         $metadataType = $dtdTypes[$metadataNode->getAttribute('type')];
                         $reviewObjectMetadata->setMetadataType($metadataType);
                         $required = $metadataNode->getAttribute('required');
                         $reviewObjectMetadata->setRequired($required == 'true' ? 1 : 0);
                         $display = $metadataNode->getAttribute('display');
                         $reviewObjectMetadata->setDisplay($display == 'true' ? 1 : 0);
                     }
                 }
                 // Set metadata name
                 $name = __($metadataNode->getChildValue('name'), array(), $locale);
                 $reviewObjectMetadata->setName($name, $locale);
                 // Set roles options
                 if ($key == REVIEW_OBJECT_METADATA_KEY_ROLE) {
                     if (!$onlyCommonMetadata) {
                         $possibleOptions = array();
                         $index = 1;
                         foreach ($roleSelectionOptions->getChildren() as $selectionOptionNode) {
                             $possibleOptions[] = array('order' => $index, 'content' => __($selectionOptionNode->getValue(), array(), $locale));
                             $index++;
                         }
                         $reviewObjectMetadata->setPossibleOptions($possibleOptions, $locale);
                     }
                 } else {
                     // Set possible options for multiple options metadata type
                     if (in_array($reviewObjectMetadata->getMetadataType(), $multipleOptionsTypes)) {
                         $selectionOptions = $metadataNode->getChildByName('selectionOptions');
                         $possibleOptions = array();
                         $index = 1;
                         foreach ($selectionOptions->getChildren() as $selectionOptionNode) {
                             $possibleOptions[] = array('order' => $index, 'content' => __($selectionOptionNode->getValue(), array(), $locale));
                             $index++;
                         }
                         $reviewObjectMetadata->setPossibleOptions($possibleOptions, $locale);
                     } else {
                         $reviewObjectMetadata->setPossibleOptions(null, null);
                     }
                 }
                 // Collect/consider the metadata
                 $reviewObjectMetadataArray[$key] = $reviewObjectMetadata;
                 unset($reviewObjectMetadata);
             }
             // End foreach metadata
         }
         // End foreach locales
         // Insert resp. update the review object type
         if ($action == 'install') {
             $reviewObjectTypeId = $reviewObjectTypeDao->insertObject($reviewObjectType);
         } elseif ($action == 'update') {
             $reviewObjectTypeDao->updateObject($reviewObjectType);
         }
         // Insert resp. update review object metadata
         foreach ($reviewObjectMetadataArray as $key => $reviewObjectMetadata) {
             // if this is a new metadata insert it
             if ($reviewObjectMetadata->getKey() == '') {
                 $reviewObjectMetadata->setKey($key);
                 $reviewObjectMetadata->setReviewObjectTypeId($reviewObjectType->getId());
                 $reviewObjectMetadataDao->insertObject($reviewObjectMetadata);
                 $reviewObjectMetadataDao->resequence($reviewObjectType->getId());
             } else {
                 $reviewObjectMetadataDao->updateObject($reviewObjectMetadata);
             }
         }
         unset($reviewObjectType);
     }
     // End foreach review objects
 }