mirror of
https://github.com/silverstripe/silverstripe-cms
synced 2024-10-22 08:05:56 +02:00
Merged from branches/2.3
git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/cms/trunk@77023 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
b62bb7ab77
commit
c69994f98f
129
code/CMSMain.php
129
code/CMSMain.php
@ -185,7 +185,7 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
|||||||
|
|
||||||
public function getfilteredsubtree() {
|
public function getfilteredsubtree() {
|
||||||
// Get the tree
|
// Get the tree
|
||||||
$tree = $this->getSiteTreeFor($this->stat('tree_class'), $_REQUEST['ID'], null, 'cmsMainMarkingFilterFunction');
|
$tree = $this->getSiteTreeFor($this->stat('tree_class'), $_REQUEST['ID'], null, array(new CMSMainMarkingFilter(), 'mark'));
|
||||||
|
|
||||||
// Trim off the outer tag
|
// Trim off the outer tag
|
||||||
$tree = ereg_replace('^[ \t\r\n]*<ul[^>]*>','', $tree);
|
$tree = ereg_replace('^[ \t\r\n]*<ul[^>]*>','', $tree);
|
||||||
@ -602,7 +602,7 @@ JS;
|
|||||||
*/
|
*/
|
||||||
public function revert($urlParams, $form) {
|
public function revert($urlParams, $form) {
|
||||||
$id = (int)$_REQUEST['ID'];
|
$id = (int)$_REQUEST['ID'];
|
||||||
$record = Versioned::get_one_by_stage('SiteTree', 'Live', "`SiteTree_Live`.`ID` = {$id}");
|
$record = Versioned::get_one_by_stage('SiteTree', 'Live', "\"SiteTree_Live\".\"ID\" = '{$id}'");
|
||||||
|
|
||||||
// a user can restore a page without publication rights, as it just adds a new draft state
|
// 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")
|
// (this action should just be available when page has been "deleted from draft")
|
||||||
@ -1284,75 +1284,72 @@ JS;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$filterCache = array();
|
class CMSMainMarkingFilter {
|
||||||
|
|
||||||
// TODO: Find way to put this in a class
|
|
||||||
function cmsMainMarkingFilterFunction($node) {
|
|
||||||
global $filterCache;
|
|
||||||
// Expand all nodes
|
|
||||||
// $node->markingFinished();
|
|
||||||
|
|
||||||
$failed_filter = false;
|
|
||||||
// First check for the generic search term in the URLSegment, Title, MenuTitle, & Content
|
|
||||||
if (!empty($_REQUEST['SiteTreeSearchTerm'])) {
|
|
||||||
// For childless nodes, show only those matching the filter
|
|
||||||
$filter = strtolower($_REQUEST['SiteTreeSearchTerm']);
|
|
||||||
if ( strpos( strtolower($node->URLSegment) , $filter) === false
|
|
||||||
&& strpos( strtolower($node->Title) , $filter) === false
|
|
||||||
&& strpos( strtolower($node->MenuTitle) , $filter) === false
|
|
||||||
&& strpos( strtolower($node->Content) , $filter) === false) {
|
|
||||||
$failed_filter = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Check the 'Edited Since' date
|
|
||||||
if (!empty($_REQUEST['SiteTreeFilterDate'])) {
|
|
||||||
$edited_since = mktime(0, 0, 0, substr($_REQUEST['SiteTreeFilterDate'], 3, 2),
|
|
||||||
substr($_REQUEST['SiteTreeFilterDate'], 0, 2), substr($_REQUEST['SiteTreeFilterDate'], 6, 4));
|
|
||||||
if ( strtotime($node->LastEdited) < $edited_since ) {
|
|
||||||
$failed_filter = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Check the ClassName
|
|
||||||
if (!empty($_REQUEST['ClassName']) && $_REQUEST['ClassName'] != 'Any') {
|
|
||||||
if ($node->ClassName != $_REQUEST['ClassName']) $failed_filter = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Now check if a specified Criteria attribute matches
|
function __construct() {
|
||||||
foreach (CMSMain::T_SiteTreeFilterOptions() as $key => $value)
|
$this->ids = array();
|
||||||
{
|
$this->expanded = array();
|
||||||
if (!empty($_REQUEST[$key])) {
|
|
||||||
$parameterName = $key;
|
$where = array();
|
||||||
$filter = strtolower($_REQUEST[$key]);
|
|
||||||
// Show node only if the filter string exists anywere in the filter paramater (ignoring case)
|
// Match against URLSegment, Title, MenuTitle & Content
|
||||||
if (strpos( strtolower($node->$parameterName) , $filter) === false) {
|
if (isset($_REQUEST['SiteTreeSearchTerm'])) {
|
||||||
$failed_filter = true;
|
$term = Convert::raw2sql($_REQUEST['SiteTreeSearchTerm']);
|
||||||
|
$where[] = "\"URLSegment\" LIKE '%$term%' OR \"Title\" LIKE '%$term%' OR \"MenuTitle\" LIKE '%$term%' OR \"Content\" LIKE '%$term%'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Match against date
|
||||||
|
if (isset($_REQUEST['SiteTreeFilterDate'])) {
|
||||||
|
$date = $_REQUEST['SiteTreeFilterDate'];
|
||||||
|
$date = ((int)substr($date,6,4)) . '-' . ((int)substr($date,3,2)) . '-' . ((int)substr($date,0,2));
|
||||||
|
$where[] = "\"LastEdited\" > '$date'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Match against exact ClassName
|
||||||
|
if (isset($_REQUEST['ClassName']) && $_REQUEST['ClassName'] != 'All') {
|
||||||
|
$klass = Convert::raw2sql($_REQUEST['ClassName']);
|
||||||
|
$where[] = "\"ClassName\" = '$klass'";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Partial string match against a variety of fields
|
||||||
|
foreach (CMSMain::T_SiteTreeFilterOptions() as $key => $value) {
|
||||||
|
if (!empty($_REQUEST[$key])) {
|
||||||
|
$match = Convert::raw2sql($_REQUEST[$key]);
|
||||||
|
$where[] = "\"$key\" LIKE '%$match%'";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$where = empty($where) ? '' : 'WHERE (' . implode(') AND (',$where) . ')';
|
||||||
|
|
||||||
|
$parents = array();
|
||||||
|
|
||||||
|
/* Do the actual search */
|
||||||
|
$res = DB::query('SELECT "ParentID", "ID" FROM "SiteTree" '.$where);
|
||||||
|
if (!$res) return;
|
||||||
|
|
||||||
|
/* And keep a record of parents we don't need to get parents of themselves, as well as IDs to mark */
|
||||||
|
foreach($res as $row) {
|
||||||
|
if ($row['ParentID']) $parents[$row['ParentID']] = true;
|
||||||
|
$this->ids[$row['ID']] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We need to recurse up the tree, finding ParentIDs for each ID until we run out of parents */
|
||||||
|
while (!empty($parents)) {
|
||||||
|
$res = DB::query('SELECT "ParentID", "ID" FROM "SiteTree" WHERE "ID" in ('.implode(',',array_keys($parents)).')');
|
||||||
|
$parents = array();
|
||||||
|
|
||||||
|
foreach($res as $row) {
|
||||||
|
if ($row['ParentID']) $parents[$row['ParentID']] = true;
|
||||||
|
$this->ids[$row['ID']] = true;
|
||||||
|
$this->expanded[$row['ID']] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Each filter must match or it fails
|
|
||||||
if (true == $failed_filter) {
|
|
||||||
// Don't ever hide nodes with children, because otherwise if one of their children matches the search, it wouldn't be shown.
|
|
||||||
if($node->AllChildrenIncludingDeleted()->count() > 0) {
|
|
||||||
// Open all nodes with children so it is easy to see any children that match the search.
|
|
||||||
|
|
||||||
foreach($node->AllChildrenIncludingDeleted() as $childNode) {
|
|
||||||
if(cmsMainMarkingFilterFunction($childNode)) {
|
|
||||||
$node->markOpened();
|
|
||||||
$filterCache[$node->ID] = true;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$filterCache[$node->ID] = false;
|
function mark($node) {
|
||||||
return false;
|
$id = $node->ID;
|
||||||
} else {
|
if (array_key_exists($id, $this->expanded)) $node->markOpened();
|
||||||
if($node->AllChildrenIncludingDeleted()->count() > 0) {
|
return array_key_exists($id, $this->ids) ? $this->ids[$id] : false;
|
||||||
$node->markOpened();
|
|
||||||
}
|
|
||||||
|
|
||||||
$filterCache[$node->ID] = true;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -780,6 +780,7 @@ JS;
|
|||||||
$parentID = 0;
|
$parentID = 0;
|
||||||
}
|
}
|
||||||
$_REQUEST['ajax'] = 1;
|
$_REQUEST['ajax'] = 1;
|
||||||
|
$cleanupJS = '';
|
||||||
|
|
||||||
if(is_numeric($id) && is_numeric($parentID) && $id != $parentID) {
|
if(is_numeric($id) && is_numeric($parentID) && $id != $parentID) {
|
||||||
$node = DataObject::get_by_id($this->stat('tree_class'), $id);
|
$node = DataObject::get_by_id($this->stat('tree_class'), $id);
|
||||||
@ -1104,8 +1105,10 @@ JS;
|
|||||||
*/
|
*/
|
||||||
function callPageMethod($data, $form) {
|
function callPageMethod($data, $form) {
|
||||||
$methodName = $form->buttonClicked()->extraData();
|
$methodName = $form->buttonClicked()->extraData();
|
||||||
$record = $this->CurrentPage();
|
$record = $this->currentPage();
|
||||||
return $record->$methodName($data, $form);
|
if(!$record) return false;
|
||||||
|
|
||||||
|
return $record->$methodName($data, $form);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -198,7 +198,16 @@ SiteTreeFilterForm.prototype = {
|
|||||||
onsubmit: function() {
|
onsubmit: function() {
|
||||||
var filters = $H();
|
var filters = $H();
|
||||||
|
|
||||||
if (this.clicked == 'Search') {
|
if (this.clicked == 'Clear') {
|
||||||
|
Form.getElements(this).each(function(el){
|
||||||
|
if (el.type == 'text') el.value = '';
|
||||||
|
else if (el.type == 'select-one') el.value = 'All';
|
||||||
|
});
|
||||||
|
document.getElementsBySelector('.SearchCriteriaContainer', this).each(function(el){
|
||||||
|
Element.hide(el);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else {
|
||||||
Form.getElements(this).each(function(el){
|
Form.getElements(this).each(function(el){
|
||||||
if (el.type == 'text') {
|
if (el.type == 'text') {
|
||||||
if ($F(el)) filters[el.name] = $F(el);
|
if ($F(el)) filters[el.name] = $F(el);
|
||||||
@ -208,15 +217,6 @@ SiteTreeFilterForm.prototype = {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
Form.getElements(this).each(function(el){
|
|
||||||
if (el.type == 'text') el.value = '';
|
|
||||||
else if (el.type == 'select-one') el.value = 'All';
|
|
||||||
});
|
|
||||||
document.getElementsBySelector('.SearchCriteriaContainer', this).each(function(el){
|
|
||||||
Element.hide(el);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
if (filters.keys().length) {
|
if (filters.keys().length) {
|
||||||
// Set new URL
|
// Set new URL
|
||||||
|
Loading…
Reference in New Issue
Block a user