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:
Ingo Schommer 2014-07-28 08:46:16 +12:00
commit d140fa0b5e
25 changed files with 311 additions and 253 deletions

View File

@ -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(

View File

@ -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);
@ -557,10 +557,10 @@ JS
}
/**
* #################################
* Garbage collection.
* #################################
*/
* #################################
* Garbage collection.
* #################################
*/
/**
* Removes all unused thumbnails from the file store

View File

@ -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
@ -892,17 +891,17 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
$newItem = new $className();
if( !$suffix ) {
if( !$suffix ) {
$sessionTag = "NewItems." . $parentID . "." . $className;
if(Session::get($sessionTag)) {
$suffix = '-' . Session::get($sessionTag);
Session::set($sessionTag, Session::get($sessionTag) + 1);
}
else
Session::set($sessionTag, 1);
if(Session::get($sessionTag)) {
$suffix = '-' . Session::get($sessionTag);
Session::set($sessionTag, Session::get($sessionTag) + 1);
}
else
Session::set($sessionTag, 1);
$id = $id . $suffix;
}
$id = $id . $suffix;
}
$newItem->Title = _t(
'CMSMain.NEWPAGE',
@ -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);

View File

@ -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)).')');

View File

@ -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();
@ -208,7 +208,7 @@ class ContentController extends Controller {
$response = $this->request->isMedia() ? null : ErrorPage::response_for($code);
// Failover to $message if the HTML response is unavailable / inappropriate
parent::httpError($code, $response ? $response : $message);
}
}
/**
* Get the project name

View File

@ -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) {

View File

@ -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,

View File

@ -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;

View File

@ -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
));
}
}

View File

@ -4,6 +4,10 @@
* @subpackage filesystem
*/
class Folder_UnusedAssetsField extends CompositeField {
/**
* @var Folder
*/
protected $folder;
public function __construct($folder) {
@ -39,10 +43,10 @@ class Folder_UnusedAssetsField extends CompositeField {
/**
* Creates table for displaying unused files.
*
* @return GridField
*/
* Creates table for displaying unused files.
*
* @return GridField
*/
protected function getAssetList() {
$where = $this->folder->getUnusedFilesListFilter();
$files = File::get()->where($where);

View File

@ -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,11 +441,11 @@ 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.
}
$link = Convert::raw2att($page->Link());
if($content) {
@ -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;
// 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) {
if($this->ParentID) {
$parentFilter = " AND \"SiteTree\".\"ParentID\" = $this->ParentID";
} else {
$parentFilter = ' AND "SiteTree"."ParentID" = 0';
}
$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') {
@ -1787,17 +1800,17 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
}
// Content links
$items = new ArrayList();
$items = new ArrayList();
// We merge all into a regular SS_List, because DataList doesn't support merge
if($contentLinks = $this->BackLinkTracking()) {
$linkList = new ArrayList();
foreach($contentLinks as $item) {
$item->DependentLinkType = 'Content link';
$linkList->push($item);
}
// We merge all into a regular SS_List, because DataList doesn't support merge
if($contentLinks = $this->BackLinkTracking()) {
$linkList = new ArrayList();
foreach($contentLinks as $item) {
$item->DependentLinkType = 'Content link';
$linkList->push($item);
}
$items->merge($linkList);
}
}
// Virtual pages
if($includeVirtuals) {
@ -1807,19 +1820,22 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
foreach($virtuals as $item) {
$item->DependentLinkType = 'Virtual page';
$virtualList->push($item);
}
}
$items->merge($virtualList);
}
}
}
// 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) {
$item->DependentLinkType = 'Redirector page';
$redirectorList->push($item);
}
}
$items->merge($redirectorList);
}
@ -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;
}
/**
@ -2099,9 +2127,9 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
->setAttribute(
'data-placeholder',
_t('SiteTree.GroupPlaceholder', 'Click to select group')
)
)
)
)
);
$visibility->setTitle($this->fieldLabel('Visibility'));
@ -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')));
@ -2326,7 +2358,7 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
// Set up the initial state of the button to reflect the state of the underlying SiteTree object.
if($this->stagesDiffer('Stage', 'Live')) {
$publish->addExtraClass('ss-ui-alternate');
}
}
}
$actions = new FieldList(array($majorActions, $rootTabSet));
@ -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;
}
@ -2766,7 +2802,7 @@ class SiteTree extends DataObject implements PermissionProvider,i18nEntityProvid
if(!$this->canEdit() && !$this->canAddChildren()) {
if (!$this->canView()) {
$classes .= " disabled";
$classes .= " disabled";
} else {
$classes .= " edit-disabled";
}

View File

@ -60,8 +60,8 @@ class SiteTreeFileExtension extends DataExtension {
* Updates link tracking.
*/
public function onAfterDelete() {
// We query the explicit ID list, because BackLinkTracking will get modified after the stage
// site does its thing
// We query the explicit ID list, because BackLinkTracking will get modified after the stage
// site does its thing
$brokenPageIDs = $this->owner->BackLinkTracking()->column("ID");
if($brokenPageIDs) {
$origStage = Versioned::current_stage();
@ -75,8 +75,8 @@ class SiteTreeFileExtension extends DataExtension {
Versioned::reading_stage('Live');
$liveBrokenPages = DataObject::get('SiteTree')->byIDs($brokenPageIDs);
foreach($liveBrokenPages as $brokenPage) {
$brokenPage->write();
}
$brokenPage->write();
}
Versioned::reading_stage($origStage);
}

View File

@ -1,11 +1,15 @@
<?php
/**
* @todo Cleanup, refactor, test this class
*/
class SiteTreeFolderExtension extends DataExtension {
/**
* Looks for files used in system and create where clause which contains all ID's of files.
*
* @returns String where clause which will work as filter.
*/
* Looks for files used in system and create where clause which contains all ID's of files.
*
* @returns String where clause which will work as filter.
*/
public function getUnusedFilesListFilter() {
$result = DB::query("SELECT DISTINCT \"FileID\" FROM \"SiteTree_ImageTracking\"");
$usedFiles = array();
@ -43,6 +47,6 @@ class SiteTreeFolderExtension extends DataExtension {
} else {
return "(\"ClassName\" = 'File' OR \"ClassName\" = 'Image')";
}
return $where;
return $where; // @todo - How?
}
}

View File

@ -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,15 +325,16 @@ 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));
}
}
}
// Also publish the change immediately to avoid inconsistent behaviour between
// 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');

