Example #1
0
 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;
    }