/** * 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; }
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; }