/** * 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); }
/** * 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.'); } } } }
/** * 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; }