public function setReverseValues() { if (!tao_helpers_Request::isAjax()) { throw new common_exception_IsAjaxAction(__FUNCTION__); } $values = tao_helpers_form_GenerisTreeForm::getSelectedInstancesFromPost(); $resource = new core_kernel_classes_Resource($this->getRequestParameter('resourceUri')); $property = new core_kernel_classes_Property($this->getRequestParameter('propertyUri')); $currentValues = array(); foreach ($property->getDomain() as $domain) { $instances = $domain->searchInstances(array($property->getUri() => $resource), array('recursive' => true, 'like' => false)); $currentValues = array_merge($currentValues, array_keys($instances)); } $toAdd = array_diff($values, $currentValues); $toRemove = array_diff($currentValues, $values); $success = true; foreach ($toAdd as $uri) { $subject = new core_kernel_classes_Resource($uri); $success = $success && $subject->setPropertyValue($property, $resource); } foreach ($toRemove as $uri) { $subject = new core_kernel_classes_Resource($uri); $success = $success && $subject->removePropertyValue($property, $resource); } echo json_encode(array('saved' => $success)); }
/** * Get groups to which delivery is assigned. * @param \core_kernel_classes_Resource $delivery * @return \core_kernel_classes_Resource[] */ public function getGroups(\core_kernel_classes_Resource $delivery) { $result = array(); $groupsProperty = new \core_kernel_classes_Property(PROPERTY_GROUP_DELVIERY); $domainCollection = $groupsProperty->getDomain(); if (!$domainCollection->isEmpty()) { $domain = $domainCollection->get(0); $result = $domain->searchInstances(array($groupsProperty->getUri() => $delivery), array('recursive' => false, 'like' => false)); } return $result; }
/** * Generates a form to define the reverse values of a specific property for a resource * This allows to set/remove multiple triples that share the same object * * @param core_kernel_classes_Resource $resource * @param core_kernel_classes_Property $property * @return tao_helpers_form_GenerisTreeForm */ public static function buildReverseTree(core_kernel_classes_Resource $resource, core_kernel_classes_Property $property) { $tree = new self($resource, $property); $domainCollection = $property->getDomain(); if (!$domainCollection->isEmpty()) { $domain = $domainCollection->get(0); $tree->setData('rootNode', $domain->getUri()); $tree->setData('dataUrl', _url('getData', 'GenerisTree', 'tao')); $tree->setData('saveUrl', _url('setReverseValues', 'GenerisTree', 'tao')); $values = array_keys($domain->searchInstances(array($property->getUri() => $resource), array('recursive' => true, 'like' => false))); $tree->setData('values', $values); $openNodeUris = tao_models_classes_GenerisTreeFactory::getNodesToOpen($values, $domain); $tree->setData('openNodes', $openNodeUris); } return $tree; }
/** * Short description of method delete * * @access public * @author Joel Bout, <*****@*****.**> * @param Resource resource * @param boolean deleteReference * @return boolean */ public function delete(\core_kernel_classes_Resource $resource, $deleteReference = false) { $returnValue = (bool) false; $dbWrapper = \core_kernel_classes_DbWrapper::singleton(); $tableName = ResourceReferencer::singleton()->resourceLocation($resource); if (empty($tableName)) { return $returnValue; } $uri = $resource->getUri(); $resourceId = HardapiUtils::getResourceIdByTable($resource, $tableName); if ($resourceId) { /* * Delete all the references of the resource first, before the resource is delete of course, * if the parameter $deleteReference is true */ if ($deleteReference) { $properties = array(); //get the resource classes (type) $types = ''; foreach ($resource->getTypes() as $type) { $properties[$type->getUri()] = array(); $types = "'" . $type->getUri() . "',"; } $types = substr($types, 0, strlen($types) - 1); if (!empty($types)) { //get all the properties that have one of the resource class as range $sqlQuery = 'SELECT "subject", "object" FROM "statements" WHERE "predicate" = \'' . RDFS_RANGE . '\' AND object IN (' . $types . ')'; $result = $dbWrapper->query($sqlQuery); while ($row = $result->fetch()) { //fill the properties range: propertyUri => domains: $propertyUri = $row['subject']; $rangeUri = $row['object']; $properties[$rangeUri][$propertyUri] = array(); //get the domain of the property: $property = new \core_kernel_classes_Property($propertyUri); foreach ($property->getDomain()->getIterator() as $domain) { if ($domain instanceof \core_kernel_classes_Class) { $properties[$rangeUri][$propertyUri][] = $domain->getUri(); } } } //delete the references $referencer = ResourceReferencer::singleton(); foreach ($properties as $rangeUri => $propertyUris) { foreach ($propertyUris as $propertyUri => $domains) { //property -> column $property = new \core_kernel_classes_Property($propertyUri); $isMulti = $property->isMultiple() || $property->isLgDependent(); $columnName = ''; if (!$isMulti) { $columnName = HardapiUtils::getShortName($property); if (empty($columnName)) { continue; } } foreach ($domains as $domainUri) { //classLocations -> table $classLocations = $referencer->classLocations(new \core_kernel_classes_Class($domainUri)); foreach ($classLocations as $classLocation) { if ($property->isMultiple()) { //delete the row in the props table $query = 'DELETE FROM "' . $classLocation['table'] . 'props" WHERE "property_uri" = ? AND ("property_value" = ? OR "property_foreign_uri" = ?)'; $dbWrapper->exec($query, array($propertyUri, $uri, $uri)); } else { //set the col value to NULL $query = 'UPDATE "' . $classLocation['table'] . '" SET "' . $columnName . '" = NULL WHERE "' . $columnName . '" = ?'; $dbWrapper->exec($query, array($uri)); } } } } } } } $queries = array(); // Delete records in the main table $queries[] = 'DELETE FROM "' . $tableName . '" WHERE "id" = \'' . $resourceId . '\''; // Delete records in the properties table $queries[] = 'DELETE FROM "' . $tableName . 'props" WHERE "instance_id" = \'' . $resourceId . '\''; foreach ($queries as $query) { try { $result = $dbWrapper->exec($query); if ($result === false) { $returnValue = false; break; } else { $returnValue = true; } } catch (\PDOException $e) { throw new Exception("Unable to delete resource ({$resource->getUri()}) ;" . $e->getMessage()); } } // Unreference the resource ResourceReferencer::singleton()->unReferenceResource($resource); } return (bool) $returnValue; }