Ejemplo n.º 1
0
 /**
  * Call the callback to filter the citation. If errors occur
  * they'll be added to the citation form.
  * @param $citation Citation
  * @param $filterCallback callable
  * @param $citationStateAfterFiltering integer the state the citation will
  *  be set to after the filter was executed.
  * @param $citationForm CitationForm
  * @return Citation the filtered citation or null if an error occurred
  */
 function &_filterCitation(&$citation, &$filterCallback, $citationStateAfterFiltering, &$citationForm)
 {
     // Make sure that the citation implements the
     // meta-data schema. (We currently only support
     // NLM citation.)
     $supportedMetadataSchemas =& $citation->getSupportedMetadataSchemas();
     assert(count($supportedMetadataSchemas) == 1);
     $metadataSchema =& $supportedMetadataSchemas[0];
     assert(is_a($metadataSchema, 'NlmCitationSchema'));
     // Extract the meta-data description from the citation
     $metadataDescription =& $citation->extractMetadata($metadataSchema);
     // Let the callback build the filter network
     $filterList = call_user_func_array($filterCallback, array(&$citation, &$metadataDescription));
     // The last entry in the filter list is the
     // input data for the returned filters.
     $muxInputData =& array_pop($filterList);
     // Initialize the sample demux input data array.
     $sampleDemuxInputData = array();
     // Instantiate the citation multiplexer filter
     import('filter.GenericMultiplexerFilter');
     $citationMultiplexer = new GenericMultiplexerFilter();
     $nullVar = null;
     foreach ($filterList as $citationFilter) {
         if ($citationFilter->supports($muxInputData, $nullVar)) {
             $citationMultiplexer->addFilter($citationFilter);
             unset($citationFilter);
             // We expect one citation description per filter
             // in the multiplexer result.
             $sampleDemuxInputData[] =& $metadataDescription;
         }
     }
     // Instantiate the citation de-multiplexer filter
     import('citation.NlmCitationDemultiplexerFilter');
     $citationDemultiplexer = new NlmCitationDemultiplexerFilter();
     $citationDemultiplexer->setOriginalCitation($citation);
     // Combine multiplexer and de-multiplexer to form the
     // final citation filter network.
     import('filter.GenericSequencerFilter');
     $citationFilterNet = new GenericSequencerFilter();
     $citationFilterNet->addFilter($citationMultiplexer, $muxInputData);
     $citationFilterNet->addFilter($citationDemultiplexer, $sampleDemuxInputData);
     // Send the input through the citation filter network.
     $filterErrors = array();
     $filteredCitation =& $citationFilterNet->execute($muxInputData);
     if (!is_null($filteredCitation)) {
         // Copy unfiltered data from the original citation to the filtered citation
         $article =& $this->getArticle();
         $filteredCitation->setId($citation->getId());
         $filteredCitation->setAssocId($article->getId());
         $filteredCitation->setAssocType(ASSOC_TYPE_ARTICLE);
         $filteredCitation->setRawCitation($citation->getRawCitation());
         $filteredCitation->setEditedCitation($citation->getEditedCitation());
         // Set the citation state
         $filteredCitation->setCitationState($citationStateAfterFiltering);
     }
     return $filteredCitation;
 }
Ejemplo n.º 2
0
 /**
  * Identify the requested citation, call the given callback to filter
  * it, persist it and re-display it in the citation form.
  * @param $request PKPRequest
  * @param $args array
  * @param $filterCallback callable
  * @param $citationStateAfterFiltering integer the state the citation will
  *  be set to after the filter was executed.
  * @return string
  */
 function &_filterCitation(&$request, $args, &$filterCallback, $citationStateAfterFiltering)
 {
     // Identify the citation to be filtered
     $citation =& $this->_getCitationFromArgs($args);
     // Make sure that the citation implements the
     // meta-data schema. (We currently only support
     // NLM citation.)
     $supportedMetadataSchemas =& $citation->getSupportedMetadataSchemas();
     assert(count($supportedMetadataSchemas) == 1);
     $metadataSchema =& $supportedMetadataSchemas[0];
     assert(is_a($metadataSchema, 'NlmCitationSchema'));
     // Extract the meta-data description from the citation
     $metadataDescription =& $citation->extractMetadata($metadataSchema);
     // Let the callback build the filter network
     $filterList = call_user_func($filterCallback, $citation, $metadataDescription);
     // The last entry in the filter list is the
     // input data for the returned filters.
     $muxInputData =& array_pop($filterList);
     // Initialize the sample demux input data array.
     $sampleDemuxInputData = array();
     // Instantiate the citation multiplexer filter
     import('filter.GenericMultiplexerFilter');
     $citationMultiplexer = new GenericMultiplexerFilter();
     $nullVar = null;
     foreach ($filterList as $citationFilter) {
         if ($citationFilter->supports($muxInputData, $nullVar)) {
             $citationMultiplexer->addFilter($citationFilter);
             unset($citationFilter);
             // We expect one citation description per filter
             // in the multiplexer result.
             $sampleDemuxInputData[] =& $metadataDescription;
         }
     }
     // Instantiate the citation de-multiplexer filter
     import('citation.NlmCitationDemultiplexerFilter');
     $citationDemultiplexer = new NlmCitationDemultiplexerFilter();
     $citationDemultiplexer->setOriginalCitation($citation);
     // Combine multiplexer and de-multiplexer to form the
     // final citation filter network.
     import('filter.GenericSequencerFilter');
     $citationFilterNet = new GenericSequencerFilter();
     $citationFilterNet->addFilter($citationMultiplexer, $muxInputData);
     $citationFilterNet->addFilter($citationDemultiplexer, $sampleDemuxInputData);
     // Send the input through the citation filter network.
     $filterErrors = array();
     $filteredCitation =& $citationFilterNet->execute($muxInputData);
     if (is_null($filteredCitation)) {
         // Re-display the current citation unchanged with an error message
         $filterErrors = array('editedCitation' => Locale::translate('submission.citations.form.filterError'));
         $filteredCitation =& $citation;
     } else {
         // Copy unfiltered data from the original citation to the filtered citation
         $article =& $this->getArticle();
         $filteredCitation->setId($citation->getId());
         $filteredCitation->setAssocId($article->getId());
         $filteredCitation->setAssocType(ASSOC_TYPE_ARTICLE);
         $filteredCitation->setRawCitation($citation->getRawCitation());
         $filteredCitation->setEditedCitation($citation->getEditedCitation());
         // Set the citation state
         $filteredCitation->setCitationState($citationStateAfterFiltering);
         // Persist the filtered citation
         $citationDAO =& DAORegistry::getDAO('CitationDAO');
         $citationDAO->updateCitation($filteredCitation);
     }
     // Re-display the form
     import('controllers.grid.citation.form.CitationForm');
     $citationForm = new CitationForm($filteredCitation);
     foreach ($filterErrors as $field => $message) {
         $citationForm->addError($field, $message);
     }
     $citationForm->initData();
     $citationForm->display($request);
     // The form has already been displayed.
     $emptyString = '';
     return $emptyString;
 }