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