/** * description * * @return string */ public function getRelatedConcept() { $concept = ConceptPeer::retrieveByPK($this->getRelatedConceptId()); if ($concept) { return $concept->getPrefLabel(); } }
public function __construct(\Vocabulary $vocab) { $this->itemArray["@context"] = "http://rdaregistry.info/Contexts/concepts_langmap.jsonld"; $this->vocab = $vocab; $this->setReleaseFromGithub(); $this->vocabArray["@id"] = $vocab->getUri(); $this->vocabArray["@type"] = "ConceptScheme"; $this->vocabArray['title'] = [$vocab->getLanguage() => $vocab->getName()]; $this->vocabArray['description'] = [$vocab->getLanguage() => $vocab->getNote()]; $this->vocabArray["token"] = $vocab->getToken(); $this->vocabArray["prefix"] = $vocab->getPrefix(); $status = \ConceptPeer::getConceptByUri($vocab->getStatus()->getUri()); $this->vocabArray['status'] = ["@id" => $status->getUri(), "label" => $status->getPrefLabel()]; $this->vocabArray['omr_api'] = "http://api.metadataregistry.org/vocabularies/" . $vocab->getId(); $this->vocabArray['omr_home'] = "http://metadataregistry.org/vocabulary/show/id/" . $vocab->getId() . ".html"; $this->vocabArray['documentation'] = $vocab->getUrl(); $this->vocabArray['tags'] = ["en" => $this->getTags($this->vocab->getCommunity())]; $this->vocabArray["count"] = $vocab->countConcepts(); $this->vocabArray["languages"] = $this->getLanguages($vocab->getLanguages()); $this->vocabArray["dateOfPublication"] = $this->getDateOfPublication(); $this->itemArray["@graph"][] = $this->vocabArray; $concepts = $this->getConcepts(); if ($concepts) { foreach ($concepts as $concept) { $this->itemArray["@graph"][] = $this->getConceptPropertyArray($concept); } } }
/** * @return Status[] */ public static function getStatusArray() { $statusArray = []; $c = new Criteria(); $c->addJoin(StatusPeer::DISPLAY_NAME, ConceptPeer::PREF_LABEL); $c->add(ConceptPeer::VOCABULARY_ID, 31); StatusPeer::addSelectColumns($c); ConceptPeer::addSelectColumns($c); $stati = StatusPeer::doSelectRS($c); /** @var Status[] $stati */ foreach ($stati as $stat) { $statusArray[$stat[0]] = $stat; } return $statusArray; }
/** * creates a link to related concept * * @return none * @param conceptproperty $property */ function link_to_related($property) { $relConceptId = $property->getRelatedConceptId(); if ($relConceptId) { //get the related concept $relConcept = ConceptPeer::retrieveByPK($relConceptId); if ($relConcept) { return link_to($relConcept->getPrefLabel(), 'concept/show/?id=' . $relConceptId); } } //If the skosProperty.objectType is resource then we display a truncated URI with a complete link_to if ($property->getProfileProperty()->getIsObjectProp()) { return link_to(truncate_text($property->getObject(), 30), $property->getObject()); } //if all else fails we display a truncated = 30 value return truncate_text($property->getObject(), 30); }
public function execute(&$value, &$error) { $conceptId = $this->getContext()->getRequest()->getParameter('id'); $c = new Criteria(); $c->add(ConceptPeer::URI, $value); $object = ConceptPeer::doSelectOne($c); if ($object) { //check to see if the retrieved object has the same id if ($conceptId && $object->getId() == $conceptId) { return true; } else { $error = $this->getParameter('unique_error'); return false; } } return true; }
/** * Set the defaults * * @param ConceptProperty $concept_property */ public function setDefaults($discuss) { $action = $this->getRequest()->getParameter('action'); if ('create' == strtolower($action)) { $filter = $this->getUser()->getAttributeHolder()->getAll('sf_admin/discuss/filters'); //we need to get all the numbers if ($filter && is_array($filter)) { $filterKey = array_keys($filter); try { switch ($filterKey[0]) { case "property": $property = ConceptPropertyPeer::retrieveByPK($filter[$filterKey[0]]); $concept = $property->getConceptRelatedByConceptId(); $vocabId = $concept->getVocabularyId(); $vocabulary = myActionTools::findCurrentVocabulary(); /** @var Discuss **/ $discuss->setConceptProperty($property); $discuss->setConcept($concept); $discuss->setVocabularyId($vocabId); break; case "concept_id": $concept = ConceptPeer::retrieveByPK($filter[$filterKey[0]]); $vocabId = $concept->getVocabularyId(); /** @var Discuss **/ $discuss->setConcept($concept); $discuss->setVocabularyId($vocabId); case "vocabulary_id": $vocabId = VocabularyPeer::retrieveByPK($filter[$filterKey[0]]); /** @var Discuss **/ $discuss->setVocabularyId($vocabId); break; default: } } catch (Exception $e) { } } } else { } parent::setDefaults($discuss); }
/** * @param int $vocabularyId * @return array */ public static function getNamespaceList($vocabularyId) { $namespaces = array(); $c = new Criteria(); $c->clearSelectColumns(); $c->addSelectColumn(ConceptPropertyPeer::OBJECT); $c->add(ConceptPropertyPeer::OBJECT, "http%", Criteria::LIKE); $c->add(ConceptPeer::VOCABULARY_ID, $vocabularyId); $c->addJoin(ConceptPropertyPeer::CONCEPT_ID, ConceptPeer::ID); $result = self::doSelectRS($c); self::getNamespaceUris($result, 'getObject', $namespaces); $c = new Criteria(); $c->clearSelectColumns(); $c->addSelectColumn(ConceptPeer::URI); $c->add(ConceptPeer::VOCABULARY_ID, $vocabularyId); $result = ConceptPeer::doSelectRS($c); self::getNamespaceUris($result, 'getUri', $namespaces); return $namespaces; }
/** * Populates the object using an array. * * This is particularly useful when populating an object from one of the * request arrays (e.g. $_POST). This method goes through the column * names, checking to see whether a matching key exists in populated * array. If so the setByName() method is called for that column. * * You can specify the key type of the array by additionally passing one * of the class type constants TYPE_PHPNAME, TYPE_COLNAME, TYPE_FIELDNAME, * TYPE_NUM. The default key type is the column's phpname (e.g. 'authorId') * * @param array $arr An array to populate the object from. * @param string $keyType The type of keys the array uses. * @return void */ public function fromArray($arr, $keyType = BasePeer::TYPE_PHPNAME) { $keys = ConceptPeer::getFieldNames($keyType); if (array_key_exists($keys[0], $arr)) { $this->setId($arr[$keys[0]]); } if (array_key_exists($keys[1], $arr)) { $this->setCreatedAt($arr[$keys[1]]); } if (array_key_exists($keys[2], $arr)) { $this->setUpdatedAt($arr[$keys[2]]); } if (array_key_exists($keys[3], $arr)) { $this->setDeletedAt($arr[$keys[3]]); } if (array_key_exists($keys[4], $arr)) { $this->setLastUpdated($arr[$keys[4]]); } if (array_key_exists($keys[5], $arr)) { $this->setCreatedUserId($arr[$keys[5]]); } if (array_key_exists($keys[6], $arr)) { $this->setUpdatedUserId($arr[$keys[6]]); } if (array_key_exists($keys[7], $arr)) { $this->setUri($arr[$keys[7]]); } if (array_key_exists($keys[8], $arr)) { $this->setPrefLabel($arr[$keys[8]]); } if (array_key_exists($keys[9], $arr)) { $this->setVocabularyId($arr[$keys[9]]); } if (array_key_exists($keys[10], $arr)) { $this->setIsTopConcept($arr[$keys[10]]); } if (array_key_exists($keys[11], $arr)) { $this->setPrefLabelId($arr[$keys[11]]); } if (array_key_exists($keys[12], $arr)) { $this->setStatusId($arr[$keys[12]]); } if (array_key_exists($keys[13], $arr)) { $this->setLanguage($arr[$keys[13]]); } }
/** * Retrieve multiple objects by pkey. * * @param array $pks List of primary keys * @param Connection $con the connection to use * @throws PropelException Any exceptions caught during processing will be * rethrown wrapped into a PropelException. */ public static function retrieveByPKs($pks, $con = null) { if ($con === null) { $con = Propel::getConnection(self::DATABASE_NAME); } $objs = null; if (empty($pks)) { $objs = array(); } else { $criteria = new Criteria(); $criteria->add(ConceptPeer::ID, $pks, Criteria::IN); $objs = ConceptPeer::doSelect($criteria, $con); } return $objs; }
/** * Get the associated Concept object * * @param Connection Optional Connection object. * @return Concept The associated Concept object. * @throws PropelException */ public function getConceptRelatedByRelatedConceptId($con = null) { if ($this->aConceptRelatedByRelatedConceptId === null && $this->related_concept_id !== null) { // include the related Peer class include_once 'lib/model/om/BaseConceptPeer.php'; $this->aConceptRelatedByRelatedConceptId = ConceptPeer::retrieveByPK($this->related_concept_id, $con); /* The following can be used instead of the line above to guarantee the related object contains a reference to this object, but this level of coupling may be undesirable in many circumstances. As it can lead to a db query with many results that may never be used. $obj = ConceptPeer::retrieveByPK($this->related_concept_id, $con); $obj->addConceptsRelatedByRelatedConceptId($this); */ } return $this->aConceptRelatedByRelatedConceptId; }
/** * description * * @return Concept Current concept object * @param integer $vocabId */ public static function setLatestConcept($vocabId) { $vocabObj = ConceptPeer::retrieveByPK($vocabId); sfContext::getInstance()->getUser()->setCurrentConcept($vocabObj); return $vocabObj; }
/** * Selects a collection of Concept objects filtered by history timestamp. * * @param integer $vocabularyId * @param date $ts The timestamp * @return array Array of Concept objects. * @throws PropelException Any exceptions caught during processing will be * rethrown wrapped into a PropelException. */ public static function doSelectConceptByHistoryTimestamp($vocabularyId, $ts) { $c = new Criteria(); $c->addJoin(ConceptPeer::ID, ConceptPropertyHistoryPeer::CONCEPT_ID); $c->setDistinct(); $c->add(ConceptPeer::VOCABULARY_ID, $vocabularyId); $c->add(ConceptPropertyHistoryPeer::CREATED_AT, $ts, Criteria::LESS_EQUAL); $c->add(ConceptPropertyHistoryPeer::ACTION, 'deleted', Criteria::NOT_EQUAL); $results = ConceptPeer::populateObjects(ConceptPeer::doSelectRS($c)); return $results; }
public function write() { $adapter = new Adapter("/"); $filesystem = new Filesystem($adapter); if ( ! $filesystem->has($this->path)) { $filesystem->createDir($this->path); } $filename = $this->path . $this->getFileName(); $writer = new CsvWriter( "," ); $writer->setStream( fopen( $filename, 'w' ) ); $header = $this->getPrologHeader(); if ($this->includeProlog) { $header[ 1 ][ 0 ] = 'uri'; ksort($header[1]); $header[ 2 ][ 0 ] = 'lang'; $header[ 2 ][ 1 ] = $this->getSchema()->getLanguage(); //default language ksort($header[2]); $header[ 3 ][ 0 ] = 'type'; $header[ 3 ][ 1 ] = 'uri'; //default type ksort($header[3]); } foreach ( $header as $line ) { $writer->writeItem( $line ); } if ($this->includeProlog) { $metadata = $this->getMetadata(); foreach ($metadata as $line) { $writer->writeItem($line); } $prefixRows = $this->getPrefixRows(); foreach ($prefixRows as $line) { $writer->writeItem($line); } } //get the data if ( $this->populate ) { $prefixes = $this->getPrefixes(); $prefixPattern = array(); $prefixReplacement = array(); foreach ( $prefixes as $prefix => $namespace ) { if (trim($prefix)) { if ( ! is_int($prefix)) { $prefixPattern[] = "|" . $namespace . "|"; $prefixReplacement[] = $prefix . ":"; } } } $map = $this->getHeaderMap(); $c = new \Criteria(); $c->clearSelectColumns(); if ('schema' === $this->type) { $c->addSelectColumn(\SchemaPropertyPeer::ID); $c->add(\SchemaPropertyPeer::SCHEMA_ID, $this->schema->getId()); if ($this->excludeDeprecated) { $c->add(\SchemaPropertyPeer::STATUS_ID, 8, \Criteria::NOT_EQUAL); } $c->addAscendingOrderByColumn(\SchemaPropertyPeer::URI); $properties = \SchemaPropertyPeer::doSelectRS($c); } else { $c->addSelectColumn(\ConceptPeer::ID); $c->addSelectColumn(\ConceptPeer::URI); $c->addSelectColumn(\ConceptPeer::STATUS_ID); $c->add(\ConceptPeer::VOCABULARY_ID, $this->schema->getId()); if ($this->excludeDeprecated) { $c->add(\ConceptPeer::STATUS_ID, 8, \Criteria::NOT_EQUAL); } $c->addAscendingOrderByColumn(\ConceptPeer::URI); $properties = \ConceptPeer::doSelectRS($c); } foreach ( $properties as $property ) { $line = array_fill( 0, $this->getHeaderCount(), '' ); $line[0] = $property[0]; $map = $this->getHeaderMap(); $ce = new \Criteria(); if ('schema' === $this->type) { $ce->add(\BaseSchemaPropertyElementPeer::SCHEMA_PROPERTY_ID, $property[0]); if (!$this->includeDeleted) { $ce->add(\BaseSchemaPropertyElementPeer::DELETED_AT, null); } if ($this->includeDeleted) { $ce->addAscendingOrderByColumn(\SchemaPropertyElementPeer::UPDATED_AT); } $elements = \SchemaPropertyElementPeer::doSelectJoinProfileProperty($ce); } else { $ce->add(\ConceptPropertyPeer::CONCEPT_ID, $property[0]); if (!$this->includeDeleted) { $ce->add(\ConceptPropertyPeer::DELETED_AT, null); } if ($this->includeDeleted) { $ce->addAscendingOrderByColumn(\ConceptPropertyPeer::UPDATED_AT); } $elements = \ConceptPropertyPeer::doSelectJoinProfilePropertyRelatedBySkosPropertyId($ce); $line[array_search('uri', $header[0])] = $property[1]; $line[array_search('status', $header[0])] = $property[2]; } /** @var \SchemaPropertyElement $element */ foreach ($elements as $element ) { if ($this->excludeGenerated and $element->getIsGenerated()) { continue; } /** @var \ProfileProperty $profileProperty */ $profileProperty = $element->getProfileProperty(); $propertyId = $profileProperty->getId(); if ('schema' === $this->type and in_array( $propertyId, [ 6, 9, ] ) and $element->getIsSchemaProperty() ) { $language = 'parent'; } else { $language = $profileProperty->getHasLanguage() ? $element->getLanguage() : ''; } $index = $propertyId . $language; if (isset($map[ $index ])) { foreach ($map[ $index ] as &$column) { if (false !== $column) { $line[ $column ] = $element->getObject(); $column = false; break; } } } } $writer->writeItem( preg_replace( $prefixPattern, $prefixReplacement, $line )); unset($line, $elements); } } //add an empty line at the end $line = array_fill( 0, $this->getHeaderCount(), '' ); $writer->writeItem( $line ); $writer->finish(); }
/** * If this collection has already been initialized with * an identical criteria, it returns the collection. * Otherwise if this ConceptProperty is new, it will return * an empty collection; or if this ConceptProperty has previously * been saved, it will retrieve related Concepts from storage. * * This method is protected by default in order to keep the public * api reasonable. You can provide public methods for those you * actually need in ConceptProperty. */ public function getConceptsJoinStatus($criteria = null, $con = null) { // include the Peer class include_once 'lib/model/om/BaseConceptPeer.php'; if ($criteria === null) { $criteria = new Criteria(); } elseif ($criteria instanceof Criteria) { $criteria = clone $criteria; } if ($this->collConcepts === null) { if ($this->isNew()) { $this->collConcepts = array(); } else { $criteria->add(ConceptPeer::PREF_LABEL_ID, $this->getId()); $this->collConcepts = ConceptPeer::doSelectJoinStatus($criteria, $con); } } else { // the following code is to determine if a new query is // called for. If the criteria is the same as the last // one, just return the collection. $criteria->add(ConceptPeer::PREF_LABEL_ID, $this->getId()); if (!isset($this->lastConceptCriteria) || !$this->lastConceptCriteria->equals($criteria)) { $this->collConcepts = ConceptPeer::doSelectJoinStatus($criteria, $con); } } $this->lastConceptCriteria = $criteria; return $this->collConcepts; }
function run_import_marc_vocabulary($task, $args) { //check the argument counts if (count($args) < 1) { throw new Exception('You must provide a vocabulary type.'); } if (count($args) < 2) { throw new Exception('You must provide a file name.'); } if (count($args) < 3) { throw new Exception('You must provide a vocabulary id.'); } //set the arguments $type = strtolower($args[0]); $filePath = $args[1]; $id = $args[2]; $deleteMissing = (isset($args[3]) && ("-d" == $args[3])); //do some basic validity checks if (! in_array($type, array("schema", "vocab", "vocabulary"))) { throw new Exception('You must import into a schema or a vocab'); } if ("vocabulary" == $type) { $type = "vocab"; } if (! is_numeric($id)) { throw new Exception('You must provide a valid ID'); } //does the file exist? if (! file_exists($filePath)) { throw new Exception('You must supply a valid file to import: ' . $filePath); } //is the file a valid type? if (preg_match('/^.+\.([[:alpha:]]{2,4})$/', $filePath, $matches)) { if (! in_array(strtolower($matches[1]), array("json", "rdf", "csv", "xml"))) { throw new Exception('You must provide a valid file type based on the extension'); } } else { throw new Exception("File type cannot be determined from the file extension"); } $fileType = $matches[1]; //is the object a valid object? if ('vocab' == $type) { $vocabObj = VocabularyPeer::retrieveByPK($id); if (is_null($vocabObj)) { throw new Exception('Invalid vocabulary ID'); } //set some defaults $baseDomain = $vocabObj->getBaseDomain(); $language = $vocabObj->getLanguage(); $statusId = $vocabObj->getStatusId(); //get a skos property id map $skosMap = SkosPropertyPeer::getPropertyNames(); //there has to be a hash or a slash $tSlash = preg_match('@(/$)@i', $vocabObj->getUri()) ? '' : '/'; $tSlash = preg_match('/#$/', $vocabObj->getUri()) ? '' : $tSlash; } else { $schemaObj = SchemaPeer::retrieveByPK($id); if (is_null($schemaObj)) { throw new Exception('Invalid schema ID'); } //set some defaults $baseDomain = $schemaObj->getUri(); $language = $schemaObj->getLanguage(); $statusId = $schemaObj->getStatusId(); //get a element set property id map $profileId = 1; $profile = ProfilePeer::retrieveByPK($profileId); $elementMap = $profile->getAllProperties(); //there has to be a hash or a slash $tSlash = preg_match('@(/$)@i', $baseDomain) ? '' : '/'; $tSlash = preg_match('/#$/', $baseDomain) ? '' : $tSlash; } // insert jon's user id $userId = 36; /* From here on the process is the same regardless of UI */ //execute // parse file to get the fields/columns and data $file = fopen($filePath, "r"); if (! $file) { throw new Exception("Can't read supplied file"); } // check to see if file has been uploaded before // check import history for file name $importHistory = FileImportHistoryPeer::retrieveByLastFilePath($filePath); // if reimport // get last import history for filename // unserialize column map // match column names to AP based on map // look for matches in unmatched field/column names to AP (ideal) // csv table of data -- // row1: parsed field names/column headers // row2: select dropdown with available fields from object AP (pre-select known matches) // each select identified by column number // row3: display datatype of selected field (updated dynamically when field selected) // row4-13: first 10 rows of parsed data from file // require a column that can match to 'URI' (maybe we'll allow an algorithm later) // require columns that are required by AP // on reimport there should be a flag to 'delete missing properties' from the current data // note: at some point there will be a reimport process that allows URI changing // this will require that there be an OMR identifier embedded in the incoming data switch ($fileType) { case "csv": try { $reader = new aCsvReader($filePath); } catch(Exception $e) { throw new Exception("Not a happy CSV file!"); } if ('vocab' == $type) { // Get array of heading names found $headings = $reader->getHeadings(); $fields = ConceptPeer::getFieldNames(); //set the map // $map[] = array("property" => "Uri", "column" => "URILocal"); // $map[] = array("property" => "prefLabel", "column" => "skos:prefLabel"); // $map[] = array("property" => "definition", "column" => "skos:definition"); // $map[] = array("property" => "notation", "column" => "skos:notation"); // $map[] = array("property" => "scopeNote", "column" => "skos:scopeNote"); $map = array( "uri" => "URILocal", "prefLabel" => "skos:prefLabel", "definition" => "skos:definition", "notation" => "skos:notation", "scopeNote" => "skos:scopeNote" ); $rows = 0; //executeImport: // serialize the column map try { while ($row = $reader->getRow()) { $rows ++; // lookup the URI (or the OMR ID if available) for a match $uri = $baseDomain . $row[$map["uri"]]; $concept = ConceptPeer::getConceptByUri($uri); $updateTime = time(); $language = (isset($map['language'])) ? $row[$map['language']] : $vocabObj->getLanguage(); if (! $concept) { // create a new concept or element $concept = new Concept(); $concept->setVocabulary($vocabObj); $concept->setUri($uri); /** * @todo Need to handle updates for topconcept here, just like language **/ $concept->setIsTopConcept(false); $concept->updateFromRequest( $userId, fixMarcEncoding(rtrim($row[$map['prefLabel']])), $language, $statusId ); } //don't update the concept if the preflabel matches else if ($row[$map['prefLabel']] != $concept->getPrefLabel()) { $concept->updateFromRequest($userId, fixMarcEncoding(rtrim($row[$map['prefLabel']]))); } //there needs to be a language to lookup the properties unless it's an objectProperty $rowLanguage = (isset($map['language'])) ? $row[$map['language']] : $concept->getLanguage(); foreach ($map as $key => $value) { //we skip because we already did them if (! in_array($key, array('uri', 'prefLabel', 'language'))) { $skosId = $skosMap[$key]; //check to see if the property already exists $property = ConceptPropertyPeer::lookupProperty($concept->getId(), $skosId, $rowLanguage); //create a new property for each unmatched column if (! empty($row[$value])) { if (! $property) { $property = new ConceptProperty(); $property->setCreatedUserId($userId); $property->setConceptId($concept->getId()); $property->setCreatedAt($updateTime); $property->setSkosPropertyId($skosId); } if (($row[$value] != $property->getObject()) || ($rowLanguage != $property->getLanguage()) ) { /** * @todo We need a check here for skos objectproperties and handle differently **/ if ($rowLanguage != $property->getLanguage()) { $property->setLanguage($rowLanguage); } if ($row[$value] != $property->getObject()) { $property->setObject(fixMarcEncoding(rtrim($row[$value]))); } $property->setUpdatedUserId($userId); $property->setUpdatedAt($updateTime); $property->save(); } } //the row value is empty else if ($deleteMissing && $property) { $property->delete(); } } } // else // lookup and update concept or element // lookup and update each property // update the history for each property, action is 'import', should be a single timestamp for all (this should be automatic) // if 'delete missing properties' is true // delete each existing, non-required property that wasn't updated by the import } } catch(Exception $e) { // catch // if there's an error of any kind, write to error log and continue echo "Error on row: " . $rows . ", " . $uri . "\n" . $e . "\n"; continue; } $objects = $vocabObj->countConcepts(); } else //it's an element set { $map = array( "uri" => "uriLocalPart", "name" => "reg:name", "definition" => "skos:definition", "label" => "rdfs:label", "note" => array("tag" => "tagCap", "ind1" => "ind1Cap", "ind2" => "ind2Cap", "sub" => "subCap") ); $rows = 0; //executeImport: // serialize the column map try { while ($row = $reader->getRow()) { // lookup the URI (or the OMR ID if available) for a match //There always has to be a URI on either update or create if (! isset($row[$map["uri"]])) { throw new Exception('Missing URI for row: ' . $reader->getRowCount()); continue; } $rows ++; $uri = $baseDomain . $tSlash . $row[$map["uri"]]; $property = SchemaPropertyPeer::retrieveByUri($uri); $updateTime = time(); $rowLanguage = (isset($map['language'])) ? $row[$map['language']] : $language; $rowStatusId = (isset($map['status'])) ? $row[$map['status']] : $statusId; if (! $property) { // create a new property /** @var SchemaProperty * */ $property = new SchemaProperty(); $property->setSchema($schemaObj); $property->setUri($uri); $property->setCreatedUserId($userId); $property->setCreatedAt($updateTime); } $property->setLanguage($rowLanguage); $property->setStatusId($rowStatusId); $property->setUpdatedUserId($userId); $property->setUpdatedAt($updateTime); if (isset($row[$map["label"]])) { $property->setLabel($row[$map["label"]]); } if (isset($row[$map["name"]])) { $property->setName($row[$map["name"]]); } if (isset($row[$map["definition"]])) { $property->setDefinition($row[$map["definition"]]); } if (is_array($map["note"])) { $note = ''; foreach ($map["note"] as $key => $value) { $caption = ! empty($row[$value]) ? " (" . $row[$value] . ")" : ' (no caption)'; $note .= ! empty($row[$key]) ? $key . ": " . $row[$key] . $caption . "<br />" : ""; } $property->setNote($note); } else { if (isset($row[$map["note"]])) { $property->setNote($row[$map["note"]]); } } $property->saveSchemaProperty($userId); /** * @todo Need to handle domain and range **/ foreach ($map as $key => $value) { //we skip because we already did them if (! in_array( $key, array('uri', 'status', 'language', 'label', 'name', 'definition', 'comment', 'note') ) ) { $elementId = $elementMap[$key]; //check to see if the property already exists //note that this also checks the object value as well, so there's no way to update or delete an existing triple //the sheet would have to conatin the identifier for the triple $element = SchemaPropertyElementPeer::lookupElement( $schemaObj->getId(), $elementId, $map[$value] ); //create a new property for each unmatched column if (! empty($row[$value])) { if (! $element) { $element = new SchemaPropertyElement(); $element->setCreatedUserId($userId); $element->setCreatedAt($updateTime); $element->setProfilePropertyId($elementId); } if (($row[$value] != $element->getObject()) || ($rowLanguage != $element->getLanguage()) ) { /** * @todo We need a check here for objectproperties and handle differently **/ if ($rowLanguage != $element->getLanguage()) { $element->setLanguage($rowLanguage); } if ($row[$value] != $element->getObject()) { $element->setObject($row[$value]); } $element->setUpdatedUserId($userId); $element->setUpdatedAt($updateTime); $element->save(); } } //the row value is empty else if ($deleteMissing && $element) { $element->delete(); } } } // else // lookup and update concept or element // lookup and update each property // update the history for each property, action is 'import', should be a single timestamp for all (this should be automatic) // if 'delete missing properties' is true // delete each existing, non-required property that wasn't updated by the import } } catch(Exception $e) { // catch // if there's an error of any kind, write to error log and continue echo "Error on row: " . $rows . ", " . $uri . "\n" . $e . "\n"; continue; } $objects = $schemaObj->countSchemaPropertys(); } // save the import history file (match timestamp to history entries) break; case "json": break; case "rdf": break; case "xml": break; default: } /* output to stdout*/ // number of objects imported (link to history, filtered on timestamp of import) echo "File:" . $filePath . ";\n Objects imported: " . $objects . "; Rows read: " . $rows . "\n"; // number of errors (link to error log) }
protected function getConceptOrCreate($id = 'id') { if (!$this->getRequestParameter($id)) { $concept = new Concept(); $this->setDefaults($concept); } else { $concept = ConceptPeer::retrieveByPk($this->getRequestParameter($id)); $this->forward404Unless($concept); } return $concept; }
/** * Gets the related vocabulary object * * @return Vocabulary */ public function getRelatedConcept() { return ConceptPeer::retrieveByPK($this->related_concept_id); }
} } $objectId = $vocabulary_has_user->getID(); if (!isset($vocabulary)) { $vocabulary = $vocabulary_has_user->getVocabulary(); } $tab = false; break; case 'concept': $showBc = true; $showVocabularyBc = true; $showConceptBc = true; if (!isset($concept)) { $id = 'show' == $action ? $sf_params->get('id') : $paramId; if ($id) { $concept = ConceptPeer::retrieveByPK($id); } } if (!isset($vocabulary)) { if ($concept) { $vocabulary = $concept->getVocabulary(); } } $objectId = $concept->getID(); break; case 'conceptprop': $showBc = true; $showVocabularyBc = true; $showConceptBc = true; $showconceptpropBc = true; if (!isset($concept_property)) {
/** * @return \Ddeboer\DataImport\Result * @throws \Ddeboer\DataImport\Exception\ExceptionInterface * @throws \Exception */ public function processData() { $workflow = new Workflow($this->reader); $output = new ConsoleOutput(); // Don’t import the non-metadata $filter = new Filter\CallbackFilter(function ($row) { if (is_numeric($row['reg_id'])) { return true; } if ( ! trim($row['reg_id'])) { foreach ($row as $item) { if ( ! is_array($item)) { if (trim($item)) { return true; } } else { foreach ($item as $foo) { if (trim($foo)) { return true; } } } } } return false; }); $trimConverter = new CallbackItemConverter(function ($row) { foreach ($row as $key => $value) { $row[$key] = trim($row[$key]); } return $row; }); $lexicalConverter = new CallbackItemConverter(function ($row) { foreach ($row as $key => $value) { if (isset( $this->prolog['columns'][$key]['id'] ) and $this->prolog['columns'][$key]['id'] == 27) { $lang = $this->prolog['columns'][$key]['lang']; //check for existing language suffix if ($value and ! preg_match("/\\." . $lang . "$/u", $value)) { $row[$key] = $value . "." . $lang; } } } return $row; }); $typeConverter = new MappingValueConverter([ 'rdfs:class' => 'class', 'rdfs:property' => 'property', 'class' => 'class', 'property' => 'property', 'Class' => 'class', 'Property' => 'property', 'subclass' => 'class', 'subproperty' => 'property', '' => '', ]); $vocabWriter = new Writer\CallbackWriter(function ($row) { $this->setPrologColumns(); //todo: $row[59] (status) and $row[62] (uri) sre hardcoded but the array key should be set somewhere globally if ( ! isset( $row[59] )) { $row[59] = $this->prolog['defaults']['statusId']; } $rowStatus = $row[59]; $language = $this->prolog['defaults']['lang']; foreach ($row as $key => &$element) { $this->updateRowUris($key, $element); } $uri = $this->getFqn($row[62]); $property = null; if ( ! empty( $row['reg_id'] )) { $property = \ConceptPeer::retrieveByPK($row['reg_id']); } else { //check for an existing property by uri /** @var \Concept $property */ $property = \ConceptPeer::getConceptByUri($uri); } //even if we found a property, we kill it if it's in a different schema than we're populating if ($property and $property->getVocabularyId() !== $this->vocabId) { //todo: we should log this event unset( $property ); } if (empty( $property )) { //it's a new property $property = new \Concept(); $property->setVocabularyId($this->vocabId); $property->setCreatedUserId($this->userId); $property->setUpdatedUserId($this->userId); $property->setStatusId($rowStatus); $property->setLanguage($language); $property->setUri($uri); $property->save(); } unset( $row['reg_id'] ); if ($property) { // if (8 == $rowStatus) { // //it's been deprecated and we don't do anything else // $property->setStatusId($rowStatus); // $this->updateElement($element, $dbElement, $property); // } else { $dbElements = $property->getElementsForImport($this->profileProperties); foreach ($dbElements as $key => $dbElement) { /** @var string | array $rowElement */ $rowElement = isset( $row[$key] ) ? $row[$key] : null; if (is_array($rowElement)) { foreach ($rowElement as $elementKey => &$element) { if ($this->updateConceptProperty($element, $dbElement, $property)) { unset( $rowElement[$elementKey] ); } } } else { if ($this->updateConceptProperty($rowElement, $dbElement, $property)) { unset( $row[$key] ); } } } foreach ($row as $key => $value) { $dbElement = isset( $dbElements[$key] ) ? $dbElements[$key] : null; if ( ! empty( $this->prolog['columns'][$key]['property'] )) { $profileProperty = $this->prolog['columns'][$key]['property']; if (is_array($value)) { foreach ($value as &$oneValue) { $language = $this->prolog['columns'][$key]['lang'][0]; $this->upsertConceptFromRow($dbElement, $oneValue, $rowStatus, $property, $profileProperty, $language, $key); } } else { $language = $this->prolog['columns'][$key]['lang']; $this->upsertConceptFromRow($dbElement, $value, $rowStatus, $property, $profileProperty, $language, $key); } } } } $property->setUri($uri); $property->setStatusId($rowStatus); $affectedRows = $property->save(); if (empty( $property->getPrefLabel() )) { $prefLabel = \ConceptPropertyPeer::lookupProperty($property->getId(), 19, $this->prolog['defaults']['lang']); if ( ! empty( $prefLabel )) { $property->setPrefLabel($prefLabel->getObject()); $property->setPrefLabelId($prefLabel->getId()); $property->setLanguage($this->prolog['defaults']['lang']); $property->save(); } } return; //************** // CRUFT ALERT // The rest of this is never run!! //************** //build an array of references $newElements = [ ]; $newElements2 = [ ]; if ( ! isset( $row['status'] )) { $row[14] = $this->prolog['defaults']['statusId']; } foreach ($row as $key => $element) { //skip it there's no property id $columnKey = $this->prolog['columns'][$key]; if ( ! $columnKey['id']) { continue; } if ( ! empty( $columnKey['type'] ) and $this->useCuries) { $element = $this->getFqn($element); } $key2 = md5(strval($columnKey['id']) . strval($columnKey['lang']) . $element); $newElements[$key2] = [ ]; $newElements[$key2] += $columnKey; $newElements[$key2]['val'] = $element; /** @var \ProfileProperty $profileProperty */ if (isset( $columnKey['property'] )) { $profileProperty = $columnKey['property']; $var = [ 'matchkey' => $key2, 'val' => $newElements[$key2], ]; if (isset( $profileProperty ) and $profileProperty->getHasLanguage()) { $newElements2[$columnKey['id']][$columnKey['lang']][] = $var; } else { $newElements2[$columnKey['id']][] = $var; } } } if ( ! empty( $row['reg_id'] )) { $property = \SchemaPropertyPeer::retrieveByPK($row['reg_id']); if ($property) { $dbElements = $property->getSchemaPropertyElementsRelatedBySchemaPropertyIdJoinProfileProperty(); $dbElements2 = [ ]; /** @var \SchemaPropertyElement $dbElement */ foreach ($dbElements as $dbElement) { if ($dbElement->getProfileProperty()->getHasLanguage()) { $dbElements2[$dbElement->getProfilePropertyId()][$dbElement->getLanguage()][] = &$dbElement; } else { $dbElements2[$dbElement->getProfilePropertyId()][] = &$dbElement; } } /** @var \SchemaPropertyElement $element */ foreach ($dbElements as $element) { $language = $element->getLanguage(); $profilePropertyId = $element->getProfilePropertyId(); $key = md5(strval($profilePropertyId) . strval($language) . $element->getObject()); //if the newelement key matches then if (isset( $newElements[$key] )) { if ($element->getProfileProperty()->getHasLanguage()) { $newElements2Array = $newElements2[$profilePropertyId][$language]; } else { $newElements2Array = $newElements2[$profilePropertyId]; } $count = count($newElements2Array); for ($I = 0; $I < $count; $I++) { if ($newElements2Array[$I]['matchkey'] == $key) { unset( $newElements2Array[$I] ); } } unset( $newElements[$key] ); $element->importStatus = 'match'; continue; } else { if ($element->getProfileProperty()->getHasLanguage()) { if (isset( $newElements2[$profilePropertyId][$language] )) { $count = count($newElements2[$profilePropertyId][$language]); for ($I = 0; $I < $count; $I++) { if ($newElements2[$profilePropertyId][$language][$I]['val']['val'] == $element->getObject()) { unset( $newElements2[$profilePropertyId][$language][$I] ); $element->importStatus = 'match'; if ( ! count($newElements2[$profilePropertyId][$language])) { unset( $newElements2[$profilePropertyId][$language] ); } continue; } } } } else { //compare the old values with the new with the same key $count = count($newElements2[$profilePropertyId]); for ($I = 0; $I < $count; $I++) { if (isset( $newElements2[$profilePropertyId][$I] )) { if ($newElements2[$profilePropertyId][$I]['val']['val'] == $element->getObject()) { unset( $newElements2[$profilePropertyId][$I] ); $element->importStatus = 'match'; continue; } } } } //if the key matches then //if the value matches //delete the newElement //else the value doesn't match //if the newElement value is empty //delete the dbElement } $element->matchKey = $key; } //update the property values $property->save(); } else { //there's no existing property an we have to create a new one $property = new \SchemaProperty(); } foreach ($newElements as $key => $newElement) { if ( ! empty( $newElement['id'] ) and ! isset( $oldElements[$key] )) { $profileProperty = $newElement['property']; //walk the old elements looking for a match on predicate + language /** @var \SchemaPropertyElement[] $oldElement */ foreach ($dbElements as $oldElement) { /** @var \SchemaPropertyElement $oldOne */ $oldOne = &$oldElement['element']; if ($newElement['id'] == $oldOne->getProfilePropertyId()) { /** @var \ProfileProperty $profileProperty */ if (( $profileProperty->getHasLanguage() and $newElement['lang'] == $oldOne->getLanguage() ) or ! $profileProperty->getHasLanguage()) { if ( ! empty( $newElement['val'] )) { $oldOne->setObject($newElement['val']); $oldOne->setUpdatedUserId($this->userId); $oldOne->setStatusId($row['status']); //$oldOne->save(); $oldElement['status'] = "updated"; } else { $oldOne->delete(); $oldElement['status'] = "deleted"; } //update the property value if ($profileProperty->getIsInForm()) { $this->setPropertyValue($newElement['val'], $property, $profileProperty->getName(), ! $profileProperty->getIsObjectProp()); } break; } } } //we looked through them all, add a new one if ( ! empty( $newElement['val'] )) { $addMe = new \SchemaPropertyElement(); $addMe->setObject($newElement['val']); //$addMe->setSchemaPropertyRelatedBySchemaPropertyId($property); $addMe->setCreatedUserId($this->userId); $addMe->setUpdatedUserId($this->userId); $addMe->setLanguage($newElement['lang']); $addMe->setProfilePropertyId($newElement['id']); $addMe->setStatusId($row['status']); $addMe->importId = $this->importId; //$addMe->save(); $property->addSchemaPropertyElementRelatedBySchemaPropertyId($addMe); //update the property value if ($profileProperty->getIsInForm()) { $this->setPropertyValue($newElement['val'], $property, $profileProperty->getName(), ! $profileProperty->getIsObjectProp()); } } } } //update the property if ($property) { $property->setStatusId($row['status']); $property->save(); } } //var_dump($row); }); $schemaWriter = new Writer\CallbackWriter(function ($row) { $this->setPrologColumns(); if ( ! isset( $row[14] )) { $row[14] = $this->prolog['defaults']['statusId']; } $rowStatus = $row[14]; $language = $this->prolog['defaults']['lang']; foreach ($row as $key => &$element) { $this->updateRowUris($key, $element); } $uri = $row[13]; $property = null; $schemaId = $this->vocabId; if ( ! empty( $row['reg_id'] )) { $property = \SchemaPropertyPeer::retrieveByPK($row['reg_id']); } else { //check for an existing property by uri /** @var \SchemaProperty $property */ $property = \SchemaPropertyPeer::retrieveByUri($uri); if ($property) { $schemaId = $property->getSchemaId(); } } //even if we found a property, we kill it if it's in a different schema than we're populating if ($property and $schemaId !== $this->vocabId) { //todo: we should log this event unset( $property ); } if (empty( $property )) { //it's a new property $property = new \SchemaProperty(); $property->setSchemaId($this->vocabId); $property->setCreatedUserId($this->userId); $property->setUpdatedUserId($this->userId); $property->setStatusId($rowStatus); $property->setLanguage($language); $property->save(); } unset( $row['reg_id'] ); if ($property) { // if (8 == $rowStatus) { // //it's been deprecated and we don't do anything else // $property->setStatusId($rowStatus); // $this->updateElement($element, $dbElement, $property); // } else { $dbElements = $property->getElementsForImport($this->profileProperties); foreach ($dbElements as $key => $dbElement) { /** @var string | array $rowElement */ $rowElement = isset( $row[$key] ) ? $row[$key] : null; if (is_array($rowElement)) { foreach ($rowElement as $elementKey => &$element) { if ($this->updateElement($element, $dbElement, $property)) { unset( $rowElement[$elementKey] ); } } } else { if ($this->updateElement($rowElement, $dbElement, $property)) { unset( $row[$key] ); } } } foreach ($row as $key => $value) { $dbElement = isset( $dbElements[$key] ) ? $dbElements[$key] : null; if ( ! empty( $this->prolog['columns'][$key]['property'] )) { $profileProperty = $this->prolog['columns'][$key]['property']; if (is_array($value)) { foreach ($value as &$oneValue) { $language = $this->prolog['columns'][$key]['lang'][0]; $this->upsertElementFromRow($dbElement, $oneValue, $rowStatus, $property, $profileProperty, $language, $key); } } else { $language = $this->prolog['columns'][$key]['lang']; $this->upsertElementFromRow($dbElement, $value, $rowStatus, $property, $profileProperty, $language, $key); } if ($key == 'parent_class' and strtolower($property->getType()) == 'class' and $row[$key] != $property->getParentUri()) { $property->setParentUri($row[$key]); //we'll set this later $property->setIsSubpropertyOf(null); } if ($key == 'parent_property' and strtolower($property->getType()) == 'property' and $row[$key] != $property->getParentUri()) { $property->setParentUri($row[$key]); //we'll set this later $property->setIsSubpropertyOf(null); } } } } $affectedRows = $property->save(); // } return; //build an array of references $newElements = [ ]; $newElements2 = [ ]; if ( ! isset( $row['status'] )) { $row[14] = $this->prolog['defaults']['statusId']; } foreach ($row as $key => $element) { //skip it there's no property id $columnKey = $this->prolog['columns'][$key]; if ( ! $columnKey['id']) { continue; } if ( ! empty( $columnKey['type'] ) and $this->useCuries) { $element = $this->getFqn($element); } $key2 = md5(strval($columnKey['id']) . strval($columnKey['lang']) . $element); $newElements[$key2] = [ ]; $newElements[$key2] += $columnKey; $newElements[$key2]['val'] = $element; /** @var \ProfileProperty $profileProperty */ if (isset( $columnKey['property'] )) { $profileProperty = $columnKey['property']; $var = [ 'matchkey' => $key2, 'val' => $newElements[$key2], ]; if (isset( $profileProperty ) and $profileProperty->getHasLanguage()) { $newElements2[$columnKey['id']][$columnKey['lang']][] = $var; } else { $newElements2[$columnKey['id']][] = $var; } } } if ( ! empty( $row['reg_id'] )) { $property = \SchemaPropertyPeer::retrieveByPK($row['reg_id']); if ($property) { $dbElements = $property->getSchemaPropertyElementsRelatedBySchemaPropertyIdJoinProfileProperty(); $dbElements2 = [ ]; /** @var \SchemaPropertyElement $dbElement */ foreach ($dbElements as $dbElement) { if ($dbElement->getProfileProperty()->getHasLanguage()) { $dbElements2[$dbElement->getProfilePropertyId()][$dbElement->getLanguage()][] = &$dbElement; } else { $dbElements2[$dbElement->getProfilePropertyId()][] = &$dbElement; } } /** @var \SchemaPropertyElement $element */ foreach ($dbElements as $element) { $language = $element->getLanguage(); $profilePropertyId = $element->getProfilePropertyId(); $key = md5(strval($profilePropertyId) . strval($language) . $element->getObject()); //if the newelement key matches then if (isset( $newElements[$key] )) { if ($element->getProfileProperty()->getHasLanguage()) { $newElements2Array = $newElements2[$profilePropertyId][$language]; } else { $newElements2Array = $newElements2[$profilePropertyId]; } $count = count($newElements2Array); for ($I = 0; $I < $count; $I++) { if ($newElements2Array[$I]['matchkey'] == $key) { unset( $newElements2Array[$I] ); } } unset( $newElements[$key] ); $element->importStatus = 'match'; continue; } else { if ($element->getProfileProperty()->getHasLanguage()) { if (isset( $newElements2[$profilePropertyId][$language] )) { $count = count($newElements2[$profilePropertyId][$language]); for ($I = 0; $I < $count; $I++) { if ($newElements2[$profilePropertyId][$language][$I]['val']['val'] == $element->getObject()) { unset( $newElements2[$profilePropertyId][$language][$I] ); $element->importStatus = 'match'; if ( ! count($newElements2[$profilePropertyId][$language])) { unset( $newElements2[$profilePropertyId][$language] ); } continue; } } } } else { //compare the old values with the new with the same key $count = count($newElements2[$profilePropertyId]); for ($I = 0; $I < $count; $I++) { if (isset( $newElements2[$profilePropertyId][$I] )) { if ($newElements2[$profilePropertyId][$I]['val']['val'] == $element->getObject()) { unset( $newElements2[$profilePropertyId][$I] ); $element->importStatus = 'match'; continue; } } } } //if the key matches then //if the value matches //delete the newElement //else the value doesn't match //if the newElement value is empty //delete the dbElement } $element->matchKey = $key; } //update the property values $property->save(); } else { //there's no existing property an we have to create a new one $property = new \SchemaProperty(); } foreach ($newElements as $key => $newElement) { if ( ! empty( $newElement['id'] ) and ! isset( $oldElements[$key] )) { $profileProperty = $newElement['property']; //walk the old elements looking for a match on predicate + language /** @var \SchemaPropertyElement[] $oldElement */ foreach ($dbElements as $oldElement) { /** @var \SchemaPropertyElement $oldOne */ $oldOne = &$oldElement['element']; if ($newElement['id'] == $oldOne->getProfilePropertyId()) { /** @var \ProfileProperty $profileProperty */ if (( $profileProperty->getHasLanguage() and $newElement['lang'] == $oldOne->getLanguage() ) or ! $profileProperty->getHasLanguage()) { if ( ! empty( $newElement['val'] )) { $oldOne->setObject($newElement['val']); $oldOne->setUpdatedUserId($this->userId); $oldOne->setStatusId($row['status']); //$oldOne->save(); $oldElement['status'] = "updated"; } else { $oldOne->delete(); $oldElement['status'] = "deleted"; } //update the property value if ($profileProperty->getIsInForm()) { $this->setPropertyValue($newElement['val'], $property, $profileProperty->getName(), ! $profileProperty->getIsObjectProp()); } break; } } } //we looked through them all, add a new one if ( ! empty( $newElement['val'] )) { $addMe = new \SchemaPropertyElement(); $addMe->setObject($newElement['val']); //$addMe->setSchemaPropertyRelatedBySchemaPropertyId($property); $addMe->setCreatedUserId($this->userId); $addMe->setUpdatedUserId($this->userId); $addMe->setLanguage($newElement['lang']); $addMe->setProfilePropertyId($newElement['id']); $addMe->setStatusId($row['status']); $addMe->importId = $this->importId; //$addMe->save(); $property->addSchemaPropertyElementRelatedBySchemaPropertyId($addMe); //update the property value if ($profileProperty->getIsInForm()) { $this->setPropertyValue($newElement['val'], $property, $profileProperty->getName(), ! $profileProperty->getIsObjectProp()); } } } } //update the property if ($property) { $property->setStatusId($row['status']); $property->save(); } } //var_dump($row); }); $workflow->addItemConverter($this->mapping); $workflow->addFilter($filter); $workflow->addItemConverter($trimConverter); $workflow->addItemConverter($lexicalConverter); $workflow->addWriter(new Writer\ConsoleProgressWriter($output, $this->reader)); $workflow->addValueConverter("4", $typeConverter); //add a database writer if ('schema' == $this->type) { $workflow->addWriter($schemaWriter); } else { $workflow->addWriter($vocabWriter); } /** @todo we need to make a second pass through to delete missing rows * for each schemaproperty in the database * match to a row in the csv * if the row value is empty and $this->deleteMissing * delete the entire schemaproperty */ $workResults = $workflow->process(); $this->DataWorkflowResults = $workResults; /** @TODO need to make a second pass through to lookup and set $element->related_schema_property_id */ $this->processParents($this->vocabId); //use the prolog to configure namespaces, look up correct resources in the database //store the row number of the first non-meta line return $workResults; }
/** * Executes show action * */ public function executeShowScheme() { //build the complete URI $rootUri = $this->getRequest()->getUriPrefix() . '/'; $schemeUri = $rootUri . 'uri/' . $this->getRequestParameter('scheme', ''); $type = $this->getRequestParameter('type'); $ts = strtotime($this->getRequestParameter('ts')); $this->timestamp = $ts; $version = $this->getRequestParameter('version'); //$_SERVER['HTTP_ACCEPT'] = ''; //$_SERVER['HTTP_USER_AGENT'] = ''; switch ($type) { case 'xmlschema': //this URI HAS an 'id', HAS an 'rdf' suffix, and does NOT have a 'uri' action $id = $this->getRequestParameter('id'); $vocabulary = VocabularyPeer::retrieveByPK($id); $this->getContext()->getResponse()->setStatusCode(200); break; case 'html': //this URI does NOT have an 'id', HAS an 'html' suffix, and HAS a 'uri' action //redirect to the base registry using the correct id for the scheme: // http://metadataregistry.org/concept/list/vocabulary_id/16.html $vocabulary = VocabularyPeer::retrieveByUri($schemeUri); $this->forward404Unless($vocabulary); //redirect $this->getContext()->getResponse()->setStatusCode(303); $this->redirect($this->getRequest()->getUriPrefix() . '/concept/list/vocabulary_id/' . $vocabulary->getId() . '.html'); break; case 'uri': //this URI does NOT have an 'id', HAS an 'rdf' suffix, and HAS a 'uri' action //$this->getContext()->getResponse()->setStatusCode(303); $vocabulary = VocabularyPeer::retrieveByUri($schemeUri); break; case 'api_uri': //this URI does NOT have an 'id', does NOT have an 'html' suffix, and comes from the API $uri = $this->getRequestParameter('uri', ''); $vocabulary = VocabularyPeer::retrieveByUri($uri); break; default: //covers case of 'unknown' too //this URI does NOT have an 'id', does NOT have a suffix, and HAS a 'uri' action //do content negotiation if (true === strpos($_SERVER['HTTP_ACCEPT'], 'text/html') || true === strpos($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml') || 0 === strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla')) { //we redirect to html $vocabulary = VocabularyPeer::retrieveByUri($schemeUri); $this->forward404Unless($vocabulary); //redirect $this->redirect($this->getRequest()->getUriPrefix() . '/concept/list/vocabulary_id/' . $vocabulary->getId() . '.html'); } else { $vocabulary = VocabularyPeer::retrieveByUri($schemeUri); } break; } $this->forward404Unless($vocabulary); $this->vocabulary = $vocabulary; //forward to the timeslice if there's a version if ($version && !$ts) { $c = new Criteria(); $c->add(VocabularyHasVersionPeer::NAME, $version); $version = VocabularyHasVersionPeer::doSelectOne($c); $this->forward404Unless($version, 'Unknown version!'); $ts = $version->getTimeslice('YmdHis'); $this->getRequest()->getParameterHolder()->set('ts', $ts); $this->forward('xml', 'showScheme'); } if (!$ts) { $this->concepts = $vocabulary->getConcepts(); } else { $this->concepts = ConceptPeer::doSelectConceptByHistoryTimestamp($vocabulary->getid(), $ts); } }
/** * Selects a collection of ConceptPropertyHistory objects pre-filled with all related objects except FileImportHistory. * * @return array Array of ConceptPropertyHistory objects. * @throws PropelException Any exceptions caught during processing will be * rethrown wrapped into a PropelException. */ public static function doSelectJoinAllExceptFileImportHistory(Criteria $c, $con = null) { $c = clone $c; // Set the correct dbName if it has not been overridden // $c->getDbName() will return the same object if not set to another value // so == check is okay and faster if ($c->getDbName() == Propel::getDefaultDB()) { $c->setDbName(self::DATABASE_NAME); } ConceptPropertyHistoryPeer::addSelectColumns($c); $startcol2 = ConceptPropertyHistoryPeer::NUM_COLUMNS - ConceptPropertyHistoryPeer::NUM_LAZY_LOAD_COLUMNS + 1; ConceptPropertyPeer::addSelectColumns($c); $startcol3 = $startcol2 + ConceptPropertyPeer::NUM_COLUMNS; ConceptPeer::addSelectColumns($c); $startcol4 = $startcol3 + ConceptPeer::NUM_COLUMNS; VocabularyPeer::addSelectColumns($c); $startcol5 = $startcol4 + VocabularyPeer::NUM_COLUMNS; SkosPropertyPeer::addSelectColumns($c); $startcol6 = $startcol5 + SkosPropertyPeer::NUM_COLUMNS; VocabularyPeer::addSelectColumns($c); $startcol7 = $startcol6 + VocabularyPeer::NUM_COLUMNS; ConceptPeer::addSelectColumns($c); $startcol8 = $startcol7 + ConceptPeer::NUM_COLUMNS; StatusPeer::addSelectColumns($c); $startcol9 = $startcol8 + StatusPeer::NUM_COLUMNS; UserPeer::addSelectColumns($c); $startcol10 = $startcol9 + UserPeer::NUM_COLUMNS; $c->addJoin(ConceptPropertyHistoryPeer::CONCEPT_PROPERTY_ID, ConceptPropertyPeer::ID); $c->addJoin(ConceptPropertyHistoryPeer::CONCEPT_ID, ConceptPeer::ID); $c->addJoin(ConceptPropertyHistoryPeer::VOCABULARY_ID, VocabularyPeer::ID); $c->addJoin(ConceptPropertyHistoryPeer::SKOS_PROPERTY_ID, SkosPropertyPeer::ID); $c->addJoin(ConceptPropertyHistoryPeer::SCHEME_ID, VocabularyPeer::ID); $c->addJoin(ConceptPropertyHistoryPeer::RELATED_CONCEPT_ID, ConceptPeer::ID); $c->addJoin(ConceptPropertyHistoryPeer::STATUS_ID, StatusPeer::ID); $c->addJoin(ConceptPropertyHistoryPeer::CREATED_USER_ID, UserPeer::ID); $rs = BasePeer::doSelect($c, $con); $results = array(); while ($rs->next()) { $omClass = ConceptPropertyHistoryPeer::getOMClass(); $cls = Propel::import($omClass); $obj1 = new $cls(); $obj1->hydrate($rs); $omClass = ConceptPropertyPeer::getOMClass(); $cls = Propel::import($omClass); $obj2 = new $cls(); $obj2->hydrate($rs, $startcol2); $newObject = true; for ($j = 0, $resCount = count($results); $j < $resCount; $j++) { $temp_obj1 = $results[$j]; $temp_obj2 = $temp_obj1->getConceptProperty(); //CHECKME if ($temp_obj2->getPrimaryKey() === $obj2->getPrimaryKey()) { $newObject = false; $temp_obj2->addConceptPropertyHistory($obj1); break; } } if ($newObject) { $obj2->initConceptPropertyHistorys(); $obj2->addConceptPropertyHistory($obj1); } $omClass = ConceptPeer::getOMClass(); $cls = Propel::import($omClass); $obj3 = new $cls(); $obj3->hydrate($rs, $startcol3); $newObject = true; for ($j = 0, $resCount = count($results); $j < $resCount; $j++) { $temp_obj1 = $results[$j]; $temp_obj3 = $temp_obj1->getConceptRelatedByConceptId(); //CHECKME if ($temp_obj3->getPrimaryKey() === $obj3->getPrimaryKey()) { $newObject = false; $temp_obj3->addConceptPropertyHistoryRelatedByConceptId($obj1); break; } } if ($newObject) { $obj3->initConceptPropertyHistorysRelatedByConceptId(); $obj3->addConceptPropertyHistoryRelatedByConceptId($obj1); } $omClass = VocabularyPeer::getOMClass(); $cls = Propel::import($omClass); $obj4 = new $cls(); $obj4->hydrate($rs, $startcol4); $newObject = true; for ($j = 0, $resCount = count($results); $j < $resCount; $j++) { $temp_obj1 = $results[$j]; $temp_obj4 = $temp_obj1->getVocabularyRelatedByVocabularyId(); //CHECKME if ($temp_obj4->getPrimaryKey() === $obj4->getPrimaryKey()) { $newObject = false; $temp_obj4->addConceptPropertyHistoryRelatedByVocabularyId($obj1); break; } } if ($newObject) { $obj4->initConceptPropertyHistorysRelatedByVocabularyId(); $obj4->addConceptPropertyHistoryRelatedByVocabularyId($obj1); } $omClass = SkosPropertyPeer::getOMClass(); $cls = Propel::import($omClass); $obj5 = new $cls(); $obj5->hydrate($rs, $startcol5); $newObject = true; for ($j = 0, $resCount = count($results); $j < $resCount; $j++) { $temp_obj1 = $results[$j]; $temp_obj5 = $temp_obj1->getSkosProperty(); //CHECKME if ($temp_obj5->getPrimaryKey() === $obj5->getPrimaryKey()) { $newObject = false; $temp_obj5->addConceptPropertyHistory($obj1); break; } } if ($newObject) { $obj5->initConceptPropertyHistorys(); $obj5->addConceptPropertyHistory($obj1); } $omClass = VocabularyPeer::getOMClass(); $cls = Propel::import($omClass); $obj6 = new $cls(); $obj6->hydrate($rs, $startcol6); $newObject = true; for ($j = 0, $resCount = count($results); $j < $resCount; $j++) { $temp_obj1 = $results[$j]; $temp_obj6 = $temp_obj1->getVocabularyRelatedBySchemeId(); //CHECKME if ($temp_obj6->getPrimaryKey() === $obj6->getPrimaryKey()) { $newObject = false; $temp_obj6->addConceptPropertyHistoryRelatedBySchemeId($obj1); break; } } if ($newObject) { $obj6->initConceptPropertyHistorysRelatedBySchemeId(); $obj6->addConceptPropertyHistoryRelatedBySchemeId($obj1); } $omClass = ConceptPeer::getOMClass(); $cls = Propel::import($omClass); $obj7 = new $cls(); $obj7->hydrate($rs, $startcol7); $newObject = true; for ($j = 0, $resCount = count($results); $j < $resCount; $j++) { $temp_obj1 = $results[$j]; $temp_obj7 = $temp_obj1->getConceptRelatedByRelatedConceptId(); //CHECKME if ($temp_obj7->getPrimaryKey() === $obj7->getPrimaryKey()) { $newObject = false; $temp_obj7->addConceptPropertyHistoryRelatedByRelatedConceptId($obj1); break; } } if ($newObject) { $obj7->initConceptPropertyHistorysRelatedByRelatedConceptId(); $obj7->addConceptPropertyHistoryRelatedByRelatedConceptId($obj1); } $omClass = StatusPeer::getOMClass(); $cls = Propel::import($omClass); $obj8 = new $cls(); $obj8->hydrate($rs, $startcol8); $newObject = true; for ($j = 0, $resCount = count($results); $j < $resCount; $j++) { $temp_obj1 = $results[$j]; $temp_obj8 = $temp_obj1->getStatus(); //CHECKME if ($temp_obj8->getPrimaryKey() === $obj8->getPrimaryKey()) { $newObject = false; $temp_obj8->addConceptPropertyHistory($obj1); break; } } if ($newObject) { $obj8->initConceptPropertyHistorys(); $obj8->addConceptPropertyHistory($obj1); } $omClass = UserPeer::getOMClass(); $cls = Propel::import($omClass); $obj9 = new $cls(); $obj9->hydrate($rs, $startcol9); $newObject = true; for ($j = 0, $resCount = count($results); $j < $resCount; $j++) { $temp_obj1 = $results[$j]; $temp_obj9 = $temp_obj1->getUser(); //CHECKME if ($temp_obj9->getPrimaryKey() === $obj9->getPrimaryKey()) { $newObject = false; $temp_obj9->addConceptPropertyHistory($obj1); break; } } if ($newObject) { $obj9->initConceptPropertyHistorys(); $obj9->addConceptPropertyHistory($obj1); } $results[] = $obj1; } return $results; }
public function getNamespaces() { $criteria = new Criteria(); $criteria->add(ConceptPeer::VOCABULARY_ID, $this->getId()); $criteria->addJoin(ConceptPropertyPeer::CONCEPT_ID, ConceptPeer::ID); $criteria->addJoin(ProfilePropertyPeer::SKOS_ID, ConceptPropertyPeer::SKOS_PROPERTY_ID); $criteria->clearSelectColumns(); $criteria->addSelectColumn(ProfilePropertyPeer::URI); $criteria->setDistinct(); $rs = ConceptPeer::doSelectRS($criteria); $coreNamespaces = ['dc' => 'http://purl.org/dc/elements/1.1/', 'dcterm' => 'http://purl.org/dc/terms/', 'owl' => 'http://www.w3.org/2002/07/owl#', 'skos' => 'http://www.w3.org/2004/02/skos/core#', 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 'rdfs' => 'http://www.w3.org/2000/01/rdf-schema#', 'reg' => 'http://metadataregistry.org/uri/profile/regap/', 'rdakit' => 'http://metadataregistry.org/uri/profile/rdakit/']; $namespaces = []; foreach ($rs as $r) { $array = explode(":", $r[0]); if (isset($coreNamespaces[$array[0]])) { $namespaces[$array[0]] = $coreNamespaces[$array[0]]; } } //add the required namespaces foreach (['dc', 'reg', 'rdf', 'skos'] as $ns) { $namespaces[$ns] = $coreNamespaces[$ns]; } ksort($namespaces); return $namespaces; }
public function executeShowConcept() { //build the complete URI $rootUri = $this->getRequest()->getUriPrefix() . '/'; $conceptUri = $rootUri . 'uri/' . $this->getRequestParameter('scheme', '') . '/' . $this->getRequestParameter('concept', ''); $type = $this->getRequestParameter('type'); $ts = strtotime($this->getRequestParameter('ts')); $this->timestamp = $ts; //$_SERVER['HTTP_ACCEPT'] = ''; //$_SERVER['HTTP_USER_AGENT'] = ''; switch ($type) { case 'rdf': //this URI HAS an 'id', HAS an 'rdf' suffix, and does NOT have a 'uri' action $id = $this->getRequestParameter('id'); $concept = ConceptPeer::retrieveByPK($id); $this->getContext()->getResponse()->setStatusCode(200); break; case 'html': //this URI does NOT have an 'id', HAS an 'html' suffix, and HAS a 'uri' action //redirect to the base registry using the correct id for the scheme: // http://metadataregistry.org/concept/list/vocabulary_id/16.html $concept = ConceptPeer::getConceptByUri($conceptUri); $this->forward404Unless($concept); //redirect $this->getContext()->getResponse()->setStatusCode(303); $this->redirect($this->getRequest()->getUriPrefix() . '/concept/show/id/' . $concept->getId() . '.html'); break; case 'uri': //this URI does NOT have an 'id', HAS an 'rdf' suffix, and HAS a 'uri' action $concept = ConceptPeer::getConceptByUri($conceptUri); break; case 'api_uri': //this URI does NOT have an 'id', does NOT have an 'rdf' suffix, and comes from the API $uri = $this->getRequestParameter('uri', ''); $concept = ConceptPeer::getConceptByUri($uri); break; default: //covers case of 'unknown' too //this URI does NOT have an 'id', does NOT have a suffix, and HAS a 'uri' action //do content negotiation if (true === strpos($_SERVER['HTTP_ACCEPT'], 'text/html') || true === strpos($_SERVER['HTTP_ACCEPT'], 'application/xhtml+xml') || 0 === strpos($_SERVER['HTTP_USER_AGENT'], 'Mozilla')) { //we redirect to html $concept = ConceptPeer::getConceptByUri($conceptUri); $this->forward404Unless($concept); //redirect $this->getContext()->getResponse()->setStatusCode(303); $this->redirect($this->getRequest()->getUriPrefix() . '/concept/show/id/' . $concept->getId() . '.html'); } else { $concept = ConceptPeer::getConceptByUri($conceptUri); $this->forward404Unless($concept); //we redirect to rdf $redirectUri = $_SERVER['REDIRECT_URL'] ? $_SERVER['REDIRECT_URL'] : $_SERVER['REQUEST_URI']; $this->redirect($this->getRequest()->getUriPrefix() . $redirectUri . '.rdf'); } break; } $this->forward404Unless($concept); $vocabulary = $concept->getVocabulary(); //get the property data $properties = $concept->getConceptPropertysRelatedByConceptId(); $this->properties = $properties; $this->vocabulary = $vocabulary; $this->concept = $concept; // get the list of skos properties that reference resources $this->skosProps = SkosPropertyPeer::getResourceProperties(); $this->namespaces = $vocabulary->getNamespaces(); //get top concepts for vocabulary $this->getTopConcepts($vocabulary); }
/** * @return string * @throws sfError404Exception */ public function executeGet() { /** @var myWebRequest $request **/ $request = $this->getRequest(); $redir = $this->getRequestParameter('redir', false); $uri = $this->getRequestParameter('uri'); if (!$uri) { $uri = "http://" . $request->getPathInfoParam('HTTP_HOST') . $request->getPathInfoParam('REQUEST_URI'); //strip trailing type $uri = preg_replace('/\\.\\w+$/U', '', $uri); //strip _dev script if it's part of the URI' $uri = preg_replace('%\\w+\\_dev.php/%', '', $uri); } $module = $this->getRequestParameter('type'); if ('unknown' == $module) { $accept = $request->getPathInfoParam('HTTP_ACCEPT'); $agent = $request->getPathInfoParam('HTTP_USER_AGENT'); //any of these will return html /*RewriteCond %{HTTP_ACCEPT} !application/rdf\+xml.*(text/html|application/xhtml\+xml) RewriteCond %{HTTP_ACCEPT} text/html [OR] RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml [OR] RewriteCond %{HTTP_USER_AGENT} ^Mozilla/.* RewriteRule ^(.*)$ rdtest.php?type=html&uri=$1 [QSA,L] */ if (!preg_match('%application/rdf\\+xml.*(text/html|application/xhtml\\+xml)%im', $accept) && (preg_match('%text/html%im', $accept) || preg_match('%application/xhtml\\+xml%im', $accept) || preg_match('%^Mozilla/.*%im', $agent) && preg_match('%\\*/\\*%im', $accept))) { $module = 'html'; } elseif (preg_match('%application/rdf\\+xml%im', $accept)) { $module = 'rdf'; } elseif (preg_match('%text/rdf+n3%im', $accept)) { $module = 'n3'; } else { $module = sfConfig::get('default_conneg_type'); } } $class = strtolower($this->getRequestParameter('class')); switch ($class) { case 'concept': switch ($module) { case 'html': /** @var Concept $concept **/ $concept = ConceptPeer::getConceptByUri($uri); $this->forward404Unless($concept); $uri = $request->getUriPrefix() . "/concept/show/id/" . $concept->getId() . ".html"; //redirect $this->redirectIf($redir, $uri, 303); //return the url return $this->renderText($uri); //forward //$request->setParameter('vocabulary_id', $vocabulary->getId()); //$this->forward('concept','list'); break; case 'rdf': //redirect $this->redirectIf($redir, $uri . '.rdf', 303); //forward $request->setParameter('type', 'api_uri'); $this->forwardIf($uri, 'rdf', 'showConcept'); break; } break; case 'concept_scheme': case 'conceptscheme': switch ($module) { case 'html': /** @var Vocabulary $vocabulary **/ $vocabulary = VocabularyPeer::retrieveByUri($uri); $this->forward404Unless($vocabulary); $uri = $request->getUriPrefix() . "/vocabulary/show/id/" . $vocabulary->getId() . ".html"; //redirect $this->redirectIf($redir, $uri, 303); //return the url return $this->renderText($uri); //forward //$request->setParameter('vocabulary_id', $vocabulary->getId()); //$this->forward('concept','list'); break; case 'rdf': //redirect $this->redirectIf($redir, $uri . '.rdf', 303); //forward $request->setParameter('type', 'api_uri'); $this->forwardIf($uri, 'rdf', 'showScheme'); break; case 'xsd': //reset the type $request->setParameter('type', 'api_uri'); $this->forwardIf($uri, 'xml', 'showScheme'); break; } break; case 'schema': /** @var Schema $schema **/ $schema = SchemaPeer::retrieveByUri($uri); $this->forward404Unless($schema); switch ($module) { case 'html': $uri = $request->getUriPrefix() . "/schema/show/id/" . $schema->getId() . ".html"; //redirect $this->redirectIf($redir, $uri, 303); //return the url return $this->renderText($uri); break; case 'rdf': //redirect $this->redirectIf($redir, $uri . '.rdf', 303); //forward $request->setParameter('id', $schema->getId()); $this->forwardIf($uri, 'schema', 'showRdf'); break; } break; case 'schema_property': case 'schemaproperty': /** @var SchemaProperty $property **/ $property = SchemaPropertyPeer::retrieveByUri($uri); $this->forward404Unless($property); switch ($module) { case 'html': $uri = $request->getUriPrefix() . "/schemaprop/show/id/" . $property->getId() . ".html"; //redirect $this->redirectIf($redir, $uri, 303); //return the url return $this->renderText($uri); break; case 'rdf': //redirect $this->redirectIf($redir, $uri . '.rdf', 303); //forward $request->setParameter('id', $property->getId()); $this->forwardIf($uri, 'schemaprop', 'showRdf'); break; } break; default: $this->forward404(); } return sfView::NONE; }
public function testGetConceptPropertiesArray(FunctionalTester $I) { $concept = ConceptPeer::retrieveByPK(727); $propertyArray = jsonldService::getConceptPropertyArray($concept); $I->assertEquals(json_encode($propertyArray, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT), '{ "@id": "http://rdaregistry.info/termList/AspectRatio/1001", "@type": "Concept", "api": "http://api.metadataregistry.org/concepts/727", "inScheme": "http://rdaregistry.info/termList/AspectRatio/", "status": "Published", "prefLabel": { "en": "full screen", "de": "Vollbild", "fr": "plein écran", "es": "pantalla completa", "zh": "全屏" }, "scopeNote": { "en": "Use for standard format, i.e., 1.33:1 or 4:3." }, "definition": { "en": "Aspect ratio for a moving image resource of less than 1.5:1.", "de": "Bildformat einer Bewegtbildressource von weniger als 1.5:1.", "fr": "Format de l’image d’une ressource d’images animées inférieur à 1,5:1.", "es": "Proporción dimensional de un recurso de imagen en movimiento menor que 1.5:1.", "zh": "动态图像资源的宽高比小于1.5:1。" }, "ToolkitLabel": { "en": "full screen", "fr": "plein écran", "de": "Vollbild", "es": "pantalla completa", "zh": "全屏" }, "ToolkitDefinition": { "en": "Aspect ratio for a moving image resource of less than 1.5:1.", "fr": "Format de l’image d’une ressource d’images animées inférieur à 1,5:1.", "de": "Bildformat einer Bewegtbildressource von weniger als 1.5:1.", "es": "Proporción dimensional de un recurso de imagen en movimiento menor que 1.5:1.", "zh": "动态图像资源的宽高比小于1.5:1。" }, "altLabel": { "en": [ "full-screen", "full-screen", "fullscreen", "full-screen" ] } }'); }
/** * @param $task * @param $args * * Arg[0] is one of "schema" (element set), "vocab" or "vocabulary" * arg[1] is the vocabulary name. * The file type is determined by the extension and must be one of "json", "rdf", "csv", "xml" * arg[2] is the vocabulary id * arg[3] is the batch id * arg[4] [optional] is -d * * @throws Exception */ function run_import_vocabulary($task, $args) { //xdebug_break(); //check the argument counts if (count($args) < 1) { throw new Exception('You must provide a vocabulary type.'); } if (count($args) < 2) { throw new Exception('You must provide a file name.'); } if (count($args) < 3) { throw new Exception('You must provide a vocabulary id.'); } //set the arguments $type = strtolower($args[0]); $filePath = $args[1]; $vocabId = $args[2]; $batchId = isset($args[3]) ? $args[3] : ""; $deleteMissing = (isset($args[4]) && ("-d" == $args[4])); //do some basic validity checks if (! in_array( $type, array( "schema", "vocab", "vocabulary" ) ) ) { throw new Exception('You must import into a schema or a vocab'); } if ("vocabulary" == $type) { $type = "vocab"; } if (! is_numeric($vocabId)) { throw new Exception('You must provide a valid ID'); } //does the file exist? if (! file_exists($filePath)) { //default to the site upload path $filePath = $GLOBALS['uploadPath'] . $filePath; if (! file_exists($filePath)) { throw new Exception('You must supply a valid file to import: ' . $filePath); } } //is the file a valid type? if (preg_match('/^.+\.([[:alpha:]]{2,4})$/', $filePath, $matches)) { if (! in_array( strtolower($matches[1]), array( "json", "rdf", "csv", "xml" ) ) ) { throw new Exception('You must provide a valid file type based on the extension'); } } else { throw new Exception("File type cannot be determined from the file extension"); } $fileType = $matches[1]; //is the object a valid object? if ('vocab' == $type) { $vocabObj = VocabularyPeer::retrieveByPK($vocabId); if (is_null($vocabObj)) { throw new Exception('Invalid vocabulary ID'); } //set some defaults $baseDomain = $vocabObj->getBaseDomain(); $language = $vocabObj->getLanguage(); $statusId = $vocabObj->getStatusId(); $userId = $vocabObj->getCreatedUserId(); $agentId = $vocabObj->getAgentId(); //get a skos property id map $skosMap = SkosPropertyPeer::getPropertyNames(); //there has to be a hash or a slash $tSlash = preg_match('@(/$)@i', $vocabObj->getUri()) ? '' : '/'; $tSlash = preg_match('/#$/', $vocabObj->getUri()) ? '' : $tSlash; } else { $import = new ImportVocab($type, $filePath, $vocabId); } /* From here on the process is the same regardless of UI */ // check to see if file has been uploaded before // check import history for file name $importHistory = FileImportHistoryPeer::retrieveByLastFilePath($filePath); // if reimport // get last import history for filename // unserialize column map // match column names to AP based on map // look for matches in unmatched field/column names to AP (ideal) // csv table of data -- // row1: parsed field names/column headers // row2: select dropdown with available fields from object AP (pre-select known matches) // each select identified by column number // row3: display datatype of selected field (updated dynamically when field selected) // row4-13: first 10 rows of parsed data from file // require a column that can match to 'URI' (maybe we'll allow an algorithm later) // require columns that are required by AP // on reimport there should be a flag to 'delete missing properties' from the current data // note: at some point there will be a reimport process that allows URI changing // this will require that there be an OMR identifier embedded in the incoming data switch ($fileType) { case "csv": if ('vocab' == $type) { // Get array of heading names found $headings = $reader->getHeadings(); $fields = ConceptPeer::getFieldNames(); //set the map // $map[] = array("property" => "Uri", "column" => "URILocal"); // $map[] = array("property" => "prefLabel", "column" => "skos:prefLabel"); // $map[] = array("property" => "definition", "column" => "skos:definition"); // $map[] = array("property" => "notation", "column" => "skos:notation"); // $map[] = array("property" => "scopeNote", "column" => "skos:scopeNote"); $map = array( "uri" => "URILocal", "prefLabel" => "skos:prefLabel", "definition" => "skos:definition", "notation" => "skos:notation", "scopeNote" => "skos:scopeNote" ); $rows = 0; //executeImport: // serialize the column map try { while ($row = $reader->getRow()) { $rows ++; // lookup the URI (or the OMR ID if available) for a match $uri = $baseDomain . $row[$map["uri"]]; $concept = ConceptPeer::getConceptByUri($uri); $updateTime = time(); $language = (isset($map['language'])) ? $row[$map['language']] : $vocabObj->getLanguage(); if (! $concept) { // create a new concept or element $concept = new Concept(); $concept->setVocabulary($vocabObj); $concept->setUri($uri); /** * @todo Need to handle updates for topconcept here, just like language **/ $concept->setIsTopConcept(false); $concept->updateFromRequest( $userId, fixEncoding(rtrim($row[$map['prefLabel']])), $language, $statusId ); } //don't update the concept if the preflabel matches else if ($row[$map['prefLabel']] != $concept->getPrefLabel()) { $concept->updateFromRequest($userId, fixEncoding(rtrim($row[$map['prefLabel']]))); } //there needs to be a language to lookup the properties unless it's an objectProperty $rowLanguage = (isset($map['language'])) ? $row[$map['language']] : $concept->getLanguage(); foreach ($map as $key => $value) { //we skip because we already did them if (! in_array( $key, array( 'uri', 'prefLabel', 'language' ) ) ) { $skosId = $skosMap[$key]; //check to see if the property already exists $property = ConceptPropertyPeer::lookupProperty($concept->getId(), $skosId, $rowLanguage); //create a new property for each unmatched column if (! empty($row[$value])) { if (! $property) { $property = new ConceptProperty(); $property->setCreatedUserId($userId); $property->setConceptId($concept->getId()); $property->setCreatedAt($updateTime); $property->setSkosPropertyId($skosId); } if (($row[$value] != $property->getObject()) || ($rowLanguage != $property->getLanguage()) ) { /** * @todo We need a check here for skos objectproperties and handle differently **/ if ($rowLanguage != $property->getLanguage()) { $property->setLanguage($rowLanguage); } if ($row[$value] != $property->getObject()) { $property->setObject(fixEncoding(rtrim($row[$value]))); } $property->setUpdatedUserId($userId); $property->setUpdatedAt($updateTime); $property->save(); } } //the row value is empty else if ($deleteMissing && $property) { $property->delete(); } } } // else // lookup and update concept or element // lookup and update each property // update the history for each property, action is 'import', should be a single timestamp for all (this should be automatic) // if 'delete missing properties' is true // delete each existing, non-required property that wasn't updated by the import } } catch(Exception $e) { // catch // if there's an error of any kind, write to error log and continue echo "Error on row: " . $rows . ", " . $uri . "\n" . $e . "\n"; continue; } $objects = $vocabObj->countConcepts(); } else //it's an element set { $import->setCsvReader($import->file); $import->processProlog(); $import->getDataColumnIds(); $import->processData(); //todo: $results should be a class $results[$vocabId] = $import->results; $bacthId = $import->saveResults($batchId); } break; case "json": break; case "rdf": break; case "xml": break; default: } /* output to stdout*/ // number of objects imported (link to history, filtered on timestamp of import) echo " Rows imported: " . count($results[$vocabId]['success']['rows']) . "\n From File:" . $filePath . "\nUse this ID for more in this batch: " . $bacthId; // number of errors (link to error log) }
public function executeEdit() { $this->setFlash('vocabID', $this->getVocabularyId()); if ($this->getRequest()->getMethod() == sfRequest::POST) { //before the save... $concept_property = $this->getRequestParameter('concept_property'); /** * @todo the list of skos property types that require a related concept should be in a master configuration array * this applies to the template too **/ //check to see if the skosproperty requires a related concept if (!in_array($concept_property['skos_property_id'], array('3', '16', '21', '32', '33', '34', '35', '36', '37'))) { $concept_property['related_concept_id'] = null; $concept_property['scheme_id'] = null; } $conceptPropertyId = $this->getRequestParameter('id'); $userId = $this->getUser()->getSubscriberId(); //does the user have editorial rights to the reciprocal... $permission = false; if (isset($concept_property['related_concept_id']) and $concept_property['related_concept_id']) { //we want to lookup the URI of the related term $related_concept = ConceptPeer::retrieveByPK($concept_property['related_concept_id']); if ($related_concept) { if ($this->getUser()->hasCredential(array(0 => 'administrator'))) { $permission = true; } else { //get the maintainers of the reciprocal property $maintainers = $related_concept->getVocabulary()->getVocabularyHasUsers(); /** @var VocabularyHasUser $maintainer */ foreach ($maintainers as $maintainer) { if ($userId === $maintainer->getUserId() and $maintainer->getIsMaintainerFor()) { $permission = true; break; } } } } } if ($permission) { if (isset($conceptPropertyId) && $conceptPropertyId) { $this->deleteReciprocalProperty($conceptPropertyId, $concept_property['related_concept_id']); } if (isset($concept_property['related_concept_id']) and $concept_property['related_concept_id']) { //we want to lookup the URI of the related term $related_concept = ConceptPeer::retrieveByPK($concept_property['related_concept_id']); if ($related_concept) { //and overwrite whatever is in the current object TODO: move this into an javascript action in the user interface $concept_property['object'] = $related_concept->getUri(); $this->getRequest()->getParameterHolder()->set('concept_property', $concept_property); } //lookup the inverse id $InverseProfileId = ProfilePropertyPeer::retrieveBySkosID($concept_property['skos_property_id'])->getInverseProfilePropertyId(); $InverseSkosId = ProfilePropertyPeer::retrieveByPK($InverseProfileId)->getSkosId(); //then we create a new reciprocal property in the related term $newProp = new ConceptProperty(); $newProp->setConceptId($concept_property['related_concept_id']); $newProp->setSkosPropertyId($InverseSkosId); $newProp->setSchemeId($this->concept->getVocabularyId()); $newProp->setRelatedConceptId($this->concept->GetId()); $newProp->setObject($this->concept->getUri()); $newProp->setStatusId($concept_property['status_id']); $newProp->setIsGenerated(true); $newProp->setCreatedUserId($this->getUser()->getSubscriberId()); $newProp->setUpdatedUserId($this->getUser()->getSubscriberId()); //TODO: make this the user's default language (actually the language is not relevant when defining relationships) //$newProp->setLanguage($this->concept->getLanguage()); $newProp->setLanguage(''); $concept_property['language'] = ''; $newProp->save(); } } //save the array back to the request parameter $this->requestParameterHolder->set('concept_property', $concept_property); } parent::executeEdit(); }