Home » Blog » Evolution CMS 1.3.0

first release with name EVO

EVOLUTION CMS 1.3.0

The new release of EVO 1.3.0 runs under the name EVOLUTION CMS. Now updates will be released more often. About once a month there will be a fresh release instead of 1 release at half a year.

Just say a few words about future plans:

  • Starting with the current version we will have the correct versioning: http://semver.org/lang/ru/ I think this will be much more convenient and correct.
  • In the near future, work with the documentation site will be finished: docs.evo.im, and there will be a video of how to help with the documentation so that we can have everything in one place. Also, the documentation will be multilanguage.
  • Many additions from the kernel to the repository will be moved.
  • On the part of admin: removing mootools, translating them all in html and bootstrap.
  • Also in the plans of integrating composer and much more will be added soon to the roadmap.

What’s new in 1.3.0:

  • New name and logo
  • min version php now is 5.4
  • Correction of errors and stability
  • New admin panel theme with a lot of innovations:
    • Drag & drop in the document tree
    • Dark style, quickly switching the appearance of the admin system
    • Easier and faster
    • Context menu for elements
    • Ajax search in the admin area
    • Remembering paths in admin panel
    • 3 Level menu items with search and the ability to create a new item
    • Support for mobile devices, although there is still some work in progress
  • Widgets for the main page (OnManagerWelcomeHome)
  • Change the top menu (OnManagerMenuPrerender)
  • Document tree changes (OnManagerNodePrerender)

In details the new features:

New logo:

