Файл: concrete5.7.5.6/concrete/src/Page/Collection/Collection.php
Строк: 1036
<?php
namespace ConcreteCorePageCollection;
use Area;
use Block;
use CacheLocal;
use CollectionAttributeKey;
use CollectionVersion;
use ConcreteCoreAttributeKeyKey;
use ConcreteCoreAttributeValueCollectionValue as CollectionAttributeValue;
use ConcreteCoreFeatureAssignmentCollectionVersionAssignment as CollectionVersionFeatureAssignment;
use ConcreteCoreFeatureFeature;
use ConcreteCoreFoundationObject as Object;
use ConcreteCoreGatheringItemPage as PageGatheringItem;
use ConcreteCorePageCollectionVersionVersionList;
use ConcreteCorePageSearchIndexedSearch;
use ConcreteCoreStyleCustomizerInlineStyleSet;
use ConcreteCoreBlockCustomStyle as BlockCustomStyle;
use ConcreteCoreAreaCustomStyle as AreaCustomStyle;
use Config;
use Loader;
use Page;
use PageCache;
use Permissions;
use Stack;
use User;
class Collection extends Object
{
public $cID;
protected $vObj;
protected $cHandle;
protected $cDateAdded;
protected $cDateModified;
protected $attributes = array();
/* version specific stuff */
public static function reindexPendingPages()
{
$num = 0;
$db = Loader::db();
$r = $db->Execute('select cID from PageSearchIndex where cRequiresReindex = 1');
while ($row = $r->FetchRow()) {
$pc = Page::getByID($row['cID']);
$pc->reindex(false, true);
$num++;
}
Config::save('concrete.misc.do_page_reindex_check', false);
return $num;
}
public static function getByHandle($handle)
{
$db = Loader::db();
// first we ensure that this does NOT appear in the Pages table. This is not a page. It is more basic than that
$r = $db->query(
'select Collections.cID, Pages.cID as pcID from Collections left join Pages on Collections.cID = Pages.cID where Collections.cHandle = ?',
array($handle)
);
if ($r->numRows() == 0) {
// there is nothing in the collections table for this page, so we create and grab
$data = array(
'handle' => $handle,
);
$cObj = self::createCollection($data);
} else {
$row = $r->fetchRow();
if ($row['cID'] > 0 && $row['pcID'] == null) {
// there is a collection, but it is not a page. so we grab it
$cObj = Collection::getByID($row['cID']);
}
}
if (isset($cObj)) {
return $cObj;
}
}
public function addCollection($data)
{
$data['pThemeID'] = 0;
if (isset($this) && $this instanceof Page) {
$data['pThemeID'] = $this->getCollectionThemeID();
}
return static::createCollection($data);
}
public static function createCollection($data)
{
$db = Loader::db();
$dh = Loader::helper('date');
$cDate = $dh->getOverridableNow();
$data = array_merge(
array(
'name' => '',
'pTemplateID' => 0,
'handle' => null,
'uID' => null,
'cDatePublic' => $cDate,
'cDescription' => null,
),
$data
);
$cDatePublic = ($data['cDatePublic']) ? $data['cDatePublic'] : $cDate;
if (isset($data['cID'])) {
$res = $db->query(
'insert into Collections (cID, cHandle, cDateAdded, cDateModified) values (?, ?, ?, ?)',
array($data['cID'], $data['handle'], $cDate, $cDate)
);
$newCID = $data['cID'];
} else {
$res = $db->query(
'insert into Collections (cHandle, cDateAdded, cDateModified) values (?, ?, ?)',
array($data['handle'], $cDate, $cDate)
);
$newCID = $db->Insert_ID();
}
$cvIsApproved = (isset($data['cvIsApproved']) && $data['cvIsApproved'] == 0) ? 0 : 1;
$cvIsNew = 1;
if ($cvIsApproved) {
$cvIsNew = 0;
}
if (isset($data['cvIsNew'])) {
$cvIsNew = $data['cvIsNew'];
}
$data['name'] = Loader::helper('text')->sanitize($data['name']);
$pThemeID = 0;
if (isset($data['pThemeID']) && $data['pThemeID']) {
$pThemeID = $data['pThemeID'];
}
$pTemplateID = 0;
if ($data['pTemplateID']) {
$pTemplateID = $data['pTemplateID'];
}
if ($res) {
// now we add a pending version to the collectionversions table
$v2 = array(
$newCID,
1,
$pTemplateID,
$data['name'],
$data['handle'],
$data['cDescription'],
$cDatePublic,
$cDate,
VERSION_INITIAL_COMMENT,
$data['uID'],
$cvIsApproved,
$cvIsNew,
$pThemeID,
);
$q2 = 'insert into CollectionVersions (cID, cvID, pTemplateID, cvName, cvHandle, cvDescription, cvDatePublic, cvDateCreated, cvComments, cvAuthorUID, cvIsApproved, cvIsNew, pThemeID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
$r2 = $db->prepare($q2);
$res2 = $db->execute($r2, $v2);
}
$nc = Collection::getByID($newCID);
return $nc;
}
/**
* @param int $cID
* @param mixed $version 'RECENT'|'ACTIVE'|version id
*
* @return Collection
*/
public static function getByID($cID, $version = 'RECENT')
{
$db = Loader::db();
$q = 'select Collections.cDateAdded, Collections.cDateModified, Collections.cID from Collections where cID = ?';
$row = $db->getRow($q, array($cID));
$c = new Collection();
$c->setPropertiesFromArray($row);
if ($version != false) {
// we don't do this on the front page
$c->loadVersionObject($version);
}
return $c;
}
public function loadVersionObject($cvID = 'ACTIVE')
{
$this->vObj = CollectionVersion::get($this, $cvID);
}
/* attribute stuff */
public function getVersionToModify()
{
// first, we check to see if the version we're modifying has the same
// author uID associated with it as we currently have, and if it's inactive
// If that's the case, then we just return the current collection + version object.
$u = new User();
$vObj = $this->getVersionObject();
if ($this->isMasterCollection() || ($vObj->isNew())) {
return $this;
} else {
// otherwise, we have to clone this version of the collection entirely,
// and return that collection.
$nc = $this->cloneVersion(null);
return $nc;
}
}
public function getVersionObject()
{
return $this->vObj;
}
// remove the collection attributes for this version of a page
public function cloneVersion($versionComments)
{
// first, we run the version object's createNew() command, which returns a new
// version object, which we can combine with our collection object, so we'll have
// our original collection object ($this), and a new collection object, consisting
// of our collection + the new version
$vObj = $this->getVersionObject();
$nvObj = $vObj->createNew($versionComments);
$nc = Page::getByID($this->getCollectionID());
$nc->vObj = $nvObj;
// now that we have the original version object and the cloned version object,
// we're going to select all the blocks that exist for this page, and we're going
// to copy them to the next version
// unless btIncludeAll is set -- as that gets included no matter what
$db = Loader::db();
$cID = $this->getCollectionID();
$cvID = $vObj->getVersionID();
$q = "select bID, arHandle from CollectionVersionBlocks where cID = '$cID' and cvID = '$cvID' and cbIncludeAll=0 order by cbDisplayOrder asc";
$r = $db->query($q);
if ($r) {
while ($row = $r->fetchRow()) {
// now we loop through these, create block objects for all of them, and
// duplicate them to our collection object (which is actually the same collection,
// but different version)
$b = Block::getByID($row['bID'], $this, $row['arHandle']);
if (is_object($b)) {
$b->alias($nc);
}
}
}
// duplicate any area styles
$q = "select issID, arHandle from CollectionVersionAreaStyles where cID = '$cID' and cvID = '$cvID'";
$r = $db->query($q);
while ($row = $r->FetchRow()) {
$db->Execute(
'insert into CollectionVersionAreaStyles (cID, cvID, arHandle, issID) values (?, ?, ?, ?)',
array(
$this->getCollectionID(),
$nvObj->getVersionID(),
$row['arHandle'],
$row['issID'],
)
);
}
return $nc;
}
public function getCollectionID()
{
return $this->cID;
}
public function getNextVersionComments()
{
$c = Page::getByID($this->getCollectionID(), 'ACTIVE');
$cvID = $c->getVersionID();
return t('Version %d', $cvID + 1);
}
public function getFeatureAssignments()
{
if (is_object($this->vObj)) {
return CollectionVersionFeatureAssignment::getList($this);
}
return array();
}
/**
* Returns the value of the attribute with the handle $ak
* of the current object.
*
* $displayMode makes it possible to get the correct output
* value. When you need the raw attribute value or object, use
* this:
* <code>
* $c = Page::getCurrentPage();
* $attributeValue = $c->getAttribute('attribute_handle');
* </code>
*
* But if you need the formatted output supported by some
* attribute, use this:
* <code>
* $c = Page::getCurrentPage();
* $attributeValue = $c->getAttribute('attribute_handle', 'display');
* </code>
*
* An attribute type like "date" will then return the date in
* the correct format just like other attributes will show
* you a nicely formatted output and not just a simple value
* or object.
*
*
* @param string|object $akHandle
* @param bool $displayMode
*
* @return type
*/
public function getAttribute($akHandle, $displayMode = false)
{
if (is_object($this->vObj)) {
return $this->vObj->getAttribute($akHandle, $this, $displayMode);
}
}
public function getCollectionAttributeValue($ak)
{
if (is_object($this->vObj)) {
return $this->vObj->getAttribute($ak, $this);
}
}
// get's an array of collection attribute objects that are attached to this collection. Does not get values
public function clearCollectionAttributes($retainAKIDs = array())
{
$db = Loader::db();
if (count($retainAKIDs) > 0) {
$cleanAKIDs = array();
foreach ($retainAKIDs as $akID) {
$cleanAKIDs[] = intval($akID);
}
$akIDStr = implode(',', $cleanAKIDs);
$v2 = array($this->getCollectionID(), $this->getVersionID());
$db->query(
"delete from CollectionAttributeValues where cID = ? and cvID = ? and akID not in ({$akIDStr})",
$v2
);
} else {
$v2 = array($this->getCollectionID(), $this->getVersionID());
$db->query('delete from CollectionAttributeValues where cID = ? and cvID = ?', $v2);
}
$this->reindex();
}
public function getVersionID()
{
// shortcut
return $this->vObj->cvID;
}
/* area stuff */
public function reindex($index = false, $actuallyDoReindex = true)
{
if ($this->isAlias() && !$this->isExternalLink()) {
return false;
}
if ($actuallyDoReindex || Config::get('concrete.page.search.always_reindex') == true) {
$db = Loader::db();
$attribs = CollectionAttributeKey::getAttributes(
$this->getCollectionID(),
$this->getVersionID(),
'getSearchIndexValue'
);
$db->Execute('delete from CollectionSearchIndexAttributes where cID = ?', array($this->getCollectionID()));
$searchableAttributes = array('cID' => $this->getCollectionID());
$key = new Key();
$key->reindex('CollectionSearchIndexAttributes', $searchableAttributes, $attribs);
if ($index == false) {
$index = new IndexedSearch();
}
$index->reindexPage($this);
$db->Replace(
'PageSearchIndex',
array('cID' => $this->getCollectionID(), 'cRequiresReindex' => 0),
array('cID'),
false
);
$cache = PageCache::getLibrary();
$cache->purge($this);
// we check to see if this page is referenced in any gatherings
$c = Page::getByID($this->getCollectionID(), $this->getVersionID());
$items = PageGatheringItem::getListByItem($c);
foreach ($items as $it) {
$it->deleteFeatureAssignments();
$it->assignFeatureAssignments($c);
}
} else {
$db = Loader::db();
Config::save('concrete.misc.do_page_reindex_check', true);
$db->Replace(
'PageSearchIndex',
array('cID' => $this->getCollectionID(), 'cRequiresReindex' => 1),
array('cID'),
false
);
}
}
/* aliased content */
public function clearAttribute($ak)
{
$db = Loader::db();
$cav = $this->getAttributeValueObject($ak);
if (is_object($cav)) {
$cav->delete();
}
$this->reindex();
}
/* basic CRUD */
public function getAttributeValueObject($ak, $createIfNotFound = false)
{
$db = Loader::db();
$av = false;
if (is_string($ak)) {
$ak = CollectionAttributeKey::getByHandle($ak);
}
$v = array($this->getCollectionID(), $this->getVersionID(), $ak->getAttributeKeyID());
$avID = $db->GetOne('select avID from CollectionAttributeValues where cID = ? and cvID = ? and akID = ?', $v);
if ($avID > 0) {
$av = CollectionAttributeValue::getByID($avID);
if (is_object($av)) {
$av->setCollection($this);
$av->setAttributeKey($ak);
}
}
if ($createIfNotFound) {
$cnt = 0;
// Is this avID in use ?
if (is_object($av)) {
$cnt = $db->GetOne(
'select count(avID) from CollectionAttributeValues where avID = ?',
$av->getAttributeValueID()
);
}
if ((!is_object($av)) || ($cnt > 1)) {
$newAV = $ak->addAttributeValue();
$av = CollectionAttributeValue::getByID($newAV->getAttributeValueID());
$av->setCollection($this);
}
}
return $av;
}
public function getSetCollectionAttributes()
{
$db = Loader::db();
$akIDs = $db->GetCol(
'select akID from CollectionAttributeValues where cID = ? and cvID = ?',
array($this->getCollectionID(), $this->getVersionID())
);
$attribs = array();
foreach ($akIDs as $akID) {
$attribs[] = CollectionAttributeKey::getByID($akID);
}
return $attribs;
}
public function addAttribute($ak, $value)
{
$this->setAttribute($ak, $value);
}
public function setAttribute($ak, $value)
{
if (!is_object($ak)) {
$ak = CollectionAttributeKey::getByHandle($ak);
}
$ak->setAttribute($this, $value);
unset($ak);
$this->reindex();
}
/**
* @param string $arHandle
*
* @return Area
*/
public function getArea($arHandle)
{
return Area::get($this, $arHandle);
}
public function hasAliasedContent()
{
$db = Loader::db();
// aliased content is content on the particular page that is being
// used elsewhere - but the content on the PAGE is the original version
$v = array($this->cID);
$q = 'select bID from CollectionVersionBlocks where cID = ? and isOriginal = 1';
$r = $db->query($q, $v);
$bIDArray = array();
if ($r) {
while ($row = $r->fetchRow()) {
$bIDArray[] = $row['bID'];
}
if (count($bIDArray) > 0) {
$bIDList = implode(',', $bIDArray);
$v2 = array($bIDList, $this->cID);
$q2 = 'select cID from CollectionVersionBlocks where bID in (?) and cID <> ? limit 1';
$aliasedCID = $db->getOne($q2, $v2);
if ($aliasedCID > 0) {
return true;
}
}
}
return false;
}
public function getCollectionDateLastModified()
{
return $this->cDateModified;
}
public function getCollectionHandle()
{
return $this->cHandle;
}
public function getCollectionDateAdded()
{
return $this->cDateAdded;
}
public function __destruct()
{
unset($this->vObj);
}
/**
* Retrieves all custom style rules that should be inserted into the header on a page, whether they are defined in areas
* or blocks.
*/
public function outputCustomStyleHeaderItems($return = false)
{
$db = Loader::db();
$psss = array();
$txt = Loader::helper('text');
CacheLocal::set('pssCheck', $this->getCollectionID().':'.$this->getVersionID(), true);
$r1 = $db->GetAll(
'select bID, arHandle, issID from CollectionVersionBlockStyles where cID = ? and cvID = ? and issID > 0',
array($this->getCollectionID(), $this->getVersionID())
);
$r2 = $db->GetAll(
'select arHandle, issID from CollectionVersionAreaStyles where cID = ? and cvID = ? and issID > 0',
array($this->getCollectionID(), $this->getVersionID())
);
foreach ($r1 as $r) {
$issID = $r['issID'];
$arHandle = $txt->filterNonAlphaNum($r['arHandle']);
$bID = $r['bID'];
$obj = StyleSet::getByID($issID);
if (is_object($obj)) {
$b = new Block();
$b->bID = $bID;
$a = new Area($arHandle);
$b->setBlockAreaObject($a);
$obj = new BlockCustomStyle($obj, $b, $this->getCollectionThemeObject());
$psss[] = $obj;
CacheLocal::set(
'pssObject',
$this->getCollectionID().':'.$this->getVersionID().':'.$r['arHandle'].':'.$r['bID'],
$obj
);
}
}
foreach ($r2 as $r) {
$issID = $r['issID'];
$obj = StyleSet::getByID($issID);
if (is_object($obj)) {
$a = new Area($r['arHandle']);
$obj = new AreaCustomStyle($obj, $a, $this->getCollectionThemeObject());
$psss[] = $obj;
CacheLocal::set(
'pssObject',
$this->getCollectionID().':'.$this->getVersionID().':'.$r['arHandle'],
$obj
);
}
}
// grab all the header block style rules for items in global areas on this page
$rs = $db->GetCol(
'select arHandle from Areas where arIsGlobal = 1 and cID = ?',
array($this->getCollectionID())
);
if (count($rs) > 0) {
$pcp = new Permissions($this);
foreach ($rs as $garHandle) {
if ($pcp->canViewPageVersions()) {
$s = Stack::getByName($garHandle, 'RECENT');
} else {
$s = Stack::getByName($garHandle, 'ACTIVE');
}
if (is_object($s)) {
CacheLocal::set('pssCheck', $s->getCollectionID().':'.$s->getVersionID(), true);
$rs1 = $db->GetAll(
'select bID, issID, arHandle from CollectionVersionBlockStyles where cID = ? and cvID = ? and issID > 0',
array($s->getCollectionID(), $s->getVersionID())
);
foreach ($rs1 as $r) {
$issID = $r['issID'];
$obj = StyleSet::getByID($issID);
if (is_object($obj)) {
$b = new Block();
$b->bID = $r['bID'];
$a = new Area($r['arHandle']);
$b->setBlockAreaObject($a);
$obj = new BlockCustomStyle($obj, $b, $this->getCollectionThemeObject());
$psss[] = $obj;
CacheLocal::set(
'pssObject',
$s->getCollectionID().':'.$s->getVersionID().':'.$r['arHandle'].':'.$r['bID'],
$obj
);
}
}
}
}
}
$styleHeader = '';
foreach ($psss as $st) {
$css = $st->getCSS();
if ($css !== '') {
$styleHeader .= $st->getStyleWrapper($css);
}
}
if (strlen(trim($styleHeader))) {
if ($return == true) {
return $styleHeader;
} else {
$v = View::getInstance();
$v->addHeaderItem($styleHeader);
}
}
}
public function getAreaCustomStyle($area, $force = false)
{
$areac = $area->getAreaCollectionObject();
if ($areac instanceof Stack) {
// this fixes the problem of users applying design to the main area on the page, and then that trickling into any
// stacks that have been added to other areas of the page.
return null;
}
$result = null;
$styles = $this->vObj->getCustomAreaStyles();
$areaHandle = $area->getAreaHandle();
if ($force || isset($styles[$areaHandle])) {
$pss = isset($styles[$areaHandle]) ? StyleSet::getByID($styles[$areaHandle]) : null;
$result = new AreaCustomStyle($pss, $area, $this->getCollectionThemeObject());
}
return $result;
}
public function resetAreaCustomStyle($area)
{
$db = Loader::db();
$db->Execute(
'delete from CollectionVersionAreaStyles where cID = ? and cvID = ? and arHandle = ?',
array(
$this->getCollectionID(),
$this->getVersionID(),
$area->getAreaHandle(),
)
);
}
public function setCustomStyleSet($area, $set)
{
$db = Loader::db();
$db->Replace(
'CollectionVersionAreaStyles',
array(
'cID' => $this->getCollectionID(),
'cvID' => $this->getVersionID(),
'arHandle' => $area->getAreaHandle(),
'issID' => $set->getID(),
),
array('cID', 'cvID', 'arHandle'),
true
);
}
public function relateVersionEdits($oc)
{
$db = Loader::db();
$v = array(
$this->getCollectionID(),
$this->getVersionID(),
$oc->getCollectionID(),
$oc->getVersionID(),
);
$r = $db->GetOne(
'select count(*) from CollectionVersionRelatedEdits where cID = ? and cvID = ? and cRelationID = ? and cvRelationID = ?',
$v
);
if ($r > 0) {
return false;
} else {
$db->Execute(
'insert into CollectionVersionRelatedEdits (cID, cvID, cRelationID, cvRelationID) values (?, ?, ?, ?)',
$v
);
}
}
public function getCollectionTypeID()
{
return false;
}
/* new cleaned up API below */
public function getPageTypeID()
{
return false;
}
/* This function is slightly misnamed: it should be getOrCreateByHandle($handle) but I wanted to keep it brief
* @param string $handle
* @return Collection
*/
public function rescanDisplayOrder($arHandle)
{
// this collection function fixes the display order properties for all the blocks within the collection/area. We select all the items
// order by display order, and fix the sequence
$db = Loader::db();
$cID = $this->cID;
$cvID = $this->vObj->cvID;
$args = array($cID, $cvID, $arHandle);
$q = "select bID from CollectionVersionBlocks where cID = ? and cvID = ? and arHandle=? order by cbDisplayOrder asc";
$r = $db->query($q, $args);
if ($r) {
$displayOrder = 0;
while ($row = $r->fetchRow()) {
$args = array($displayOrder, $cID, $cvID, $arHandle, $row['bID']);
$q = "update CollectionVersionBlocks set cbDisplayOrder = ? where cID = ? and cvID = ? and arHandle = ? and bID = ?";
$db->query($q, $args);
$displayOrder++;
}
$r->free();
}
}
public function refreshCache()
{
CacheLocal::flush();
}
public function getGlobalBlocks()
{
$db = Loader::db();
$v = array(Stack::ST_TYPE_GLOBAL_AREA);
$rs = $db->GetCol('select stName from Stacks where Stacks.stType = ?', $v);
$blocks = array();
if (count($rs) > 0) {
$pcp = new Permissions($this);
foreach ($rs as $garHandle) {
if ($pcp->canViewPageVersions()) {
$s = Stack::getByName($garHandle, 'RECENT');
} else {
$s = Stack::getByName($garHandle, 'ACTIVE');
}
if (is_object($s)) {
$blocksTmp = $s->getBlocks(STACKS_AREA_NAME);
$blocks = array_merge($blocks, $blocksTmp);
}
}
}
return $blocks;
}
/**
* List the blocks in a collection or area within a collection.
*
* @param bool|string $arHandle . If specified, returns just the blocks in an area
*
* @return array
*/
public function getBlocks($arHandle = false)
{
$blockIDs = $this->getBlockIDs($arHandle);
$blocks = array();
if (is_array($blockIDs)) {
foreach ($blockIDs as $row) {
$ab = Block::getByID($row['bID'], $this, $row['arHandle']);
if (is_object($ab)) {
$blocks[] = $ab;
}
}
}
return $blocks;
}
/**
* List the block IDs in a collection or area within a collection.
*
* @param bool|string $arHandle . If specified, returns just the blocks in an area
*
* @return array
*/
public function getBlockIDs($arHandle = false)
{
$blockIDs = CacheLocal::getEntry(
'collection_block_ids',
$this->getCollectionID().':'.$this->getVersionID()
);
if (!is_array($blockIDs)) {
$v = array($this->getCollectionID(), $this->getVersionID());
$db = Loader::db();
$q = 'select Blocks.bID, CollectionVersionBlocks.arHandle from CollectionVersionBlocks inner join Blocks on (CollectionVersionBlocks.bID = Blocks.bID) inner join BlockTypes on (Blocks.btID = BlockTypes.btID) where CollectionVersionBlocks.cID = ? and (CollectionVersionBlocks.cvID = ? or CollectionVersionBlocks.cbIncludeAll=1) order by CollectionVersionBlocks.cbDisplayOrder asc';
$r = $db->GetAll($q, $v);
$blockIDs = array();
if (is_array($r)) {
foreach ($r as $bl) {
$blockIDs[strtolower($bl['arHandle'])][] = $bl;
}
}
CacheLocal::set('collection_block_ids', $this->getCollectionID().':'.$this->getVersionID(), $blockIDs);
}
$result = array();
if ($arHandle != false) {
$key = strtolower($arHandle);
if (isset($blockIDs[$key])) {
$result = $blockIDs[$key];
}
} else {
foreach ($blockIDs as $arHandle => $row) {
foreach ($row as $brow) {
if (!in_array($brow, $blockIDs)) {
$result[] = $brow;
}
}
}
}
return $result;
}
public function addBlock($bt, $a, $data)
{
$db = Loader::db();
// first we add the block to the system
$nb = $bt->add($data, $this, $a);
// now that we have a block, we add it to the collectionversions table
$arHandle = (is_object($a)) ? $a->getAreaHandle() : $a;
$cID = $this->getCollectionID();
$vObj = $this->getVersionObject();
if ($bt->includeAll()) {
// normally, display order is dependant on a per area, per version basis. However, since this block
// is not aliased across versions, then we want to get display order simply based on area, NOT based
// on area + version
$newBlockDisplayOrder = $this->getCollectionAreaDisplayOrder(
$arHandle,
true
); // second argument is "ignoreVersions"
} else {
$newBlockDisplayOrder = $this->getCollectionAreaDisplayOrder($arHandle);
}
$v = array(
$cID,
$vObj->getVersionID(),
$nb->getBlockID(),
$arHandle,
$newBlockDisplayOrder,
1,
intval($bt->includeAll()),
);
$q = 'insert into CollectionVersionBlocks (cID, cvID, bID, arHandle, cbDisplayOrder, isOriginal, cbIncludeAll) values (?, ?, ?, ?, ?, ?, ?)';
$res = $db->Execute($q, $v);
$controller = $nb->getController();
$features = $controller->getBlockTypeFeatureObjects();
if (count($features) > 0) {
foreach ($features as $fe) {
$fd = $fe->getFeatureDetailObject($controller);
$fa = CollectionVersionFeatureAssignment::add($fe, $fd, $this);
$db->Execute(
'insert into BlockFeatureAssignments (cID, cvID, bID, faID) values (?, ?, ?, ?)',
array(
$this->getCollectionID(),
$this->getVersionID(),
$nb->getBlockID(),
$fa->getFeatureAssignmentID(),
)
);
}
}
return Block::getByID($nb->getBlockID(), $this, $a);
}
public function getCollectionAreaDisplayOrder($arHandle, $ignoreVersions = false)
{
// this function queries CollectionBlocks to grab the highest displayOrder value, then increments it, and returns
// this is used to add new blocks to existing Pages/areas
$db = Loader::db();
$cID = $this->cID;
$cvID = $this->vObj->cvID;
if ($ignoreVersions) {
$q = 'select max(cbDisplayOrder) as cbdis from CollectionVersionBlocks where cID = ? and arHandle = ?';
$v = array($cID, $arHandle);
} else {
$q = 'select max(cbDisplayOrder) as cbdis from CollectionVersionBlocks where cID = ? and cvID = ? and arHandle = ?';
$v = array($cID, $cvID, $arHandle);
}
$r = $db->query($q, $v);
if ($r) {
if ($r->numRows() > 0) {
// then we know we got a value; we increment it and return
$res = $r->fetchRow();
$displayOrder = $res['cbdis'];
if (is_null($displayOrder)) {
return 0;
}
$displayOrder++;
return $displayOrder;
} else {
// we didn't get anything, so we return a zero
return 0;
}
}
}
public function addFeature(Feature $fe)
{
$db = Loader::db();
$db->Replace(
'CollectionVersionFeatures',
array('cID' => $this->getCollectionID(), 'cvID' => $this->getVersionID(), 'feID' => $fe->getFeatureID()),
array('cID', 'cvID', 'feID'),
true
);
}
public function markModified()
{
// marks this collection as newly modified
$db = Loader::db();
$dh = Loader::helper('date');
$cDateModified = $dh->getOverridableNow();
$v = array($cDateModified, $this->cID);
$q = 'update Collections set cDateModified = ? where cID = ?';
$r = $db->prepare($q);
$res = $db->execute($r, $v);
}
public function delete()
{
if ($this->cID > 0) {
$db = Loader::db();
// First we delete all versions
$vl = new VersionList($this);
$vl->setItemsPerPage(-1);
$vlArray = $vl->getPage();
foreach ($vlArray as $v) {
$v->delete();
}
$cID = $this->getCollectionID();
$q = "delete from CollectionAttributeValues where cID = {$cID}";
$db->query($q);
$q = "delete from Collections where cID = '{$cID}'";
$r = $db->query($q);
try {
$q = "delete from CollectionSearchIndexAttributes where cID = {$cID}";
$db->query($q);
} catch (Exception $e) {
}
}
}
public function duplicateCollection()
{
$db = Loader::db();
$dh = Loader::helper('date');
$cDate = $dh->getOverridableNow();
$v = array($cDate, $cDate, $this->cHandle);
$r = $db->query('insert into Collections (cDateAdded, cDateModified, cHandle) values (?, ?, ?)', $v);
$newCID = $db->Insert_ID();
if ($r) {
// first, we get the creation date of the active version in this collection
//$q = "select cvDateCreated from CollectionVersions where cvIsApproved = 1 and cID = {$this->cID}";
//$dcOriginal = $db->getOne($q);
// now we create the query that will grab the versions we're going to copy
$qv = "select * from CollectionVersions where cID = '{$this->cID}' order by cvDateCreated asc";
// now we grab all of the current versions
$rv = $db->query($qv);
$cvList = array();
while ($row = $rv->fetchRow()) {
// insert
$cvList[] = $row['cvID'];
$cDate = date('Y-m-d H:i:s', strtotime($cDate) + 1);
$vv = array(
$newCID,
$row['cvID'],
$row['cvName'],
$row['cvHandle'],
$row['cvDescription'],
$row['cvDatePublic'],
$cDate,
$row['cvComments'],
$row['cvAuthorUID'],
$row['cvIsApproved'],
$row['pThemeID'],
$row['pTemplateID'],
);
$qv = 'insert into CollectionVersions (cID, cvID, cvName, cvHandle, cvDescription, cvDatePublic, cvDateCreated, cvComments, cvAuthorUID, cvIsApproved, pThemeID, pTemplateID) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
$db->query($qv, $vv);
}
$ql = "select * from CollectionVersionBlockStyles where cID = '{$this->cID}'";
$rl = $db->query($ql);
while ($row = $rl->fetchRow()) {
$vl = array($newCID, $row['cvID'], $row['bID'], $row['arHandle'], $row['issID']);
$ql = 'insert into CollectionVersionBlockStyles (cID, cvID, bID, arHandle, issID) values (?, ?, ?, ?, ?)';
$db->query($ql, $vl);
}
$ql = "select * from CollectionVersionAreaStyles where cID = '{$this->cID}'";
$rl = $db->query($ql);
while ($row = $rl->fetchRow()) {
$vl = array($newCID, $row['cvID'], $row['arHandle'], $row['issID']);
$ql = 'insert into CollectionVersionAreaStyles (cID, cvID, arHandle, issID) values (?, ?, ?, ?)';
$db->query($ql, $vl);
}
$ql = "select * from CollectionVersionThemeCustomStyles where cID = '{$this->cID}'";
$rl = $db->query($ql);
while ($row = $rl->fetchRow()) {
$vl = array($newCID, $row['cvID'], $row['pThemeID'], $row['scvlID'], $row['preset'], $row['sccRecordID']);
$ql = 'insert into CollectionVersionThemeCustomStyles (cID, cvID, pThemeID, scvlID, preset, sccRecordID) values (?, ?, ?, ?, ?, ?)';
$db->query($ql, $vl);
}
// now we grab all the blocks we're going to need
$cvList = implode(',', $cvList);
$q = "select bID, cvID, arHandle, cbDisplayOrder, cbOverrideAreaPermissions, cbIncludeAll from CollectionVersionBlocks where cID = '{$this->cID}' and cvID in ({$cvList})";
$r = $db->query($q);
while ($row = $r->fetchRow()) {
$v = array(
$newCID,
$row['cvID'],
$row['bID'],
$row['arHandle'],
$row['cbDisplayOrder'],
0,
$row['cbOverrideAreaPermissions'],
$row['cbIncludeAll'],
);
$q = 'insert into CollectionVersionBlocks (cID, cvID, bID, arHandle, cbDisplayOrder, isOriginal, cbOverrideAreaPermissions, cbIncludeAll) values (?, ?, ?, ?, ?, ?, ?, ?)';
$db->query($q, $v);
if ($row['cbOverrideAreaPermissions'] != 0) {
$q2 = "select paID, pkID from BlockPermissionAssignments where cID = '{$this->cID}' and bID = '{$row['bID']}' and cvID = '{$row['cvID']}'";
$r2 = $db->query($q2);
while ($row2 = $r2->fetchRow()) {
$db->Replace(
'BlockPermissionAssignments',
array(
'cID' => $newCID,
'cvID' => $row['cvID'],
'bID' => $row['bID'],
'paID' => $row2['paID'],
'pkID' => $row2['pkID'],
),
array('cID', 'cvID', 'bID', 'paID', 'pkID'),
true
);
}
}
}
// duplicate any attributes belonging to the collection
$v = array($this->getCollectionID());
$q = 'select akID, cvID, avID from CollectionAttributeValues where cID = ?';
$r = $db->query($q, $v);
while ($row = $r->fetchRow()) {
$v2 = array($row['akID'], $row['cvID'], $row['avID'], $newCID);
$db->query('insert into CollectionAttributeValues (akID, cvID, avID, cID) values (?, ?, ?, ?)', $v2);
}
return Collection::getByID($newCID);
}
}
}