/** * @see Editor_Models_ConceptValidator::validate($concept) */ public function isValid(Editor_Models_Concept $concept, $extraData) { $this->_setField('prefLabel'); $isValid = true; if (isset($concept['inScheme']) && !empty($concept['inScheme'])) { // Get all pref labels for all languages. $prefLabels = array(); $languages = $concept->getConceptLanguages(); foreach ($languages as $lang) { if (isset($concept['prefLabel@' . $lang])) { $prefLabels = array_merge($prefLabels, $concept['prefLabel@' . $lang]); } } $query = 'prefLabel:("' . implode('" OR "', $prefLabels) . '")'; $query .= ' inScheme:("' . implode('" OR "', $concept['inScheme']) . '")'; if (isset($concept['tenant']) && !empty($concept['tenant'])) { $query .= ' tenant:' . $concept['tenant']; } elseif (null !== ($tenant = OpenSKOS_Db_Table_Tenants::fromIdentity())) { $query .= ' tenant:' . $tenant->code; } $query .= ' -uuid:"' . $concept['uuid'] . '"'; $response = Api_Models_Concepts::factory()->setQueryParams(array('rows' => 0))->getConcepts($query); if ($response['response']['numFound'] > 0) { $isValid = false; } } if (!$isValid) { $this->_setErrorMessage(_('There is already a concept with same preferred label in one of the schemes.')); } return $isValid; }
/** * Handles tsome automated actions for when status is changed. * @param Editor_Models_Concept $concept * @param array $formData * @param array $extraData */ protected function _handleStatusAutomatedActions(Editor_Models_Concept $concept, &$formData, $extraData) { if (isset($extraData['statusOtherConcept']) && !empty($extraData['statusOtherConcept'])) { $otherConcept = null; $otherConceptResponse = Api_Models_Concepts::factory()->getConcepts('uuid:' . $extraData['statusOtherConcept']); if (isset($otherConceptResponse['response']['docs']) || 1 === count($otherConceptResponse['response']['docs'])) { $otherConcept = new Editor_Models_Concept(new Api_Models_Concept(array_shift($otherConceptResponse['response']['docs']))); } if ($otherConcept !== null) { if ($extraData['status'] == OpenSKOS_Concept_Status::REDIRECTED || $extraData['status'] == OpenSKOS_Concept_Status::OBSOLETE) { foreach ($concept->getConceptLanguages() as $lang) { $existingChangeNotes = []; if (isset($formData['changeNote@' . $lang])) { $existingChangeNotes = $formData['changeNote@' . $lang]; } $newChangeNotes = [_('Forward') . ': ' . $otherConcept['uri']]; $formData['changeNote@' . $lang] = array_unique(array_merge($existingChangeNotes, $newChangeNotes)); } } if ($extraData['status'] == OpenSKOS_Concept_Status::REDIRECTED) { $otherConceptUpdateData = []; foreach ($concept->getConceptLanguages() as $lang) { $labelToFill = $extraData['statusOtherConceptLabelToFill']; $existingLabels = $otherConcept[$labelToFill . '@' . $lang]; if (empty($existingLabels)) { $existingLabels = []; } $newLabels = []; if (isset($formData['prefLabel@' . $lang])) { $newLabels = $formData['prefLabel@' . $lang]; } $otherConceptUpdateData[$labelToFill . '@' . $lang] = array_unique(array_merge($existingLabels, $newLabels)); } $otherConcept->update($otherConceptUpdateData, ['modified_by' => $this->getCurrentUser()->id, 'modified_timestamp' => date("Y-m-d\\TH:i:s\\Z")], true, true); } } } }