Exemple #1
0
 /**
  * Initialize the form elements
  *
  * @access protected
  * @author Bertrand Chevrier, <*****@*****.**>
  * @return mixed
  */
 protected function initElements()
 {
     parent::initElements();
     $elements = $this->form->getElements();
     $this->form->setElements(array());
     $currentLangElt = tao_helpers_form_FormFactory::getElement('current_lang', 'Textbox');
     $currentLangElt->setDescription(__('Current language'));
     $currentLangElt->setAttributes(array('readonly' => 'true'));
     $currentLangElt->setValue(\common_session_SessionManager::getSession()->getDataLanguage());
     //API lang /data lang
     $this->form->addElement($currentLangElt);
     $dataLangElement = tao_helpers_form_FormFactory::getElement('translate_lang', 'Combobox');
     $dataLangElement->setDescription(__('Translate to'));
     $dataLangElement->setOptions(tao_helpers_I18n::getAvailableLangsByUsage(new core_kernel_classes_Resource(INSTANCE_LANGUAGE_USAGE_DATA)));
     $dataLangElement->setEmptyOption(__('Select a language'));
     $dataLangElement->addValidator(tao_helpers_form_FormFactory::getValidator('NotEmpty'));
     $this->form->addElement($dataLangElement);
     $this->form->createGroup('translation_info', __('Translation parameters'), array('current_lang', 'translate_lang'));
     $dataGroup = array();
     foreach ($elements as $element) {
         if ($element instanceof tao_helpers_form_elements_Hidden || $element->getName() == 'uri' || $element->getName() == 'classUri') {
             $this->form->addElement($element);
         } else {
             $propertyUri = tao_helpers_Uri::decode($element->getName());
             $property = new core_kernel_classes_Property($propertyUri);
             //translate only language dependent properties or Labels
             //supported widget are: Textbox, TextArea, HtmlArea
             //@todo support other widgets
             if ($property->isLgDependent() && ($element instanceof tao_helpers_form_elements_Textbox || $element instanceof tao_helpers_form_elements_TextArea || $element instanceof tao_helpers_form_elements_HtmlArea) || $propertyUri == RDFS_LABEL) {
                 $translatedElt = clone $element;
                 $viewElt = tao_helpers_form_FormFactory::getElement('view_' . $element->getName(), 'Label');
                 $viewElt->setDescription($element->getDescription());
                 $viewElt->setValue($element->getValue());
                 $viewElt->setAttribute('no-format', true);
                 if ($element instanceof tao_helpers_form_elements_HtmlArea) {
                     $viewElt->setAttribute('htmlentities', false);
                 }
                 $this->form->addElement($viewElt);
                 $dataGroup[] = $viewElt->getName();
                 $translatedElt->setDescription(' ');
                 $translatedElt->setValue('');
                 if ($propertyUri == RDFS_LABEL) {
                     $translatedElt->setForcedValid();
                 }
                 $this->form->addElement($translatedElt);
                 $dataGroup[] = $translatedElt->getName();
             }
         }
     }
     $this->form->createGroup('translation_form', __('Translate'), $dataGroup);
 }
Exemple #2
0
 /**
  * Test the service factory: dynamical instantiation and single instance serving
  */
 public function testMultiple()
 {
     $propClass = new core_kernel_classes_Class(RDF_PROPERTY);
     $q = "SELECT subject, count(object)\n                FROM statements\n                    WHERE predicate = ?\n                    GROUP BY subject\n                    HAVING (count(object) > 1)";
     foreach ($propClass->getInstances(true) as $property) {
         $property = new core_kernel_classes_Property($property);
         if (!$property->isMultiple() && !$property->isLgDependent()) {
             // bypass generis
             $result = core_kernel_classes_DbWrapper::singleton()->query($q, array($property->getUri()));
             while ($statement = $result->fetch()) {
                 $this->fail($property->getUri() . ' has multiple values but is not multiple.');
             }
         }
     }
 }
Exemple #3
0
 /**
  * Short description of method removePropertyValues
  *
  * @access public
  * @author Joel Bout, <*****@*****.**>
  * @param  Resource resource
  * @param  Property property
  * @param  array options
  * @return boolean
  */
 public function removePropertyValues(core_kernel_classes_Resource $resource, core_kernel_classes_Property $property, $options = array())
 {
     $returnValue = (bool) false;
     // Optional params
     $pattern = isset($options['pattern']) && !is_null($options['pattern']) ? $options['pattern'] : null;
     $like = isset($options['like']) && $options['like'] == true ? true : false;
     //build query:
     $query = 'DELETE FROM statements WHERE subject = ? AND predicate = ?';
     $objectType = $this->getPersistence()->getPlatForm()->getObjectTypeCondition();
     $conditions = array();
     if (is_string($pattern)) {
         if (!is_null($pattern)) {
             $searchPattern = core_kernel_persistence_smoothsql_Utils::buildSearchPattern($this->getPersistence(), $pattern, $like);
             $conditions[] = '( ' . $objectType . ' ' . $searchPattern . ' )';
         }
     } else {
         if (is_array($pattern)) {
             if (count($pattern) > 0) {
                 $multiCondition = "( ";
                 foreach ($pattern as $i => $patternToken) {
                     $searchPattern = core_kernel_persistence_smoothsql_Utils::buildSearchPattern($this->getPersistence(), $patternToken, $like);
                     if ($i > 0) {
                         $multiCondition .= " OR ";
                     }
                     $multiCondition .= '(' . $objectType . ' ' . $searchPattern . ' )';
                 }
                 $conditions[] = "{$multiCondition} ) ";
             }
         }
     }
     foreach ($conditions as $i => $additionalCondition) {
         $query .= " AND ( {$additionalCondition} ) ";
     }
     //be sure the property we try to remove is included in an updatable model
     $query .= ' AND ' . $this->getModelWriteSqlCondition();
     if ($property->isLgDependent()) {
         $query .= ' AND (' . $this->getPersistence()->getPlatForm()->isNullCondition('l_language') . ' OR l_language = ?) ';
         $returnValue = $this->getPersistence()->exec($query, array($resource->getUri(), $property->getUri(), \common_session_SessionManager::getSession()->getDataLanguage()));
     } else {
         $returnValue = $this->getPersistence()->exec($query, array($resource->getUri(), $property->getUri()));
     }
     if (!$returnValue) {
         $returnValue = false;
     }
     return (bool) $returnValue;
 }
    /**
     * 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;
    }