Example #1
0
 /**
  * Prüft, ob eine Nummer für eine Schriftenreihe bereits vergeben ist.
  *
  * Wenn die Nummer bereits vergeben ist, wird geprüft, ob es sich um das aktuelle Dokument handelt. In diesem Fall
  * ist die Validierung ebenfalls erfolgreich.
  *
  * Wenn die Series nicht gefunden werden kann soll die Validierung einfach ignoriert werden, da nicht festgestellt
  * werden kann, ob es eine Kollision gibt. Eine fehlende Series-ID im Formular muss woanders geprüft und gemeldet
  * werden.
  */
 public function isValid($value, $context = null)
 {
     $value = (string) $value;
     $this->_setValue($value);
     if (array_key_exists(Admin_Form_Document_Series::ELEMENT_SERIES_ID, $context)) {
         $seriesId = $context[Admin_Form_Document_Series::ELEMENT_SERIES_ID];
     } else {
         $seriesId = null;
     }
     if (strlen(trim($seriesId)) == 0 && is_numeric($seriesId)) {
         Zend_Registry::get('Zend_Log')->err(__METHOD__ . ' Context without \'SeriesId\'.');
         return true;
         // should be captured somewhere else
     }
     try {
         $series = new Opus_Series($seriesId);
     } catch (Opus_Model_NotFoundException $omnfe) {
         Zend_Registry::get('Zend_Log')->err(__METHOD__ . $omnfe->getMessage());
         return true;
     }
     if (!$series->isNumberAvailable($value)) {
         if (array_key_exists(Admin_Form_Document_Series::ELEMENT_DOC_ID, $context)) {
             $currentDocId = $context[Admin_Form_Document_Series::ELEMENT_DOC_ID];
             $otherDocId = $series->getDocumentIdForNumber($value);
             if ($currentDocId == $otherDocId) {
                 return true;
             }
         }
         $this->_error(self::NOT_AVAILABLE);
         return false;
     }
     return true;
 }
Example #2
0
 private function _validateSeriesNumber()
 {
     $validSeries = true;
     $series = $this->fetchSeriesFields();
     // in $series befinden sich auch die nicht vom Benutzer ausgefüllten Felder
     $seriesWithoutDefaults = array();
     foreach ($series as $key => $value) {
         if ($value != '') {
             $seriesWithoutDefaults[$key] = $value;
         }
     }
     if (count($seriesWithoutDefaults) == 0) {
         return true;
         // es wurden keine Schriftenreihen / Bandnummern ausgewählt / eingegeben
     }
     // prüfe, ob zu jedem Series-Select eine zugehörige Bandnummer existiert und umgekehrt
     foreach ($seriesWithoutDefaults as $seriesElement => $value) {
         if (strpos($seriesElement, 'Series_') === 0) {
             // Schriftenreihe gefunden: zugehörige Bandnummer erwartet
             $key = str_replace('Series_', 'SeriesNumber_', $seriesElement);
             $errorMsgPrefix = 'seriesnumber';
         } else {
             if (strpos($seriesElement, 'SeriesNumber_') === 0) {
                 // Bandnummer gefunden: zugehörige Schriftenreihe erwartet
                 $key = str_replace('SeriesNumber_', 'Series_', $seriesElement);
                 $errorMsgPrefix = 'seriesselect';
             } else {
                 $this->log->warn(__METHOD__ . " unbekanntes Schriftenreihen-Formularfeld: " . $seriesElement);
                 continue;
             }
         }
         if (!array_key_exists($key, $seriesWithoutDefaults)) {
             // Mismatch gefunden: Validierungsfehlermeldung ausgeben
             $element = $this->form->getElement($key);
             if (!is_null($element)) {
                 $element->clearErrorMessages();
                 $element->addError($this->translate('publish_error_series_missing_' . $errorMsgPrefix));
             }
             $this->log->debug(__METHOD__ . " Feld {$seriesElement} ohne zugehöriges Feld {$key}");
             $validSeries = false;
         }
     }
     foreach ($series as $fieldname => $number) {
         if (strpos($fieldname, 'SeriesNumber_') === 0 && $number != '') {
             $selectFieldName = str_replace('SeriesNumber_', 'Series_', $fieldname);
             if (key_exists($selectFieldName, $this->data)) {
                 $selectFieldValue = $this->data[$selectFieldName];
                 $matches = array();
                 if (preg_match('/^(\\d+)$/', $selectFieldValue, $matches) == 0) {
                     continue;
                 }
                 $seriesId = $matches[1];
                 $currSeries = null;
                 try {
                     $currSeries = new Opus_Series($seriesId);
                 } catch (Opus_Model_Exception $e) {
                     $this->log->err(__METHOD__ . " could not instantiate Opus_Series with id {$seriesId}", $e);
                     $validSeries = false;
                 }
                 if ($currSeries != null && !$currSeries->isNumberAvailable($number)) {
                     $this->log->debug(__METHOD__ . " : error for element {$fieldname} : serial number {$number} not available");
                     $element = $this->form->getElement($fieldname);
                     if (!is_null($element)) {
                         $element->clearErrorMessages();
                         $element->addError($this->translate('publish_error_seriesnumber_not_available'));
                     }
                     $validSeries = false;
                 }
             }
         }
     }
     return $validSeries;
 }