Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Page/Collection/Version/Version.php
Строк: 464
<?php
namespace ConcreteCorePageCollectionVersion;

use 
Loader;
use 
ConcreteCoreFoundationObject;
use 
Block;
use 
Page;
use 
PageType;
use 
PageTemplate;
use 
Permissions;
use 
User;
use 
Events;
use 
CacheLocal;
use 
CollectionAttributeKey;
use 
ConcreteCoreFeatureAssignmentCollectionVersionAssignment as CollectionVersionFeatureAssignment;

class 
Version extends Object implements ConcreteCorePermissionObjectInterface
{

    var 
$cvIsApproved;

    var 
$cID;

    protected 
$attributes = array();

    public 
$layoutStyles = array();

    public function 
getPermissionObjectIdentifier()
    {
        return 
$this->getCollectionID() . ':' $this->getVersionID();
    }

    public function 
getPermissionResponseClassName()
    {
        return 
'\Concrete\Core\Permission\Response\CollectionVersionResponse';
    }

    public function 
getPermissionAssignmentClassName()
    {
        return 
'\Concrete\Core\Permission\Assignment\PageAssignment';
    }

    public function 
getPermissionObjectKeyCategoryHandle()
    {
        return 
'page';
    }

    public function 
refreshCache()
    {
        
CacheLocal::delete('page'$this->getCollectionID());
    }

    public static function 
get(&$c$cvID)
    {
        
$db Loader::db();

        if ((
$c instanceof Page) && $c->getCollectionPointerID()) {
            
$v = array(
                
$c->getCollectionPointerID()
            );
        } else {
            
$v = array(
                
$c->getCollectionID()
            );
        }

        
$q "select cvID, cvIsApproved, cvIsNew, cvHandle, cvName, cvDescription, cvDateCreated, cvDatePublic, pTemplateID, cvAuthorUID, cvApproverUID, cvComments, pThemeID from CollectionVersions where cID = ?";
        if (
$cvID == 'ACTIVE') {
            
$q .= ' and cvIsApproved = 1';
        } elseif (
$cvID == 'RECENT') {
            
$q .= ' order by cvID desc';
        } else {
            
$v[] = $cvID;
            
$q .= ' and cvID = ?';
        }

        
$row $db->GetRow($q$v);
        
$cv = new static();

        if (
is_array($row) && $row['cvID']) {
            
$cv->setPropertiesFromArray($row);
        }

        
// load the attributes for a particular version object
        
$cv->cID $c->getCollectionID();
        return 
$cv;
    }

    public function 
getAttribute($ak$c$displayMode false)
    {
        if (
is_object($ak)) {
            
$akHandle $ak->getAttributeKeyHandle();
        } else {
            
$akHandle $ak;
            
$ak null;
        }
        
$akHash $akHandle ':' $displayMode;

        if (! isset(
$this->attributes[$akHash])) {
            
$this->attributes[$akHash] = false;
            if (! 
$ak) {
                
$ak CollectionAttributeKey::getByHandle($akHandle);
            }
            if (
is_object($ak)) {
                
$av $c->getAttributeValueObject($ak);
                if (
is_object($av)) {
                    
$this->attributes[$akHash] = $av->getValue($displayMode);
                }
            }
        }
        return 
$this->attributes[$akHash];
    }

    function 
isApproved()
    {
        return 
$this->cvIsApproved;
    }

    function 
isMostRecent()
    {
        if (! isset(
$this->isMostRecent)) {
            
$cID $this->cID;
            
$db Loader::db();
            
$q "select cvID from CollectionVersions where cID = '{$cID}' order by cvID desc";
            
$cvID $db->getOne($q);
            
$this->isMostRecent = ($cvID == $this->cvID);
        }
        return 
$this->isMostRecent;
    }

    function 
isNew()
    {
        return 
$this->cvIsNew;
    }

    function 
getVersionID()
    {
        return 
$this->cvID;
    }

    function 
getCollectionID()
    {
        return 
$this->cID;
    }

    function 
getVersionName()
    {
        return 
$this->cvName;
    }

    function 
getVersionComments()
    {
        return 
$this->cvComments;
    }

    function 
getVersionAuthorUserID()
    {
        return 
$this->cvAuthorUID;
    }

    function 
getVersionApproverUserID()
    {
        return 
$this->cvApproverUID;
    }

    function 
getVersionAuthorUserName()
    {
        if (
$this->cvAuthorUID 0) {
            
$db Loader::db();
            return 
$db->GetOne('select uName from Users where uID = ?', array(
                
$this->cvAuthorUID
            
));
        }
    }

    function 
getVersionApproverUserName()
    {
        if (
$this->cvApproverUID 0) {
            
$db Loader::db();
            return 
$db->GetOne('select uName from Users where uID = ?', array(
                
$this->cvApproverUID
            
));
        }
    }

    public function 
getCustomAreaStyles()
    {
        if (! isset(
$this->customAreaStyles)) {
            
$db Loader::db();
            
$r $db->GetAll('select issID, arHandle from CollectionVersionAreaStyles where cID = ? and cvID = ?', array(
                
$this->getCollectionID(),
                
$this->cvID
            
));
            
$this->customAreaStyles = array();
            foreach (
$r as $styles) {
                
$this->customAreaStyles[$styles['arHandle']] = $styles['issID'];
            }
        }
        return 
$this->customAreaStyles;
    }

    
/**
     * Gets the date the collection version was created
     *
     * @return string date formated like: 2009-01-01 00:00:00
     */
    
function getVersionDateCreated()
    {
        return 
$this->cvDateCreated;
    }

    function 
canWrite()
    {
        return 
$this->cvCanWrite;
    }

    function 
setComment($comment)
    {
        
$thisCVID $this->getVersionID();
        
$comment = ($comment != null) ? $comment "Version {$thisCVID}";
        
$v = array(
            
$comment,
            
$thisCVID,
            
$this->cID
        
);
        
$db Loader::db();
        
$q "update CollectionVersions set cvComments = ? where cvID = ? and cID = ?";
        
$r $db->query($q$v);

        
$this->versionComments $comment;
    }

    function 
createNew($versionComments)
    {
        
$db Loader::db();
        
$highestVID $db->GetOne('select max(cvID) from CollectionVersions where cID = ?', array(
            
$this->cID
        
));
        
$newVID $highestVID 1;
        
$c Page::getByID($this->cID$this->cvID);

        
$u = new User();
        
$versionComments = (! $versionComments) ? t("New Version %s"$newVID) : $versionComments;
        
$cvIsNew 1;
        if (
$c->getPageTypeHandle() == STACKS_PAGE_TYPE) {
            
$cvIsNew 0;
        }
        
$dh Loader::helper('date');
        
$v = array(
            
$this->cID,
            
$newVID,
            
$c->getCollectionName(),
            
$c->getCollectionHandle(),
            
$c->getCollectionDescription(),
            
$c->getCollectionDatePublic(),
            
$dh->getOverridableNow(),
            
$versionComments,
            
$u->getUserID(),
            
$cvIsNew,
            
$this->pThemeID,
            
$this->pTemplateID
        
);
        
$q "insert into CollectionVersions (cID, cvID, cvName, cvHandle, cvDescription, cvDatePublic, cvDateCreated, cvComments, cvAuthorUID, cvIsNew, pThemeID, pTemplateID)
            values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
;

        
$r $db->prepare($q);
        
$res $db->execute($r$v);

        
$q2 "select akID, avID from CollectionAttributeValues where cID = ? and cvID = ?";
        
$v2 = array(
            
$c->getCollectionID(),
            
$this->getVersionID()
        );
        
$r2 $db->query($q2$v2);
        while (
$row2 $r2->fetchRow()) {
            
$v3 = array(
                
intval($c->getCollectionID()),
                
$newVID,
                
$row2['akID'],
                
$row2['avID']
            );
            
$recordExists intval($db->getOne('SELECT count(*) FROM CollectionAttributeValues WHERE cID=? AND cvID=? AND akID=? AND avID=?'$v3)) ? 0;
            if (! 
$recordExists)
                
$db->query("insert into CollectionAttributeValues (cID, cvID, akID, avID) values (?, ?, ?, ?)"$v3);
        }

        
$q3 "select faID from CollectionVersionFeatureAssignments where cID = ? and cvID = ?";
        
$v3 = array(
            
$c->getCollectionID(),
            
$this->getVersionID()
        );
        
$r3 $db->query($q3$v3);
        while (
$row3 $r3->fetchRow()) {
            
$v3 = array(
                
intval($c->getCollectionID()),
                
$newVID,
                
$row3['faID']
            );
            
$db->query("insert into CollectionVersionFeatureAssignments (cID, cvID, faID) values (?, ?, ?)"$v3);
        }

        
$q4 "select pThemeID, scvlID, preset, sccRecordID from CollectionVersionThemeCustomStyles where cID = ? and cvID = ?";
        
$v4 = array(
            
$c->getCollectionID(),
            
$this->getVersionID()
        );
        
$r4 $db->query($q4$v4);
        while (
$row4 $r4->fetchRow()) {
            
$v4 = array(
                
intval($c->getCollectionID()),
                
$newVID,
                
$row4['pThemeID'],
                
$row4['scvlID'],
                
$row4['preset'],
                
$row4['sccRecordID']
            );
            
$db->query("insert into CollectionVersionThemeCustomStyles (cID, cvID, pThemeID, scvlID, preset, sccRecordID) values (?, ?, ?, ?, ?, ?)"$v4);
        }

        
$nv = static::get($c$newVID);

        
$ev = new Event($c);
        
$ev->setCollectionVersionObject($nv);
        
Events::dispatch('on_page_version_add'$ev);

        
$nv->refreshCache();
        
// now we return it
        
return $nv;
    }

    function 
approve($doReindexImmediately true)
    {
        
$db Loader::db();
        
$u = new User();
        
$uID $u->getUserID();
        
$cvID $this->cvID;
        
$cID $this->cID;
        
$c Page::getByID($cID$this->cvID);

        
$ov Page::getByID($cID'ACTIVE');

        
$oldHandle $ov->getCollectionHandle();
        
$newHandle $this->cvHandle;

        
// update a collection updated record
        
$dh Loader::helper('date');
        
$db->query('update Collections set cDateModified = ? where cID = ?', array(
            
$dh->getOverridableNow(),
            
$cID
        
));

        
// first we remove approval for the other version of this collection
        
$v = array(
            
$cID
        
);
        
$q "update CollectionVersions set cvIsApproved = 0 where cID = ?";
        
$r $db->query($q$v);
        
$ov->refreshCache();

        
// now we approve our version
        
$v2 = array(
            
$uID,
            
$cID,
            
$cvID
        
);
        
$q2 "update CollectionVersions set cvIsNew = 0, cvIsApproved = 1, cvApproverUID = ? where cID = ? and cvID = ?";
        
$r $db->query($q2$v2);

        
// next, we rescan our collection paths for the particular collection, but only if this isn't a generated collection
        // I don't know why but this just isn't reliable. It might be a race condition with the cached page objects?
        /*
         * if ((($oldHandle != $newHandle) || $oldHandle == '') && (!$c->isGeneratedCollection())) {
         */

        
$c->rescanCollectionPath();

        
// }

        // check for related version edits. This only gets applied when we edit global areas.
        
$r $db->Execute('select cRelationID, cvRelationID from CollectionVersionRelatedEdits where cID = ? and cvID = ?', array(
            
$cID,
            
$cvID
        
));
        while (
$row $r->FetchRow()) {
            
$cn Page::getByID($row['cRelationID'], $row['cvRelationID']);
            
$cnp = new Permissions($cn);
            if (
$cnp->canApprovePageVersions()) {
                
$v $cn->getVersionObject();
                
$v->approve();
                
$db->Execute('delete from CollectionVersionRelatedEdits where cID = ? and cvID = ? and cRelationID = ? and cvRelationID = ?', array(
                    
$cID,
                    
$cvID,
                    
$row['cRelationID'],
                    
$row['cvRelationID']
                ));
            }
        }

        if (
$c->getCollectionInheritance() == 'TEMPLATE') {
            
// we make sure to update the cInheritPermissionsFromCID value
            
$pType PageType::getByID($c->getPageTypeID());
            
$pTemplate PageTemplate::getByID($c->getPageTemplateID());
            
$masterC $pType->getPageTypePageTemplateDefaultPageObject($pTemplate);
            
$db->Execute('update Pages set cInheritPermissionsFromCID = ? where cID = ?', array(
                
$masterC->getCollectionID(),
                
$c->getCollectioniD()
            ));
        }

        
$ev = new Event($c);
        
$ev->setCollectionVersionObject($this);
        
Events::dispatch('on_page_version_approve'$ev);

        
$c->reindex(false$doReindexImmediately);
        
$c->writePageThemeCustomizations();
        
$this->refreshCache();
    }

    public function 
discard()
    {
        
// discard's my most recent edit that is pending
        
$u = new User();
        if (
$this->isNew()) {
            
$db Loader::db();
            
// check for related version edits. This only gets applied when we edit global areas.
            
$r $db->Execute('select cRelationID, cvRelationID from CollectionVersionRelatedEdits where cID = ? and cvID = ?', array(
                
$this->cID,
                
$this->cvID
            
));
            while (
$row $r->FetchRow()) {
                
$cn Page::getByID($row['cRelationID'], $row['cvRelationID']);
                
$cnp = new Permissions($cn);
                if (
$cnp->canApprovePageVersions()) {
                    
$v $cn->getVersionObject();
                    
$v->delete();
                    
$db->Execute('delete from CollectionVersionRelatedEdits where cID = ? and cvID = ? and cRelationID = ? and cvRelationID = ?', array(
                        
$this->cID,
                        
$this->cvID,
                        
$row['cRelationID'],
                        
$row['cvRelationID']
                    ));
                }
            }
            
$this->delete();
        }
        
$this->refreshCache();
    }

    public function 
canDiscard()
    {
        
$db Loader::db();
        
$total $db->GetOne('select count(cvID) from CollectionVersions where cID = ?', array(
            
$this->cID
        
));
        return 
$this->isNew() && $total 1;
    }

    public function 
removeNewStatus()
    {
        
$db Loader::db();
        
$db->query("update CollectionVersions set cvIsNew = 0 where cID = ? and cvID = ?", array(
            
$this->cID,
            
$this->cvID
        
));
        
$this->refreshCache();
    }

    function 
deny()
    {
        
$db Loader::db();
        
$cvID $this->cvID;
        
$cID $this->cID;

        
// first we update a collection updated record
        
$dh Loader::helper('date');
        
$db->query('update Collections set cDateModified = ? where cID = ?', array(
            
$dh->getOverridableNow(),
            
$cID
        
));

        
// first we remove approval for all versions of this collection
        
$v = array(
            
$cID
        
);
        
$q "update CollectionVersions set cvIsApproved = 0 where cID = ?";
        
$r $db->query($q$v);

        
// now we deny our version
        
$v2 = array(
            
$cID,
            
$cvID
        
);
        
$q2 "update CollectionVersions set cvIsApproved = 0, cvApproverUID = 0 where cID = ? and cvID = ?";
        
$r2 $db->query($q2$v2);
        
$this->refreshCache();
    }

    function 
delete()
    {
        
$db Loader::db();

        
$cvID $this->cvID;
        
$c Page::getByID($this->cID$cvID);
        
$cID $c->getCollectionID();

        
$q "select bID, arHandle from CollectionVersionBlocks where cID = ? and cvID = ?";
        
$r $db->query($q, array(
            
$cID,
            
$cvID
        
));
        if (
$r) {
            while (
$row $r->fetchRow()) {
                if (
$row['bID']) {
                    
$b Block::getByID($row['bID'], $c$row['arHandle']);
                    if (
is_object($b)) {
                        
$b->deleteBlock();
                    }
                }
                unset(
$b);
            }
        }

        
$features CollectionVersionFeatureAssignment::getList($this);
        foreach (
$features as $fa) {
            
$fa->delete();
        }

        
$r $db->Execute('select avID, akID from CollectionAttributeValues where cID = ? and cvID = ?', array(
            
$cID,
            
$cvID
        
));
        while (
$row $r->FetchRow()) {
            
$cak CollectionAttributeKey::getByID($row['akID']);
            
$cav $c->getAttributeValueObject($cak);
            if (
is_object($cav)) {
                
$cav->delete();
            }
        }

        
$db->Execute('delete from CollectionVersionBlockStyles where cID = ? and cvID = ?', array(
            
$cID,
            
$cvID
        
));
        
$db->Execute('delete from CollectionVersionThemeCustomStyles where cID = ? and cvID = ?', array(
            
$cID,
            
$cvID
        
));
        
$db->Execute('delete from CollectionVersionRelatedEdits where cID = ? and cvID = ?', array(
            
$cID,
            
$cvID
        
));
        
$db->Execute('delete from CollectionVersionAreaStyles where cID = ? and cvID = ?', array(
            
$cID,
            
$cvID
        
));

        
$q "delete from CollectionVersions where cID = '{$cID}' and cvID='{$cvID}'";
        
$r $db->query($q);
        
$this->refreshCache();
    }
}
Онлайн: 1
Реклама