This bugtracker is archived (announcement). New tickets are created on github.com. See all framework issues, cms issues, and search the module listings for more specific bugtrackers.

Ticket #4199: CMSMain.patch

File CMSMain.patch, 20.8 KB (added by drx, 6 years ago)
  • CMSMain.php

     
    33 * The main "content" area of the CMS. 
    44 * This class creates a 2-frame layout - left-tree and right-form - to sit beneath the main 
    55 * admin menu. 
    6  *  
     6 * 
    77 * @package cms 
    88 * @subpackage content 
    99 * @todo Create some base classes to contain the generic functionality that will be replicated. 
    1010 */ 
    1111class CMSMain extends LeftAndMain implements CurrentPageIdentifier, PermissionProvider { 
    12          
     12 
    1313        static $url_segment = ''; 
    14          
     14 
    1515        static $url_rule = '/$Action/$ID/$OtherID'; 
    16          
     16 
    1717        // Maintain a lower priority than other administration sections 
    1818        // so that Director does not think they are actions of CMSMain 
    1919        static $url_priority = 40; 
    20          
     20 
    2121        static $menu_title = 'Site Content'; 
    22          
     22 
    2323        static $menu_priority = 10; 
    24          
     24 
    2525        static $tree_class = "SiteTree"; 
    26          
     26 
    2727        static $subitem_class = "Member"; 
    28          
     28 
    2929        static $allowed_actions = array( 
    3030                'addmember', 
    3131                'addpage', 
     
    5757                'getfilteredsubtree', 
    5858                'batchactions' 
    5959        ); 
    60          
     60 
    6161        /** 
    6262         * SiteTree Columns that can be filtered using the the Site Tree Search button 
    6363         */ 
    6464        static $site_tree_filter_options = array( 
    6565                'Title' => array('CMSMain.TITLE', 'Title'), 
    6666                'MenuTitle' => array('CMSMain.MENUTITLE', 'Navigation Label'), 
    67                 'ClassName' => array('CMSMain.PAGETYPE', 'Page Type'),  
     67                'ClassName' => array('CMSMain.PAGETYPE', 'Page Type'), 
    6868                'Status' => array('CMSMain.STATUS', 'Status'), 
    6969                'MetaDescription' => array('CMSMain.METADESC', 'Description'), 
    7070                'MetaKeywords' => array('CMSMain.METAKEYWORDS', 'Keywords') 
    7171        ); 
    72          
     72 
    7373        static function T_SiteTreeFilterOptions(){ 
    7474                return array( 
    7575                        'Title' => _t('CMSMain.TITLEOPT', 'Title', 0, 'The dropdown title in CMSMain left SiteTreeFilterOptions'), 
    7676                        'MenuTitle' => _t('CMSMain.MENUTITLEOPT', 'Navigation Label', 0, 'The dropdown title in CMSMain left SiteTreeFilterOptions'), 
    77                         'Status' => _t('CMSMain.STATUSOPT', 'Status',  0, "The dropdown title in CMSMain left SiteTreeFilterOptions"),  
    78                         'MetaDescription' => _t('CMSMain.METADESCOPT', 'Description', 0, "The dropdown title in CMSMain left SiteTreeFilterOptions"),  
     77                        'Status' => _t('CMSMain.STATUSOPT', 'Status',  0, "The dropdown title in CMSMain left SiteTreeFilterOptions"), 
     78                        'MetaDescription' => _t('CMSMain.METADESCOPT', 'Description', 0, "The dropdown title in CMSMain left SiteTreeFilterOptions"), 
    7979                        'MetaKeywords' => _t('CMSMain.METAKEYWORDSOPT', 'Keywords', 0, "The dropdown title in CMSMain left SiteTreeFilterOptions") 
    8080                ); 
    8181        } 
    82          
     82 
    8383        public function init() { 
    8484                parent::init(); 
    85                  
     85 
    8686                // Locale" attribute is either explicitly added by LeftAndMain Javascript logic, 
    8787                // or implied on a translated record (see {@link Translatable->updateCMSFields()}). 
    8888                if(Translatable::is_enabled()) { 
     
    9292                                $this->Locale = $this->getRequest()->requestVar("Locale"); 
    9393                        } elseif($this->getRequest()->requestVar("locale")) { 
    9494                                $this->Locale = $this->getRequest()->requestVar("locale"); 
     95                        } elseif (Session::get("{$this->class}.Locale")) { 
     96                          $this->Locale = Session::get("{$this->class}.Locale"); 
    9597                        } else { 
    9698                                $this->Locale = Translatable::default_locale(); 
    9799                        } 
    98100                        Translatable::set_current_locale($this->Locale); 
     101                        Session::set("{$this->class}.Locale", $this->Locale); 
    99102                } 
    100                  
     103 
    101104                // collect languages for TinyMCE spellchecker plugin 
    102105                if(Translatable::is_enabled()) { 
    103106                        $spellcheckLangs = Translatable::get_existing_content_languages(); 
     
    110113 
    111114                // Set custom options for TinyMCE specific to CMSMain 
    112115                HtmlEditorConfig::get('cms')->setOption('spellchecker_languages', '+' . implode(',', $spellcheckSpec)); 
    113                                  
     116 
    114117                Requirements::javascript(CMS_DIR . '/javascript/CMSMain.js'); 
    115118                Requirements::javascript(CMS_DIR . '/javascript/CMSMain_left.js'); 
    116119                Requirements::javascript(CMS_DIR . '/javascript/CMSMain_right.js'); 
    117120        } 
    118          
     121 
    119122        /** 
    120123         * If this is set to true, the "switchView" context in the 
    121124         * template is shown, with links to the staging and publish site. 
     
    134137 
    135138        /** 
    136139         * Override {@link LeftAndMain} Link to allow blank URL segment for CMSMain. 
    137          *  
     140         * 
    138141         * @return string 
    139142         */ 
    140143        public function Link($action = null) { 
     
    174177 
    175178                return $tree; 
    176179        } 
    177          
     180 
    178181        public function getfilteredsubtree() { 
    179182                // Get the tree 
    180183                $tree = $this->getSiteTreeFor($this->stat('tree_class'), $_REQUEST['ID'], null, array(new CMSMainMarkingFilter(), 'mark')); 
     
    182185                // Trim off the outer tag 
    183186                $tree = ereg_replace('^[ \t\r\n]*<ul[^>]*>','', $tree); 
    184187                $tree = ereg_replace('</ul[^>]*>[ \t\r\n]*$','', $tree); 
    185                  
     188 
    186189                return $tree; 
    187190        } 
    188          
     191 
    189192        /** 
    190193         * Returns the SiteTree columns that can be filtered using the the Site Tree Search button as a DataObjectSet 
    191194         */ 
     
    208211                        $types = SiteTree::page_type_classes(); array_unshift($types, 'All'); 
    209212                        $optionsetField = new DropdownField('ClassName', 'ClassName', array_combine($types, $types), 'Any'); 
    210213                        return $optionsetField->Field(); 
    211                 }        
     214                } 
    212215 
    213216        public function generateDataTreeHints() { 
    214217                $classes = ClassInfo::subclassesFor( $this->stat('tree_class') ); 
     
    324327                        if($instance->stat('need_permission') && !$this->can(singleton($class)->stat('need_permission'))) continue; 
    325328 
    326329                        $addAction = $instance->i18n_singular_name(); 
    327                          
     330 
    328331                        // if we're in translation mode, the link between the translated pagetype 
    329332                        // title and the actual classname might not be obvious, so we add it in parantheses 
    330333                        // Example: class "RedirectorPage" has the title "Weiterleitung" in German, 
     
    338341                                'AddAction' => $addAction, 
    339342                        ))); 
    340343                } 
    341                  
     344 
    342345                $result->sort('AddAction'); 
    343                  
     346 
    344347                return $result; 
    345348        } 
    346349 
     
    363366                                $record = DataObject::get_one( $treeClass, "`$treeClass`.ID = $id"); 
    364367                                if($record) Versioned::reading_stage(null); 
    365368                        } 
    366                          
     369 
    367370                        // Then, try getting a deleted record 
    368371                        if(!$record) { 
    369372                                $record = Versioned::get_latest_version($treeClass, $id); 
     
    399402                        $fields->push(new HiddenField('Sort','', $record->Sort )); 
    400403 
    401404                        $idField->setValue($id); 
    402                          
     405 
    403406                        if($record->ID && is_numeric( $record->ID ) ) { 
    404407                                $liveRecord = Versioned::get_one_by_stage('SiteTree', 'Live', "`SiteTree`.ID = $record->ID"); 
    405408                                if($liveRecord) $liveURLField->setValue($liveRecord->AbsoluteLink()); 
    406409                        } 
    407                          
     410 
    408411                        if(!$record->IsDeletedFromStage) { 
    409412                                $stageURLField->setValue($record->AbsoluteLink()); 
    410413                        } 
    411                          
     414 
    412415                        // getAllCMSActions can be used to completely redefine the action list 
    413416                        if($record->hasMethod('getAllCMSActions')) { 
    414417                                $actions = $record->getAllCMSActions(); 
     
    458461 
    459462                if(is_numeric($parent)) $parentObj = DataObject::get_by_id("SiteTree", $parent); 
    460463                if(!$parentObj || !$parentObj->ID) $parent = 0; 
    461                  
     464 
    462465                if($parentObj && !$parentObj->canAddChildren()) return Security::permissionFailure($this); 
    463466                if(!singleton($className)->canCreate()) return Security::permissionFailure($this); 
    464467 
     
    474477         */ 
    475478        public function getNewItem($id, $setID = true) { 
    476479                list($dummy, $className, $parentID, $suffix) = array_pad(explode('-',$id),4,null); 
    477                  
     480 
    478481                $newItem = new $className(); 
    479482 
    480483            if( !$suffix ) { 
     
    507510 
    508511                # Some modules like subsites add extra fields that need to be set when the new item is created 
    509512                $this->extend('augmentNewSiteTreeItem', $newItem); 
    510                  
     513 
    511514                return $newItem; 
    512515        } 
    513516 
    514517        /** 
    515518         * Delete the page from live. This means a page in draft mode might still exist. 
    516          *  
     519         * 
    517520         * @see delete() 
    518521         */ 
    519522        public function deletefromlive($urlParams, $form) { 
     
    521524                Versioned::reading_stage('Live'); 
    522525                $record = DataObject::get_by_id("SiteTree", $id); 
    523526                if($record && !$record->canDelete()) return Security::permissionFailure($this); 
    524                  
     527 
    525528                $descRemoved = ''; 
    526529                $descendantsRemoved = 0; 
    527                  
     530 
    528531                // before deleting the records, get the descendants of this tree 
    529532                if($record) { 
    530533                        $descendantIDs = $record->getDescendantIDList('SiteTree'); 
     
    561564         */ 
    562565        public function performPublish($record) { 
    563566                if($record && !$record->canPublish()) return Security::permissionFailure($this); 
    564                  
     567 
    565568                $record->doPublish(); 
    566569        } 
    567570 
     
    569572         * Reverts a page by publishing it to live. 
    570573         * Use {@link restorepage()} if you want to restore a page 
    571574         * which was deleted from draft without publishing. 
    572          *  
     575         * 
    573576         * @uses SiteTree->doRevertToLive() 
    574577         */ 
    575578        public function revert($urlParams, $form) { 
     
    578581                // a user can restore a page without publication rights, as it just adds a new draft state 
    579582                // (this action should just be available when page has been "deleted from draft") 
    580583                if($record && !$record->canEdit()) return Security::permissionFailure($this); 
    581                  
     584 
    582585                $record->doRevertToLive(); 
    583586 
    584587                $title = Convert::raw2js($record->Title); 
     
    588591 
    589592                return FormResponse::respond(); 
    590593        } 
    591          
     594 
    592595        /** 
    593596         * Delete the current page from draft stage. 
    594597         * @see deletefromlive() 
     
    597600                $id = $_REQUEST['ID']; 
    598601                $record = DataObject::get_one("SiteTree", "SiteTree.ID = $id"); 
    599602                if($record && !$record->canDelete()) return Security::permissionFailure(); 
    600                  
     603 
    601604                // save ID and delete record 
    602605                $recordID = $record->ID; 
    603606                $record->delete(); 
    604                  
     607 
    605608                if(Director::is_ajax()) { 
    606609                        // need a valid ID value even if the record doesn't have one in the database 
    607610                        // (its still present in the live tables) 
     
    615618                                FormResponse::add($this->deleteTreeNodeJS($record)); 
    616619                                FormResponse::status_message(sprintf(_t('CMSMain.REMOVEDPAGEFROMDRAFT',"Removed '%s' from the draft site"),$record->Title), 'good'); 
    617620                                return FormResponse::respond(); 
    618                         }                        
     621                        } 
    619622                } else { 
    620623                        Director::redirectBack(); 
    621624                } 
     
    675678 
    676679                $page = DataObject::get_by_id("SiteTree", $SQL_id); 
    677680                if($page && !$page->canPublish()) return Security::permissionFailure($this); 
    678                  
     681 
    679682                $page->doUnpublish(); 
    680                  
     683 
    681684                return $this->tellBrowserAboutPublicationChange($page, sprintf(_t('CMSMain.REMOVEDPAGE',"Removed '%s' from the published site"),$page->Title)); 
    682685        } 
    683          
     686 
    684687        /** 
    685688         * Return a few pieces of information about a change to a page 
    686689         *  - Send the new status message 
     
    697700 
    698701                FormResponse::add($this->getActionUpdateJS($page)); 
    699702                FormResponse::update_status($page->Status); 
    700                  
     703 
    701704                if($JS_stageURL || $JS_liveURL) { 
    702705                        FormResponse::add("\$('sitetree').setNodeTitle($page->ID, '$JS_title');"); 
    703706                } else { 
     
    705708                        FormResponse::add("if(node && node.parentTreeNode) node.parentTreeNode.removeTreeNode(node);"); 
    706709                        FormResponse::add("$('Form_EditForm').reloadIfSetTo($page->ID);"); 
    707710                } 
    708                  
     711 
    709712                FormResponse::status_message($statusMessage, 'good'); 
    710713                FormResponse::add("$('Form_EditForm').elements.StageURLSegment.value = '$JS_stageURL';"); 
    711714                FormResponse::add("$('Form_EditForm').elements.LiveURLSegment.value = '$JS_liveURL';"); 
     
    717720        function performRollback($id, $version) { 
    718721                $record = DataObject::get_by_id($this->stat('tree_class'), $id); 
    719722                if($record && !$record->canPublish()) return Security::permissionFailure($this); 
    720                  
     723 
    721724                $record->doRollbackTo($version); 
    722725                return $record; 
    723726        } 
     
    730733 
    731734                if($record) { 
    732735                        if($record && !$record->canView()) return Security::permissionFailure($this); 
    733                          
     736 
    734737                        $fields = $record->getCMSFields($this); 
    735738                        $fields->removeByName("Status"); 
    736739 
     
    738741                        $fields->push(new HiddenField("Version")); 
    739742                        $fields->insertBefore( 
    740743                                new LiteralField( 
    741                                         'YouAreViewingHeader',  
     744                                        'YouAreViewingHeader', 
    742745                                        '<p class="message notice">' . 
    743746                                        sprintf( 
    744747                                                _t( 
     
    747750                                                        PR_MEDIUM, 
    748751                                                        'Version number is a linked string, created is a relative time (e.g. 2 days ago), by a specific author' 
    749752                                                ), 
    750                                                 "<a href=\"admin/getversion/$record->ID/$version\" title=\"" . $versionAuthor->Title . "\">$version</a>",  
     753                                                "<a href=\"admin/getversion/$record->ID/$version\" title=\"" . $versionAuthor->Title . "\">$version</a>", 
    751754                                                $record->obj('LastEdited')->Ago(), 
    752755                                                $versionAuthor->Title 
    753756                                        ) . 
     
    764767 
    765768                        // encode the message to appear in the body of the email 
    766769                        $archiveURL = Director::absoluteBaseURL() . $record->URLSegment . '?archiveDate=' . $record->obj('LastEdited')->URLDatetime(); 
    767                          
     770 
    768771                        // Ensure that source file comments are disabled 
    769772                        SSViewer::set_source_file_comments(false); 
    770                          
     773 
    771774                        $archiveEmailMessage = urlencode( $this->customise( array( 'ArchiveDate' => $record->obj('LastEdited'), 'ArchiveURL' => $archiveURL ) )->renderWith( 'ViewArchivedEmail' ) ); 
    772775                        $archiveEmailMessage = preg_replace( '/\+/', '%20', $archiveEmailMessage ); 
    773776 
     
    781784                                "ID" => $id, 
    782785                                "Version" => $version, 
    783786                        )); 
    784                          
     787 
    785788                        // historical version shouldn't be editable 
    786789                        $readonlyFields = $form->Fields()->makeReadonly(); 
    787790                        $form->setFields($readonlyFields); 
     
    791794                        )); 
    792795 
    793796                        SSViewer::setOption('rewriteHashlinks', false); 
    794                          
     797 
    795798                        if(Director::is_ajax()) { 
    796799                                $result = $templateData->renderWith($this->class . '_right'); 
    797800                                $parts = split('</?form[^>]*>', $result); 
     
    799802                        } else { 
    800803                                return $templateData->renderWith('LeftAndMain'); 
    801804                        } 
    802                          
    803                          
     805 
     806 
    804807                } 
    805808        } 
    806809 
     
    819822 
    820823                $page = DataObject::get_by_id("SiteTree", $id); 
    821824                if($page && !$page->canView()) return Security::permissionFailure($this); 
    822                  
     825 
    823826                $record = $page->compareVersions($fromVersion, $toVersion); 
    824827                $fromVersionRecord = Versioned::get_version('SiteTree', $id, $fromVersion); 
    825828                $toVersionRecord = Versioned::get_version('SiteTree', $id, $toVersion); 
    826                  
     829 
    827830                if($record) { 
    828831                        $fromDateNice = $fromVersionRecord->obj('LastEdited')->Ago(); 
    829832                        $toDateNice = $toVersionRecord->obj('LastEdited')->Ago(); 
     
    836839                        $fields->insertBefore( 
    837840                                new LiteralField( 
    838841                                        'YouAreComparingHeader', 
    839                                         '<p class="message notice">' .  
     842                                        '<p class="message notice">' . 
    840843                                        sprintf( 
    841844                                                _t('CMSMain.COMPARINGV',"Comparing versions %s and %s"), 
    842845                                                "<a href=\"admin/getversion/$id/$fromVersionRecord->Version\" title=\"$fromAuthor->Title\">$fromVersionRecord->Version</a> <small>($fromDateNice)</small>", 
    843846                                                "<a href=\"admin/getversion/$id/$toVersionRecord->Version\" title=\"$toAuthor->Title\">$toVersionRecord->Version</a> <small>($toDateNice)</small>" 
    844847                                        ) . 
    845848                                        '</p>' 
    846                                 ),  
     849                                ), 
    847850                                "Root" 
    848851                        ); 
    849852 
     
    855858                                "ID" => $id, 
    856859                                "Version" => $fromVersion, 
    857860                        )); 
    858                          
     861 
    859862                        // comparison views shouldn't be editable 
    860863                        $readonlyFields = $form->Fields()->makeReadonly(); 
    861864                        $form->setFields($readonlyFields); 
    862                          
     865 
    863866                        foreach($form->Fields()->dataFields() as $field) { 
    864867                                $field->dontEscape = true; 
    865868                        } 
     
    919922                        'DialogType' => 'alert' 
    920923                ))->renderWith('Dialog'); 
    921924        } 
    922          
     925 
    923926        /** 
    924927         * Batch Actions Handler 
    925928         */ 
     
    972975                foreach( $this->PageTypes() as $arrayData ) { 
    973976                        $pageTypes[$arrayData->getField('ClassName')] = $arrayData->getField('AddAction'); 
    974977                } 
    975                  
     978 
    976979                $fields = new FieldSet( 
    977980                        new HiddenField("ParentID"), 
    978981                        new HiddenField("Locale", 'Locale', Translatable::get_current_locale()), 
    979982                        new DropdownField("PageType", "", $pageTypes, 'Page') 
    980983                ); 
    981                  
     984 
    982985                $actions = new FieldSet( 
    983986                        new FormAction("addpage", _t('CMSMain.GO',"Go")) 
    984987                ); 
     
    10191022        function publishall() { 
    10201023                ini_set("memory_limit", -1); 
    10211024                ini_set('max_execution_time', 0); 
    1022                  
     1025 
    10231026                $response = ""; 
    10241027 
    10251028                if(isset($this->requestParams['confirm'])) { 
     
    10291032                        while(true) { 
    10301033                                foreach($pages as $page) { 
    10311034                                        if($page && !$page->canPublish()) return Security::permissionFailure($this); 
    1032                                          
     1035 
    10331036                                        $page->doPublish(); 
    10341037                                        $page->destroy(); 
    10351038                                        unset($page); 
     
    10561059                                        . _t('CMSMain.PUBALLCONFIRM',"Please publish every page in the site, copying content stage to live",PR_LOW,'Confirmation button') .'" /> 
    10571060                                </form>'; 
    10581061                } 
    1059                  
     1062 
    10601063                return $response; 
    10611064        } 
    1062          
     1065 
    10631066        /** 
    10641067         * Restore a completely deleted page from the SiteTree_versions table. 
    10651068         */ 
     
    10891092                        if($page && !$page->canEdit()) return Security::permissionFailure($this); 
    10901093 
    10911094                        $newPage = $page->duplicate(); 
    1092                          
     1095 
    10931096                        // ParentID can be hard-set in the URL.  This is useful for pages with multiple parents 
    10941097                        if($_GET['parentID'] && is_numeric($_GET['parentID'])) { 
    10951098                                $newPage->ParentID = $_GET['parentID']; 
     
    11141117                        user_error("CMSMain::duplicate() Bad ID: '$id'", E_USER_WARNING); 
    11151118                } 
    11161119        } 
    1117          
    11181120 
    1119          
     1121 
     1122 
    11201123        /** 
    11211124         * Create a new translation from an existing item, switch to this language and reload the tree. 
    11221125         */ 
     
    11251128                $originalLangID = (int)$_REQUEST['ID']; 
    11261129 
    11271130                $record = $this->getRecord($originalLangID); 
    1128                  
     1131 
    11291132                $this->Locale = $langCode; 
    11301133                Translatable::set_current_locale($langCode); 
    1131                  
     1134 
    11321135                // Create a new record in the database - this is different 
    11331136                // to the usual "create page" pattern of storing the record 
    11341137                // in-memory until a "save" is performed by the user, mainly 
     
    11371140                $translatedRecord = $record->createTranslation($langCode); 
    11381141 
    11391142                $url = sprintf( 
    1140                         "%s/%d/?locale=%s",  
     1143                        "%s/%d/?locale=%s", 
    11411144                        $this->Link('show'), 
    11421145                        $translatedRecord->ID, 
    11431146                        $langCode 
     
    11571160                        $title = _t("{$class}.MENUTITLE", LeftAndMain::menu_title_for_class($class)); 
    11581161                $perms["CMS_ACCESS_" . $class] = sprintf( 
    11591162                                _t( 
    1160                                         'CMSMain.ACCESS',  
     1163                                        'CMSMain.ACCESS', 
    11611164                                        "Access to '%s' (%s)", 
    11621165                                        PR_MEDIUM, 
    11631166                                        "Item in permission selection identifying the admin section, with title and classname. Example: Access to 'Files & Images' (AssetAdmin)" 
    1164                                 ),  
     1167                                ), 
    11651168                                $title, 
    11661169                                $class 
    11671170                        ); 
    11681171                } 
    11691172                $perms["CMS_ACCESS_LeftAndMain"] = _t( 
    1170                         'CMSMain.ACCESSALLINTERFACES',  
     1173                        'CMSMain.ACCESSALLINTERFACES', 
    11711174                        'Access to all CMS interfaces' 
    11721175                ); 
    11731176                return $perms; 
    11741177        } 
    1175          
     1178 
    11761179        /** 
    11771180     * Returns all languages with languages already used appearing first. 
    11781181     * Called by the SSViewer when rendering the template. 
     
    11811184                $member = Member::currentUser(); //check to see if the current user can switch langs or not 
    11821185                if(Permission::checkMember($member, 'VIEW_LANGS')) { 
    11831186                        $dropdown = new LanguageDropdownField( 
    1184                                 'LangSelector',  
    1185                                 'Language',  
    1186                                 array(),  
    1187                                 'SiteTree',  
     1187                                'LangSelector', 
     1188                                'Language', 
     1189                                array(), 
     1190                                'SiteTree', 
    11881191                                'Locale-English' 
    11891192                        ); 
    11901193                        $dropdown->setValue(Translatable::get_current_locale()); 
    11911194                        return $dropdown; 
    11921195        } 
    1193          
     1196 
    11941197        //user doesn't have permission to switch langs so just show a string displaying current language 
    11951198        return i18n::get_locale_name( Translatable::get_current_locale() ); 
    11961199    } 
    11971200 
    11981201        /** 
    11991202         * Determine if there are more than one languages in our site tree. 
    1200          *  
     1203         * 
    12011204         * @return boolean 
    12021205         */ 
    12031206        function MultipleLanguages() { 
     
    12051208 
    12061209                return (count($langs) > 1); 
    12071210        } 
    1208          
     1211 
    12091212        /** 
    12101213         * @return boolean 
    12111214         */ 
     
    12151218} 
    12161219 
    12171220class CMSMainMarkingFilter { 
    1218          
     1221 
    12191222        function __construct() { 
    12201223                $this->ids = array(); 
    12211224                $this->expanded = array(); 
    1222                  
     1225 
    12231226                $where = array(); 
    1224                  
     1227 
    12251228                // Match against URLSegment, Title, MenuTitle & Content 
    12261229                if (isset($_REQUEST['SiteTreeSearchTerm'])) { 
    12271230                        $term = Convert::raw2sql($_REQUEST['SiteTreeSearchTerm']); 
    12281231                        $where[] = "`URLSegment` LIKE '%$term%' OR `Title` LIKE '%$term%' OR `MenuTitle` LIKE '%$term%' OR `Content` LIKE '%$term%'"; 
    12291232                } 
    1230                  
     1233 
    12311234                // Match against date 
    12321235                if (isset($_REQUEST['SiteTreeFilterDate'])) { 
    12331236                        $date = $_REQUEST['SiteTreeFilterDate']; 
    12341237                        $date = ((int)substr($date,6,4)) . '-' . ((int)substr($date,3,2)) . '-' . ((int)substr($date,0,2)); 
    1235                         $where[] = "`LastEdited` > '$date'";  
     1238                        $where[] = "`LastEdited` > '$date'"; 
    12361239                } 
    1237                  
     1240 
    12381241                // Match against exact ClassName 
    12391242                if (isset($_REQUEST['ClassName']) && $_REQUEST['ClassName'] != 'All') { 
    12401243                        $klass = Convert::raw2sql($_REQUEST['ClassName']); 
    12411244                        $where[] = "`ClassName` = '$klass'"; 
    12421245                } 
    1243                  
    1244                 // Partial string match against a variety of fields  
     1246 
     1247                // Partial string match against a variety of fields 
    12451248                foreach (CMSMain::T_SiteTreeFilterOptions() as $key => $value) { 
    12461249                        if (!empty($_REQUEST[$key])) { 
    12471250                                $match = Convert::raw2sql($_REQUEST[$key]); 
    12481251                                $where[] = "`$key` LIKE '%$match%'"; 
    12491252                        } 
    12501253                } 
    1251                  
     1254 
    12521255                $where = empty($where) ? '' : 'WHERE (' . implode(') AND (',$where) . ')'; 
    1253                  
     1256 
    12541257                $parents = array(); 
    1255                  
     1258 
    12561259                /* Do the actual search */ 
    12571260                $res = DB::query('SELECT `ParentID`, `ID` FROM SiteTree '.$where); 
    12581261                if (!$res) return; 
    1259                  
     1262 
    12601263                /* And keep a record of parents we don't need to get parents of themselves, as well as IDs to mark */ 
    12611264                foreach($res as $row) { 
    12621265                        if ($row['ParentID']) $parents[$row['ParentID']] = true; 
    12631266                        $this->ids[$row['ID']] = true; 
    12641267                } 
    1265                  
     1268 
    12661269                /* We need to recurse up the tree, finding ParentIDs for each ID until we run out of parents */ 
    12671270                while (!empty($parents)) { 
    12681271                        $res = DB::query('SELECT `ParentID`, `ID` FROM SiteTree WHERE `ID` in ('.implode(',',array_keys($parents)).')'); 
     
    12751278                        } 
    12761279                } 
    12771280        } 
    1278          
     1281 
    12791282        function mark($node) { 
    12801283                $id = $node->ID; 
    12811284                if (array_key_exists($id, $this->expanded)) $node->markOpened();