View File

@ -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) {

View File

@ -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

View File

@ -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);

View File

@ -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
)
'Stage',
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
)
'Stage',
array("\"$orphanBaseClass\".\"ID\"" => $id)
);
if($stageRecord) {
$removedOrphans[$stageRecord->ID] = sprintf('Rebased %s (#%d)', $stageRecord->Title, $stageRecord->ID);
@ -286,11 +274,8 @@ in the other stage:<br />
}
$liveRecord = Versioned::get_one_by_stage(
$this->orphanedSearchClass,
'Live',
sprintf("\"%s\".\"ID\" = %d",
ClassInfo::baseDataClass($this->orphanedSearchClass),
$id
)
'Live',
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

View File

@ -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);
}
}
}

View File

@ -92,9 +92,9 @@ 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();
$this->assertEquals(1, $dsCount, "Published page has no duplicate version records: it has " . $dsCount . " for version " . $latestID);
$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());

View File

@ -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'));

View File

@ -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());
}
}

View File

@ -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);
@ -104,9 +104,9 @@ class SiteTreeTest extends SapphireTest {
public function testParentNodeCachedInMemory() {
$parent = new SiteTree();
$parent->Title = 'Section Title';
$child = new SiteTree();
$child->Title = 'Page Title';
$parent->Title = 'Section Title';
$child = new SiteTree();
$child->Title = 'Page Title';
$child->setParent($parent);
$this->assertInstanceOf("SiteTree", $child->Parent);
@ -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.'
);

View File

@ -314,7 +314,7 @@ class VirtualPageTest extends SapphireTest {
// Unpublish the source page, confirm that the virtual page has also been unpublished
$p->doUnpublish();
// The draft VP still has the CopyContentFromID link
// The draft VP still has the CopyContentFromID link
$vp->flushCache();
$vp = DataObject::get_by_id('SiteTree', $vp->ID);
$this->assertEquals($p->ID, $vp->CopyContentFromID);

View File

@ -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");
}