Merge pull request #1286 from spekulatius/remove-trailing-spaces

remove trailing spaces in the codebase
This commit is contained in:
Damian Mooyman 2015-09-29 17:37:59 +13:00
commit bcc19df231
15 changed files with 454 additions and 454 deletions

View File

@ -2,20 +2,20 @@
/**
* AssetAdmin is the 'file store' section of the CMS.
* It provides an interface for manipulating the File and Folder objects in the system.
*
*
* @package cms
* @subpackage assets
*/
class AssetAdmin extends LeftAndMain implements PermissionProvider{
private static $url_segment = 'assets';
private static $url_rule = '/$Action/$ID';
private static $menu_title = 'Files';
private static $tree_class = 'Folder';
/**
* Amount of results showing on a single page.
*
@ -23,14 +23,14 @@ class AssetAdmin extends LeftAndMain implements PermissionProvider{
* @var int
*/
private static $page_length = 15;
/**
* @config
* @see Upload->allowedMaxFileSize
* @var int
*/
private static $allowed_max_file_size;
private static $allowed_actions = array(
'addfolder',
'delete',
@ -45,7 +45,7 @@ class AssetAdmin extends LeftAndMain implements PermissionProvider{
'doSync',
'filter',
);
/**
* Return fake-ID "root" if no ID is found (needed to upload files into the root-folder)
*/
@ -66,7 +66,7 @@ class AssetAdmin extends LeftAndMain implements PermissionProvider{
*/
public function init() {
parent::init();
// Create base folder if it doesnt exist already
if(!file_exists(ASSETS_PATH)) Filesystem::makeFolder(ASSETS_PATH);
@ -84,7 +84,7 @@ class AssetAdmin extends LeftAndMain implements PermissionProvider{
};
JS
);
CMSBatchActionHandler::register('delete', 'AssetAdmin_DeleteBatchAction', 'Folder');
}
@ -92,7 +92,7 @@ JS
* Returns the files and subfolders contained in the currently selected folder,
* defaulting to the root node. Doubles as search results, if any search parameters
* are set through {@link SearchForm()}.
*
*
* @return SS_List
*/
public function getList() {
@ -122,7 +122,7 @@ JS
));
}
// Always show folders at the top
// Always show folders at the top
$list = $list->sort('(CASE WHEN "File"."ClassName" = \'Folder\' THEN 0 ELSE 1 END), "Name"');
// If a search is conducted, check for the "current folder" limitation.
@ -138,7 +138,7 @@ JS
$exts = File::config()->app_categories[$params['AppCategory']];
$list = $list->filter('Name:PartialMatch', $exts);
}
// Date filter
if(!empty($params['CreatedFrom'])) {
$fromDate = new DateField(null, null, $params['CreatedFrom']);
@ -187,14 +187,14 @@ JS
'Created' => 'SS_Datetime->Nice'
));
$gridField->setAttribute(
'data-url-folder-template',
'data-url-folder-template',
Controller::join_links($this->Link('show'), '%s')
);
if(!$folder->hasMethod('canAddChildren') || ($folder->hasMethod('canAddChildren') && $folder->canAddChildren())) {
// TODO Will most likely be replaced by GridField logic
$addFolderBtn = new LiteralField(
'AddFolderButton',
'AddFolderButton',
sprintf(
'<a class="ss-ui-button font-icon-plus-circled cms-add-folder-link" data-icon="add" data-url="%s" href="%s">%s</a>',
Controller::join_links($this->Link('AddForm'), '?' . http_build_query(array(
@ -223,12 +223,12 @@ JS
} else {
$syncButton = null;
}
// Move existing fields to a "details" tab, unless they've already been tabbed out through extensions.
// Required to keep Folder->getCMSFields() simple and reuseable,
// without any dependencies into AssetAdmin (e.g. useful for "add folder" views).
if(!$fields->hasTabset()) {
$tabs = new TabSet('Root',
$tabs = new TabSet('Root',
$tabList = new Tab('ListView', _t('AssetAdmin.ListView', 'List View')),
$tabTree = new Tab('TreeView', _t('AssetAdmin.TreeView', 'Tree View'))
);
@ -253,7 +253,7 @@ JS
// Add the upload field for new media
if($currentPageID = $this->currentPageID()){
Session::set("{$this->class}.currentPage", $currentPageID);
Session::set("{$this->class}.currentPage", $currentPageID);
}
$folder = $this->currentPage();
@ -296,10 +296,10 @@ JS
new LiteralField(
'Tree',
FormField::create_tag(
'div',
'div',
array(
'class' => 'cms-tree',
'data-url-tree' => $this->Link('getsubtree'),
'class' => 'cms-tree',
'data-url-tree' => $this->Link('getsubtree'),
'data-url-savetreenode' => $this->Link('savetreenode')
),
$this->SiteTreeAsUL()
@ -315,11 +315,11 @@ JS
$actions->removeByName('action_delete');
if(($saveBtn || $deleteBtn) && $fields->fieldByName('Root.DetailsView')) {
$fields->addFieldToTab(
'Root.DetailsView',
'Root.DetailsView',
CompositeField::create($saveBtn,$deleteBtn)->addExtraClass('Actions')
);
}
$fields->setForm($form);
@ -351,7 +351,7 @@ JS
public function delete($data, $form) {
$className = $this->stat('tree_class');
$record = DataObject::get_by_id($className, $data['ID']);
if($record && !$record->canDelete()) return Security::permissionFailure();
if(!$record || !$record->ID) throw new SS_HTTPResponse_Exception("Bad record ID #" . (int)$data['ID'], 404);
@ -371,7 +371,7 @@ JS
*/
public function getSearchContext() {
$context = singleton('File')->getDefaultSearchContext();
// Namespace fields, for easier detection if a search is present
foreach($context->getFields() as $field) $field->setName(sprintf('q[%s]', $field->getName()));
foreach($context->getFilters() as $filter) $filter->setFullName(sprintf('q[%s]', $filter->getFullName()));
@ -413,7 +413,7 @@ JS
return $context;
}
/**
* Returns a form for filtering of files and assets gridfield.
* Result filtering takes place in {@link getList()}.
@ -431,7 +431,7 @@ JS
->addExtraClass('ss-ui-action-constructive'),
Object::create('ResetFormAction', 'clear', _t('CMSMain_left_ss.RESET', 'Reset'))
);
$form = new Form($this, 'filter', $fields, $actions);
$form->setFormMethod('GET');
$form->setFormAction(Controller::join_links($this->Link('show'), $folder->ID));
@ -442,10 +442,10 @@ JS
$form->setAttribute('data-gridfield', 'File');
return $form;
}
public function AddForm() {
$folder = singleton('Folder');
$form = CMSForm::create(
$form = CMSForm::create(
$this,
'AddForm',
new FieldList(
@ -462,31 +462,31 @@ JS
$form->setTemplate($this->getTemplatesWithSuffix('_EditForm'));
// TODO Can't merge $FormAttributes in template at the moment
$form->addExtraClass('add-form cms-add-form cms-edit-form cms-panel-padded center ' . $this->BaseCSSClasses());
return $form;
}
/**
* Add a new group and return its details suitable for ajax.
*
*
* @todo Move logic into Folder class, and use LeftAndMain->doAdd() default implementation.
*/
public function doAdd($data, $form) {
$class = $this->stat('tree_class');
// check create permissions
if(!singleton($class)->canCreate()) return Security::permissionFailure($this);
// check addchildren permissions
if(
singleton($class)->hasExtension('Hierarchy')
singleton($class)->hasExtension('Hierarchy')
&& isset($data['ParentID'])
&& is_numeric($data['ParentID'])
&& $data['ParentID']
) {
$parentRecord = DataObject::get_by_id($class, $data['ParentID']);
if(
$parentRecord->hasMethod('canAddChildren')
$parentRecord->hasMethod('canAddChildren')
&& !$parentRecord->canAddChildren()
) return Security::permissionFailure($this);
} else {
@ -496,8 +496,8 @@ JS
$parent = (isset($data['ParentID']) && is_numeric($data['ParentID'])) ? (int)$data['ParentID'] : 0;
$name = (isset($data['Name'])) ? basename($data['Name']) : _t('AssetAdmin.NEWFOLDER',"NewFolder");
if(!$parentRecord || !$parentRecord->ID) $parent = 0;
// Get the folder to be created
// Get the folder to be created
if($parentRecord && $parentRecord->ID) $filename = $parentRecord->FullPath . $name;
else $filename = ASSETS_PATH . '/' . $name;
@ -505,22 +505,22 @@ JS
if(!file_exists(ASSETS_PATH)) {
mkdir(ASSETS_PATH);
}
$record = new Folder();
$record->ParentID = $parent;
$record->Name = $record->Title = basename($filename);
// Ensure uniqueness
// Ensure uniqueness
$i = 2;
$baseFilename = substr($record->Filename, 0, -1) . '-';
while(file_exists($record->FullPath)) {
$record->Filename = $baseFilename . $i . '/';
$i++;
}
$record->Name = $record->Title = basename($record->Filename);
$record->write();
mkdir($record->FullPath);
chmod($record->FullPath, Filesystem::config()->file_create_mask);
@ -545,17 +545,17 @@ JS
$this->setCurrentPageID(null);
return new Folder();
}
public function getSiteTreeFor($className, $rootID = null, $childrenMethod = null, $numChildrenMethod = null, $filterFunction = null, $minNodeCount = 30) {
if (!$childrenMethod) $childrenMethod = 'ChildFolders';
if (!$numChildrenMethod) $numChildrenMethod = 'numChildFolders';
return parent::getSiteTreeFor($className, $rootID, $childrenMethod, $numChildrenMethod, $filterFunction, $minNodeCount);
}
public function getCMSTreeTitle() {
return Director::absoluteBaseURL() . "assets";
}
public function SiteTreeAsUL() {
return $this->getSiteTreeFor($this->stat('tree_class'), null, 'ChildFolders', 'numChildFolders');
}
@ -571,16 +571,16 @@ JS
public function doSync() {
$message = Filesystem::sync();
$this->response->addHeader('X-Status', rawurlencode($message));
return;
}
/**
* #################################
* Garbage collection.
* #################################
*/
/**
* Removes all unused thumbnails from the file store
* and returns the status of the process to the user.
@ -588,42 +588,42 @@ JS
public function deleteunusedthumbnails($request) {
// Protect against CSRF on destructive action
if(!SecurityToken::inst()->checkRequest($request)) return $this->httpError(400);
$count = 0;
$thumbnails = $this->getUnusedThumbnails();
if($thumbnails) {
foreach($thumbnails as $thumbnail) {
unlink(ASSETS_PATH . "/" . $thumbnail);
$count++;
}
}
$message = _t(
'AssetAdmin.THUMBSDELETED',
'{count} unused thumbnails have been deleted',
'AssetAdmin.THUMBSDELETED',
'{count} unused thumbnails have been deleted',
array('count' => $count)
);
$this->response->addHeader('X-Status', rawurlencode($message));
return;
}
/**
* Creates array containg all unused thumbnails.
*
*
* Array is created in three steps:
* 1. Scan assets folder and retrieve all thumbnails
* 2. Scan all HTMLField in system and retrieve thumbnails from them.
* 3. Count difference between two sets (array_diff)
*
* @return array
* @return array
*/
private function getUnusedThumbnails() {
$allThumbnails = array();
$usedThumbnails = array();
$dirIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator(ASSETS_PATH));
$classes = ClassInfo::subclassesFor('SiteTree');
if($dirIterator) {
foreach($dirIterator as $file) {
if($file->isFile()) {
@ -637,26 +637,26 @@ JS
}
}
}
if($classes) {
foreach($classes as $className) {
$SNG_class = singleton($className);
$objects = DataObject::get($className);
if($objects !== NULL) {
foreach($objects as $object) {
foreach($SNG_class->db() as $fieldName => $fieldType) {
if($fieldType == 'HTMLText') {
$url1 = HTTP::findByTagAndAttribute($object->$fieldName,array('img' => 'src'));
if($url1 != NULL) {
$usedThumbnails[] = substr($url1[0], strpos($url1[0], '/assets/') + 8);
}
if($object->latestPublished > 0) {
$object = Versioned::get_latest_version($className, $object->ID);
$url2 = HTTP::findByTagAndAttribute($object->$fieldName, array('img' => 'src'));
if($url2 != NULL) {
$usedThumbnails[] = substr($url2[0], strpos($url2[0], '/assets/') + 8);
}
@ -667,7 +667,7 @@ JS
}
}
}
return array_diff($allThumbnails, $usedThumbnails);
}
@ -711,12 +711,12 @@ JS
)
);
}
}
/**
* Delete multiple {@link Folder} records (and the associated filesystem nodes).
* Usually used through the {@link AssetAdmin} interface.
*
*
* @package cms
* @subpackage batchactions
*/
@ -731,10 +731,10 @@ class AssetAdmin_DeleteBatchAction extends CMSBatchAction {
'modified'=>array(),
'deleted'=>array()
);
foreach($records as $record) {
$id = $record->ID;
// Perform the action
if($record->canDelete()) $record->delete();

View File

@ -4,29 +4,29 @@
*
* This class creates a 2-frame layout - left-tree and right-form - to sit beneath the main
* admin menu.
*
*
* @package cms
* @subpackage controller
* @todo Create some base classes to contain the generic functionality that will be replicated.
*/
class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionProvider {
private static $url_segment = 'pages';
private static $url_rule = '/$Action/$ID/$OtherID';
// Maintain a lower priority than other administration sections
// so that Director does not think they are actions of CMSMain
private static $url_priority = 39;
private static $menu_title = 'Edit Page';
private static $menu_priority = 10;
private static $tree_class = "SiteTree";
private static $subitem_class = "Member";
/**
* Amount of results showing on a single page.
*
@ -34,7 +34,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
* @var int
*/
private static $page_length = 15;
private static $allowed_actions = array(
'archive',
'buildbrokenlinks',
@ -65,20 +65,20 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
* @config
*/
private static $enabled_legacy_actions = array();
public function init() {
// set reading lang
if(SiteTree::has_extension('Translatable') && !$this->getRequest()->isAjax()) {
Translatable::choose_site_locale(array_keys(Translatable::get_existing_content_languages('SiteTree')));
}
parent::init();
Versioned::reading_stage("Stage");
Requirements::css(CMS_DIR . '/css/screen.css');
Requirements::customCSS($this->generatePageIconsCss());
Requirements::combine_files(
'cmsmain.js',
array_merge(
@ -97,7 +97,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
CMSBatchActionHandler::register('publish', 'CMSBatchAction_Publish');
CMSBatchActionHandler::register('unpublish', 'CMSBatchAction_Unpublish');
// Check legacy actions
$legacy = $this->config()->enabled_legacy_actions;
@ -144,7 +144,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
public function ShowSwitchView() {
return true;
}
/**
* Overloads the LeftAndMain::ShowView. Allows to pass a page as a parameter, so we are able
* to switch view also for archived versions.
@ -153,7 +153,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if(!$page) {
$page = $this->currentPage();
}
if($page) {
$nav = SilverStripeNavigator::get_for_record($page);
return $nav['items'];
@ -305,10 +305,10 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
$this->extend('updateExtraTreeTools', $html);
return $html;
}
/**
* Returns a Form for page searching for use in templates.
*
*
* Can be modified from a decorator by a 'updateSearchForm' method
*
* @return Form
@ -318,7 +318,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
$content = new TextField('q[Term]', _t('CMSSearch.FILTERLABELTEXT', 'Search'));
$dateHeader = new HeaderField('q[Date]', _t('CMSSearch.PAGEFILTERDATEHEADING', 'Last edited'), 4);
$dateFrom = new DateField(
'q[LastEditedFrom]',
'q[LastEditedFrom]',
_t('CMSSearch.FILTERDATEFROM', 'From')
);
$dateFrom->setConfig('showcalendar', true);
@ -328,17 +328,17 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
);
$dateTo->setConfig('showcalendar', true);
$pageFilter = new DropdownField(
'q[FilterClass]',
_t('CMSMain.PAGES', 'Page status'),
'q[FilterClass]',
_t('CMSMain.PAGES', 'Page status'),
CMSSiteTreeFilter::get_all_filters()
);
$pageClasses = new DropdownField(
'q[ClassName]',
_t('CMSMain.PAGETYPEOPT', 'Page type', 'Dropdown for limiting search to a page type'),
'q[ClassName]',
_t('CMSMain.PAGETYPEOPT', 'Page type', 'Dropdown for limiting search to a page type'),
$this->getPageTypes()
);
$pageClasses->setEmptyString(_t('CMSMain.PAGETYPEANYOPT','Any'));
// Group the Datefields
$dateGroup = new FieldGroup(
$dateHeader,
@ -346,7 +346,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
$dateTo
);
$dateGroup->setFieldHolderTemplate('FieldGroup_DefaultFieldHolder')->addExtraClass('stacked');
// Create the Field list
$fields = new FieldList(
$content,
@ -354,7 +354,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
$pageFilter,
$pageClasses
);
// Create the Search and Reset action
$actions = new FieldList(
FormAction::create('doSearch', _t('CMSMain_left_ss.APPLY_FILTER', 'Search'))
@ -366,7 +366,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
foreach($actions->dataFields() as $action) {
$action->setUseButtonTag(true);
}
// Create the form
$form = Form::create($this, 'SearchForm', $fields, $actions)
->addExtraClass('cms-search-form')
@ -374,19 +374,19 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
->setFormAction($this->Link())
->disableSecurityToken()
->unsetValidator();
// Load the form with previously sent search data
$form->loadDataFrom($this->getRequest()->getVars());
// Allow decorators to modify the form
$this->extend('updateSearchForm', $form);
return $form;
}
/**
* Returns a sorted array suitable for a dropdown with pagetypes and their translated name
*
*
* @return array
*/
protected function getPageTypes() {
@ -397,7 +397,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
asort($pageTypes);
return $pageTypes;
}
public function doSearch($data, $form) {
return $this->getsubtree($this->getRequest());
}
@ -421,7 +421,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
/**
* Create serialized JSON string with site tree hints data to be injected into
* 'data-hints' attribute of root node of jsTree.
*
*
* @return String Serialized JSON
*/
public function SiteTreeHints() {
@ -506,18 +506,18 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if($instance->stat('need_permission') && !$this->can(singleton($class)->stat('need_permission'))) continue;
$addAction = $instance->i18n_singular_name();
// Get description (convert 'Page' to 'SiteTree' for correct localization lookups)
$description = _t((($class == 'Page') ? 'SiteTree' : $class) . '.DESCRIPTION');
if(!$description) {
$description = $instance->uninherited('description');
}
if($class == 'Page' && !$description) {
$description = singleton('SiteTree')->uninherited('description');
}
$result->push(new ArrayData(array(
'ClassName' => $class,
'AddAction' => $addAction,
@ -527,9 +527,9 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
'Title' => singleton($class)->i18n_singular_name(),
)));
}
$result = $result->sort('AddAction');
return $result;
}
@ -545,12 +545,12 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if($id instanceof $treeClass) {
return $id;
}
}
else if($id && is_numeric($id)) {
if($this->getRequest()->getVar('Version')) {
$versionID = (int) $this->getRequest()->getVar('Version');
}
if($versionID) {
$record = Versioned::get_version($treeClass, $id, $versionID);
} else {
@ -566,7 +566,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
$record = DataObject::get_by_id($treeClass, $id);
if($record) Versioned::set_reading_mode('');
}
// Then, try getting a deleted record
if(!$record) {
$record = Versioned::get_latest_version($treeClass, $id);
@ -577,7 +577,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
* we should not check their locale matches the Translatable::get_current_locale,
* here as long as we all the HTTPRequest is init with right locale.
* This bit breaks the all FileIFrameField functions if the field is used in CMS
* and its relevent ajax calles, like loading the tree dropdown for TreeSelectorField.
* and its relevent ajax calles, like loading the tree dropdown for TreeSelectorField.
*/
/* if($record && SiteTree::has_extension('Translatable') && $record->Locale && $record->Locale != Translatable::get_current_locale()) {
$record = null;
@ -589,7 +589,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
return $this->getNewItem($id);
}
}
/**
* @param Int $id
* @param FieldList $fields
@ -599,7 +599,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if(!$id) $id = $this->currentPageID();
$form = parent::getEditForm($id);
// TODO Duplicate record fetching (see parent implementation)
$record = $this->getRecord($id);
if($record && !$record->canView()) return Security::permissionFailure($this);
@ -626,14 +626,14 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if($stageLink) $stageLinkField->setValue($stageLink);
}
}
// Added in-line to the form, but plucked into different view by LeftAndMain.Preview.js upon load
if(in_array('CMSPreviewable', class_implements($record)) && !$fields->fieldByName('SilverStripeNavigator')) {
$navField = new LiteralField('SilverStripeNavigator', $this->getSilverStripeNavigator());
$navField->setAllowHTML(true);
$fields->push($navField);
}
// getAllCMSActions can be used to completely redefine the action list
if($record->hasMethod('getAllCMSActions')) {
$actions = $record->getAllCMSActions();
@ -656,14 +656,14 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
// Use <button> to allow full jQuery UI styling
$actionsFlattened = $actions->dataFields();
if($actionsFlattened) foreach($actionsFlattened as $action) $action->setUseButtonTag(true);
if($record->hasMethod('getCMSValidator')) {
$validator = $record->getCMSValidator();
} else {
$validator = new RequiredFields();
}
$form = CMSForm::create(
$form = CMSForm::create(
$this, "EditForm", $fields, $actions, $validator
)->setHTMLID('Form_EditForm');
$form->setResponseNegotiator($this->getResponseNegotiator());
@ -747,7 +747,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
->addHeader('Content-Type', 'application/json; charset=utf-8')
->setBody(Convert::raw2json($disallowedChildren));
}
/**
* Safely reconstruct a selected filter from a given set of query parameters
*
@ -768,7 +768,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
* Returns the pages meet a certain criteria as {@see CMSSiteTreeFilter} or the subpages of a parent page
* defaulting to no filter and show all pages in first level.
* Doubles as search results, if any search parameters are set through {@link SearchForm()}.
*
*
* @param array $params Search filter criteria
* @param int $parentID Optional parent node to filter on (can't be combined with other search criteria)
* @return SS_List
@ -783,11 +783,11 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
return $list->filter("ParentID", $parentID);
}
}
public function ListViewForm() {
$params = $this->getRequest()->requestVar('q');
$list = $this->getList($params, $parentID = $this->getRequest()->requestVar('ParentID'));
$gridFieldConfig = GridFieldConfig::create()->addComponents(
$gridFieldConfig = GridFieldConfig::create()->addComponents(
new GridFieldSortableHeader(),
new GridFieldDataColumns(),
new GridFieldPaginator(self::config()->page_length)
@ -830,7 +830,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
return sprintf(
'<a class="cms-panel-link list-children-link" data-pjax-target="ListViewForm,Breadcrumbs" href="%s">%s</a>',
Controller::join_links(
$controller->Link(),
$controller->Link(),
sprintf("?ParentID=%d&view=list", (int)$item->ID)
),
$num
@ -848,8 +848,8 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
);
}
));
$listview = CMSForm::create(
$listview = CMSForm::create(
$this,
'ListViewForm',
new FieldList($gridField),
@ -859,14 +859,14 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
$listview->setResponseNegotiator($this->getResponseNegotiator());
$this->extend('updateListView', $listview);
$listview->disableSecurityToken();
return $listview;
}
public function currentPageID() {
$id = parent::currentPageID();
$this->extend('updateCurrentPageID', $id);
// Fall back to homepage record
@ -877,10 +877,10 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
));
if($homepageRecord) $id = $homepageRecord->ID;
}
return $id;
}
//------------------------------------------------------------------------------------------//
// Data saving handlers
@ -900,7 +900,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if(!singleton($this->stat('tree_class'))->canCreate()) return Security::permissionFailure($this);
$record = $this->getNewItem($id, false);
}
// TODO Coupling to SiteTree
$record->HasBrokenLink = 0;
$record->HasBrokenFile = 0;
@ -921,11 +921,11 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
// save form data into record
$form->saveInto($record);
$record->write();
// If the 'Save & Publish' button was clicked, also publish the page
if (isset($data['publish']) && $data['publish'] == 1) {
$record->doPublish();
}
}
return $this->getResponseNegotiator()->respond($this->getRequest());
}
@ -944,7 +944,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
}
throw new SS_HTTPResponse_Exception($response);
}
$newItem = new $className();
if( !$suffix ) {
@ -977,25 +977,25 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
# Some modules like subsites add extra fields that need to be set when the new item is created
$this->extend('augmentNewSiteTreeItem', $newItem);
return $newItem;
}
/**
* Delete the page from live. This means a page in draft mode might still exist.
*
*
* @see delete()
*/
public function deletefromlive($data, $form) {
Versioned::reading_stage('Live');
$record = DataObject::get_by_id("SiteTree", $data['ID']);
if($record && !($record->canDelete() && $record->canDeleteFromLive())) return Security::permissionFailure($this);
$descRemoved = '';
$descendantsRemoved = 0;
$recordTitle = $record->Title;
$recordID = $record->ID;
// before deleting the records, get the descendants of this tree
if($record) {
$descendantIDs = $record->getDescendantIDList();
@ -1016,8 +1016,8 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if(isset($descendantsRemoved)) {
$descRemoved = ' ' . _t(
'CMSMain.DESCREMOVED',
'and {count} descendants',
'CMSMain.DESCREMOVED',
'and {count} descendants',
array('count' => $descendantsRemoved)
);
} else {
@ -1028,13 +1028,13 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
'X-Status',
rawurlencode(
_t(
'CMSMain.REMOVED',
'CMSMain.REMOVED',
'Deleted \'{title}\'{description} from live site',
array('title' => $recordTitle, 'description' => $descRemoved)
)
)
);
// Even if the record has been deleted from stage and live, it can be viewed in "archive mode"
return $this->getResponseNegotiator()->respond($this->getRequest());
}
@ -1044,7 +1044,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
*/
public function performPublish($record) {
if($record && !$record->canPublish()) return Security::permissionFailure($this);
$record->doPublish();
}
@ -1052,16 +1052,16 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
* Reverts a page by publishing it to live.
* Use {@link restorepage()} if you want to restore a page
* which was deleted from draft without publishing.
*
*
* @uses SiteTree->doRevertToLive()
*/
public function revert($data, $form) {
if(!isset($data['ID'])) return new SS_HTTPResponse("Please pass an ID in the form content", 400);
$id = (int) $data['ID'];
$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', array(
'"SiteTree_Live"."ID"' => $id
));
@ -1072,7 +1072,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if(!$record || !$record->ID) throw new SS_HTTPResponse_Exception("Bad record ID #$id", 404);
$record->doRevertToLive();
$this->response->addHeader(
'X-Status',
rawurlencode(_t(
@ -1082,10 +1082,10 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
array('title' => $record->Title)
))
);
return $this->getResponseNegotiator()->respond($this->getRequest());
}
/**
* Delete the current page from draft stage.
* @see deletefromlive()
@ -1096,7 +1096,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
$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);
// Delete record
$record->delete();
@ -1104,7 +1104,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
'X-Status',
rawurlencode(sprintf(_t('CMSMain.REMOVEDPAGEFROMDRAFT',"Removed '%s' from the draft site"), $record->Title))
);
// Even if the record has been deleted from stage and live, it can be viewed in "archive mode"
return $this->getResponseNegotiator()->respond($this->getRequest());
}
@ -1139,24 +1139,24 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
public function publish($data, $form) {
$data['publish'] = '1';
return $this->save($data, $form);
}
public function unpublish($data, $form) {
$className = $this->stat('tree_class');
$record = DataObject::get_by_id($className, $data['ID']);
if($record && !$record->canDeleteFromLive()) return Security::permissionFailure($this);
if(!$record || !$record->ID) throw new SS_HTTPResponse_Exception("Bad record ID #" . (int)$data['ID'], 404);
$record->doUnpublish();
$this->response->addHeader(
'X-Status',
rawurlencode(_t('CMSMain.REMOVEDPAGE',"Removed '{title}' from the published site", array('title' => $record->Title)))
);
return $this->getResponseNegotiator()->respond($this->getRequest());
}
@ -1180,13 +1180,13 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
*/
public function doRollback($data, $form) {
$this->extend('onBeforeRollback', $data['ID']);
$id = (isset($data['ID'])) ? (int) $data['ID'] : null;
$version = (isset($data['Version'])) ? (int) $data['Version'] : null;
$record = DataObject::get_by_id($this->stat('tree_class'), $id);
if($record && !$record->canEdit()) return Security::permissionFailure($this);
if($version) {
$record->doRollbackTo($version);
$message = _t(
@ -1202,14 +1202,14 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
}
$this->response->addHeader('X-Status', rawurlencode($message));
// Can be used in different contexts: In normal page edit view, in which case the redirect won't have any effect.
// Or in history view, in which case a revert causes the CMS to re-load the edit view.
// The X-Pjax header forces a "full" content refresh on redirect.
$url = Controller::join_links(singleton('CMSPageEditController')->Link('show'), $record->ID);
$this->response->addHeader('X-ControllerURL', $url);
$this->getRequest()->addHeader('X-Pjax', 'Content');
$this->response->addHeader('X-Pjax', 'Content');
$this->response->addHeader('X-Pjax', 'Content');
return $this->getResponseNegotiator()->respond($this->getRequest());
}
@ -1220,7 +1220,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
public function batchactions() {
return new CMSBatchActionHandler($this, 'batchactions');
}
public function BatchActionParameters() {
$batchActions = CMSBatchActionHandler::config()->batch_actions;
@ -1238,7 +1238,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
$pageHtml = '';
foreach($forms as $urlSegment => $html) {
$pageHtml .= "<div class=\"params\" id=\"BatchActionParameters_$urlSegment\">$html</div>\n\n";
}
}
return new LiteralField("BatchActionParameters", '<div id="BatchActionParameters" style="display:none">'.$pageHtml.'</div>');
}
/**
@ -1247,14 +1247,14 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
public function BatchActionList() {
return $this->batchactions()->batchActionList();
}
public function buildbrokenlinks($request) {
// Protect against CSRF on destructive action
if(!SecurityToken::inst()->checkRequest($request)) return $this->httpError(400);
increase_time_limit_to();
increase_memory_limit_to();
if($this->urlParams['ID']) {
$newPageSet[] = DataObject::get_by_id("Page", $this->urlParams['ID']);
} else {
@ -1289,20 +1289,20 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
increase_time_limit_to();
increase_memory_limit_to();
$response = "";
if(isset($this->requestParams['confirm'])) {
// Protect against CSRF on destructive action
if(!SecurityToken::inst()->checkRequest($request)) return $this->httpError(400);
$start = 0;
$pages = DataObject::get("SiteTree", "", "", "", "$start,30");
$count = 0;
while($pages) {
foreach($pages as $page) {
if($page && !$page->canPublish()) return Security::permissionFailure($this);
$page->doPublish();
$page->destroy();
unset($page);
@ -1334,10 +1334,10 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
. $tokenHtml .
'</form>';
}
return $response;
}
/**
* Restore a completely deleted page from the SiteTree_versions table.
*/
@ -1345,29 +1345,29 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if(!isset($data['ID']) || !is_numeric($data['ID'])) {
return new SS_HTTPResponse("Please pass an ID in the form content", 400);
}
$id = (int)$data['ID'];
$restoredPage = Versioned::get_latest_version("SiteTree", $id);
if(!$restoredPage) return new SS_HTTPResponse("SiteTree #$id not found", 400);
$restoredPage = $restoredPage->doRestoreToStage();
$this->response->addHeader(
'X-Status',
rawurlencode(_t(
'CMSMain.RESTORED',
"Restored '{title}' successfully",
"Restored '{title}' successfully",
array('title' => $restoredPage->Title)
))
);
return $this->getResponseNegotiator()->respond($this->getRequest());
}
public function duplicate($request) {
// Protect against CSRF on destructive action
if(!SecurityToken::inst()->checkRequest($request)) return $this->httpError(400);
if(($id = $this->urlParams['ID']) && is_numeric($id)) {
$page = DataObject::get_by_id("SiteTree", $id);
if($page && (!$page->canEdit() || !$page->canCreate(null, array('Parent' => $page->Parent())))) {
@ -1376,26 +1376,26 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
if(!$page || !$page->ID) throw new SS_HTTPResponse_Exception("Bad record ID #$id", 404);
$newPage = $page->duplicate();
// ParentID can be hard-set in the URL. This is useful for pages with multiple parents
if(isset($_GET['parentID']) && is_numeric($_GET['parentID'])) {
$newPage->ParentID = $_GET['parentID'];
$newPage->write();
}
$this->response->addHeader(
'X-Status',
rawurlencode(_t(
'CMSMain.DUPLICATED',
"Duplicated '{title}' successfully",
"Duplicated '{title}' successfully",
array('title' => $newPage->Title)
))
);
$url = Controller::join_links(singleton('CMSPageEditController')->Link('show'), $newPage->ID);
$this->response->addHeader('X-ControllerURL', $url);
$this->getRequest()->addHeader('X-Pjax', 'Content');
$this->response->addHeader('X-Pjax', 'Content');
$this->response->addHeader('X-Pjax', 'Content');
return $this->getResponseNegotiator()->respond($this->getRequest());
} else {
return new SS_HTTPResponse("CMSMain::duplicate() Bad ID: '$id'", 400);
@ -1419,21 +1419,21 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
'X-Status',
rawurlencode(_t(
'CMSMain.DUPLICATEDWITHCHILDREN',
"Duplicated '{title}' and children successfully",
"Duplicated '{title}' and children successfully",
array('title' => $newPage->Title)
))
);
$url = Controller::join_links(singleton('CMSPageEditController')->Link('show'), $newPage->ID);
$this->response->addHeader('X-ControllerURL', $url);
$this->getRequest()->addHeader('X-Pjax', 'Content');
$this->response->addHeader('X-Pjax', 'Content');
$this->response->addHeader('X-Pjax', 'Content');
return $this->getResponseNegotiator()->respond($this->getRequest());
} else {
return new SS_HTTPResponse("CMSMain::duplicatewithchildren() Bad ID: '$id'", 400);
}
}
public function providePermissions() {
$title = _t("CMSPagesController.MENUTITLE", LeftAndMain::menu_title_for_class('CMSPagesController'));
return array(

View File

@ -50,7 +50,7 @@ class CMSPageAddController extends CMSPageEditController {
new SelectionGroup_Item(
'child',
$parentField = new TreeDropdownField(
"ParentID",
"ParentID",
"",
'SiteTree',
'ID',
@ -61,8 +61,8 @@ class CMSPageAddController extends CMSPageEditController {
)
),
$typeField = new OptionsetField(
"PageType",
sprintf($numericLabelTmpl, 2, _t('CMSMain.ChoosePageType', 'Choose page type')),
"PageType",
sprintf($numericLabelTmpl, 2, _t('CMSMain.ChoosePageType', 'Choose page type')),
$pageTypes,
'Page'
),
@ -71,7 +71,7 @@ class CMSPageAddController extends CMSPageEditController {
sprintf(
'<p class="message notice message-restricted">%s</p>',
_t(
'CMSMain.AddPageRestriction',
'CMSMain.AddPageRestriction',
'Note: Some page types are not allowed for this selection'
)
)
@ -79,7 +79,7 @@ class CMSPageAddController extends CMSPageEditController {
);
$parentField->setSearchFunction(function ($sourceObject, $labelField, $search) {
return DataObject::get(
$sourceObject,
$sourceObject,
sprintf(
"\"MenuTitle\" LIKE '%%%s%%' OR \"Title\" LIKE '%%%s%%'",
Convert::raw2sql($search),
@ -88,10 +88,10 @@ class CMSPageAddController extends CMSPageEditController {
);
});
// TODO Re-enable search once it allows for HTML title display,
// TODO Re-enable search once it allows for HTML title display,
// see http://open.silverstripe.org/ticket/7455
// $parentField->setShowSearch(true);
$parentModeField->addExtraClass('parent-mode');
// CMSMain->currentPageID() automatically sets the homepage,
@ -102,7 +102,7 @@ class CMSPageAddController extends CMSPageEditController {
} else {
$parentModeField->setValue('top');
}
$actions = new FieldList(
FormAction::create("doAdd", _t('CMSMain.Create',"Create"))
->addExtraClass('ss-ui-action-constructive')->setAttribute('data-icon', 'accept')
@ -111,10 +111,10 @@ class CMSPageAddController extends CMSPageEditController {
->addExtraClass('ss-ui-action-destructive ss-ui-action-cancel')
->setUseButtonTag(true)
);
$this->extend('updatePageOptions', $fields);
$form = CMSForm::create(
$form = CMSForm::create(
$this, "AddForm", $fields, $actions
)->setHTMLID('Form_AddForm');
$form->setAttribute('data-hints', $this->SiteTreeHints());
@ -140,7 +140,7 @@ class CMSPageAddController extends CMSPageEditController {
if(is_numeric($parentID) && $parentID > 0) $parentObj = DataObject::get_by_id("SiteTree", $parentID);
else $parentObj = null;
if(!$parentObj || !$parentObj->ID) $parentID = 0;
if(!singleton($className)->canCreate(Member::currentUser(), array('Parent' => $parentObj))) {
@ -163,11 +163,11 @@ class CMSPageAddController extends CMSPageEditController {
$editController->setCurrentPageID($record->ID);
Session::set(
"FormInfo.Form_EditForm.formError.message",
"FormInfo.Form_EditForm.formError.message",
_t('CMSMain.PageAdded', 'Successfully created page')
);
Session::set("FormInfo.Form_EditForm.formError.type", 'good');
return $this->redirect(Controller::join_links(singleton('CMSPageEditController')->Link('show'), $record->ID));
}

View File

@ -12,14 +12,14 @@ class CMSPageHistoryController extends CMSMain {
private static $menu_title = 'History';
private static $required_permission_codes = 'CMS_ACCESS_CMSMain';
private static $session_namespace = 'CMSMain';
private static $allowed_actions = array(
'VersionsForm',
'CompareVersionsForm',
'show',
'compare'
);
private static $url_handlers = array(
'$Action/$ID/$VersionID/$OtherVersionID' => 'handleAction'
);
@ -37,14 +37,14 @@ class CMSPageHistoryController extends CMSMain {
});
return $negotiator;
}
/**
* @param SS_HTTPRequest $request
* @return array
*/
public function show($request) {
$form = $this->ShowVersionForm($request->param('VersionID'));
$negotiator = $this->getResponseNegotiator();
$controller = $this;
$negotiator->setCallback('CurrentForm', function() use(&$controller, &$form) {
@ -56,14 +56,14 @@ class CMSPageHistoryController extends CMSMain {
return $negotiator->respond($request);
}
/**
* @param SS_HTTPRequest $request
* @return array
*/
public function compare($request) {
$form = $this->CompareVersionsForm(
$request->param('VersionID'),
$request->param('VersionID'),
$request->param('OtherVersionID')
);
@ -88,13 +88,13 @@ class CMSPageHistoryController extends CMSMain {
return false;
}
}
/**
* Returns the read only version of the edit form. Detaches all {@link FormAction}
* Returns the read only version of the edit form. Detaches all {@link FormAction}
* instances attached since only action relates to revert.
*
* Permission checking is done at the {@link CMSMain::getEditForm()} level.
*
*
* @param int $id ID of the record to show
* @param array $fields optional
* @param int $versionID
@ -104,10 +104,10 @@ class CMSPageHistoryController extends CMSMain {
*/
public function getEditForm($id = null, $fields = null, $versionID = null, $compareID = null) {
if(!$id) $id = $this->currentPageID();
$record = $this->getRecord($id, $versionID);
$versionID = ($record) ? $record->Version : $versionID;
$form = parent::getEditForm($record, ($record) ? $record->getCMSFields() : null);
// Respect permission failures from parent implementation
if(!($form instanceof Form)) return $form;
@ -118,14 +118,14 @@ class CMSPageHistoryController extends CMSMain {
$form->setActions(new FieldList(
$revert = FormAction::create('doRollback', _t('CMSPageHistoryController.REVERTTOTHISVERSION', 'Revert to this version'))->setUseButtonTag(true)
));
$fields = $form->Fields();
$fields->removeByName("Status");
$fields->push(new HiddenField("ID"));
$fields->push(new HiddenField("Version"));
$fields = $fields->makeReadonly();
$fields = $fields->makeReadonly();
if($compareID) {
$link = Controller::join_links(
$this->Link('show'),
@ -133,7 +133,7 @@ class CMSPageHistoryController extends CMSMain {
);
$view = _t('CMSPageHistoryController.VIEW',"view");
$message = _t(
'CMSPageHistoryController.COMPARINGVERSION',
"Comparing versions {version1} and {version2}.",
@ -142,7 +142,7 @@ class CMSPageHistoryController extends CMSMain {
'version2' => sprintf('%s (<a href="%s">%s</a>)', $compareID, Controller::join_links($link, $compareID), $view)
)
);
$revert->setReadonly(true);
} else {
if($record->isLatestVersion()) {
@ -155,8 +155,8 @@ class CMSPageHistoryController extends CMSMain {
);
}
}
$fields->addFieldToTab('Root.Main',
$fields->addFieldToTab('Root.Main',
new LiteralField('CurrentlyViewingMessage', $this->customise(array(
'Content' => $message,
'Classes' => 'notice'
@ -169,23 +169,23 @@ class CMSPageHistoryController extends CMSMain {
"ID" => $id,
"Version" => $versionID,
));
if(($record && $record->isLatestVersion())) {
$revert->setReadonly(true);
}
$form->removeExtraClass('cms-content');
return $form;
}
/**
* Version select form. Main interface between selecting versions to view
* Version select form. Main interface between selecting versions to view
* and comparing multiple versions.
*
*
* Because we can reload the page directly to a compare view (history/compare/1/2/3)
* this form has to adapt to those parameters as well.
* this form has to adapt to those parameters as well.
*
* @return Form
*/
@ -197,7 +197,7 @@ class CMSPageHistoryController extends CMSMain {
$action = $this->getRequest()->param('Action');
$versionID = $this->getRequest()->param('VersionID');
$otherVersionID = $this->getRequest()->param('OtherVersionID');
$showUnpublishedChecked = 0;
$compareModeChecked = ($action == "compare");
@ -208,19 +208,19 @@ class CMSPageHistoryController extends CMSMain {
if($versions) {
foreach($versions as $k => $version) {
$active = false;
if($version->Version == $versionID || $version->Version == $otherVersionID) {
$active = true;
if(!$version->WasPublished) $showUnpublishedChecked = 1;
}
$version->Active = ($active);
}
}
$vd = new ViewableData();
$versionsHtml = $vd->customise(array(
'Versions' => $versions
))->renderWith('CMSPageHistoryController_versions');
@ -246,14 +246,14 @@ class CMSPageHistoryController extends CMSMain {
'doCompare', _t('CMSPageHistoryController.COMPAREVERSIONS','Compare Versions')
),
new FormAction(
'doShowVersion', _t('CMSPageHistoryController.SHOWVERSION','Show Version')
'doShowVersion', _t('CMSPageHistoryController.SHOWVERSION','Show Version')
)
);
// Use <button> to allow full jQuery UI styling
foreach($actions->dataFields() as $action) $action->setUseButtonTag(true);
$form = CMSForm::create(
$form = CMSForm::create(
$this,
'VersionsForm',
$fields,
@ -263,15 +263,15 @@ class CMSPageHistoryController extends CMSMain {
$form->loadDataFrom($this->getRequest()->requestVars());
$hiddenID->setValue($id);
$form->unsetValidator();
$form
->addExtraClass('cms-versions-form') // placeholder, necessary for $.metadata() to work
->setAttribute('data-link-tmpl-compare', Controller::join_links($this->Link('compare'), '%s', '%s', '%s'))
->setAttribute('data-link-tmpl-show', Controller::join_links($this->Link('show'), '%s', '%s'));
return $form;
}
/**
* Process the {@link VersionsForm} compare function between two pages.
*
@ -283,7 +283,7 @@ class CMSPageHistoryController extends CMSMain {
public function doCompare($data, $form) {
$versions = $data['Versions'];
if(count($versions) < 2) return null;
$id = $this->currentPageID();
$version1 = array_shift($versions);
$version2 = array_shift($versions);
@ -295,11 +295,11 @@ class CMSPageHistoryController extends CMSMain {
return $this->customise(array(
"EditForm" => $form
))->renderWith(array(
$this->class . '_EditForm',
$this->class . '_EditForm',
'LeftAndMain_Content'
));
}
// non javascript, redirect the user to the page
$this->redirect(Controller::join_links(
$this->Link('compare'),
@ -316,21 +316,21 @@ class CMSPageHistoryController extends CMSMain {
* @param Form
*
* @return html
*/
*/
public function doShowVersion($data, $form) {
$versionID = null;
if(isset($data['Versions']) && is_array($data['Versions'])) {
if(isset($data['Versions']) && is_array($data['Versions'])) {
$versionID = array_shift($data['Versions']);
}
if(!$versionID) return;
if($request->isAjax()) {
return $this->customise(array(
"EditForm" => $this->ShowVersionForm($versionID)
))->renderWith(array(
$this->class . '_EditForm',
$this->class . '_EditForm',
'LeftAndMain_Content'
));
}
@ -354,7 +354,7 @@ class CMSPageHistoryController extends CMSMain {
return $form;
}
/**
* @param int $versionID
* @param int $otherVersionID
@ -370,10 +370,10 @@ class CMSPageHistoryController extends CMSMain {
}
if(!$toVersion || !$toVersion) return false;
$id = $this->currentPageID();
$page = DataObject::get_by_id("SiteTree", $id);
if($page && !$page->canView()) {
return Security::permissionFailure($this);
}
@ -382,11 +382,11 @@ class CMSPageHistoryController extends CMSMain {
$fromVersionRecord = Versioned::get_version('SiteTree', $id, $fromVersion);
$toVersionRecord = Versioned::get_version('SiteTree', $id, $toVersion);
if(!$fromVersionRecord) {
user_error("Can't find version $fromVersion of page $id", E_USER_ERROR);
}
if(!$toVersionRecord) {
user_error("Can't find version $toVersion of page $id", E_USER_ERROR);
}
@ -395,23 +395,23 @@ class CMSPageHistoryController extends CMSMain {
$form = $this->getEditForm($id, null, null, true);
$form->setActions(new FieldList());
$form->addExtraClass('compare');
// Comparison views shouldn't be editable.
// Its important to convert fields *before* loading data,
// as the comparison output is HTML and not valid values for the various field types
$readonlyFields = $form->Fields()->makeReadonly();
$form->setFields($readonlyFields);
$form->loadDataFrom($record);
$form->loadDataFrom(array(
"ID" => $id,
"Version" => $fromVersion,
));
foreach($form->Fields()->dataFields() as $field) {
$field->dontEscape = true;
}
return $form;
}
}

View File

@ -10,10 +10,10 @@ class CMSPageSettingsController extends CMSMain {
private static $url_priority = 42;
private static $required_permission_codes = 'CMS_ACCESS_CMSMain';
private static $session_namespace = 'CMSMain';
public function getEditForm($id = null, $fields = null) {
$record = $this->getRecord($id ? $id : $this->currentPageID());
return parent::getEditForm($record, ($record) ? $record->getSettingsFields() : null);
}

View File

@ -4,11 +4,11 @@
* @package cms
*/
class CMSPagesController extends CMSMain {
private static $url_segment = 'pages';
private static $url_rule = '/$Action/$ID/$OtherID';
private static $url_priority = 40;
private static $menu_title = 'Pages';
private static $menu_title = 'Pages';
private static $required_permission_codes = 'CMS_ACCESS_CMSMain';
private static $session_namespace = 'CMSMain';

View File

@ -1,7 +1,7 @@
<?php
/**
* Base class for filtering the subtree for certain node statuses.
*
*
* The simplest way of building a CMSSiteTreeFilter is to create a pagesToBeShown() method that
* returns an Iterator of maps, each entry containing the 'ID' and 'ParentID' of the pages to be
* included in the tree. The result of a DB::query() can then be returned directly.
@ -9,7 +9,7 @@
* If you wish to make a more complex tree, you can overload includeInTree($page) to return true/
* false depending on whether the given page should be included. Note that you will need to include
* parent helper pages yourself.
*
*
* @package cms
* @subpackage content
*/
@ -20,10 +20,10 @@ abstract class CMSSiteTreeFilter extends Object implements LeftAndMain_SearchFil
* Caution: Unescaped data.
*/
protected $params = array();
/**
* List of filtered items and all their parents
*
*
* @var array
*/
protected $_cache_ids = null;
@ -37,14 +37,14 @@ abstract class CMSSiteTreeFilter extends Object implements LeftAndMain_SearchFil
* @var array
*/
protected $_cache_highlight_ids = null;
/**
* @var Array
*/
protected $_cache_expanded = array();
/**
* @var String
* @var String
*/
protected $childrenMethod = null;
@ -55,38 +55,38 @@ abstract class CMSSiteTreeFilter extends Object implements LeftAndMain_SearchFil
/**
* Returns a sorted array of all implementators of CMSSiteTreeFilter, suitable for use in a dropdown.
*
*
* @return array
*/
public static function get_all_filters() {
// get all filter instances
$filters = ClassInfo::subclassesFor('CMSSiteTreeFilter');
// remove abstract CMSSiteTreeFilter class
array_shift($filters);
// add filters to map
$filterMap = array();
foreach($filters as $filter) {
$filterMap[$filter] = $filter::title();
}
// Ensure that 'all pages' filter is on top position and everything else is sorted alphabetically
uasort($filterMap, function($a, $b) {
return ($a === CMSSiteTreeFilter_Search::title())
? -1
: strcasecmp($a, $b);
});
return $filterMap;
}
public function __construct($params = null) {
if($params) $this->params = $params;
parent::__construct();
}
public function getChildrenMethod() {
return $this->childrenMethod;
}
@ -120,7 +120,7 @@ abstract class CMSSiteTreeFilter extends Object implements LeftAndMain_SearchFil
public function pagesIncluded() {
return $this->mapIDs($this->getFilteredPages());
}
/**
* Populate the IDs of the pages returned by pagesIncluded(), also including
* the necessary parent helper pages.
@ -129,10 +129,10 @@ abstract class CMSSiteTreeFilter extends Object implements LeftAndMain_SearchFil
$parents = array();
$this->_cache_ids = array();
$this->_cache_highlight_ids = array();
if($pages = $this->pagesIncluded()) {
// And keep a record of parents we don't need to get
// And keep a record of parents we don't need to get
// parents of themselves, as well as IDs to mark
foreach($pages as $pageArr) {
$parents[$pageArr['ParentID']] = true;
@ -152,7 +152,7 @@ abstract class CMSSiteTreeFilter extends Object implements LeftAndMain_SearchFil
}
}
}
public function isPageIncluded($page) {
if($this->_cache_ids === NULL) {
$this->populateIDs();
@ -160,10 +160,10 @@ abstract class CMSSiteTreeFilter extends Object implements LeftAndMain_SearchFil
return !empty($this->_cache_ids[$page->ID]);
}
/**
* Applies the default filters to a specified DataList of pages
*
*
* @param DataList $query Unfiltered query
* @return DataList Filtered query
*/
@ -208,10 +208,10 @@ abstract class CMSSiteTreeFilter extends Object implements LeftAndMain_SearchFil
}
return $query;
}
/**
* Maps a list of pages to an array of associative arrays with ID and ParentID keys
*
*
* @param DataList $pages
* @return array
*/
@ -272,7 +272,7 @@ class CMSSiteTreeFilter_PublishedPages extends CMSSiteTreeFilter {
* Works a bit different than the other filters:
* Shows all pages *including* those deleted from stage and live.
* It does not filter out pages still existing in the different stages.
*
*
* @package cms
* @subpackage content
*/
@ -287,11 +287,11 @@ class CMSSiteTreeFilter_DeletedPages extends CMSSiteTreeFilter {
* @var string
*/
protected $numChildrenMethod = 'numHistoricalChildren';
static public function title() {
return _t('CMSSiteTreeFilter_DeletedPages.Title', "All pages, including archived");
}
public function getFilteredPages() {
$pages = Versioned::get_including_deleted('SiteTree');
$pages = $this->applyDefaultFilters($pages);
@ -301,40 +301,40 @@ class CMSSiteTreeFilter_DeletedPages extends CMSSiteTreeFilter {
/**
* Gets all pages which have changed on stage.
*
*
* @package cms
* @subpackage content
*/
class CMSSiteTreeFilter_ChangedPages extends CMSSiteTreeFilter {
static public function title() {
return _t('CMSSiteTreeFilter_ChangedPages.Title', "Modified pages");
}
public function getFilteredPages() {
$pages = Versioned::get_by_stage('SiteTree', 'Stage');
$pages = $this->applyDefaultFilters($pages)
->leftJoin('SiteTree_Live', '"SiteTree_Live"."ID" = "SiteTree"."ID"')
->where('"SiteTree"."Version" <> "SiteTree_Live"."Version"');
return $pages;
}
}
}
/**
* Filters pages which have a status "Removed from Draft".
*
*
* @package cms
* @subpackage content
*/
class CMSSiteTreeFilter_StatusRemovedFromDraftPages extends CMSSiteTreeFilter {
static public function title() {
return _t('CMSSiteTreeFilter_StatusRemovedFromDraftPages.Title', 'Live but removed from draft');
}
/**
* Filters out all pages who's status is set to "Removed from draft".
*
*
* @return SS_List
*/
public function getFilteredPages() {
@ -345,24 +345,24 @@ class CMSSiteTreeFilter_StatusRemovedFromDraftPages extends CMSSiteTreeFilter {
return $page->getIsDeletedFromStage() && $page->getExistsOnLive();
});
return $pages;
}
}
}
/**
* Filters pages which have a status "Draft".
*
*
* @package cms
* @subpackage content
*/
class CMSSiteTreeFilter_StatusDraftPages extends CMSSiteTreeFilter {
static public function title() {
return _t('CMSSiteTreeFilter_StatusDraftPages.Title', 'Draft pages');
}
/**
* Filters out all pages who's status is set to "Draft".
*
*
* @see {@link SiteTree::getStatusFlags()}
* @return SS_List
*/
@ -374,12 +374,12 @@ class CMSSiteTreeFilter_StatusDraftPages extends CMSSiteTreeFilter {
return (!$page->getIsDeletedFromStage() && $page->getIsAddedToStage());
});
return $pages;
}
}
}
/**
* Filters pages which have a status "Deleted".
*
*
* @package cms
* @subpackage content
*/
@ -394,14 +394,14 @@ class CMSSiteTreeFilter_StatusDeletedPages extends CMSSiteTreeFilter {
* @var string
*/
protected $numChildrenMethod = 'numHistoricalChildren';
static public function title() {
return _t('CMSSiteTreeFilter_StatusDeletedPages.Title', 'Archived pages');
}
/**
* Filters out all pages who's status is set to "Deleted".
*
*
* @see {@link SiteTree::getStatusFlags()}
* @return SS_List
*/
@ -414,7 +414,7 @@ class CMSSiteTreeFilter_StatusDeletedPages extends CMSSiteTreeFilter {
return $page->getIsDeletedFromStage() && !$page->getExistsOnLive();
});
return $pages;
}
}
}
/**
@ -426,11 +426,11 @@ class CMSSiteTreeFilter_Search extends CMSSiteTreeFilter {
static public function title() {
return _t('CMSSiteTreeFilter_Search.Title', "All pages");
}
/**
* Retun an array of maps containing the keys, 'ID' and 'ParentID' for each page to be displayed
* in the search.
*
*
* @return SS_List
*/
public function getFilteredPages() {

View File

@ -12,7 +12,7 @@
*
* Subclasses of ContentController are generally instantiated by ModelAsController; this will create
* a controller based on the URLSegment action variable, by looking in the SiteTree table.
*
*
* @todo Can this be used for anything other than SiteTree controllers?
*
* @package cms
@ -29,7 +29,7 @@ class ContentController extends Controller {
'deleteinstallfiles', // secured through custom code
'LoginForm'
);
/**
* The ContentController will take the URLSegment parameter from the URL and use that to look
* up a SiteTree record.
@ -41,12 +41,12 @@ class ContentController extends Controller {
$dataRecord->URLSegment = get_class($this);
$dataRecord->ID = -1;
}
$this->dataRecord = $dataRecord;
$this->failover = $this->dataRecord;
parent::__construct();
}
/**
* Return the link to this controller, but force the expanded link to be returned so that form methods and
* similar will function properly.
@ -57,10 +57,10 @@ class ContentController extends Controller {
public function Link($action = null) {
return $this->data()->Link(($action ? $action : true));
}
//----------------------------------------------------------------------------------//
// These flexible data methods remove the need for custom code to do simple stuff
/**
* Return the children of a given page. The parent reference can either be a page link or an ID.
*
@ -69,14 +69,14 @@ class ContentController extends Controller {
*/
public function ChildrenOf($parentRef) {
$parent = SiteTree::get_by_link($parentRef);
if(!$parent && is_numeric($parentRef)) {
$parent = DataObject::get_by_id('SiteTree', $parentRef);
}
if($parent) return $parent->Children();
}
/**
* @param string $link
* @return SiteTree
@ -87,10 +87,10 @@ class ContentController extends Controller {
public function init() {
parent::init();
// If we've accessed the homepage as /home/, then we should redirect to /.
if($this->dataRecord && $this->dataRecord instanceof SiteTree
&& RootURLController::should_be_on_root($this->dataRecord) && (!isset($this->urlParams['Action']) || !$this->urlParams['Action'] )
&& RootURLController::should_be_on_root($this->dataRecord) && (!isset($this->urlParams['Action']) || !$this->urlParams['Action'] )
&& !$_POST && !$_FILES && !$this->redirectedTo() ) {
$getVars = $_GET;
unset($getVars['url']);
@ -99,7 +99,7 @@ class ContentController extends Controller {
$this->redirect($url, 301);
return;
}
if($this->dataRecord) $this->dataRecord->extend('contentcontrollerInit', $this);
else singleton('SiteTree')->extend('contentcontrollerInit', $this);
@ -112,17 +112,17 @@ class ContentController extends Controller {
// Draft/Archive security check - only CMS users should be able to look at stage/archived content
if(
$this->URLSegment != 'Security'
&& !Session::get('unsecuredDraftSite')
$this->URLSegment != 'Security'
&& !Session::get('unsecuredDraftSite')
&& (
Versioned::current_archived_date()
Versioned::current_archived_date()
|| (Versioned::current_stage() && Versioned::current_stage() != 'Live')
)
) {
if(!$this->dataRecord->canView()) {
Session::clear('currentStage');
Session::clear('archiveDate');
$permissionMessage = sprintf(
_t(
"ContentController.DRAFT_SITE_ACCESS_RESTRICTION",
@ -136,13 +136,13 @@ class ContentController extends Controller {
}
}
// Use theme from the site config
if(($config = SiteConfig::current_site_config()) && $config->Theme) {
Config::inst()->update('SSViewer', 'theme', $config->Theme);
}
}
/**
* This acts the same as {@link Controller::handleRequest()}, but if an action cannot be found this will attempt to
* fall over to a child controller in order to provide functionality for nested URLs.
@ -156,7 +156,7 @@ class ContentController extends Controller {
$child = null;
$action = $request->param('Action');
$this->setDataModel($model);
// If nested URLs are enabled, and there is no action handler for the current request then attempt to pass
// control to a child controller. This allows for the creation of chains of controllers which correspond to a
// nested URL.
@ -170,12 +170,12 @@ class ContentController extends Controller {
))->first();
if(class_exists('Translatable')) Translatable::enable_locale_filter();
}
// we found a page with this URLSegment.
if($child) {
$request->shiftAllParams();
$request->shift();
$response = ModelAsController::controller_for($child)->handleRequest($request, $model);
} else {
// If a specific locale is requested, and it doesn't match the page found by URLSegment,
@ -191,7 +191,7 @@ class ContentController extends Controller {
}
}
}
Director::set_current_page($this->data());
try {
@ -200,16 +200,16 @@ class ContentController extends Controller {
Director::set_current_page(null);
} catch(SS_HTTPResponse_Exception $e) {
$this->popCurrent();
Director::set_current_page(null);
throw $e;
}
}
return $response;
}
/**
* @uses ErrorPage::response_for()
*/
@ -229,7 +229,7 @@ class ContentController extends Controller {
global $project;
return $project;
}
/**
* Returns the associated database record
*/
@ -254,13 +254,13 @@ class ContentController extends Controller {
} else {
$parent = $this->data();
$stack = array($parent);
if($parent) {
while($parent = $parent->Parent) {
array_unshift($stack, $parent);
}
}
if(isset($stack[$level-2])) $result = $stack[$level-2]->Children();
}
@ -298,12 +298,12 @@ class ContentController extends Controller {
$items = '';
$message = '';
if(Director::isDev() || Permission::check('CMS_ACCESS_CMSMain') || Permission::check('VIEW_DRAFT_CONTENT')) {
if(Director::isDev() || Permission::check('CMS_ACCESS_CMSMain') || Permission::check('VIEW_DRAFT_CONTENT')) {
if($this->dataRecord) {
Requirements::css(CMS_DIR . '/css/SilverStripeNavigator.css');
Requirements::javascript(FRAMEWORK_DIR . '/thirdparty/jquery/jquery.js');
Requirements::javascript(CMS_DIR . '/javascript/SilverStripeNavigator.js');
$return = $nav = SilverStripeNavigator::get_for_record($this->dataRecord);
$items = $return['items'];
$message = $return['message'];
@ -322,7 +322,7 @@ class ContentController extends Controller {
);
}
$viewPageIn = _t('ContentController.VIEWPAGEIN', 'View Page in:');
return <<<HTML
<div id="SilverStripeNavigator">
<div class="holder">
@ -331,7 +331,7 @@ class ContentController extends Controller {
</div>
<div id="switchView" class="bottomTabs">
$viewPageIn
$viewPageIn
$items
</div>
</div>
@ -349,7 +349,7 @@ HTML;
}
}
}
public function SiteConfig() {
if(method_exists($this->dataRecord, 'getSiteConfig')) {
return $this->dataRecord->getSiteConfig();
@ -363,10 +363,10 @@ HTML;
* Inspects the associated {@link dataRecord} for a {@link SiteTree->Locale} value if present,
* and falls back to {@link Translatable::get_current_locale()} or {@link i18n::default_locale()},
* depending if Translatable is enabled.
*
*
* Suitable for insertion into lang= and xml:lang=
* attributes in HTML or XHTML output.
*
*
* @return string
*/
public function ContentLocale() {
@ -377,9 +377,9 @@ HTML;
} else {
$locale = i18n::get_locale();
}
return i18n::convert_rfc1766($locale);
}
}
/**
@ -430,20 +430,20 @@ HTML;
$fourohfour->write();
$fourohfour->publish("Stage", "Live");
}
// TODO Allow this to work when allow_url_fopen=0
if(isset($_SESSION['StatsID']) && $_SESSION['StatsID']) {
$url = 'http://ss2stat.silverstripe.com/Installation/installed?ID=' . $_SESSION['StatsID'];
@file_get_contents($url);
}
global $project;
$data = new ArrayData(array(
'Project' => Convert::raw2xml($project),
'Username' => Convert::raw2xml(Session::get('username')),
'Password' => Convert::raw2xml(Session::get('password')),
));
return array(
"Title" => _t("ContentController.INSTALL_SUCCESS", "Installation Successful!"),
"Content" => $data->renderWith('Install_successfullyinstalled'),
@ -452,7 +452,7 @@ HTML;
public function deleteinstallfiles() {
if(!Permission::check("ADMIN")) return Security::permissionFailure($this);
$title = new Varchar("Title");
$content = new HTMLText('Content');

View File

@ -2,12 +2,12 @@
/**
* Enhances error handling for a controller with ErrorPage generated output
*
*
* @package cms
* @subpackage controller
*/
class ErrorPageControllerExtension extends Extension {
public function onBeforeHTTPError($statusCode, $request) {
$response = ErrorPage::response_for($statusCode);
if($response) {

View File

@ -1,7 +1,7 @@
<?php
/**
* Extension to include custom page icons
*
*
* @package cms
* @subpackage controller
*/
@ -14,16 +14,16 @@ class LeftAndMainPageIconsExtension extends Extension {
/**
* Include CSS for page icons. We're not using the JSTree 'types' option
* because it causes too much performance overhead just to add some icons.
*
* @return String CSS
*
* @return String CSS
*/
public function generatePageIconsCss() {
$css = '';
$classes = ClassInfo::subclassesFor('SiteTree');
$css = '';
$classes = ClassInfo::subclassesFor('SiteTree');
foreach($classes as $class) {
$obj = singleton($class);
$iconSpec = $obj->stat('icon');
$obj = singleton($class);
$iconSpec = $obj->stat('icon');
if(!$iconSpec) continue;
@ -33,9 +33,9 @@ class LeftAndMainPageIconsExtension extends Extension {
// Legacy support: Add file extension if none exists
if(!pathinfo($iconFile, PATHINFO_EXTENSION)) $iconFile .= '-file.gif';
$iconPathInfo = pathinfo($iconFile);
// Base filename
$iconPathInfo = pathinfo($iconFile);
// Base filename
$baseFilename = $iconPathInfo['dirname'] . '/' . $iconPathInfo['filename'];
$fileExtension = $iconPathInfo['extension'];

View File

@ -8,7 +8,7 @@
*/
class ModelAsController extends Controller implements NestedController {
private static $extensions = array('OldPageRedirector');
/**
* Get the appropriate {@link ContentController} for handling a {@link SiteTree} object, link it to the object and
* return it.
@ -31,15 +31,15 @@ class ModelAsController extends Controller implements NestedController {
if($action && class_exists($controller . '_' . ucfirst($action))) {
$controller = $controller . '_' . ucfirst($action);
}
return class_exists($controller) ? Injector::inst()->create($controller, $sitetree) : $sitetree;
}
public function init() {
singleton('SiteTree')->extend('modelascontrollerInit', $this);
parent::init();
}
/**
* @uses ModelAsController::getNestedController()
* @param SS_HTTPRequest $request
@ -49,7 +49,7 @@ class ModelAsController extends Controller implements NestedController {
public function handleRequest(SS_HTTPRequest $request, DataModel $model) {
$this->setRequest($request);
$this->setDataModel($model);
$this->pushCurrent();
// Create a response just in case init() decides to redirect
@ -67,64 +67,64 @@ class ModelAsController extends Controller implements NestedController {
if(!DB::is_active() || !ClassInfo::hasTable('SiteTree')) {
$this->response->redirect(Director::absoluteBaseURL() . 'dev/build?returnURL=' . (isset($_GET['url']) ? urlencode($_GET['url']) : null));
$this->popCurrent();
return $this->response;
}
try {
$result = $this->getNestedController();
if($result instanceof RequestHandler) {
$result = $result->handleRequest($this->getRequest(), $model);
} else if(!($result instanceof SS_HTTPResponse)) {
user_error("ModelAsController::getNestedController() returned bad object type '" .
user_error("ModelAsController::getNestedController() returned bad object type '" .
get_class($result)."'", E_USER_WARNING);
}
} catch(SS_HTTPResponse_Exception $responseException) {
$result = $responseException->getResponse();
}
$this->popCurrent();
return $result;
}
/**
* @return ContentController
* @throws Exception If URLSegment not passed in as a request parameter.
*/
public function getNestedController() {
$request = $this->getRequest();
if(!$URLSegment = $request->param('URLSegment')) {
throw new Exception('ModelAsController->getNestedController(): was not passed a URLSegment value.');
}
// Find page by link, regardless of current locale settings
if(class_exists('Translatable')) Translatable::disable_locale_filter();
// 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) {
$response = ErrorPage::response_for(404);
$this->httpError(404, $response ? $response : 'The requested page could not be found.');
}
// Enforce current locale setting to the loaded SiteTree object
if(class_exists('Translatable') && $sitetree->Locale) Translatable::set_current_locale($sitetree->Locale);
if(isset($_REQUEST['debug'])) {
Debug::message("Using record #$sitetree->ID of type $sitetree->class with link {$sitetree->Link()}");
}
return self::controller_for($sitetree, $this->getRequest()->param('Action'));
}
@ -139,7 +139,7 @@ class ModelAsController extends Controller implements NestedController {
static public function find_old_page($URLSegment, $parent = null, $ignoreNestedURLs = false) {
Deprecation::notice('4.0', 'Use OldPageRedirector::find_old_page instead');
if ($parent) {
$parent = SiteTree::get()->byId($parent);
$parent = SiteTree::get()->byId($parent);
}
$url = OldPageRedirector::find_old_page(array($URLSegment), $parent);
return SiteTree::get_by_link($url);

View File

@ -1,6 +1,6 @@
<?php
/**
* Interface that is implemented by controllers that are designed to hand control over to another controller.
* Interface that is implemented by controllers that are designed to hand control over to another controller.
* ModelAsController, which selects up a SiteTree object and passes control over to a suitable subclass of ContentController, is a good
* example of this.
* @package cms

View File

@ -39,7 +39,7 @@ class OldPageRedirector extends Extension {
* @return string|boolean False, or the new URL
*/
static public function find_old_page($params, $parent = null, $redirect = false) {
$parent = is_numeric($parent) ? SiteTree::get()->byId($parent) : $parent;
$parent = is_numeric($parent) ? SiteTree::get()->byId($parent) : $parent;
$params = (array)$params;
$URL = rawurlencode(array_shift($params));
if (empty($URL)) { return false; }

View File

@ -4,23 +4,23 @@
* @subpackage control
*/
class RootURLController extends Controller {
/**
* @var bool
*/
protected static $is_at_root = false;
/**
* @config
* @var string
*/
private static $default_homepage_link = 'home';
/**
* @var string
*/
protected static $cached_homepage_link;
/**
* Get the full form (e.g. /home/) relative link to the home page for the current HTTP_HOST value. Note that the
* link is trimmed of leading and trailing slashes before returning to ensure consistency.
@ -41,7 +41,7 @@ class RootURLController extends Controller {
}
}
}
if(!self::$cached_homepage_link) {
// TODO Move to 'translatable' module
if (
@ -55,10 +55,10 @@ class RootURLController extends Controller {
}
}
}
return self::$cached_homepage_link;
}
/**
* Set the URL Segment used for your homepage when it is created by dev/build.
* This allows you to use home page URLs other than the default "home".
@ -81,7 +81,7 @@ class RootURLController extends Controller {
Deprecation::notice('4.0', 'Use the "RootURLController.default_homepage_link" config setting instead');
return Config::inst()->get('RootURLController', 'default_homepage_link');
}
/**
* Returns TRUE if a request to a certain page should be redirected to the site root (i.e. if the page acts as the
* home page).
@ -95,17 +95,17 @@ class RootURLController extends Controller {
class_exists('Translatable') && $page->hasExtension('Translatable') && $page->Locale && $page->Locale != Translatable::default_locale()
);
}
return false;
}
/**
* Resets the cached homepage link value - useful for testing.
*/
static public function reset() {
self::$cached_homepage_link = null;
}
/**
* @param SS_HTTPRequest $request
* @param DataModel|null $model
@ -114,24 +114,24 @@ class RootURLController extends Controller {
public function handleRequest(SS_HTTPRequest $request, DataModel $model = null) {
self::$is_at_root = true;
$this->setDataModel($model);
$this->pushCurrent();
$this->init();
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;
}
$request->setUrl(self::get_homepage_link() . '/');
$request->match('$URLSegment//$Action', true);
$controller = new ModelAsController();
$result = $controller->handleRequest($request, $model);
$this->popCurrent();
return $result;
}
}

View File

@ -4,21 +4,21 @@
* for CMS authors, usually for {@link SiteTree} objects with "stage" and "live" links.
* Useful both in the CMS and alongside the page template (for logged in authors).
* The class can be used for any {@link DataObject} subclass implementing the {@link CMSPreviewable} interface.
*
*
* New item types can be defined by extending the {@link SilverStripeNavigatorItem} class,
* for example the "cmsworkflow" module defines a new "future state" item with a date selector
* to view embargoed data at a future point in time. So the item doesn't always have to be a simple link.
*
*
* @package cms
* @subpackage content
*/
class SilverStripeNavigator extends ViewableData {
/**
* @var DataObject
*/
protected $record;
/**
* @param DataObject $record
* @throws InvalidArgumentException if record doesn't implement CMSPreviewable
@ -30,7 +30,7 @@ class SilverStripeNavigator extends ViewableData {
get_class($record)
));
}
$this->record = $record;
}
@ -39,26 +39,26 @@ class SilverStripeNavigator extends ViewableData {
*/
public function getItems() {
$items = array();
$classes = ClassInfo::subclassesFor('SilverStripeNavigatorItem');
array_shift($classes);
// Sort menu items according to priority
$i = 0;
foreach($classes as $class) {
// Skip base class
if($class == 'SilverStripeNavigatorItem') continue;
$i++;
$item = new $class($this->record);
if(!$item->canView()) continue;
// This funny litle formula ensures that the first item added with the same priority will be left-most.
$priority = $item->getPriority() * 100 - 1;
// Ensure that we can have duplicates with the same (default) priority
while(isset($items[$priority])) $priority++;
$items[$priority] = $item;
}
ksort($items);
@ -66,7 +66,7 @@ class SilverStripeNavigator extends ViewableData {
// Drop the keys and let the ArrayList handle the numbering, so $First, $Last and others work properly.
return new ArrayList(array_values($items));
}
/**
* @return DataObject
*/
@ -83,13 +83,13 @@ class SilverStripeNavigator extends ViewableData {
$message = '';
$navigator = new SilverStripeNavigator($record);
$items = $navigator->getItems();
foreach($items as $item) {
foreach($items as $item) {
$text = $item->getHTML();
if($text) $html .= $text;
$newMessage = $item->getMessage();
if($newMessage && $item->isActive()) $message = $newMessage;
}
return array(
'items' => $html,
'message' => $message
@ -101,24 +101,24 @@ class SilverStripeNavigator extends ViewableData {
* Navigator items are links that appear in the $SilverStripeNavigator bar.
* To add an item, extend this class - it will be automatically picked up.
* When instanciating items manually, please ensure to call {@link canView()}.
*
*
* @package cms
* @subpackage content
*/
class SilverStripeNavigatorItem extends ViewableData {
/**
* @param DataObject
*/
protected $record;
/**
* @param DataObject
*/
public function __construct($record) {
$this->record = $record;
}
/**
* @return String HTML, mostly a link - but can be more complex as well.
* For example, a "future state" item might show a date selector.
@ -130,7 +130,7 @@ class SilverStripeNavigatorItem extends ViewableData {
* Get the Title of an item
*/
public function getTitle() {}
/**
* Machine-friendly name.
*/
@ -142,44 +142,44 @@ class SilverStripeNavigatorItem extends ViewableData {
* Optional link to a specific view of this record.
* Not all items are simple links, please use {@link getHTML()}
* to represent an item in markup unless you know what you're doing.
*
*
* @return String
*/
public function getLink() {}
/**
* @return String
*/
public function getMessage() {}
/**
* @return DataObject
*/
public function getRecord() {
return $this->record;
}
}
/**
* @return Int
*/
public function getPriority() {
return $this->stat('priority');
}
/**
* As items might convey different record states like a "stage" or "live" table,
* an item can be active (showing the record in this state).
*
*
* @return boolean
*/
public function isActive() {
return false;
}
/**
* Filters items based on member permissions or other criteria,
* such as if a state is generally available for the current record.
*
*
* @param Member
* @return Boolean
*/
@ -189,12 +189,12 @@ class SilverStripeNavigatorItem extends ViewableData {
/**
* Counts as "archived" if the current record is a different version from both live and draft.
*
*
* @return boolean
*/
public function isArchived() {
if(!$this->record->hasExtension('Versioned')) return false;
if(!isset($this->record->_cached_isArchived)) {
$baseTable = ClassInfo::baseDataClass($this->record->class);
$currentDraft = Versioned::get_one_by_stage($baseTable, 'Stage', array(
@ -203,9 +203,9 @@ class SilverStripeNavigatorItem extends ViewableData {
$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))
(!$currentDraft || ($currentDraft && $this->record->Version != $currentDraft->Version))
&& (!$currentLive || ($currentLive && $this->record->Version != $currentLive->Version))
);
}
@ -220,8 +220,8 @@ class SilverStripeNavigatorItem extends ViewableData {
*/
class SilverStripeNavigatorItem_CMSLink extends SilverStripeNavigatorItem {
/** @config */
private static $priority = 10;
private static $priority = 10;
public function getHTML() {
return sprintf(
'<a href="%s">%s</a>',
@ -229,19 +229,19 @@ class SilverStripeNavigatorItem_CMSLink extends SilverStripeNavigatorItem {
_t('ContentController.CMS', 'CMS')
);
}
public function getTitle() {
return _t('ContentController.CMS', 'CMS', 'Used in navigation. Should be a short label');
return _t('ContentController.CMS', 'CMS', 'Used in navigation. Should be a short label');
}
public function getLink() {
return $this->record->CMSEditLink();
}
public function isActive() {
return (Controller::curr() instanceof LeftAndMain);
}
public function canView($member = null) {
return (
// Don't show in CMS
@ -272,37 +272,37 @@ class SilverStripeNavigatorItem_StageLink extends SilverStripeNavigatorItem {
public function getTitle() {
return _t('ContentController.DRAFT', 'Draft', 'Used for the Switch between draft and published view mode. Needs to be a short label');
}
public function getMessage() {
return "<div id=\"SilverStripeNavigatorMessage\" title=\"". _t('ContentControl.NOTEWONTBESHOWN', 'Note: this message will not be shown to your visitors') ."\">". _t('ContentController.DRAFTSITE', 'Draft Site') ."</div>";
}
public function getLink() {
$date = Versioned::current_archived_date();
return Controller::join_links(
$this->record->PreviewLink(),
$this->record->PreviewLink(),
'?stage=Stage',
$date ? '?archiveDate=' . $date : null
);
}
public function canView($member = null) {
return (
$this->record->hasExtension('Versioned')
$this->record->hasExtension('Versioned')
&& $this->getDraftPage()
// Don't follow redirects in preview, they break the CMS editing form
&& !($this->record instanceof RedirectorPage)
);
}
public function isActive() {
return (
Versioned::current_stage() == 'Stage'
Versioned::current_stage() == 'Stage'
&& !(ClassInfo::exists('SiteTreeFutureState') && SiteTreeFutureState::get_future_datetime())
&& !$this->isArchived()
);
}
protected function getDraftPage() {
$baseTable = ClassInfo::baseDataClass($this->record->class);
return Versioned::get_one_by_stage($baseTable, 'Stage', array(
@ -330,31 +330,31 @@ class SilverStripeNavigatorItem_LiveLink extends SilverStripeNavigatorItem {
public function getTitle() {
return _t('ContentController.PUBLISHED', 'Published', 'Used for the Switch between draft and published view mode. Needs to be a short label');
}
public function getMessage() {
return "<div id=\"SilverStripeNavigatorMessage\" title=\"". _t('ContentControl.NOTEWONTBESHOWN', 'Note: this message will not be shown to your visitors') ."\">". _t('ContentController.PUBLISHEDSITE', 'Published Site') ."</div>";
}
public function getLink() {
return Controller::join_links($this->record->PreviewLink(), '?stage=Live');
}
public function canView($member = null) {
return (
$this->record->hasExtension('Versioned')
$this->record->hasExtension('Versioned')
&& $this->getLivePage()
// Don't follow redirects in preview, they break the CMS editing form
&& !($this->record instanceof RedirectorPage)
);
}
public function isActive() {
return (
(!Versioned::current_stage() || Versioned::current_stage() == 'Live')
&& !$this->isArchived()
);
}
protected function getLivePage() {
$baseTable = ClassInfo::baseDataClass($this->record->class);
return Versioned::get_one_by_stage($baseTable, 'Live', array(
@ -375,31 +375,31 @@ class SilverStripeNavigatorItem_ArchiveLink extends SilverStripeNavigatorItem {
$this->recordLink = $this->record->AbsoluteLink();
return "<a class=\"ss-ui-button". ($this->isActive() ? ' current' : '') ."\" href=\"$this->recordLink?archiveDate={$this->record->LastEdited}\" target=\"_blank\">". _t('ContentController.ARCHIVEDSITE', 'Preview version') ."</a>";
}
public function getTitle() {
return _t('SilverStripeNavigator.ARCHIVED', 'Archived');
}
public function getMessage() {
public function getMessage() {
if($date = Versioned::current_archived_date()) {
$dateObj = DBField::create_field('Datetime', $date);
return "<div id=\"SilverStripeNavigatorMessage\" title=\"". _t('ContentControl.NOTEWONTBESHOWN', 'Note: this message will not be shown to your visitors') ."\">". _t('ContentController.ARCHIVEDSITEFROM', 'Archived site from') ."<br>" . $dateObj->Nice() . "</div>";
}
}
public function getLink() {
return $this->record->PreviewLink() . '?archiveDate=' . urlencode($this->record->LastEdited);
}
public function canView($member = null) {
return (
$this->record->hasExtension('Versioned')
$this->record->hasExtension('Versioned')
&& $this->isArchived()
// Don't follow redirects in preview, they break the CMS editing form
&& !($this->record instanceof RedirectorPage)
);
}
public function isActive() {
return $this->isArchived();
}