/**
  * Unit test for eZContentClass::versionHistoryLimit() with object parameters
  *
  * Replica of testVersionHistoryLimit() but you cannot make calls
  * to the eZ API which relies on a database, as this is not present
  * in the provider methods.
  */
 public function testVersionHistoryLimitWithObjectParameter()
 {
     // different custom limits (article: 13, image: 6) and object as a parameter
     $INISettings = array(array('VersionHistoryClass', array('article' => 13, 'image' => 6)));
     $class = eZContentClass::fetchByIdentifier('image');
     $expectedLimit = 6;
     // change the INI limit settings
     foreach ($INISettings as $settings) {
         list($INIVariable, $INIValue) = $settings;
         ezpINIHelper::setINISetting('content.ini', 'VersionManagement', $INIVariable, $INIValue);
     }
     $limit = eZContentClass::versionHistoryLimit($class);
     self::assertEquals($expectedLimit, $limit);
     ezpINIHelper::restoreINISettings();
 }
示例#2
0
    // Check permission for object in specified language
    if ( !$obj->canEdit( false, false, false, $EditLanguage ) )
    {
        return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel',
                                     array( 'AccessList' => $obj->accessList( 'edit' ) ) );
    }
    $isAccessChecked = true;

    // Kept for backwards compatibility
    if ( $http->hasPostVariable( 'ContentObjectLanguageCode' ) )
    {
        $EditLanguage = $http->postVariable( 'ContentObjectLanguageCode' );
    }

    // Check the new version against history limit for class $classID
    $versionlimit = eZContentClass::versionHistoryLimit( $classID );
    $versionCount = $obj->getVersionCount();
    if ( $versionCount < $versionlimit )
    {
        $version = $obj->createNewVersionIn( $EditLanguage, $FromLanguage, false, true, eZContentObjectVersion::STATUS_INTERNAL_DRAFT );
        if ( !$http->hasPostVariable( 'DoNotEditAfterNewDraft' ) )
        {
            return $Module->redirectToView( 'edit', array( $ObjectID, $version->attribute( 'version' ), $EditLanguage ) );
        }
        else
        {
            return $Module->redirectToView( 'edit', array( $ObjectID, 'f', $EditLanguage ) );
        }
    }
    else
    {
    /**
     * Creates a new version and returns it as an eZContentObjectVersion object.
     *
     * Transaction unsafe. If you call several transaction unsafe methods you must enclose
     * the calls within a db transaction; thus within db->begin and db->commit.
     *
     * @param int|bool $copyFromVersion If given, that version is used to create a copy.
     * @param bool $versionCheck If \c true it will check if there are too many version and remove some of them to make room for a new.
     * @param string|bool $languageCode
     * @param string|bool $copyFromLanguageCode
     * @param int $status
     *
     * @return eZContentObjectVersion
     */
    function createNewVersion( $copyFromVersion = false, $versionCheck = true, $languageCode = false, $copyFromLanguageCode = false, $status = eZContentObjectVersion::STATUS_DRAFT )
    {
        $db = eZDB::instance();
        $db->begin();

        // get the next available version number
        $nextVersionNumber = $this->nextVersion();

        if ( $copyFromVersion == false )
        {
            $version = $this->currentVersion();
        }
        else
        {
            $version = $this->version( $copyFromVersion );
        }

        if ( !$languageCode )
        {
            $initialLanguage = $version->initialLanguage();
            if ( !$initialLanguage )
            {
                $initialLanguage = $this->initialLanguage();
            }

            if ( $initialLanguage )
            {
                $languageCode = $initialLanguage->attribute( 'locale' );
            }
        }

        $copiedVersion = $this->copyVersion( $this, $version, $nextVersionNumber, false, $status, $languageCode, $copyFromLanguageCode );

        // We need to make sure the copied version contains node-assignment for the existing nodes.
        // This is required for BC since scripts might traverse the node-assignments and mark
        // some of them for removal.
        $parentMap = array();
        $copiedNodeAssignmentList = $copiedVersion->attribute( 'node_assignments' );
        foreach ( $copiedNodeAssignmentList as $copiedNodeAssignment )
        {
            $parentMap[$copiedNodeAssignment->attribute( 'parent_node' )] = $copiedNodeAssignment;
        }
        $nodes = $this->assignedNodes();
        foreach ( $nodes as $node )
        {
            $remoteID = 0;
            // Remove assignments which conflicts with existing nodes, but keep remote_id
            if ( isset( $parentMap[$node->attribute( 'parent_node_id' )] ) )
            {
                $copiedNodeAssignment = $parentMap[$node->attribute( 'parent_node_id' )];
                $remoteID = $copiedNodeAssignment->attribute( 'remote_id' );
                $copiedNodeAssignment->purge();
            }
            $newNodeAssignment = $copiedVersion->assignToNode( $node->attribute( 'parent_node_id' ), $node->attribute( 'is_main' ), 0,
                                                               $node->attribute( 'sort_field' ), $node->attribute( 'sort_order' ),
                                                               $remoteID, $node->attribute( 'remote_id' ) );
            // Reset execution bit
            $newNodeAssignment->setAttribute( 'op_code', $newNodeAssignment->attribute( 'op_code' ) & ~1 );
            $newNodeAssignment->store();
        }

        // Removing last item if we don't have enough space in version list
        if ( $versionCheck )
        {
            $versionlimit = eZContentClass::versionHistoryLimit( $this->attribute( 'contentclass_id' ) );
            $versionCount = $this->getVersionCount();
            if ( $versionCount > $versionlimit )
            {
                // Remove oldest archived version
                $params = array( 'conditions'=> array( 'status' => eZContentObjectVersion::STATUS_ARCHIVED ) );
                $versions = $this->versions( true, $params );
                if ( count( $versions ) > 0 )
                {
                    $modified = $versions[0]->attribute( 'modified' );
                    $removeVersion = $versions[0];
                    foreach ( $versions as $version )
                    {
                        $currentModified = $version->attribute( 'modified' );
                        if ( $currentModified < $modified )
                        {
                            $modified = $currentModified;
                            $removeVersion = $version;
                        }
                    }
                    $removeVersion->removeThis();
                }
            }
        }

        $db->commit();
        return $copiedVersion;
    }
 if (!$versionID or $version->attribute('status') == eZContentObjectVersion::STATUS_INTERNAL_DRAFT) {
     $currentVersion = $object->attribute('current_version');
     $Module->redirectToView('history', array($ObjectID, $currentVersion));
     return eZModule::HOOK_STATUS_CANCEL_RUN;
 }
 $languages = $Module->actionParameter('LanguageArray');
 if ($languages && array_key_exists($versionID, $languages)) {
     $language = $languages[$versionID];
 } else {
     $language = $version->initialLanguageCode();
 }
 if (!$object->checkAccess('edit', false, false, false, $language)) {
     return $Module->handleError(eZError::KERNEL_ACCESS_DENIED, 'kernel');
 }
 // Check the version limit for the object's class
 $versionlimit = eZContentClass::versionHistoryLimit($object->attribute('contentclass_id'));
 $versionCount = $object->getVersionCount();
 if ($versionCount < $versionlimit) {
     $db = eZDB::instance();
     $db->begin();
     $newVersionID = $object->copyRevertTo($versionID, $language);
     $db->commit();
     if (!$http->hasPostVariable('DoNotEditAfterCopy')) {
         return $Module->redirectToView('edit', array($ObjectID, $newVersionID, $language));
     }
 } else {
     $params = array('conditions' => array('status' => eZContentObjectVersion::STATUS_ARCHIVED));
     $versions = $object->versions(true, $params);
     if (count($versions) > 0) {
         $modified = $versions[0]->attribute('modified');
         $removeVersion = $versions[0];
$total = eZContentObjectTreeNode::subTreeCountByNodeID($subTreeParams, 1);
$cli->output("{$total} objects to check... (In the progess bar, 'R' means that at least a version was removed)");
$script->setIterationData('R', '.');
$script->resetIteration($total);
$subTreeParams['Offset'] = 0;
$subTreeParams['Limit'] = 100;
$db = eZDB::instance();
while (true) {
    $nodes = eZContentObjectTreeNode::subTreeByNodeID($subTreeParams, 1);
    if (empty($nodes)) {
        break;
    }
    foreach ($nodes as $node) {
        $object = $node->attribute('object');
        $versionCount = $object->getVersionCount();
        $versionLimit = eZContentClass::versionHistoryLimit($object->attribute('content_class'));
        if ($versionCount <= $versionLimit) {
            $script->iterate($cli, false, "Nothing to do on object #{$object->attribute('id')}");
            continue;
        }
        $versionToRemove = $versionCount - $versionLimit;
        $versions = $object->versions(true, array('conditions' => array('status' => eZContentObjectVersion::STATUS_ARCHIVED), 'sort' => array('modified' => 'asc'), 'limit' => array('limit' => $versionToRemove, 'offset' => 0)));
        $removedVersion = 0;
        $db->begin();
        foreach ($versions as $version) {
            $version->removeThis();
            $removedVersion++;
        }
        $db->commit();
        if ($removedVersion > 0) {
            $script->iterate($cli, true, "Removed {$removedVersion} archived versions of object #{$object->attribute('id')}");