/** * Removes a translation from the current object * * @param int $languageID * @return bool */ function removeTranslation( $languageID ) { $language = eZContentLanguage::fetch( $languageID ); if ( !$language ) { return false; } // check permissions for editing if ( !$this->checkAccess( 'edit', false, false, false, $languageID ) ) { return false; } // check if it is not the initial language $objectInitialLanguageID = $this->attribute( 'initial_language_id' ); if ( $objectInitialLanguageID == $languageID ) { return false; } // change language_mask of the object $languageMask = (int) $this->attribute( 'language_mask' ); $languageMask = (int) $languageMask & ~ (int) $languageID; $this->setAttribute( 'language_mask', $languageMask ); $db = eZDB::instance(); $db->begin(); $this->store(); $objectID = $this->ID; // If the current version has initial_language_id $languageID, change it to the initial_language_id of the object. $currentVersion = $this->currentVersion(); if ( $currentVersion->attribute( 'initial_language_id' ) == $languageID ) { $currentVersion->setAttribute( 'initial_language_id', $objectInitialLanguageID ); $currentVersion->store(); } // Remove all versions which had the language as its initial ID. Because of previous checks, it is sure we will not remove the published version. $versionsToRemove = $this->versions( true, array( 'conditions' => array( 'initial_language_id' => $languageID ) ) ); foreach ( $versionsToRemove as $version ) { $version->removeThis(); } $altLanguageID = $languageID++; // Remove all attributes in the language $attributes = $db->arrayQuery( "SELECT * FROM ezcontentobject_attribute WHERE contentobject_id='$objectID' AND ( language_id='$languageID' OR language_id='$altLanguageID' )" ); foreach ( $attributes as $attribute ) { $attributeObject = new eZContentObjectAttribute( $attribute ); $attributeObject->remove( $attributeObject->attribute( 'id' ), $attributeObject->attribute( 'version' ) ); unset( $attributeObject ); } // Remove all names in the language $db->query( "DELETE FROM ezcontentobject_name WHERE contentobject_id='$objectID' AND ( language_id='$languageID' OR language_id='$altLanguageID' )" ); // Update masks of the objects $mask = eZContentLanguage::maskForRealLanguages() - (int) $languageID; if ( $db->databaseName() == 'oracle' ) { $db->query( "UPDATE ezcontentobject_version SET language_mask = bitand( language_mask, $mask ) WHERE contentobject_id='$objectID'" ); } else { $db->query( "UPDATE ezcontentobject_version SET language_mask = language_mask & $mask WHERE contentobject_id='$objectID'" ); } $urlElementfilter = new eZURLAliasQuery(); $urlElementfilter->type = 'name'; // We want all languages present here, so we are turning off // language filtering $urlElementfilter->languages = false; $urlElementfilter->limit = false; $nodes = $this->assignedNodes(); foreach ( $nodes as $node ) { $parent = null; $textMD5 = null; $urlElementfilter->actions = array( 'eznode:' . $node->attribute( 'node_id' ) ); $urlElementfilter->prepare(); $urlElements = $urlElementfilter->fetchAll(); foreach ($urlElements as $url ) { if ( $url->attribute( 'lang_mask' ) === (int)$languageID or $url->attribute( 'lang_mask') === (int)$altLanguageID ) { $parent = $url->attribute( 'parent'); $textMD5 = $url->attribute( 'text_md5' ); break; } } if ( $parent !== null and $textMD5 !== null ) eZURLAliasML::removeSingleEntry( $parent, $textMD5, $language ); } $db->commit(); return true; }