/** * Parse the XSD and update the list of search fields * * @param MetadataProfile $metadataProfile * * @return TBD */ public static function parseProfileSearchFields(MetadataProfile $metadataProfile) { $key = $metadataProfile->getSyncKey(MetadataProfile::FILE_SYNC_METADATA_DEFINITION); $xsdPath = kFileSyncUtils::getLocalFilePathForKey($key); $xPaths = kXsd::findXpathsByAppInfo($xsdPath, self::APP_INFO_SEARCH, 'true'); MetadataProfileFieldPeer::setUseCriteriaFilter(false); $profileFields = MetadataProfileFieldPeer::retrieveByMetadataProfileId($metadataProfile->getId()); MetadataProfileFieldPeer::setUseCriteriaFilter(true); // check all existing fields foreach ($profileFields as $profileField) { $xPath = $profileField->getXpath(); // field removed if (!isset($xPaths[$xPath])) { $profileField->setStatus(MetadataProfileField::STATUS_DEPRECATED); $profileField->save(); continue; } $xPathData = $xPaths[$xPath]; $profileField->setStatus(MetadataProfileField::STATUS_ACTIVE); $profileField->setMetadataProfileVersion($metadataProfile->getVersion()); if (isset($xPathData['name'])) { $profileField->setKey($xPathData['name']); } if (isset($xPathData['label'])) { $profileField->setLabel($xPathData['label']); } if (isset($xPathData['type'])) { $profileField->setType($xPathData['type']); } $profileField->save(); unset($xPaths[$xPath]); } // add new searchable fields foreach ($xPaths as $xPath => $xPathData) { $profileField = new MetadataProfileField(); $profileField->setMetadataProfileId($metadataProfile->getId()); $profileField->setMetadataProfileVersion($metadataProfile->getVersion()); $profileField->setPartnerId($metadataProfile->getPartnerId()); $profileField->setStatus(MetadataProfileField::STATUS_ACTIVE); $profileField->setXpath($xPath); if (isset($xPathData['name'])) { $profileField->setKey($xPathData['name']); } if (isset($xPathData['label'])) { $profileField->setLabel($xPathData['label']); } if (isset($xPathData['type'])) { $profileField->setType($xPathData['type']); } $profileField->save(); } // set none searchable existing fields $xPaths = kXsd::findXpathsByAppInfo($xsdPath, self::APP_INFO_SEARCH, 'false'); foreach ($profileFields as $profileField) { $xPath = $profileField->getXpath(); if (!isset($xPaths[$xPath])) { continue; } $xPathData = $xPaths[$xPath]; if (isset($xPathData['name'])) { $profileField->setKey($xPathData['name']); } if (isset($xPathData['label'])) { $profileField->setLabel($xPathData['label']); } if (isset($xPathData['type'])) { $profileField->setType($xPathData['type']); } $profileField->setStatus(MetadataProfileField::STATUS_NONE_SEARCHABLE); $profileField->setMetadataProfileVersion($metadataProfile->getVersion()); $profileField->save(); unset($xPaths[$xPath]); } // add new none searchable fields foreach ($xPaths as $xPath => $xPathData) { $profileField = new MetadataProfileField(); $profileField->setMetadataProfileId($metadataProfile->getId()); $profileField->setMetadataProfileVersion($metadataProfile->getVersion()); $profileField->setPartnerId($metadataProfile->getPartnerId()); $profileField->setStatus(MetadataProfileField::STATUS_NONE_SEARCHABLE); $profileField->setXpath($xPath); if (isset($xPathData['name'])) { $profileField->setKey($xPathData['name']); } if (isset($xPathData['label'])) { $profileField->setLabel($xPathData['label']); } if (isset($xPathData['type'])) { $profileField->setType($xPathData['type']); } $profileField->save(); } }
public static function validateProfileFields($partnerId, $xsd) { $xPaths = array_merge(kXsd::findXpathsByAppInfo($xsd, self::APP_INFO_SEARCH, 'true', false), kXsd::findXpathsByAppInfo($xsd, self::APP_INFO_SEARCH, 'false', false)); foreach ($xPaths as $xPath => $xPathData) { if ($xPathData['type'] === MetadataSearchFilter::KMC_FIELD_TYPE_METADATA_OBJECT && isset($xPathData['metadataProfileId'])) { $relatedMetadataProfileId = $xPathData['metadataProfileId']; $relatedMetadataProfile = MetadataProfilePeer::retrieveByPK($relatedMetadataProfileId); if (!$relatedMetadataProfile) { throw new kCoreException('Metadata profile id [' . $relatedMetadataProfileId . ' was not found', kCoreException::ID_NOT_FOUND, $relatedMetadataProfileId); } } } }
public static function validateMetadataProfileField($partnerId, $xsdData, $isPath, $obejctType, $metadataProfileId = null) { $additionalSearchableFieldsCounter = 0; $profileFields = MetadataProfileFieldPeer::retrieveIndexableByPartnerAndType($partnerId, $obejctType); foreach ($profileFields as $profileField) { if ($profileField->getMetadataProfileId() == $metadataProfileId) { continue; } $type = $profileField->getType(); if ($type == MetadataSearchFilter::KMC_FIELD_TYPE_DATE || $type == MetadataSearchFilter::KMC_FIELD_TYPE_INT) { $additionalSearchableFieldsCounter++; } } $xPaths = kXsd::findXpathsByAppInfo($xsdData, kMetadataManager::APP_INFO_SEARCH, 'true', $isPath); foreach ($xPaths as $xPath => $xPathData) { if (isset($xPathData['type']) && ($xPathData['type'] == MetadataSearchFilter::KMC_FIELD_TYPE_DATE || $xPathData['type'] == MetadataSearchFilter::KMC_FIELD_TYPE_INT)) { $additionalSearchableFieldsCounter++; } } $partnerLimit = MetadataPlugin::getAdditionalSearchableFieldsLimit($partnerId, $obejctType); if ($additionalSearchableFieldsCounter > $partnerLimit) { throw new APIException(MetadataErrors::EXCEEDED_ADDITIONAL_SEARCHABLE_FIELDS_LIMIT, $partnerLimit); } }