mirror of
https://github.com/silverstripe/silverstripe-cms
synced 2024-10-22 08:05:56 +02:00
Merge pull request #311 from tractorcow/3.2-pdo-connector
API New Parameterised Database ORM for Silverstripe 3.2. Ticket #7429
This commit is contained in:
commit
d140fa0b5e
@ -66,7 +66,9 @@ class CMSBatchAction_Delete extends CMSBatchAction {
|
||||
|
||||
// check to see if the record exists on the live site,
|
||||
// if it doesn't remove the tree node
|
||||
$liveRecord = Versioned::get_one_by_stage( 'SiteTree', 'Live', "\"SiteTree\".\"ID\"=$id");
|
||||
$liveRecord = Versioned::get_one_by_stage( 'SiteTree', 'Live', array(
|
||||
'"SiteTree"."ID"' => $id
|
||||
));
|
||||
if($liveRecord) {
|
||||
$liveRecord->IsDeletedFromStage = true;
|
||||
$status['modified'][$liveRecord->ID] = array(
|
||||
@ -111,7 +113,9 @@ class CMSBatchAction_DeleteFromLive extends CMSBatchAction {
|
||||
if($page->canDelete()) $page->doDeleteFromLive();
|
||||
|
||||
// check to see if the record exists on the stage site, if it doesn't remove the tree node
|
||||
$stageRecord = Versioned::get_one_by_stage( 'SiteTree', 'Stage', "\"SiteTree\".\"ID\"=$id");
|
||||
$stageRecord = Versioned::get_one_by_stage( 'SiteTree', 'Stage', array(
|
||||
'"SiteTree"."ID"' => $id
|
||||
));
|
||||
if($stageRecord) {
|
||||
$stageRecord->IsAddedToStage = true;
|
||||
$status['modified'][$stageRecord->ID] = array(
|
||||
|
@ -335,9 +335,9 @@ JS
|
||||
public function delete($data, $form) {
|
||||
$className = $this->stat('tree_class');
|
||||
|
||||
$record = DataObject::get_by_id($className, Convert::raw2sql($data['ID']));
|
||||
$record = DataObject::get_by_id($className, $data['ID']);
|
||||
if($record && !$record->canDelete()) return Security::permissionFailure();
|
||||
if(!$record || !$record->ID) throw new HTTPResponse_Exception("Bad record ID #" . (int)$data['ID'], 404);
|
||||
if(!$record || !$record->ID) throw new SS_HTTPResponse_Exception("Bad record ID #" . (int)$data['ID'], 404);
|
||||
$parentID = $record->ParentID;
|
||||
$record->delete();
|
||||
$this->setCurrentPageID(null);
|
||||
|
@ -536,7 +536,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
||||
if($versionID) {
|
||||
$record = Versioned::get_version($treeClass, $id, $versionID);
|
||||
} else {
|
||||
$record = DataObject::get_one($treeClass, "\"$treeClass\".\"ID\" = $id");
|
||||
$record = DataObject::get_by_id($treeClass, $id);
|
||||
}
|
||||
|
||||
// Then, try getting a record from the live site
|
||||
@ -545,7 +545,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
||||
Versioned::reading_stage('Live');
|
||||
singleton($treeClass)->flushCache();
|
||||
|
||||
$record = DataObject::get_one( $treeClass, "\"$treeClass\".\"ID\" = $id");
|
||||
$record = DataObject::get_by_id($treeClass, $id);
|
||||
if($record) Versioned::set_reading_mode('');
|
||||
}
|
||||
|
||||
@ -816,9 +816,8 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
||||
// Fall back to homepage record
|
||||
if(!$id) {
|
||||
$homepageSegment = RootURLController::get_homepage_link();
|
||||
$homepageRecord = DataObject::get_one('SiteTree', sprintf(
|
||||
'"SiteTree"."URLSegment" = \'%s\'',
|
||||
Convert::raw2sql($homepageSegment)
|
||||
$homepageRecord = DataObject::get_one('SiteTree', array(
|
||||
'"SiteTree"."URLSegment"' => $homepageSegment
|
||||
));
|
||||
if($homepageRecord) $id = $homepageRecord->ID;
|
||||
}
|
||||
@ -836,14 +835,14 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
||||
$className = $this->stat('tree_class');
|
||||
|
||||
// Existing or new record?
|
||||
$SQL_id = Convert::raw2sql($data['ID']);
|
||||
if(substr($SQL_id,0,3) != 'new') {
|
||||
$record = DataObject::get_by_id($className, $SQL_id);
|
||||
$id = $data['ID'];
|
||||
if(substr($id,0,3) != 'new') {
|
||||
$record = DataObject::get_by_id($className, $id);
|
||||
if($record && !$record->canEdit()) return Security::permissionFailure($this);
|
||||
if(!$record || !$record->ID) throw new SS_HTTPResponse_Exception("Bad record ID #$SQL_id", 404);
|
||||
if(!$record || !$record->ID) throw new SS_HTTPResponse_Exception("Bad record ID #$id", 404);
|
||||
} else {
|
||||
if(!singleton($this->stat('tree_class'))->canCreate()) return Security::permissionFailure($this);
|
||||
$record = $this->getNewItem($SQL_id, false);
|
||||
$record = $this->getNewItem($id, false);
|
||||
}
|
||||
|
||||
// TODO Coupling to SiteTree
|
||||
@ -915,7 +914,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
||||
// DataObject::fieldExists only checks the current class, not the hierarchy
|
||||
// This allows the CMS to set the correct sort value
|
||||
if($newItem->castingHelper('Sort')) {
|
||||
$newItem->Sort = DB::query("SELECT MAX(\"Sort\") FROM \"SiteTree\" WHERE \"ParentID\" = '" . Convert::raw2sql($parentID) . "'")->value() + 1;
|
||||
$newItem->Sort = DB::prepared_query('SELECT MAX("Sort") FROM "SiteTree" WHERE "ParentID" = ?', array($parentID))->value() + 1;
|
||||
}
|
||||
|
||||
if($setID) $newItem->ID = $id;
|
||||
@ -1007,11 +1006,9 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
||||
$restoredPage = Versioned::get_latest_version("SiteTree", $id);
|
||||
if(!$restoredPage) return new SS_HTTPResponse("SiteTree #$id not found", 400);
|
||||
|
||||
$record = Versioned::get_one_by_stage(
|
||||
'SiteTree',
|
||||
'Live',
|
||||
sprintf("\"SiteTree_Live\".\"ID\" = '%d'", (int)$data['ID'])
|
||||
);
|
||||
$record = Versioned::get_one_by_stage('SiteTree', 'Live', array(
|
||||
'"SiteTree_Live"."ID"' => $id
|
||||
));
|
||||
|
||||
// a user can restore a page without publication rights, as it just adds a new draft state
|
||||
// (this action should just be available when page has been "deleted from draft")
|
||||
@ -1038,11 +1035,8 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
||||
* @see deletefromlive()
|
||||
*/
|
||||
public function delete($data, $form) {
|
||||
$id = Convert::raw2sql($data['ID']);
|
||||
$record = DataObject::get_one(
|
||||
"SiteTree",
|
||||
sprintf("\"SiteTree\".\"ID\" = %d", $id)
|
||||
);
|
||||
$id = $data['ID'];
|
||||
$record = DataObject::get_by_id("SiteTree", $id);
|
||||
if($record && !$record->canDelete()) return Security::permissionFailure();
|
||||
if(!$record || !$record->ID) throw new SS_HTTPResponse_Exception("Bad record ID #$id", 404);
|
||||
|
||||
|
@ -101,7 +101,7 @@ abstract class CMSSiteTreeFilter extends Object {
|
||||
}
|
||||
|
||||
while(!empty($parents)) {
|
||||
$q = new SQLQuery();
|
||||
$q = new SQLSelect();
|
||||
$q->setSelect(array('"ID"','"ParentID"'))
|
||||
->setFrom('"SiteTree"')
|
||||
->setWhere('"ID" in ('.implode(',',array_keys($parents)).')');
|
||||
|
@ -71,7 +71,7 @@ class ContentController extends Controller {
|
||||
$parent = SiteTree::get_by_link($parentRef);
|
||||
|
||||
if(!$parent && is_numeric($parentRef)) {
|
||||
$parent = DataObject::get_by_id('SiteTree', Convert::raw2sql($parentRef));
|
||||
$parent = DataObject::get_by_id('SiteTree', $parentRef);
|
||||
}
|
||||
|
||||
if($parent) return $parent->Children();
|
||||
|
@ -64,7 +64,7 @@ class ModelAsController extends Controller implements NestedController {
|
||||
}
|
||||
|
||||
// If the database has not yet been created, redirect to the build page.
|
||||
if(!DB::isActive() || !ClassInfo::hasTable('SiteTree')) {
|
||||
if(!DB::is_active() || !ClassInfo::hasTable('SiteTree')) {
|
||||
$this->response->redirect(Director::absoluteBaseURL() . 'dev/build?returnURL=' . (isset($_GET['url']) ? urlencode($_GET['url']) : null));
|
||||
$this->popCurrent();
|
||||
|
||||
@ -101,14 +101,16 @@ class ModelAsController extends Controller implements NestedController {
|
||||
|
||||
// Find page by link, regardless of current locale settings
|
||||
if(class_exists('Translatable')) Translatable::disable_locale_filter();
|
||||
$sitetree = DataObject::get_one(
|
||||
'SiteTree',
|
||||
sprintf(
|
||||
'"SiteTree"."URLSegment" = \'%s\' %s',
|
||||
Convert::raw2sql(rawurlencode($URLSegment)),
|
||||
(SiteTree::config()->nested_urls ? 'AND "SiteTree"."ParentID" = 0' : null)
|
||||
)
|
||||
);
|
||||
|
||||
// Select child page
|
||||
$conditions = array('"SiteTree"."URLSegment"' => rawurlencode($URLSegment));
|
||||
if(SiteTree::config()->nested_urls) {
|
||||
$conditions[] = array('"SiteTree"."ParentID"' => 0);
|
||||
}
|
||||
$sitetree = DataObject::get_one('SiteTree', $conditions);
|
||||
|
||||
// Check translation module
|
||||
// @todo Refactor out module specific code
|
||||
if(class_exists('Translatable')) Translatable::enable_locale_filter();
|
||||
|
||||
if(!$sitetree) {
|
||||
|
@ -6,7 +6,7 @@ class OldPageRedirector extends Extension {
|
||||
* On every URL that generates a 404, we'll capture it here and see if we can
|
||||
* find an old URL that it should be redirecting to.
|
||||
*
|
||||
* @param SS_HTTPResponse $request The request object
|
||||
* @param SS_HTTPRequest $request The request object
|
||||
* @throws SS_HTTPResponse_Exception
|
||||
*/
|
||||
public function onBeforeHTTPError404($request) {
|
||||
@ -41,7 +41,7 @@ class OldPageRedirector extends Extension {
|
||||
static public function find_old_page($params, $parent = null, $redirect = false) {
|
||||
$parent = is_numeric($parent) ? SiteTree::get()->byId($parent) : $parent;
|
||||
$params = (array)$params;
|
||||
$URL = Convert::raw2sql(array_shift($params));
|
||||
$URL = rawurlencode(array_shift($params));
|
||||
if (empty($URL)) { return false; }
|
||||
if ($parent) {
|
||||
$page = SiteTree::get()->filter(array('ParentID' => $parent->ID, 'URLSegment' => $URL))->First();
|
||||
@ -51,11 +51,17 @@ class OldPageRedirector extends Extension {
|
||||
|
||||
if (!$page) {
|
||||
// If we haven't found a candidate, lets resort to finding an old page with this URL segment
|
||||
// TODO: Rewrite using ORM syntax
|
||||
$query = new SQLQuery (
|
||||
$oldFilter = array(
|
||||
'"SiteTree_versions"."URLSegment"' => $URL,
|
||||
'"SiteTree_versions"."WasPublished"' => true
|
||||
);
|
||||
if($parent) {
|
||||
$oldFilter[] = array('"SiteTree_versions"."ParentID"' => $parent->ID);
|
||||
}
|
||||
$query = new SQLSelect(
|
||||
'"RecordID"',
|
||||
'"SiteTree_versions"',
|
||||
"\"URLSegment\" = '$URL' AND \"WasPublished\" = 1" . ($parent ? ' AND "ParentID" = ' . $parent->ID : ''),
|
||||
$oldFilter,
|
||||
'"LastEdited" DESC',
|
||||
null,
|
||||
null,
|
||||
|
@ -29,11 +29,12 @@ class RootURLController extends Controller {
|
||||
*/
|
||||
static public function get_homepage_link() {
|
||||
if(!self::$cached_homepage_link) {
|
||||
// TODO Move to 'homepagefordomain' module
|
||||
// @todo Move to 'homepagefordomain' module
|
||||
if(class_exists('HomepageForDomainExtension')) {
|
||||
$host = str_replace('www.', null, $_SERVER['HTTP_HOST']);
|
||||
$SQL_host = Convert::raw2sql($host);
|
||||
$candidates = DataObject::get('SiteTree', "\"HomepageForDomain\" LIKE '%$SQL_host%'");
|
||||
$candidates = SiteTree::get()->where(array(
|
||||
'"SiteTree"."HomepageForDomain" LIKE ?' => "%$host%"
|
||||
));
|
||||
if($candidates) foreach($candidates as $candidate) {
|
||||
if(preg_match('/(,|^) *' . preg_quote($host) . ' *(,|$)/', $candidate->HomepageForDomain)) {
|
||||
self::$cached_homepage_link = trim($candidate->RelativeLink(true), '/');
|
||||
@ -117,7 +118,7 @@ class RootURLController extends Controller {
|
||||
$this->pushCurrent();
|
||||
$this->init();
|
||||
|
||||
if(!DB::isActive() || !ClassInfo::hasTable('SiteTree')) {
|
||||
if(!DB::is_active() || !ClassInfo::hasTable('SiteTree')) {
|
||||
$this->response = new SS_HTTPResponse();
|
||||
$this->response->redirect(Director::absoluteBaseURL() . 'dev/build?returnURL=' . (isset($_GET['url']) ? urlencode($_GET['url']) : null));
|
||||
return $this->response;
|
||||
|
@ -194,16 +194,12 @@ class SilverStripeNavigatorItem extends ViewableData {
|
||||
|
||||
if(!isset($this->record->_cached_isArchived)) {
|
||||
$baseTable = ClassInfo::baseDataClass($this->record->class);
|
||||
$currentDraft = Versioned::get_one_by_stage(
|
||||
$baseTable,
|
||||
'Stage',
|
||||
sprintf('"%s"."ID" = %d', $baseTable, $this->record->ID)
|
||||
);
|
||||
$currentLive = Versioned::get_one_by_stage(
|
||||
$baseTable,
|
||||
'Live',
|
||||
sprintf('"%s"."ID" = %d', $baseTable, $this->record->ID)
|
||||
);
|
||||
$currentDraft = Versioned::get_one_by_stage($baseTable, 'Stage', array(
|
||||
"\"$baseTable\".\"ID\"" => $this->record->ID
|
||||
));
|
||||
$currentLive = Versioned::get_one_by_stage($baseTable, 'Live', array(
|
||||
"\"$baseTable\".\"ID\"" => $this->record->ID
|
||||
));
|
||||
|
||||
$this->record->_cached_isArchived = (
|
||||
(!$currentDraft || ($currentDraft && $this->record->Version != $currentDraft->Version))
|
||||
@ -306,11 +302,9 @@ class SilverStripeNavigatorItem_StageLink extends SilverStripeNavigatorItem {
|
||||
|
||||
protected function getDraftPage() {
|
||||
$baseTable = ClassInfo::baseDataClass($this->record->class);
|
||||
return Versioned::get_one_by_stage(
|
||||
$baseTable,
|
||||
'Stage',
|
||||
sprintf('"%s"."ID" = %d', $baseTable, $this->record->ID)
|
||||
);
|
||||
return Versioned::get_one_by_stage($baseTable, 'Stage', array(
|
||||
"\"$baseTable\".\"ID\"" => $this->record->ID
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
@ -360,11 +354,9 @@ class SilverStripeNavigatorItem_LiveLink extends SilverStripeNavigatorItem {
|
||||
|
||||
protected function getLivePage() {
|
||||
$baseTable = ClassInfo::baseDataClass($this->record->class);
|
||||
return Versioned::get_one_by_stage(
|
||||
$baseTable,
|
||||
'Live',
|
||||
sprintf('"%s"."ID" = %d', $baseTable, $this->record->ID)
|
||||
);
|
||||
return Versioned::get_one_by_stage($baseTable, 'Live', array(
|
||||
"\"$baseTable\".\"ID\"" => $this->record->ID
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4,6 +4,10 @@
|
||||
* @subpackage filesystem
|
||||
*/
|
||||
class Folder_UnusedAssetsField extends CompositeField {
|
||||
|
||||
/**
|
||||
* @var Folder
|
||||
*/
|
||||
protected $folder;
|
||||
|
||||
public function __construct($folder) {
|
||||
|
@ -328,22 +328,22 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
$link = RootURLController::get_homepage_link();
|
||||
}
|
||||
|
||||
$parts = Convert::raw2sql(preg_split('|/+|', $link));
|
||||
$parts = preg_split('|/+|', $link);
|
||||
|
||||
// Grab the initial root level page to traverse down from.
|
||||
$URLSegment = array_shift($parts);
|
||||
$sitetree = DataObject::get_one (
|
||||
'SiteTree',
|
||||
"\"SiteTree\".\"URLSegment\" = '$URLSegment'" . (
|
||||
self::config()->nested_urls ? ' AND "SiteTree"."ParentID" = 0' : ''
|
||||
),
|
||||
$cache
|
||||
);
|
||||
$conditions = array('"SiteTree"."URLSegment"' => rawurlencode($URLSegment));
|
||||
if(self::config()->nested_urls) {
|
||||
$conditions[] = array('"SiteTree"."ParentID"' => 0);
|
||||
}
|
||||
$sitetree = DataObject::get_one('SiteTree', $conditions, $cache);
|
||||
|
||||
/// Fall back on a unique URLSegment for b/c.
|
||||
if(!$sitetree
|
||||
if( !$sitetree
|
||||
&& self::config()->nested_urls
|
||||
&& $page = DataObject::get_one('SiteTree', "\"SiteTree\".\"URLSegment\" = '$URLSegment'", $cache)
|
||||
&& $page = DataObject::get_one('SiteTree', array(
|
||||
'"SiteTree"."URLSegment"' => $URLSegment
|
||||
), $cache)
|
||||
) {
|
||||
return $page;
|
||||
}
|
||||
@ -364,9 +364,10 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
|
||||
// Traverse down the remaining URL segments and grab the relevant SiteTree objects.
|
||||
foreach($parts as $segment) {
|
||||
$next = DataObject::get_one (
|
||||
'SiteTree',
|
||||
"\"SiteTree\".\"URLSegment\" = '$segment' AND \"SiteTree\".\"ParentID\" = $sitetree->ID",
|
||||
$next = DataObject::get_one('SiteTree', array(
|
||||
'"SiteTree"."URLSegment"' => $segment,
|
||||
'"SiteTree"."ParentID"' => $sitetree->ID
|
||||
),
|
||||
$cache
|
||||
);
|
||||
|
||||
@ -440,7 +441,7 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
if (
|
||||
!($page = DataObject::get_by_id('SiteTree', $arguments['id'])) // Get the current page by ID.
|
||||
&& !($page = Versioned::get_latest_version('SiteTree', $arguments['id'])) // Attempt link to old version.
|
||||
&& !($page = DataObject::get_one('ErrorPage', '"ErrorPage"."ErrorCode" = \'404\'')) // Link to 404 page.
|
||||
&& !($page = DataObject::get_one('ErrorPage', array('"ErrorPage"."ErrorCode"' => 404))) // Link to 404 page directly.
|
||||
) {
|
||||
return; // There were no suitable matches at all.
|
||||
}
|
||||
@ -536,7 +537,9 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
public function getAbsoluteLiveLink($includeStageEqualsLive = true) {
|
||||
$oldStage = Versioned::current_stage();
|
||||
Versioned::reading_stage('Live');
|
||||
$live = Versioned::get_one_by_stage('SiteTree', 'Live', '"SiteTree"."ID" = ' . $this->ID);
|
||||
$live = Versioned::get_one_by_stage('SiteTree', 'Live', array(
|
||||
'"SiteTree"."ID"' => $this->ID
|
||||
));
|
||||
if($live) {
|
||||
$link = $live->AbsoluteLink();
|
||||
if($includeStageEqualsLive) $link .= '?stage=Live';
|
||||
@ -785,8 +788,8 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
* @return SiteTree Parent of this page.
|
||||
*/
|
||||
public function getParent() {
|
||||
if ($this->getField("ParentID")) {
|
||||
return DataObject::get_one("SiteTree", "\"SiteTree\".\"ID\" = " . $this->getField("ParentID"));
|
||||
if ($parentID = $this->getField("ParentID")) {
|
||||
return DataObject::get_by_id("SiteTree", $parentID);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1201,7 +1204,8 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
return $result;
|
||||
}
|
||||
|
||||
$SQL_idList = implode($ids, ", ");
|
||||
// Placeholder for parameterised ID list
|
||||
$idPlaceholders = DB::placeholders($ids);
|
||||
|
||||
// if page can't be viewed, don't grant edit permissions
|
||||
// to do - implement can_view_multiple(), so this can be enabled
|
||||
@ -1218,16 +1222,22 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
// Start by filling the array with the pages that actually exist
|
||||
$table = ($stage=='Stage') ? "SiteTree" : "SiteTree_$stage";
|
||||
|
||||
$result = array_fill_keys(
|
||||
($ids) ? DB::query("SELECT \"ID\" FROM \"$table\" WHERE \"ID\" IN (".implode(", ", $ids).")")->column() : array(),
|
||||
false
|
||||
);
|
||||
if($ids) {
|
||||
$idQuery = "SELECT \"ID\" FROM \"$table\" WHERE \"ID\" IN ($idPlaceholders)";
|
||||
$stageIds = DB::prepared_query($idQuery, $ids)->column();
|
||||
} else {
|
||||
$stageIds = array();
|
||||
}
|
||||
$result = array_fill_keys($stageIds, false);
|
||||
|
||||
// Get the uninherited permissions
|
||||
$uninheritedPermissions = Versioned::get_by_stage("SiteTree", $stage)
|
||||
->where("(\"$typeField\" = 'LoggedInUsers' OR
|
||||
->where(array(
|
||||
"(\"$typeField\" = 'LoggedInUsers' OR
|
||||
(\"$typeField\" = 'OnlyTheseUsers' AND \"$groupJoinTable\".\"SiteTreeID\" IS NOT NULL))
|
||||
AND \"SiteTree\".\"ID\" IN ($SQL_idList)")
|
||||
AND \"SiteTree\".\"ID\" IN ($idPlaceholders)"
|
||||
=> $ids
|
||||
))
|
||||
->leftJoin($groupJoinTable, "\"$groupJoinTable\".\"SiteTreeID\" = \"SiteTree\".\"ID\" AND \"$groupJoinTable\".\"GroupID\" IN ($SQL_groupList)");
|
||||
|
||||
if($uninheritedPermissions) {
|
||||
@ -1236,8 +1246,11 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
}
|
||||
|
||||
// Get permissions that are inherited
|
||||
$potentiallyInherited = Versioned::get_by_stage("SiteTree", $stage, "\"$typeField\" = 'Inherit'
|
||||
AND \"SiteTree\".\"ID\" IN ($SQL_idList)");
|
||||
$potentiallyInherited = Versioned::get_by_stage(
|
||||
"SiteTree",
|
||||
$stage,
|
||||
array("\"$typeField\" = 'Inherit' AND \"SiteTree\".\"ID\" IN ($idPlaceholders)" => $ids)
|
||||
);
|
||||
|
||||
if($potentiallyInherited) {
|
||||
// Group $potentiallyInherited by ParentID; we'll look at the permission of all those
|
||||
@ -1323,10 +1336,12 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
// You can only delete pages that you can edit
|
||||
$editableIDs = array_keys(array_filter(self::can_edit_multiple($ids, $memberID)));
|
||||
if($editableIDs) {
|
||||
$idList = implode(",", $editableIDs);
|
||||
|
||||
// You can only delete pages whose children you can delete
|
||||
$childRecords = DataObject::get("SiteTree", "\"ParentID\" IN ($idList)");
|
||||
$editablePlaceholders = DB::placeholders($editableIDs);
|
||||
$childRecords = SiteTree::get()->where(array(
|
||||
"\"SiteTree\".\"ParentID\" IN ($editablePlaceholders)" => $editableIDs
|
||||
));
|
||||
if($childRecords) {
|
||||
$children = $childRecords->map("ID", "ParentID");
|
||||
|
||||
@ -1492,7 +1507,7 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
// schema migration
|
||||
// @todo Move to migration task once infrastructure is implemented
|
||||
if($this->class == 'SiteTree') {
|
||||
$conn = DB::getConn();
|
||||
$conn = DB::get_schema();
|
||||
// only execute command if fields haven't been renamed to _obsolete_<fieldname> already by the task
|
||||
if(array_key_exists('Viewers', $conn->fieldList('SiteTree'))) {
|
||||
$task = new UpgradeSiteTreePermissionSchemaTask();
|
||||
@ -1510,7 +1525,10 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
// If Sort hasn't been set, make this page come after it's siblings
|
||||
if(!$this->Sort) {
|
||||
$parentID = ($this->ParentID) ? $this->ParentID : 0;
|
||||
$this->Sort = DB::query("SELECT MAX(\"Sort\") + 1 FROM \"SiteTree\" WHERE \"ParentID\" = $parentID")->value();
|
||||
$this->Sort = DB::prepared_query(
|
||||
"SELECT MAX(\"Sort\") + 1 FROM \"SiteTree\" WHERE \"ParentID\" = ?",
|
||||
array($parentID)
|
||||
)->value();
|
||||
}
|
||||
|
||||
// If there is no URLSegment set, generate one from Title
|
||||
@ -1663,15 +1681,13 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
if(class_exists($this->URLSegment) && is_subclass_of($this->URLSegment, 'RequestHandler')) return false;
|
||||
}
|
||||
|
||||
$IDFilter = ($this->ID) ? "AND \"SiteTree\".\"ID\" <> $this->ID" : null;
|
||||
$parentFilter = null;
|
||||
|
||||
if(self::config()->nested_urls) {
|
||||
if($this->ParentID) {
|
||||
$parentFilter = " AND \"SiteTree\".\"ParentID\" = $this->ParentID";
|
||||
} else {
|
||||
$parentFilter = ' AND "SiteTree"."ParentID" = 0';
|
||||
// Filters by url, id, and parent
|
||||
$filter = array('"SiteTree"."URLSegment"' => $this->URLSegment);
|
||||
if($this->ID) {
|
||||
$filter['"SiteTree"."ID" <> ?'] = $this->ID;
|
||||
}
|
||||
if(self::config()->nested_urls) {
|
||||
$filter['"SiteTree"."ParentID"'] = $this->ParentID ? $this->ParentID : 0;
|
||||
}
|
||||
|
||||
$votes = array_filter(
|
||||
@ -1682,11 +1698,9 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
return min($votes);
|
||||
}
|
||||
|
||||
$segment = Convert::raw2sql($this->URLSegment);
|
||||
$existingPage = DataObject::get_one(
|
||||
'SiteTree',
|
||||
"\"SiteTree\".\"URLSegment\" = '$segment' $IDFilter $parentFilter"
|
||||
);
|
||||
// Check existence
|
||||
$existingPage = DataObject::get_one('SiteTree', $filter);
|
||||
if ($existingPage) return false;
|
||||
|
||||
return !($existingPage);
|
||||
}
|
||||
@ -1719,11 +1733,9 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
* @return string
|
||||
*/
|
||||
public function getStageURLSegment() {
|
||||
$stageRecord = Versioned::get_one_by_stage(
|
||||
'SiteTree',
|
||||
'Stage',
|
||||
"\"SiteTree\".\"ID\" = $this->ID"
|
||||
);
|
||||
$stageRecord = Versioned::get_one_by_stage('SiteTree', 'Stage', array(
|
||||
'"SiteTree"."ID"' => $this->ID
|
||||
));
|
||||
return ($stageRecord) ? $stageRecord->URLSegment : null;
|
||||
}
|
||||
|
||||
@ -1731,11 +1743,9 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
* @return string
|
||||
*/
|
||||
public function getLiveURLSegment() {
|
||||
$liveRecord = Versioned::get_one_by_stage(
|
||||
'SiteTree',
|
||||
'Live',
|
||||
"\"SiteTree\".\"ID\" = $this->ID"
|
||||
);
|
||||
$liveRecord = Versioned::get_one_by_stage('SiteTree', 'Live', array(
|
||||
'"SiteTree"."ID"' => $this->ID
|
||||
));
|
||||
return ($liveRecord) ? $liveRecord->URLSegment : null;
|
||||
}
|
||||
|
||||
@ -1748,7 +1758,10 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
// Update the content without actually creating a new version
|
||||
foreach(array("SiteTree_Live", "SiteTree") as $table) {
|
||||
// Published site
|
||||
$published = DB::query("SELECT * FROM \"$table\" WHERE \"ID\" = $this->ID")->record();
|
||||
$published = DB::prepared_query(
|
||||
"SELECT * FROM \"$table\" WHERE \"ID\" = ?",
|
||||
array($this->ID)
|
||||
)->record();
|
||||
$origPublished = $published;
|
||||
|
||||
foreach($fields as $fieldName => $fieldType) {
|
||||
@ -1758,8 +1771,8 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
if(isset($published[$fieldName])) {
|
||||
$published[$fieldName] = str_replace($old, $new, $published[$fieldName], $numReplaced);
|
||||
if($numReplaced) {
|
||||
DB::query("UPDATE \"$table\" SET \"$fieldName\" = '"
|
||||
. Convert::raw2sql($published[$fieldName]) . "' WHERE \"ID\" = $this->ID");
|
||||
$query = sprintf('UPDATE "%s" SET "%s" = ? WHERE "ID" = ?', $table, $fieldName);
|
||||
DB::prepared_query($query, array($published[$fieldName], $this->ID));
|
||||
|
||||
// Tell static caching to update itself
|
||||
if($table == 'SiteTree_Live') {
|
||||
@ -1813,7 +1826,10 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
}
|
||||
|
||||
// Redirector pages
|
||||
$redirectors = DataObject::get("RedirectorPage", "\"RedirectorPage\".\"RedirectionType\" = 'Internal' AND \"LinkToID\" = $this->ID");
|
||||
$redirectors = RedirectorPage::get()->where(array(
|
||||
'"RedirectorPage"."RedirectionType"' => 'Internal',
|
||||
'"RedirectorPage"."LinkToID"' => $this->ID
|
||||
));
|
||||
if($redirectors) {
|
||||
$redirectorList = new ArrayList();
|
||||
foreach($redirectors as $item) {
|
||||
@ -1845,14 +1861,26 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
* Return all virtual pages that link to this page
|
||||
*/
|
||||
public function VirtualPages() {
|
||||
|
||||
// Ignore new records
|
||||
if(!$this->ID) return null;
|
||||
|
||||
// Check subsite virtual pages
|
||||
// @todo Refactor out subsite module specific code
|
||||
if(class_exists('Subsite')) {
|
||||
return Subsite::get_from_all_subsites('VirtualPage', "\"CopyContentFromID\" = " . (int)$this->ID);
|
||||
} elseif(class_exists('VirtualPage')) {
|
||||
return DataObject::get('VirtualPage', "\"CopyContentFromID\" = " . (int)$this->ID);
|
||||
}else{
|
||||
return null;
|
||||
return Subsite::get_from_all_subsites('VirtualPage', array(
|
||||
'"VirtualPage"."CopyContentFromID"' => $this->ID
|
||||
));
|
||||
}
|
||||
|
||||
// Check existing virtualpages
|
||||
if(class_exists('VirtualPage')) {
|
||||
return VirtualPage::get()->where(array(
|
||||
'"VirtualPage"."CopyContentFromID"' => $this->ID
|
||||
));
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2235,7 +2263,9 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
$rootTabSet->addExtraClass('ss-ui-action-tabset action-menus');
|
||||
|
||||
// Render page information into the "more-options" drop-up, on the top.
|
||||
$live = Versioned::get_one_by_stage('SiteTree', 'Live', "\"SiteTree\".\"ID\"='$this->ID'");
|
||||
$live = Versioned::get_one_by_stage('SiteTree', 'Live', array(
|
||||
'"SiteTree"."ID"' => $this->ID
|
||||
));
|
||||
$moreOptions->push(
|
||||
new LiteralField('Information',
|
||||
$this->customise(array(
|
||||
@ -2246,7 +2276,9 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
);
|
||||
|
||||
// "readonly"/viewing version that isn't the current version of the record
|
||||
$stageOrLiveRecord = Versioned::get_one_by_stage($this->class, Versioned::current_stage(), sprintf('"SiteTree"."ID" = %d', $this->ID));
|
||||
$stageOrLiveRecord = Versioned::get_one_by_stage($this->class, Versioned::current_stage(), array(
|
||||
'"SiteTree"."ID"' => $this->ID
|
||||
));
|
||||
if($stageOrLiveRecord && $stageOrLiveRecord->Version != $this->Version) {
|
||||
$moreOptions->push(FormAction::create('email', _t('CMSMain.EMAIL', 'Email')));
|
||||
$moreOptions->push(FormAction::create('rollback', _t('CMSMain.ROLLBACK', 'Roll back to this version')));
|
||||
@ -2346,7 +2378,9 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
public function doPublish() {
|
||||
if (!$this->canPublish()) return false;
|
||||
|
||||
$original = Versioned::get_one_by_stage("SiteTree", "Live", "\"SiteTree\".\"ID\" = $this->ID");
|
||||
$original = Versioned::get_one_by_stage("SiteTree", "Live", array(
|
||||
'"SiteTree"."ID"' => $this->ID
|
||||
));
|
||||
if(!$original) $original = new SiteTree();
|
||||
|
||||
// Handle activities undertaken by extensions
|
||||
@ -2355,9 +2389,11 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
$this->write();
|
||||
$this->publish("Stage", "Live");
|
||||
|
||||
DB::query("UPDATE \"SiteTree_Live\"
|
||||
SET \"Sort\" = (SELECT \"SiteTree\".\"Sort\" FROM \"SiteTree\" WHERE \"SiteTree_Live\".\"ID\" = \"SiteTree\".\"ID\")
|
||||
WHERE EXISTS (SELECT \"SiteTree\".\"Sort\" FROM \"SiteTree\" WHERE \"SiteTree_Live\".\"ID\" = \"SiteTree\".\"ID\") AND \"ParentID\" = " . sprintf('%d', $this->ParentID) );
|
||||
DB::prepared_query('UPDATE "SiteTree_Live"
|
||||
SET "Sort" = (SELECT "SiteTree"."Sort" FROM "SiteTree" WHERE "SiteTree_Live"."ID" = "SiteTree"."ID")
|
||||
WHERE EXISTS (SELECT "SiteTree"."Sort" FROM "SiteTree" WHERE "SiteTree_Live"."ID" = "SiteTree"."ID") AND "ParentID" = ?',
|
||||
array($this->ParentID)
|
||||
);
|
||||
|
||||
// Publish any virtual pages that might need publishing
|
||||
$linkedPages = $this->VirtualPages();
|
||||
@ -2417,7 +2453,7 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
|
||||
// If we're on the draft site, then we can update the status.
|
||||
// Otherwise, these lines will resurrect an inappropriate record
|
||||
if(DB::query("SELECT \"ID\" FROM \"SiteTree\" WHERE \"ID\" = $this->ID")->value()
|
||||
if(DB::prepared_query("SELECT \"ID\" FROM \"SiteTree\" WHERE \"ID\" = ?", array($this->ID))->value()
|
||||
&& Versioned::current_stage() != 'Live') {
|
||||
$this->write();
|
||||
}
|
||||
@ -2455,10 +2491,10 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
public function doRestoreToStage() {
|
||||
// if no record can be found on draft stage (meaning it has been "deleted from draft" before),
|
||||
// create an empty record
|
||||
if(!DB::query("SELECT \"ID\" FROM \"SiteTree\" WHERE \"ID\" = $this->ID")->value()) {
|
||||
$conn = DB::getConn();
|
||||
if(!DB::prepared_query("SELECT \"ID\" FROM \"SiteTree\" WHERE \"ID\" = ?", array($this->ID))->value()) {
|
||||
$conn = DB::get_conn();
|
||||
if(method_exists($conn, 'allowPrimaryKeyEditing')) $conn->allowPrimaryKeyEditing('SiteTree', true);
|
||||
DB::query("INSERT INTO \"SiteTree\" (\"ID\") VALUES ($this->ID)");
|
||||
DB::prepared_query("INSERT INTO \"SiteTree\" (\"ID\") VALUES (?)", array($this->ID));
|
||||
if(method_exists($conn, 'allowPrimaryKeyEditing')) $conn->allowPrimaryKeyEditing('SiteTree', false);
|
||||
}
|
||||
|
||||
@ -2517,7 +2553,7 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
|
||||
if($this->isNew())
|
||||
return false;
|
||||
|
||||
return (DB::query("SELECT \"ID\" FROM \"SiteTree_Live\" WHERE \"ID\" = $this->ID")->value())
|
||||
return (DB::prepared_query("SELECT \"ID\" FROM \"SiteTree_Live\" WHERE \"ID\" = ?", array($this->ID))->value())
|
||||
? true
|
||||
: false;
|
||||
}
|
||||
|
@ -1,4 +1,8 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @todo Cleanup, refactor, test this class
|
||||
*/
|
||||
class SiteTreeFolderExtension extends DataExtension {
|
||||
|
||||
/**
|
||||
@ -43,6 +47,6 @@ class SiteTreeFolderExtension extends DataExtension {
|
||||
} else {
|
||||
return "(\"ClassName\" = 'File' OR \"ClassName\" = 'Image')";
|
||||
}
|
||||
return $where;
|
||||
return $where; // @todo - How?
|
||||
}
|
||||
}
|
||||
|
@ -265,8 +265,14 @@ class VirtualPage extends Page {
|
||||
// On publication to live, copy from published source.
|
||||
$performCopyFrom = true;
|
||||
|
||||
$stageSourceVersion = DB::query("SELECT \"Version\" FROM \"SiteTree\" WHERE \"ID\" = $this->CopyContentFromID")->value();
|
||||
$liveSourceVersion = DB::query("SELECT \"Version\" FROM \"SiteTree_Live\" WHERE \"ID\" = $this->CopyContentFromID")->value();
|
||||
$stageSourceVersion = DB::prepared_query(
|
||||
'SELECT "Version" FROM "SiteTree" WHERE "ID" = ?',
|
||||
array($this->CopyContentFromID)
|
||||
)->value();
|
||||
$liveSourceVersion = DB::prepared_query(
|
||||
'SELECT "Version" FROM "SiteTree_Live" WHERE "ID" = ?',
|
||||
array($this->CopyContentFromID)
|
||||
)->value();
|
||||
|
||||
// We're going to create a new VP record in SiteTree_versions because the published
|
||||
// version might not exist, unless we're publishing the latest version
|
||||
@ -281,7 +287,8 @@ class VirtualPage extends Page {
|
||||
if($performCopyFrom && $this instanceof VirtualPage) {
|
||||
// This flush is needed because the get_one cache doesn't respect site version :-(
|
||||
singleton('SiteTree')->flushCache();
|
||||
$source = DataObject::get_one("SiteTree",sprintf('"SiteTree"."ID" = %d', $this->CopyContentFromID));
|
||||
// @todo Update get_one to support parameterised queries
|
||||
$source = DataObject::get_by_id("SiteTree", $this->CopyContentFromID);
|
||||
// Leave the updating of image tracking until after write, in case its a new record
|
||||
$this->copyFrom($source, false);
|
||||
}
|
||||
@ -318,7 +325,7 @@ class VirtualPage extends Page {
|
||||
// Note: *_versions records are left intact
|
||||
foreach(array('', 'Live') as $stage) {
|
||||
if($stage) $removedTable = "{$removedTable}_{$stage}";
|
||||
DB::query(sprintf('DELETE FROM "%s" WHERE "ID" = %d', $removedTable, $this->ID));
|
||||
DB::prepared_query("DELETE FROM \"$removedTable\" WHERE \"ID\" = ?", array($this->ID));
|
||||
}
|
||||
}
|
||||
|
||||
@ -326,7 +333,8 @@ class VirtualPage extends Page {
|
||||
// a non-virtual draft and a virtual live record (e.g. republishing the original record
|
||||
// shouldn't republish the - now unrelated - changes on the ex-VirtualPage draft).
|
||||
// Copies all stage fields to live as well.
|
||||
$source = DataObject::get_one("SiteTree",sprintf('"SiteTree"."ID" = %d', $this->CopyContentFromID));
|
||||
// @todo Update get_one to support parameterised queries
|
||||
$source = DataObject::get_by_id("SiteTree", $this->CopyContentFromID);
|
||||
$this->copyFrom($source);
|
||||
$this->publish('Stage', 'Live');
|
||||
|
||||
|
@ -29,8 +29,15 @@ class BrokenLinksReport extends SS_Report {
|
||||
$sort = '';
|
||||
}
|
||||
}
|
||||
if (!isset($_REQUEST['CheckSite']) || $params['CheckSite'] == 'Published') $ret = Versioned::get_by_stage('SiteTree', 'Live', '("SiteTree"."HasBrokenLink" = 1 OR "SiteTree"."HasBrokenFile" = 1)', $sort, $join, $limit);
|
||||
else $ret = DataObject::get('SiteTree', '("SiteTree"."HasBrokenFile" = 1 OR "HasBrokenLink" = 1)', $sort, $join, $limit);
|
||||
if (!isset($_REQUEST['CheckSite']) || $params['CheckSite'] == 'Published') {
|
||||
$ret = Versioned::get_by_stage('SiteTree', 'Live', array(
|
||||
'"SiteTree"."HasBrokenLink" = ? OR "SiteTree"."HasBrokenFile" = ?' => array(true, true)
|
||||
), $sort, $join, $limit);
|
||||
} else {
|
||||
$ret = DataObject::get('SiteTree', array(
|
||||
'"SiteTree"."HasBrokenFile" = ? OR "SiteTree"."HasBrokenLink" = ?' => array(true, true)
|
||||
), $sort, $join, $limit);
|
||||
}
|
||||
|
||||
$returnSet = new ArrayList();
|
||||
if ($ret) foreach($ret as $record) {
|
||||
|
@ -137,9 +137,9 @@ class SearchForm extends Form {
|
||||
$start = isset($_GET['start']) ? (int)$_GET['start'] : 0;
|
||||
|
||||
if(strpos($keywords, '"') !== false || strpos($keywords, '+') !== false || strpos($keywords, '-') !== false || strpos($keywords, '*') !== false) {
|
||||
$results = DB::getConn()->searchEngine($this->classesToSearch, $keywords, $start, $pageLength, "\"Relevance\" DESC", "", true);
|
||||
$results = DB::get_conn()->searchEngine($this->classesToSearch, $keywords, $start, $pageLength, "\"Relevance\" DESC", "", true);
|
||||
} else {
|
||||
$results = DB::getConn()->searchEngine($this->classesToSearch, $keywords, $start, $pageLength);
|
||||
$results = DB::get_conn()->searchEngine($this->classesToSearch, $keywords, $start, $pageLength);
|
||||
}
|
||||
|
||||
// filter by permission
|
||||
|
@ -18,7 +18,10 @@ class MigrateSiteTreeLinkingTask extends BuildTask {
|
||||
$linkedPages = new DataList('SiteTree');
|
||||
$linkedPages = $linkedPages->innerJoin('SiteTree_LinkTracking', '"SiteTree_LinkTracking"."SiteTreeID" = "SiteTree"."ID"');
|
||||
if($linkedPages) foreach($linkedPages as $page) {
|
||||
$tracking = DB::query(sprintf('SELECT "ChildID", "FieldName" FROM "SiteTree_LinkTracking" WHERE "SiteTreeID" = %d', $page->ID))->map();
|
||||
$tracking = DB::prepared_query(
|
||||
'SELECT "ChildID", "FieldName" FROM "SiteTree_LinkTracking" WHERE "SiteTreeID" = ?',
|
||||
array($page->ID)
|
||||
)->map();
|
||||
|
||||
foreach($tracking as $childID => $fieldName) {
|
||||
$linked = DataObject::get_by_id('SiteTree', $childID);
|
||||
|
@ -85,21 +85,16 @@ in the other stage:<br />
|
||||
if($orphans) foreach($orphans as $orphan) {
|
||||
$latestVersion = Versioned::get_latest_version($this->orphanedSearchClass, $orphan->ID);
|
||||
$latestAuthor = DataObject::get_by_id('Member', $latestVersion->AuthorID);
|
||||
$orphanBaseClass = ClassInfo::baseDataClass($this->orphanedSearchClass);
|
||||
$stageRecord = Versioned::get_one_by_stage(
|
||||
$this->orphanedSearchClass,
|
||||
'Stage',
|
||||
sprintf("\"%s\".\"ID\" = %d",
|
||||
ClassInfo::baseDataClass($this->orphanedSearchClass),
|
||||
$orphan->ID
|
||||
)
|
||||
array("\"$orphanBaseClass\".\"ID\"" => $orphan->ID)
|
||||
);
|
||||
$liveRecord = Versioned::get_one_by_stage(
|
||||
$this->orphanedSearchClass,
|
||||
'Live',
|
||||
sprintf("\"%s\".\"ID\" = %d",
|
||||
ClassInfo::baseDataClass($this->orphanedSearchClass),
|
||||
$orphan->ID
|
||||
)
|
||||
array("\"$orphanBaseClass\".\"ID\"" => $orphan->ID)
|
||||
);
|
||||
$label = sprintf(
|
||||
'<a href="admin/pages/edit/show/%d">%s</a> <small>(#%d, Last Modified Date: %s, Last Modifier: %s, %s)</small>',
|
||||
@ -218,14 +213,12 @@ in the other stage:<br />
|
||||
|
||||
protected function removeOrphans($orphanIDs) {
|
||||
$removedOrphans = array();
|
||||
$orphanBaseClass = ClassInfo::baseDataClass($this->orphanedSearchClass);
|
||||
foreach($orphanIDs as $id) {
|
||||
$stageRecord = Versioned::get_one_by_stage(
|
||||
$this->orphanedSearchClass,
|
||||
'Stage',
|
||||
sprintf("\"%s\".\"ID\" = %d",
|
||||
ClassInfo::baseDataClass($this->orphanedSearchClass),
|
||||
$id
|
||||
)
|
||||
array("\"$orphanBaseClass\".\"ID\"" => $id)
|
||||
);
|
||||
if($stageRecord) {
|
||||
$removedOrphans[$stageRecord->ID] = sprintf('Removed %s (#%d) from Stage', $stageRecord->Title, $stageRecord->ID);
|
||||
@ -236,10 +229,7 @@ in the other stage:<br />
|
||||
$liveRecord = Versioned::get_one_by_stage(
|
||||
$this->orphanedSearchClass,
|
||||
'Live',
|
||||
sprintf("\"%s\".\"ID\" = %d",
|
||||
ClassInfo::baseDataClass($this->orphanedSearchClass),
|
||||
$id
|
||||
)
|
||||
array("\"$orphanBaseClass\".\"ID\"" => $id)
|
||||
);
|
||||
if($liveRecord) {
|
||||
$removedOrphans[$liveRecord->ID] = sprintf('Removed %s (#%d) from Live', $liveRecord->Title, $liveRecord->ID);
|
||||
@ -265,14 +255,12 @@ in the other stage:<br />
|
||||
$holder->write();
|
||||
|
||||
$removedOrphans = array();
|
||||
$orphanBaseClass = ClassInfo::baseDataClass($this->orphanedSearchClass);
|
||||
foreach($orphanIDs as $id) {
|
||||
$stageRecord = Versioned::get_one_by_stage(
|
||||
$this->orphanedSearchClass,
|
||||
'Stage',
|
||||
sprintf("\"%s\".\"ID\" = %d",
|
||||
ClassInfo::baseDataClass($this->orphanedSearchClass),
|
||||
$id
|
||||
)
|
||||
array("\"$orphanBaseClass\".\"ID\"" => $id)
|
||||
);
|
||||
if($stageRecord) {
|
||||
$removedOrphans[$stageRecord->ID] = sprintf('Rebased %s (#%d)', $stageRecord->Title, $stageRecord->ID);
|
||||
@ -287,10 +275,7 @@ in the other stage:<br />
|
||||
$liveRecord = Versioned::get_one_by_stage(
|
||||
$this->orphanedSearchClass,
|
||||
'Live',
|
||||
sprintf("\"%s\".\"ID\" = %d",
|
||||
ClassInfo::baseDataClass($this->orphanedSearchClass),
|
||||
$id
|
||||
)
|
||||
array("\"$orphanBaseClass\".\"ID\"" => $id)
|
||||
);
|
||||
if($liveRecord) {
|
||||
$removedOrphans[$liveRecord->ID] = sprintf('Rebased %s (#%d)', $liveRecord->Title, $liveRecord->ID);
|
||||
@ -315,15 +300,19 @@ in the other stage:<br />
|
||||
* Gets all orphans from "Stage" and "Live" stages.
|
||||
*
|
||||
* @param string $class
|
||||
* @param string $filter
|
||||
* @param array $filter
|
||||
* @param string $sort
|
||||
* @param string $join
|
||||
* @param int|array $limit
|
||||
* @return SS_List
|
||||
*/
|
||||
public function getOrphanedPages($class = 'SiteTree', $filter = '', $sort = null, $join = null, $limit = null) {
|
||||
$filter .= ($filter) ? ' AND ' : '';
|
||||
$filter .= sprintf("\"%s\".\"ParentID\" != 0 AND \"Parents\".\"ID\" IS NULL", $class);
|
||||
public function getOrphanedPages($class = 'SiteTree', $filter = array(), $sort = null, $join = null, $limit = null) {
|
||||
// Alter condition
|
||||
if(empty($filter)) $where = array();
|
||||
elseif(is_array($filter)) $where = $filter;
|
||||
else $where = array($filter);
|
||||
$where[] = array("\"$class\".\"ParentID\" != ?" => 0);
|
||||
$where[] = '"Parents"."ID" IS NULL';
|
||||
|
||||
$orphans = new ArrayList();
|
||||
foreach(array('Stage', 'Live') as $stage) {
|
||||
@ -333,7 +322,7 @@ in the other stage:<br />
|
||||
$stageOrphans = Versioned::get_by_stage(
|
||||
$class,
|
||||
$stage,
|
||||
$filter,
|
||||
$where,
|
||||
$sort,
|
||||
null,
|
||||
$limit
|
||||
|
@ -22,8 +22,8 @@ class UpgradeSiteTreePermissionSchemaTask extends BuildTask {
|
||||
public function run($request) {
|
||||
// transfer values for changed column name
|
||||
foreach(array('SiteTree','SiteTree_Live','SiteTree_versions') as $table) {
|
||||
DB::query("UPDATE \"{$table}\" SET \"CanViewType\" = 'Viewers';");
|
||||
DB::query("UPDATE \"{$table}\" SET \"CanEditType\" = 'Editors';");
|
||||
DB::prepared_query("UPDATE \"{$table}\" SET \"CanViewType\" = ?", array('Viewers'));
|
||||
DB::prepared_query("UPDATE \"{$table}\" SET \"CanEditType\" = ?", array('Editors'));
|
||||
}
|
||||
//Debug::message('Moved SiteTree->Viewers to SiteTree->CanViewType');
|
||||
//Debug::message('Moved SiteTree->Editors to SiteTree->CanEditType');
|
||||
@ -44,7 +44,7 @@ class UpgradeSiteTreePermissionSchemaTask extends BuildTask {
|
||||
// rename legacy columns
|
||||
foreach(array('SiteTree','SiteTree_Live','SiteTree_versions') as $table) {
|
||||
foreach(array('Viewers','Editors','ViewersGroup','EditorsGroup') as $field) {
|
||||
DB::getConn()->dontRequireField($table, $field);
|
||||
DB::get_conn()->dontRequireField($table, $field);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -92,8 +92,8 @@ class CMSMainTest extends FunctionalTest {
|
||||
|
||||
// Get the latest version of the redirector page
|
||||
$pageID = $this->idFromFixture('RedirectorPage', 'page5');
|
||||
$latestID = DB::query('select max("Version") from "RedirectorPage_versions" where "RecordID"=' . $pageID)->value();
|
||||
$dsCount = DB::query('select count("Version") from "RedirectorPage_versions" where "RecordID"=' . $pageID . ' and "Version"=' . $latestID)->value();
|
||||
$latestID = DB::prepared_query('select max("Version") from "RedirectorPage_versions" where "RecordID" = ?', array($pageID))->value();
|
||||
$dsCount = DB::prepared_query('select count("Version") from "RedirectorPage_versions" where "RecordID" = ? and "Version"= ?', array($pageID, $latestID))->value();
|
||||
$this->assertEquals(1, $dsCount, "Published page has no duplicate version records: it has " . $dsCount . " for version " . $latestID);
|
||||
|
||||
$this->session()->clear('loggedInAs');
|
||||
@ -191,7 +191,9 @@ class CMSMainTest extends FunctionalTest {
|
||||
|
||||
$response = $this->get('admin/pages/edit/show/' . $pageID);
|
||||
|
||||
$livePage = Versioned::get_one_by_stage("SiteTree", "Live", "\"SiteTree\".\"ID\" = $pageID");
|
||||
$livePage = Versioned::get_one_by_stage("SiteTree", "Live", array(
|
||||
'"SiteTree"."ID"' => $pageID
|
||||
));
|
||||
$this->assertInstanceOf('SiteTree', $livePage);
|
||||
$this->assertTrue($livePage->canDelete());
|
||||
|
||||
|
@ -82,7 +82,7 @@ class CMSSiteTreeFilterTest extends SapphireTest {
|
||||
$deletedPage = Versioned::get_one_by_stage(
|
||||
'SiteTree',
|
||||
'Live',
|
||||
sprintf('"SiteTree_Live"."ID" = %d', $deletedPageID)
|
||||
array('"SiteTree_Live"."ID"' => $deletedPageID)
|
||||
);
|
||||
|
||||
$f = new CMSSiteTreeFilter_DeletedPages(array('Term' => 'Page'));
|
||||
|
@ -32,16 +32,16 @@ class FileLinkTrackingTest extends SapphireTest {
|
||||
$page = $this->objFromFixture('Page', 'page1');
|
||||
$this->assertTrue($page->doPublish());
|
||||
$this->assertContains('<img src="assets/testscript-test-file.pdf"',
|
||||
DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $page->ID")->value());
|
||||
DB::prepared_query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = ?", array($page->ID))->value());
|
||||
|
||||
$file = $this->objFromFixture('File', 'file1');
|
||||
$file->Name = 'renamed-test-file.pdf';
|
||||
$file->write();
|
||||
|
||||
$this->assertContains('<img src="assets/renamed-test-file.pdf"',
|
||||
DB::query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = $page->ID")->value());
|
||||
DB::prepared_query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = ?", array($page->ID))->value());
|
||||
$this->assertContains('<img src="assets/renamed-test-file.pdf"',
|
||||
DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $page->ID")->value());
|
||||
DB::prepared_query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = ?", array($page->ID))->value());
|
||||
}
|
||||
|
||||
public function testFileLinkRewritingOnVirtualPages() {
|
||||
@ -62,9 +62,9 @@ class FileLinkTrackingTest extends SapphireTest {
|
||||
|
||||
// Verify that the draft and publish virtual pages both have the corrected link
|
||||
$this->assertContains('<img src="assets/renamed-test-file.pdf"',
|
||||
DB::query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = $svp->ID")->value());
|
||||
DB::prepared_query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = ?", array($svp->ID))->value());
|
||||
$this->assertContains('<img src="assets/renamed-test-file.pdf"',
|
||||
DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $svp->ID")->value());
|
||||
DB::prepared_query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = ?", array($svp->ID))->value());
|
||||
}
|
||||
|
||||
public function testLinkRewritingOnAPublishedPageDoesntMakeItEditedOnDraft() {
|
||||
@ -90,7 +90,7 @@ class FileLinkTrackingTest extends SapphireTest {
|
||||
$page = $this->objFromFixture('Page', 'page1');
|
||||
$this->assertTrue($page->doPublish());
|
||||
$this->assertContains('<img src="assets/testscript-test-file.pdf"',
|
||||
DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $page->ID")->value());
|
||||
DB::prepared_query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = ?", array($page->ID))->value());
|
||||
|
||||
// Rename the file twice
|
||||
$file = $this->objFromFixture('File', 'file1');
|
||||
@ -105,9 +105,9 @@ class FileLinkTrackingTest extends SapphireTest {
|
||||
|
||||
// Confirm that the correct image is shown in both the draft and live site
|
||||
$this->assertContains('<img src="assets/renamed-test-file-second-time.pdf"',
|
||||
DB::query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = $page->ID")->value());
|
||||
DB::prepared_query("SELECT \"Content\" FROM \"SiteTree\" WHERE \"ID\" = ?", array($page->ID))->value());
|
||||
$this->assertContains('<img src="assets/renamed-test-file-second-time.pdf"',
|
||||
DB::query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = $page->ID")->value());
|
||||
DB::prepared_query("SELECT \"Content\" FROM \"SiteTree_Live\" WHERE \"ID\" = ?", array($page->ID))->value());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -22,7 +22,7 @@ class SiteTreeTest extends SapphireTest {
|
||||
);
|
||||
|
||||
public function testCreateDefaultpages() {
|
||||
$remove = DataObject::get('SiteTree');
|
||||
$remove = SiteTree::get();
|
||||
if($remove) foreach($remove as $page) $page->delete();
|
||||
// Make sure the table is empty
|
||||
$this->assertEquals(DB::query('SELECT COUNT("ID") FROM "SiteTree"')->value(), 0);
|
||||
@ -136,14 +136,16 @@ class SiteTreeTest extends SapphireTest {
|
||||
$oldMode = Versioned::get_reading_mode();
|
||||
Versioned::reading_stage('Live');
|
||||
|
||||
$checkSiteTree = DataObject::get_one("SiteTree", "\"SiteTree\".\"URLSegment\" = 'get-one-test-page'");
|
||||
$checkSiteTree = DataObject::get_one("SiteTree", array(
|
||||
'"SiteTree"."URLSegment"' => 'get-one-test-page'
|
||||
));
|
||||
$this->assertEquals("V1", $checkSiteTree->Title);
|
||||
|
||||
Versioned::set_reading_mode($oldMode);
|
||||
}
|
||||
|
||||
public function testChidrenOfRootAreTopLevelPages() {
|
||||
$pages = DataObject::get("SiteTree");
|
||||
$pages = SiteTree::get();
|
||||
foreach($pages as $page) $page->publish('Stage', 'Live');
|
||||
unset($pages);
|
||||
|
||||
@ -426,7 +428,9 @@ class SiteTreeTest extends SapphireTest {
|
||||
public function testReadArchiveDate() {
|
||||
$date = '2009-07-02 14:05:07';
|
||||
Versioned::reading_archived_date($date);
|
||||
DataObject::get('SiteTree', "\"SiteTree\".\"ParentID\" = 0");
|
||||
SiteTree::get()->where(array(
|
||||
'"SiteTree"."ParentID"' => 0
|
||||
));
|
||||
Versioned::reading_archived_date(null);
|
||||
$this->assertEquals(
|
||||
Versioned::get_reading_mode(),
|
||||
@ -619,7 +623,9 @@ class SiteTreeTest extends SapphireTest {
|
||||
|
||||
Director::set_current_page($aboutPage);
|
||||
$this->assertTrue (
|
||||
DataObject::get_one('SiteTree', '"Title" = \'About Us\'')->isCurrent(),
|
||||
DataObject::get_one('SiteTree', array(
|
||||
'"SiteTree"."Title"' => 'About Us'
|
||||
))->isCurrent(),
|
||||
'Assert that isCurrent works on another instance with the same ID.'
|
||||
);
|
||||
|
||||
|
@ -19,8 +19,8 @@ class ZZZSearchFormTest extends FunctionalTest {
|
||||
protected $mockController;
|
||||
|
||||
public function waitUntilIndexingFinished() {
|
||||
$db = DB::getConn();
|
||||
if (method_exists($db, 'waitUntilIndexingFinished')) DB::getConn()->waitUntilIndexingFinished();
|
||||
$schema = DB::get_schema();
|
||||
if (method_exists($schema, 'waitUntilIndexingFinished')) $schema->waitUntilIndexingFinished();
|
||||
}
|
||||
|
||||
public function setUpOnce() {
|
||||
@ -46,7 +46,7 @@ class ZZZSearchFormTest extends FunctionalTest {
|
||||
* @return Boolean
|
||||
*/
|
||||
protected function checkFulltextSupport() {
|
||||
$conn = DB::getConn();
|
||||
$conn = DB::get_conn();
|
||||
if(class_exists('MSSQLDatabase') && $conn instanceof MSSQLDatabase) {
|
||||
$supports = $conn->fullTextEnabled();
|
||||
} else {
|
||||
@ -231,7 +231,7 @@ class ZZZSearchFormTest extends FunctionalTest {
|
||||
public function testSearchTitleAndContentWithSpecialCharacters() {
|
||||
if(!$this->checkFulltextSupport()) return;
|
||||
|
||||
if(class_exists('PostgreSQLDatabase') && DB::getConn() instanceof PostgreSQLDatabase) {
|
||||
if(class_exists('PostgreSQLDatabase') && DB::get_conn() instanceof PostgreSQLDatabase) {
|
||||
$this->markTestSkipped("PostgreSQLDatabase doesn't support entity-encoded searches");
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user