Many thanks to the company and SKY INCOM (https://www.skyname.net) for the development of the logo:
logo

Changelog 1.2.2

- delete all theme except the default
- fix style in the default theme
- fix showChildren in tree
- fix #60 Shrinking browser width results in site tree overlay
- fix #62 Edit date on dashboard recently edit/created panel is wrapped
- new plugin Updater (For update evo from admin panel)
- Fixed display of navigation for managers with different rights

New Manager Theme

home1

Switch theme with a button above the tree of elements near the basket

home2

Significantly speed up the load of the manager for example the main page size is less than 740kb
And loaded in 0.2 seconds. It used to be: 1 meg and 0.8 seconds, and also removed 1 second of waiting after saving the document!

fast

Now it’s more convenient to work with elements in templates and chunks, because you can quickly go to the edit or create a new element

contextmenu

Search in the admin panel now AJAX + is looking not only for documents that makes it easier to develop and navigate, in the top menu all the elements are displayed at once that speeds up the work. In addition to drag & drop in the resource tree now the page does not reload the main page.

search

elements

Widget for Dashboards (OnManagerWelcomeHome):

Completely redone the work with widgets, simplified their addition and also left a reserve for the future so that you could build a user-friendly interface for the manager.
Widget example:

$e = &$modx->Event;
switch($e->name){
    case 'OnManagerWelcomeHome':
        //if($_SESSION['mgrRole']!=='2') return;
                
        //$widgets['welcome']['hide']='1';
        //$widgets['onlineinfo']['hide']='1';
        //$widgets['recentinfo']['hide']='1';
        //$widgets['news']['hide']='1';
        //$widgets['security']['hide']='1';
                
        $widgets['test'] = array(
            'menuindex' =>'1',
            'id' => 'test',
            'cols' => 'col-sm-6',
            'icon' => 'fa-rss',
            'title' => 'test',
            'body' => '<div class="card-body"></div>'
        );
        $e->output(serialize($widgets));
    break;
}

Widgets can be added in different plug-ins, there is no need to configure all widgets in one plug-in. Also in the future I think we will create a module or plug-in for easy customization by the user. In previous versions, there was a problem that the admin could not customize the widgets for the manager, since the settings were stored in localstorage. Now with this there are no problems.

Change main menu (OnManagerMenuPrerender):

The upper menu can be changed, according to the logic with the top menu and did the work of the widgets, below is the code example:

switch($e->name){
    case 'OnManagerMenuPrerender':
        //if($_SESSION['mgrRole']!=='2') return;
        unset($menu['reports']);
        unset($menu['tools']);
        unset($menu['users']);
        unset($menu['modules']);
        unset($menu['elements']);
        unset($menu['add_resource']);
        unset($menu['add_weblink']);

        $menu['remove_locks'] = array('remove_locks','main','Remove locks','javascript:modx.removeLocks();','Удалить блокировки','this.blur();','remove_locks','',0,20,'');

        $e->output(serialize($menu));
    break;
}

The only thing I notice is that if there are several plug-ins, deleting of element should be done in the last plug-in, you can add anything.

Change the documents in the tree as well as the context menu (OnManagerNodePrerender):

With this function you can change the behavior and appearance of resources in the tree, change the icon, click on the button to go to the module (For example, you can easily implement the Collections functionality from MODX REVOLUTION), you can also change the context menu that would be more understandable for example on the news section of the standard place Context menu to display: add news, all news.
Example plugin code:

$e = &$modx->Event;
switch($e->name){
    case 'OnManagerNodePrerender':
        if($ph['id'] == '2'){
            //Change icons for doc with id 2
            $ph['icon'] = "<i class='fa fa-address-card-o'></i>";
            $ph['icon_folder_open'] = "<i class='fa fa-address-card-o'></i>";
            $ph['icon_folder_close'] = "<i class='fa fa-address-card-o'></i>";

            $modx->logEvent(123, 1, '<pre>- '.print_r($ph, true).' -</pre>', 'ph info'. $ph['id']);
        }

        if($ph['id'] == '15'){
            //Hide child documents + change the icon + write to the variable variables m ph that would look what you can change
            $ph['icon'] = "<i class='fa fa-list'></i>";
            $ph['icon_folder_open'] = "<i class='fa fa-list-alt'></i>";
            $ph['icon_folder_close'] = "<i class='fa fa-list-ul'></i>";
            $ph['showChildren'] = '0';
            $ph['tree_page_click'] = 'index.php?a=3&id='.$ph['id'].'&tab=1';
            
            //Its custom menu for example took a standard that would be understandable what to change
            $ph['contextmenu'] = array(
                'header1' => array(
                    'innerText' => $ph['nodetitle'],
                ),
                'item3' => array(
                    'innerHTML' => '<i class="fa fa-file-o fa-fw fa-lg"></i> Child resource',
                    'title' => 'Child resource',
                    'id' => 'item3',
                    'onclick' => "modx.tree.menuHandler(3);",
                ),
                'item2' => array(
                    'innerHTML' => '<i class="fa fa-pencil-square-o fa-fw fa-lg"></i> Edit',
                    'title' => 'Edit',
                    'id' => 'item2',
                    'onclick' => "modx.tree.menuHandler(2);",
                ),
                'item5' => array(
                    'innerHTML' => '<i class="fa fa-arrows fa-fw fa-lg"></i> Move',
                    'title' => 'Move',
                    'id' => 'item5',
                    'onclick' => "modx.tree.menuHandler(5);",
                ),
                'item7' => array(
                    'innerHTML' => '<i class="fa fa-clone fa-fw fa-lg"></i> Make a copy',
                    'title' => 'Make a copy',
                    'id' => 'item7',
                    'onclick' => "modx.tree.menuHandler(7);",
                ),
                'item11' => array(
                    'innerHTML' => '<i class="fa fa-sort-numeric-asc fa-fw fa-lg"></i> Sort by menu item',
                    'title' => 'Sort by menu item',
                    'id' => 'item11',
                    'onclick' => "modx.tree.menuHandler(11);",
                ),
                'seperator' => '',
                'item9' => array(
                    'innerHTML' => '<i class="fa fa-arrow-up fa-fw fa-lg"></i> Publish',
                    'title' => 'Publish',
                    'id' => 'item9',
                    'onclick' => "modx.tree.menuHandler(9);",
                ),
                'item10' => array(
                    'innerHTML' => '<i class="fa fa-arrow-down fa-fw fa-lg"></i> Unpublish',
                    'title' => 'Unpublish',
                    'id' => 'item10',
                    'onclick' => "modx.tree.menuHandler(10);",
                ),
                'item4' => array(
                    'innerHTML' => '<i class="fa fa-trash fa-fw fa-lg"></i> Uninstall',
                    'title' => 'Uninstall',
                    'id' => 'item4',
                    'onclick' => "modx.tree.menuHandler(4);",
                ),
                'item8' => array(
                    'innerHTML' => '<i class="fa fa-arrow-circle-o-up fa-fw fa-lg"></i> Restore',
                    'title' => 'Restore',
                    'id' => 'item8',
                    'onclick' => "modx.tree.menuHandler(8);",
                ),
                'seperator2' => '',
                'item6' => array(
                    'innerHTML' => '<i class="fa fa-link fa-fw fa-lg"></i> Child Web Reference',
                    'title' => 'Child Web Reference',
                    'id' => 'item6',
                    'onclick' => "modx.tree.menuHandler(6);",
                ),
                'seperator3' => '',
                'item1' => array(
                    'innerHTML' => '<i class="fa fa-list fa-fw fa-lg"></i> All goods',
                    'title' => 'All goods',
                    'id' => 'item1',
                    'onclick' => "modx.tree.menuHandler(1);",
                ),
                'item12' => array(
                    'innerHTML' => '<i class="fa fa-eye fa-fw fa-lg"></i> Look inside',
                    'title' => 'Look inside',
                    'id' => 'item12',
                    'onclick' => "modx.tree.menuHandler(12);",
                ),
                'seperator4' => '',
                'item100' => array(
                    'innerHTML' => '<i class="fa fa-info fa-fw"></i> Example of your item',
                    'title' => 'Title',
                    'id' => 'item1',
                    'onclick' => "main.location.href='/'",
                ),

                'image2' => array(
                    'innerHTML' => '<img src="/assets/images/modx-logo.png" width="200" />'
                )
            );
            // Don't forget to check if the resource is published. The link publish does not make sense as well as sorting the items if it is not a folder.
            if ($ph['isfolder']=='0') unset($ph['contextmenu']['item11']);
            if ($ph['deleted']=='0') unset($ph['contextmenu']['item8']);
            if ($ph['deleted']=='1') unset($ph['contextmenu']['item4']);
            if ($ph['published']=='0') unset($ph['contextmenu']['item10']);
            if ($ph['published']=='1') unset($ph['contextmenu']['item9']);

        }
        $e->output(serialize($ph));
    break;
}

P.S.

Memory: 4 mb, MySQL: 0.0012 s, 0 request(s), PHP: 0.0318 s, total: 0.0330 s, document retrieved from cache.