mirror of
https://github.com/silverstripe/silverstripe-reports
synced 2024-10-22 09:05:53 +00:00
API CHANGE Removed CMSSiteTreeFilter->showInList(), using custom logic in CMSMain->SearchTreeForm() instead
API CHANGE Returning arrays instead of Query resource from CMSSiteTreeFilter->pagesIncluded() MINOR Removed unused LeftAndMain->getMarkingFilter() and CMSMainMarkingFilter, now handled by CMSSiteTreeFilter and CMSMain->SearchTreeForm() ENHANCEMENT Moved 'page tree filter' dropdown logic into an additional option for CMSMain->SearchTreeForm() (originally implemented in r83674) git-svn-id: svn://svn.silverstripe.com/silverstripe/open/modules/cms/trunk@92938 467b73ca-7a2a-4603-9d3b-597d59a354a9
This commit is contained in:
parent
7a1e3a9bda
commit
a5070b858a
@ -134,10 +134,6 @@ class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionPr
|
|||||||
return $this->getSiteTreeFor($this->stat('tree_class'));
|
return $this->getSiteTreeFor($this->stat('tree_class'));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getMarkingFilter($params) {
|
|
||||||
return new CMSMainMarkingFilter($params);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function generateDataTreeHints() {
|
public function generateDataTreeHints() {
|
||||||
$classes = ClassInfo::subclassesFor( $this->stat('tree_class') );
|
$classes = ClassInfo::subclassesFor( $this->stat('tree_class') );
|
||||||
|
|
||||||
@ -1055,20 +1051,24 @@ JS;
|
|||||||
array_shift($filters);
|
array_shift($filters);
|
||||||
// add filters to map
|
// add filters to map
|
||||||
foreach($filters as $filter) {
|
foreach($filters as $filter) {
|
||||||
if(!call_user_func(array($filter, 'showInList'))) continue;
|
|
||||||
|
|
||||||
$filterMap[$filter] = call_user_func(array($filter, 'title'));
|
$filterMap[$filter] = call_user_func(array($filter, 'title'));
|
||||||
}
|
}
|
||||||
|
// ensure that 'all pages' filter is on top position
|
||||||
|
uasort($filterMap,
|
||||||
|
create_function('$a,$b', 'return ($a == "CMSSiteTreeFilter_Search") ? 1 : -1;')
|
||||||
|
);
|
||||||
|
|
||||||
|
$showDefaultFields = array();
|
||||||
$form = new Form(
|
$form = new Form(
|
||||||
$this,
|
$this,
|
||||||
'SearchTreeForm',
|
'SearchTreeForm',
|
||||||
new FieldSet(
|
new FieldSet(
|
||||||
new TextField(
|
// TODO i18n
|
||||||
|
$showDefaultFields[] = new DropdownField('FilterClass', 'Pages', $filterMap),
|
||||||
|
$showDefaultFields[] = new TextField(
|
||||||
'Title',
|
'Title',
|
||||||
_t('CMSMain.TITLEOPT', 'Title')
|
_t('CMSMain.TITLEOPT', 'Title')
|
||||||
),
|
),
|
||||||
new DropdownField('filter', 'Type', $filterMap, null, null, 'Any'),
|
|
||||||
new TextField('Content', 'Text'),
|
new TextField('Content', 'Text'),
|
||||||
new CalendarDateField('EditedSince', _t('CMSMain_left.ss.EDITEDSINCE','Edited Since')),
|
new CalendarDateField('EditedSince', _t('CMSMain_left.ss.EDITEDSINCE','Edited Since')),
|
||||||
new DropdownField('ClassName', 'Page Type', $pageTypes, null, null, 'Any'),
|
new DropdownField('ClassName', 'Page Type', $pageTypes, null, null, 'Any'),
|
||||||
@ -1100,8 +1100,12 @@ JS;
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
$form->setFormMethod('GET');
|
||||||
|
$form->disableSecurityToken();
|
||||||
$form->unsetValidator();
|
$form->unsetValidator();
|
||||||
|
|
||||||
|
foreach($showDefaultFields as $f) $f->addExtraClass('show-default');
|
||||||
|
|
||||||
return $form;
|
return $form;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1342,46 +1346,4 @@ JS;
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class CMSMainMarkingFilter extends LeftAndMainMarkingFilter{
|
|
||||||
|
|
||||||
protected function getQuery($params) {
|
|
||||||
$where = array();
|
|
||||||
|
|
||||||
$SQL_params = Convert::raw2sql($params);
|
|
||||||
foreach($SQL_params as $name => $val) {
|
|
||||||
switch($name) {
|
|
||||||
// Match against URLSegment, Title, MenuTitle & Content
|
|
||||||
case 'SiteTreeSearchTerm':
|
|
||||||
$where[] = "\"URLSegment\" LIKE '%$val%' OR \"Title\" LIKE '%$val%' OR \"MenuTitle\" LIKE '%$val%' OR \"Content\" LIKE '%$val%'";
|
|
||||||
break;
|
|
||||||
// Match against date
|
|
||||||
case 'SiteTreeFilterDate':
|
|
||||||
$val = ((int)substr($val,6,4))
|
|
||||||
. '-' . ((int)substr($val,3,2))
|
|
||||||
. '-' . ((int)substr($val,0,2));
|
|
||||||
$where[] = "\"LastEdited\" > '$val'";
|
|
||||||
break;
|
|
||||||
// Match against exact ClassName
|
|
||||||
case 'ClassName':
|
|
||||||
if($val && $val != 'All') {
|
|
||||||
$where[] = "\"ClassName\" = '$val'";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// Partial string match against a variety of fields
|
|
||||||
if(!empty($val) && singleton("SiteTree")->hasDatabaseField($name)) {
|
|
||||||
$where[] = "\"$name\" LIKE '%$val%'";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new SQLQuery(
|
|
||||||
array("ParentID", "ID"),
|
|
||||||
'SiteTree',
|
|
||||||
$where
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
?>
|
@ -15,150 +15,208 @@
|
|||||||
*/
|
*/
|
||||||
abstract class CMSSiteTreeFilter extends Object {
|
abstract class CMSSiteTreeFilter extends Object {
|
||||||
|
|
||||||
protected $ids = null;
|
/**
|
||||||
protected $expanded = array();
|
* @var Array Search parameters, mostly properties on {@link SiteTree}.
|
||||||
|
* Caution: Unescaped data.
|
||||||
|
*/
|
||||||
|
protected $params = array();
|
||||||
|
|
||||||
static function showInList() {
|
/**
|
||||||
return true;
|
* @var Array
|
||||||
}
|
*/
|
||||||
|
protected $_cache_ids = null;
|
||||||
|
|
||||||
function getTree() {
|
/**
|
||||||
if(method_exists($this, 'pagesIncluded')) {
|
* @var Array
|
||||||
$this->populateIDs();
|
*/
|
||||||
}
|
protected $_cache_expanded = array();
|
||||||
|
|
||||||
$leftAndMain = new LeftAndMain();
|
/**
|
||||||
$tree = $leftAndMain->getSiteTreeFor('SiteTree', isset($_REQUEST['ID']) ? $_REQUEST['ID'] : 0, null, array($this, 'includeInTree'));
|
* @var String
|
||||||
|
*/
|
||||||
|
protected $childrenMethod = null;
|
||||||
|
|
||||||
// Trim off the outer tag
|
function __construct($params = null) {
|
||||||
$tree = ereg_replace('^[ \t\r\n]*<ul[^>]*>','', $tree);
|
if($params) $this->params = $params;
|
||||||
$tree = ereg_replace('</ul[^>]*>[ \t\r\n]*$','', $tree);
|
|
||||||
|
|
||||||
return $tree;
|
parent::__construct();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Populate $this->ids with the IDs of the pages returned by pagesIncluded(), also including
|
* @return String Method on {@link Hierarchy} objects
|
||||||
|
* which is used to traverse into children relationships.
|
||||||
|
*/
|
||||||
|
function getChildrenMethod() {
|
||||||
|
return $this->childrenMethod;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Array Map of Page IDs to their respective ParentID values.
|
||||||
|
*/
|
||||||
|
function pagesIncluded() {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Populate the IDs of the pages returned by pagesIncluded(), also including
|
||||||
* the necessary parent helper pages.
|
* the necessary parent helper pages.
|
||||||
*/
|
*/
|
||||||
protected function populateIDs() {
|
protected function populateIDs() {
|
||||||
if($res = $this->pagesIncluded()) {
|
$parents = array();
|
||||||
|
$this->_cache_ids = array();
|
||||||
|
|
||||||
/* And keep a record of parents we don't need to get parents of themselves, as well as IDs to mark */
|
if($pages = $this->pagesIncluded()) {
|
||||||
foreach($res as $row) {
|
|
||||||
if ($row['ParentID']) $parents[$row['ParentID']] = true;
|
// And keep a record of parents we don't need to get
|
||||||
$this->ids[$row['ID']] = true;
|
// parents of themselves, as well as IDs to mark
|
||||||
|
foreach($pages as $pageArr) {
|
||||||
|
$parents[$pageArr['ParentID']] = true;
|
||||||
|
$this->_cache_ids[$pageArr['ID']] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!empty($parents)) {
|
||||||
|
$q = new SQLQuery();
|
||||||
|
$q->select(array('ID','ParentID'))
|
||||||
|
->from('SiteTree')
|
||||||
|
->where('"ID" in ('.implode(',',array_keys($parents)).')');
|
||||||
|
|
||||||
while (!empty($parents)) {
|
foreach($q->execute() as $row) {
|
||||||
$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;
|
if ($row['ParentID']) $parents[$row['ParentID']] = true;
|
||||||
$this->ids[$row['ID']] = true;
|
$this->_cache_ids[$row['ID']] = true;
|
||||||
$this->expanded[$row['ID']] = true;
|
$this->_cache_expanded[$row['ID']] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns true if the given page should be included in the tree.
|
* Returns TRUE if the given page should be included in the tree.
|
||||||
|
* Caution: Does NOT check view permissions on the page.
|
||||||
|
*
|
||||||
|
* @param SiteTree $page
|
||||||
|
* @return Boolean
|
||||||
*/
|
*/
|
||||||
public function includeInTree($page) {
|
public function isPageIncluded($page) {
|
||||||
return isset($this->ids[$page->ID]) && $this->ids[$page->ID] ? true : false;
|
if($this->_cache_ids === NULL) $this->populateIDs();
|
||||||
|
|
||||||
|
return (isset($this->_cache_ids[$page->ID]) && $this->_cache_ids[$page->ID]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
class CMSSiteTreeFilter_DeletedPages extends CMSSiteTreeFilter {
|
class CMSSiteTreeFilter_DeletedPages extends CMSSiteTreeFilter {
|
||||||
|
|
||||||
|
protected $childrenMethod = "AllHistoricalChildren";
|
||||||
|
|
||||||
static function title() {
|
static function title() {
|
||||||
|
// TODO i18n
|
||||||
return "Deleted pages";
|
return "Deleted pages";
|
||||||
}
|
}
|
||||||
|
|
||||||
function getTree() {
|
function pagesIncluded() {
|
||||||
$leftAndMain = new LeftAndMain();
|
$ids = array();
|
||||||
$tree = $leftAndMain->getSiteTreeFor('SiteTree', isset($_REQUEST['ID']) ? $_REQUEST['ID'] : 0, "AllHistoricalChildren");
|
// TODO Not very memory efficient, but usually not very many deleted pages exist
|
||||||
|
$pages = Versioned::get_including_deleted('SiteTree');
|
||||||
// Trim off the outer tag
|
if($pages) foreach($pages as $page) {
|
||||||
$tree = ereg_replace('^[ \t\r\n]*<ul[^>]*>','', $tree);
|
$ids[] = array('ID' => $page->ID, 'ParentID' => $page->ParentID);
|
||||||
$tree = ereg_replace('</ul[^>]*>[ \t\r\n]*$','', $tree);
|
}
|
||||||
|
return $ids;
|
||||||
return $tree;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets all pages which have changed on stage.
|
||||||
|
*
|
||||||
|
* @package cms
|
||||||
|
* @subpackage content
|
||||||
|
*/
|
||||||
class CMSSiteTreeFilter_ChangedPages extends CMSSiteTreeFilter {
|
class CMSSiteTreeFilter_ChangedPages extends CMSSiteTreeFilter {
|
||||||
|
|
||||||
static function title() {
|
static function title() {
|
||||||
|
// TODO i18n
|
||||||
return "Changed pages";
|
return "Changed pages";
|
||||||
}
|
}
|
||||||
|
|
||||||
function pagesIncluded() {
|
function pagesIncluded() {
|
||||||
return DB::query('SELECT "ParentID", "ID" FROM "SiteTree" WHERE "Status" LIKE \'Saved%\'');
|
$ids = array();
|
||||||
|
$q = new SQLQuery();
|
||||||
|
$q->select(array('"SiteTree"."ID"','"SiteTree"."ParentID"'))
|
||||||
|
->from('SiteTree')
|
||||||
|
->leftJoin("SiteTree_Live", '"SiteTree_Live"."ID" = "SiteTree"."ID"')
|
||||||
|
->where('"SiteTree"."Version" > "SiteTree_Live"."Version"');
|
||||||
|
|
||||||
|
foreach($q->execute() as $row) {
|
||||||
|
$ids[] = array('ID'=>$row['ID'],'ParentID'=>$row['ParentID']);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ids;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @package cms
|
||||||
|
* @subpackage content
|
||||||
|
*/
|
||||||
class CMSSiteTreeFilter_Search extends CMSSiteTreeFilter {
|
class CMSSiteTreeFilter_Search extends CMSSiteTreeFilter {
|
||||||
public $data;
|
|
||||||
|
|
||||||
|
|
||||||
function __construct() {
|
|
||||||
$this->data = $_REQUEST;
|
|
||||||
}
|
|
||||||
|
|
||||||
static function showInList() { return false; }
|
|
||||||
|
|
||||||
static function title() {
|
static function title() {
|
||||||
return "Search";
|
// TODO i18n
|
||||||
|
return "All pages";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retun an array of maps containing the keys, 'ID' and 'ParentID' for each page to be displayed
|
* Retun an array of maps containing the keys, 'ID' and 'ParentID' for each page to be displayed
|
||||||
* in the search.
|
* in the search.
|
||||||
|
*
|
||||||
|
* @return Array
|
||||||
*/
|
*/
|
||||||
function pagesIncluded() {
|
function pagesIncluded() {
|
||||||
$data = $this->data;
|
$ids = array();
|
||||||
|
$q = new SQLQuery();
|
||||||
$this->ids = array();
|
$q->select(array('ID','ParentID'))
|
||||||
$this->expanded = array();
|
->from('SiteTree');
|
||||||
|
|
||||||
$where = array();
|
$where = array();
|
||||||
|
|
||||||
|
$SQL_params = Convert::raw2sql($this->params);
|
||||||
|
foreach($SQL_params as $name => $val) {
|
||||||
|
switch($name) {
|
||||||
// Match against URLSegment, Title, MenuTitle & Content
|
// Match against URLSegment, Title, MenuTitle & Content
|
||||||
if (isset($data['SiteTreeSearchTerm'])) {
|
case 'SiteTreeSearchTerm':
|
||||||
$term = Convert::raw2sql($data['SiteTreeSearchTerm']);
|
$where[] = "\"URLSegment\" LIKE '%$val%' OR \"Title\" LIKE '%$val%' OR \"MenuTitle\" LIKE '%$val%' OR \"Content\" LIKE '%$val%'";
|
||||||
$where[] = "\"URLSegment\" LIKE '%$term%' OR \"Title\" LIKE '%$term%' OR \"MenuTitle\" LIKE '%$term%' OR \"Content\" LIKE '%$term%'";
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
// Match against date
|
// Match against date
|
||||||
if (isset($data['SiteTreeFilterDate'])) {
|
case 'SiteTreeFilterDate':
|
||||||
$date = $data['SiteTreeFilterDate'];
|
// TODO Date Parsing
|
||||||
$date = ((int)substr($date,6,4)) . '-' . ((int)substr($date,3,2)) . '-' . ((int)substr($date,0,2));
|
$val = ((int)substr($val,6,4))
|
||||||
$where[] = "\"LastEdited\" > '$date'";
|
. '-' . ((int)substr($val,3,2))
|
||||||
}
|
. '-' . ((int)substr($val,0,2));
|
||||||
|
$where[] = "\"LastEdited\" > '$val'";
|
||||||
|
break;
|
||||||
// Match against exact ClassName
|
// Match against exact ClassName
|
||||||
if (isset($data['ClassName']) && $data['ClassName'] != 'All') {
|
case 'ClassName':
|
||||||
$klass = Convert::raw2sql($data['ClassName']);
|
if($val && $val != 'All') {
|
||||||
$where[] = "\"ClassName\" = '$klass'";
|
$where[] = "\"ClassName\" = '$val'";
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
// Partial string match against a variety of fields
|
// Partial string match against a variety of fields
|
||||||
foreach (CMSMain::T_SiteTreeFilterOptions() as $key => $value) {
|
if(!empty($val) && singleton("SiteTree")->hasDatabaseField($name)) {
|
||||||
if (!empty($data[$key])) {
|
$where[] = "\"$name\" LIKE '%$val%'";
|
||||||
$match = Convert::raw2sql($data[$key]);
|
|
||||||
$where[] = "\"$key\" LIKE '%$match%'";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
$q->where(empty($where) ? '' : '(' . implode(') AND (',$where) . ')');
|
||||||
|
|
||||||
$where = empty($where) ? '' : 'WHERE (' . implode(') AND (',$where) . ')';
|
foreach($q->execute() as $row) {
|
||||||
|
$ids[] = array('ID'=>$row['ID'],'ParentID'=>$row['ParentID']);
|
||||||
|
}
|
||||||
|
|
||||||
$parents = array();
|
return $ids;
|
||||||
|
|
||||||
/* Do the actual search */
|
|
||||||
$res = DB::query('SELECT "ParentID", "ID" FROM "SiteTree" '.$where);
|
|
||||||
return $res;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -448,18 +448,22 @@ class LeftAndMain extends Controller {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return String HTML
|
||||||
|
*/
|
||||||
public function SiteTreeAsUL() {
|
public function SiteTreeAsUL() {
|
||||||
return $this->getSiteTreeFor($this->stat('tree_class'));
|
return $this->getSiteTreeFor($this->stat('tree_class'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a site tree displaying the nodes under the given objects.
|
* Get a site tree HTML listing which displays the nodes under the given criteria.
|
||||||
*
|
*
|
||||||
* @param $className The class of the root object
|
* @param $className The class of the root object
|
||||||
* @param $rootID The ID of the root object. If this is null then a complete tree will be
|
* @param $rootID The ID of the root object. If this is null then a complete tree will be
|
||||||
* shown
|
* shown
|
||||||
* @param $childrenMethod The method to call to get the children of the tree. For example,
|
* @param $childrenMethod The method to call to get the children of the tree. For example,
|
||||||
* Children, AllChildrenIncludingDeleted, or AllHistoricalChildren
|
* Children, AllChildrenIncludingDeleted, or AllHistoricalChildren
|
||||||
|
* @return String Nested <ul> list with links to each page
|
||||||
*/
|
*/
|
||||||
function getSiteTreeFor($className, $rootID = null, $childrenMethod = null, $filterFunction = null, $minNodeCount = 30) {
|
function getSiteTreeFor($className, $rootID = null, $childrenMethod = null, $filterFunction = null, $minNodeCount = 30) {
|
||||||
// Default childrenMethod
|
// Default childrenMethod
|
||||||
@ -518,27 +522,31 @@ class LeftAndMain extends Controller {
|
|||||||
* If ID = 0, then get the whole tree.
|
* If ID = 0, then get the whole tree.
|
||||||
*/
|
*/
|
||||||
public function getsubtree($request) {
|
public function getsubtree($request) {
|
||||||
$tree = $this->getSiteTreeFor(
|
if($filterClass = $request->requestVar('FilterClass')) {
|
||||||
|
if(!is_subclass_of($filterClass, 'CMSSiteTreeFilter')) {
|
||||||
|
throw new Exception(sprintf('Invalid filter class passed: %s', $filterClass));
|
||||||
|
}
|
||||||
|
|
||||||
|
$filter = new $filterClass($request->requestVars());
|
||||||
|
} else {
|
||||||
|
$filter = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$html = $this->getSiteTreeFor(
|
||||||
$this->stat('tree_class'),
|
$this->stat('tree_class'),
|
||||||
$request->getVar('ID'),
|
$request->getVar('ID'),
|
||||||
null,
|
null,
|
||||||
null,
|
($filter) ? array($filter, 'isPageIncluded') : null,
|
||||||
$request->getVar('minNodeCount')
|
$request->getVar('minNodeCount'),
|
||||||
|
($filter) ? $filter->getChildrenMethod() : null
|
||||||
);
|
);
|
||||||
|
|
||||||
// Trim off the outer tag
|
// Trim off the outer tag
|
||||||
$tree = ereg_replace('^[ \t\r\n]*<ul[^>]*>','', $tree);
|
$html = ereg_replace('^[ \t\r\n]*<ul[^>]*>','', $html);
|
||||||
$tree = ereg_replace('</ul[^>]*>[ \t\r\n]*$','', $tree);
|
$html = ereg_replace('</ul[^>]*>[ \t\r\n]*$','', $html);
|
||||||
|
|
||||||
return $tree;
|
return $html;
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param array $params
|
|
||||||
* @return LeftAndMainMarkingFilter
|
|
||||||
*/
|
|
||||||
protected function getMarkingFilter($params) {
|
|
||||||
return new LeftAndMainMarkingFilter($params);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -37,7 +37,7 @@
|
|||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
// only the first field should be visible by default
|
// only the first field should be visible by default
|
||||||
this.find('.field').not(':first').hide();
|
this.find('.field').not('.show-default').hide();
|
||||||
|
|
||||||
// generate the field dropdown
|
// generate the field dropdown
|
||||||
this.setSelectEl($('<select name="options" class="options"></select>')
|
this.setSelectEl($('<select name="options" class="options"></select>')
|
||||||
@ -47,6 +47,13 @@
|
|||||||
|
|
||||||
this._setOptions();
|
this._setOptions();
|
||||||
|
|
||||||
|
// special case: we can't use CMSSiteTreeFilter together with other options
|
||||||
|
this.find('select[name=FilterClass]').change(function(e) {
|
||||||
|
var others = self.find('.field').not($(this).parents('.field')).find(':input,:select');
|
||||||
|
if(e.target.value == 'CMSSiteTreeFilter_Search') others.removeAttr('disabled');
|
||||||
|
else others.attr('disabled','disabled');
|
||||||
|
})
|
||||||
|
|
||||||
this._super();
|
this._super();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -61,7 +68,7 @@
|
|||||||
jQuery('<option value="0">Add Criteria</option>').appendTo(self.getSelectEl());
|
jQuery('<option value="0">Add Criteria</option>').appendTo(self.getSelectEl());
|
||||||
|
|
||||||
// populate dropdown values from existing fields
|
// populate dropdown values from existing fields
|
||||||
this.find('.field').each(function() {
|
this.find('.field').not(':visible').each(function() {
|
||||||
$('<option />').appendTo(self.getSelectEl())
|
$('<option />').appendTo(self.getSelectEl())
|
||||||
.val(this.id)
|
.val(this.id)
|
||||||
.text($(this).find('label').text());
|
.text($(this).find('label').text());
|
||||||
@ -100,7 +107,7 @@
|
|||||||
|
|
||||||
onreset: function(e) {
|
onreset: function(e) {
|
||||||
this.find('.field :input').clearFields();
|
this.find('.field :input').clearFields();
|
||||||
this.find('.field').not(':first').hide();
|
this.find('.field').not('.show-default').hide();
|
||||||
|
|
||||||
// Reset URL to default
|
// Reset URL to default
|
||||||
$('#sitetree')[0].clearCustomURL();
|
$('#sitetree')[0].clearCustomURL();
|
||||||
|
35
tests/CMSMainSearchFormTest.php
Normal file
35
tests/CMSMainSearchFormTest.php
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?php
|
||||||
|
class CMSMainSearchTreeFormTest extends FunctionalTest {
|
||||||
|
|
||||||
|
static $fixture_file = 'cms/tests/CMSMainTest.yml';
|
||||||
|
|
||||||
|
protected $autoFollowRedirection = false;
|
||||||
|
|
||||||
|
function testTitleFilter() {
|
||||||
|
$this->session()->inst_set('loggedInAs', $this->idFromFixture('Member', 'admin'));
|
||||||
|
|
||||||
|
$response = $this->get(
|
||||||
|
'admin/SearchTreeForm/?' .
|
||||||
|
http_build_query(array(
|
||||||
|
'Title' => 'Page 1',
|
||||||
|
'FilterClass' => 'CMSSiteTreeFilter_Search',
|
||||||
|
'action_doSearchTree' => true
|
||||||
|
))
|
||||||
|
);
|
||||||
|
|
||||||
|
$titles = $this->getPageTitles();
|
||||||
|
$this->assertEquals(count($titles), 1);
|
||||||
|
// For some reason the title gets split into two lines
|
||||||
|
|
||||||
|
$this->assertContains('Page 1', $titles[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function getPageTitles() {
|
||||||
|
$titles = array();
|
||||||
|
$links = $this->cssParser()->getBySelector('li.class-Page a');
|
||||||
|
if($links) foreach($links as $link) {
|
||||||
|
$titles[] = preg_replace('/\n/', ' ', $link->asXML());
|
||||||
|
}
|
||||||
|
return $titles;
|
||||||
|
}
|
||||||
|
}
|
87
tests/CMSSiteTreeFilterTest.php
Normal file
87
tests/CMSSiteTreeFilterTest.php
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
<?php
|
||||||
|
class CMSSiteTreeFilterTest extends SapphireTest {
|
||||||
|
|
||||||
|
static $fixture_file = 'cms/tests/CMSSiteTreeFilterTest.yml';
|
||||||
|
|
||||||
|
function testSearchFilterEmpty() {
|
||||||
|
$page1 = $this->objFromFixture('Page', 'page1');
|
||||||
|
$page2 = $this->objFromFixture('Page', 'page2');
|
||||||
|
|
||||||
|
$f = new CMSSiteTreeFilter_Search();
|
||||||
|
$results = $f->pagesIncluded();
|
||||||
|
|
||||||
|
$this->assertTrue($f->isPageIncluded($page1));
|
||||||
|
$this->assertTrue($f->isPageIncluded($page2));
|
||||||
|
}
|
||||||
|
|
||||||
|
function testSearchFilterByTitle() {
|
||||||
|
$page1 = $this->objFromFixture('Page', 'page1');
|
||||||
|
$page2 = $this->objFromFixture('Page', 'page2');
|
||||||
|
|
||||||
|
$f = new CMSSiteTreeFilter_Search(array('Title' => 'Page 1'));
|
||||||
|
$results = $f->pagesIncluded();
|
||||||
|
|
||||||
|
$this->assertTrue($f->isPageIncluded($page1));
|
||||||
|
$this->assertFalse($f->isPageIncluded($page2));
|
||||||
|
$this->assertEquals(1, count($results));
|
||||||
|
$this->assertEquals(
|
||||||
|
array('ID' => $page1->ID, 'ParentID' => 0),
|
||||||
|
$results[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testIncludesParentsForNestedMatches() {
|
||||||
|
$parent = $this->objFromFixture('Page', 'page3');
|
||||||
|
$child = $this->objFromFixture('Page', 'page3b');
|
||||||
|
|
||||||
|
$f = new CMSSiteTreeFilter_Search(array('Title' => 'Page 3b'));
|
||||||
|
$results = $f->pagesIncluded();
|
||||||
|
|
||||||
|
$this->assertTrue($f->isPageIncluded($parent));
|
||||||
|
$this->assertTrue($f->isPageIncluded($child));
|
||||||
|
$this->assertEquals(1, count($results));
|
||||||
|
$this->assertEquals(
|
||||||
|
array('ID' => $child->ID, 'ParentID' => $parent->ID),
|
||||||
|
$results[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testChangedPagesFilter() {
|
||||||
|
$unchangedPage = $this->objFromFixture('Page', 'page1');
|
||||||
|
$unchangedPage->doPublish();
|
||||||
|
|
||||||
|
$changedPage = $this->objFromFixture('Page', 'page2');
|
||||||
|
$changedPage->MetaTitle = 'Original';
|
||||||
|
$changedPage->publish('Stage', 'Live');
|
||||||
|
$changedPage->MetaTitle = 'Changed';
|
||||||
|
$changedPage->write();
|
||||||
|
|
||||||
|
$f = new CMSSiteTreeFilter_ChangedPages();
|
||||||
|
$results = $f->pagesIncluded();
|
||||||
|
|
||||||
|
$this->assertTrue($f->isPageIncluded($changedPage));
|
||||||
|
$this->assertFalse($f->isPageIncluded($unchangedPage));
|
||||||
|
$this->assertEquals(1, count($results));
|
||||||
|
$this->assertEquals(
|
||||||
|
array('ID' => $changedPage->ID, 'ParentID' => 0),
|
||||||
|
$results[0]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testDeletedPagesFilter() {
|
||||||
|
$deletedPage = $this->objFromFixture('Page', 'page2');
|
||||||
|
$deletedPage->publish('Stage', 'Live');
|
||||||
|
$deletedPageID = $deletedPage->ID;
|
||||||
|
$deletedPage->delete();
|
||||||
|
$deletedPage = Versioned::get_one_by_stage(
|
||||||
|
'SiteTree',
|
||||||
|
'Live',
|
||||||
|
sprintf('"SiteTree_Live"."ID" = %d', $deletedPageID)
|
||||||
|
);
|
||||||
|
|
||||||
|
$f = new CMSSiteTreeFilter_DeletedPages();
|
||||||
|
$results = $f->pagesIncluded();
|
||||||
|
|
||||||
|
$this->assertTrue($f->isPageIncluded($deletedPage));
|
||||||
|
}
|
||||||
|
}
|
19
tests/CMSSiteTreeFilterTest.yml
Normal file
19
tests/CMSSiteTreeFilterTest.yml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
Page:
|
||||||
|
page1:
|
||||||
|
Title: Page 1
|
||||||
|
page2:
|
||||||
|
Title: Page 2
|
||||||
|
page3:
|
||||||
|
Title: Page 3
|
||||||
|
page2a:
|
||||||
|
Parent: =>Page.page2
|
||||||
|
Title: Page 2a
|
||||||
|
page2b:
|
||||||
|
Parent: =>Page.page2
|
||||||
|
Title: Page 2b
|
||||||
|
page3a:
|
||||||
|
Parent: =>Page.page3
|
||||||
|
Title: Page 3a
|
||||||
|
page3b:
|
||||||
|
Parent: =>Page.page3
|
||||||
|
Title: Page 3b
|
Loading…
x
Reference in New Issue
Block a user