Новый релиз EVO 1.3.0 в первую очередь интересен тем что идет уже под именем EVOLUTION CMS. А так же интересен тем что теперь не будет отдельно моей кастомной сборки которая развивалась активней основной ветки. Это приведет к тому что теперь обновления будут выходить чаще, думаю раз в месяц будет свежий релиз а не так как было последнее время что у нас 1 релиз в пол года год.


Сразу скажу пару слов про планы на будущее:
  • Начиная с текущей версии у нас будет правильная версионность: http://semver.org/lang/ru/ думаю это будет куда как удобней и правильней.
  • В ближайшее время будет закончена работа с сайтом для документации: docs.evo.im, и сниму видео как помогать с документацией так что б собрать все в одном месте. Также документация будет сразу мультиязычной.
  • Так же будут перемещены многие дополнения из ядра в репозиторий.
  • По части админки: удаление motools, перевод всего html на бутстрап.
  • Так же в планах интеграция composer и многое другое, в скором времени собираюсь накидать roadmap где будет расписано что и как.

Что же нового в 1.3.0:
  • Новое имя EVOLUTION CMS и Новый логотип.
  • Исправление ошибок и стабильность работы

  • Новая тема админ панели с большим количеством нововведений:
    • Drag&drop В дереве документов
    • Dark style переключение внешнего вида адмики

    • Еще легче еще быстрее
    • Контекстное меню для елементов
    • Удобный Ajax поиск по админке
    • Запоминание путей в админ панели
    • Меню элементов в 3 уровня с поиском и возможностью создать новый элемент
    • Поддержка мобильных устройств, хотя еще есть над чем работать
  • Виджеты для главной странички (OnManagerWelcomeHome)
  • Изменение верхнего меню (OnManagerMenuPrerender)
  • Изменения дерева документов (OnManagerNodePrerender)

Останавлюсь подробней на новинках:
Новое лого:

Больше спасибо компаниии SKY INCOM (https://www.skyname.net) за разработку логотипа:
logo


Последние изменения по сравнению с версией 1.2.2
- delete all theme exept dafault
- fix style in default theme
- fix showChildren in tree
- fix #60 Shrinking browser width results in site tree overlay
- fix #62 Edited date on dashboard recently editied/created panel is wrapped
- new plugin Updater (For update evo from admin panel)
- Исправлено отображение навигации для менеджеров с разными правами


Новая тема

home1
Переключается тема кнопочкой над деревом елементов возле корзины

home2


Значительно ускорили скорость работы админки к примеру главная страничка весит меньш 740кб
и загружается за 0,2 сек. Раньше было: 1 мег и 0,8 секунды, Так же убрали 1 секунду ожидания после сохранения документа что так же добавило удобства в работе с админкой


fast


Теперь удобней работать с элементами в шаблонах и чанках, так как можно быстро перейти к редактриованию или созданию нового элемента

contextmenu


Поиск в админке теперь AJAX + ищет не только по документам что облегчает разработку и навигацию, так же в верхнем меню отображаются сразу все элементы что ускоряет работу и с ними. Ну и в дополнение drag&drop в дереве документов и запоминание где мы находимся в админке теперь перезагрузка страницы не перекидывает на главную


search


elements


Виджеты для главной страницы (OnManagerWelcomeHome):

Полностью переделали работу с виджетами, упростили их добавление а так же оставили задел на будущее что б можно было седлать удобный интерфейс для их изменения самим менеджером.
Пример виджета:

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

Виджеты можно добавлять в разных плагинах, тоесть нет необходимости все виджеты настраивать в одном плагине. Так же в будущем думаю создадим модуль или плагин для удобной настройки самим пользователем. В прошлых версиях была проблема что админ не мог настроить виджеты для менеджера так как настройки хранились в локалстораже. Сейчас же с этим нет проблем.


Изменение верхнего меню (OnManagerMenuPrerender):

Верхнее меню можно менять довольно давно, собственно по логике с верхним меню и делали работу виджетов, ниже пример кода:

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','Удалить блокировки','javascript:modx.removeLocks();','Удалить блокировки','this.blur();','remove_locks','',0,20,'');

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

Единственное замечу что если будет несколько плагинов то удаление элементов нужно делать в последнем плагине, добавлять можно в любом.


Изменение документов в дереве а так же контекстного меню (OnManagerNodePrerender):

Этого функционала не хватало очень давно. Теперь можно менять поведение и внешний вид документов в дереве, менять иконку, по клику переходить в модуль (К примеру можно легко реализовать функционал Collections из MODX REVO), так же можно менять контекстное меню что б было более понятным к примеру на разделе новости место стандартного контекстного меню вывести: добавить новость, все новости.
Пример кода плагина:


$e = &$modx->Event;
switch($e->name){
    case 'OnManagerNodePrerender':
        if($ph['id'] == '2'){
            //Просто меняем иконку если 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).' -', 'Заголовок сообщения'. $ph['id']);
        }

        if($ph['id'] == '15'){
            //скрываем дочерние документы + меняем иконку + пишем в лог переменные масива ph что б глянуть что же можно изменять
            $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';
			
            //Свое кастомное меню для примера взял стандартное что б было понятно что изменять
            $ph['contextmenu'] = array(
                'header1' => array(
                    'innerText' => $ph['nodetitle'],
                ),
                'item3' => array(
                    'innerHTML' => '<i class="fa fa-file-o fa-fw fa-lg"></i> Добавить товар',
                    'title' => 'Дочерний ресурс',
                    'id' => 'item3',
                    'onclick' => "modx.tree.menuHandler(3);",
                ),
                'item2' => array(
                    'innerHTML' => '<i class="fa fa-pencil-square-o fa-fw fa-lg"></i> Редактировать',
                    'title' => ' Редактировать',
                    'id' => 'item2',
                    'onclick' => "modx.tree.menuHandler(2);",
                ),
                'item5' => array(
                    'innerHTML' => '<i class="fa fa-arrows fa-fw fa-lg"></i> Переместить',
                    'title' => 'Переместить',
                    'id' => 'item5',
                    'onclick' => "modx.tree.menuHandler(5);",
                ),
                'item7' => array(
                    'innerHTML' => '<i class="fa fa-clone fa-fw fa-lg"></i> Сделать копию',
                    'title' => 'Сделать копию',
                    'id' => 'item7',
                    'onclick' => "modx.tree.menuHandler(7);",
                ),
                'item11' => array(
                    'innerHTML' => '<i class="fa fa-sort-numeric-asc fa-fw fa-lg"></i> Сортировать по позиции в меню',
                    'title' => 'Сортировать по позиции в меню',
                    'id' => 'item11',
                    'onclick' => "modx.tree.menuHandler(11);",
                ),
                'seperator' => '',
                'item9' => array(
                    'innerHTML' => '<i class="fa fa-arrow-up fa-fw fa-lg"></i> Опубликовать',
                    'title' => 'Опубликовать',
                    'id' => 'item9',
                    'onclick' => "modx.tree.menuHandler(9);",
                ),
                'item10' => array(
                    'innerHTML' => '<i class="fa fa-arrow-down fa-fw fa-lg"></i> Отменить публикацию',
                    'title' => 'Отменить публикацию',
                    'id' => 'item10',
                    'onclick' => "modx.tree.menuHandler(10);",
				),
                'item4' => array(
                    'innerHTML' => '<i class="fa fa-trash fa-fw fa-lg"></i> Удалить',
                    'title' => 'Удалить',
                    'id' => 'item4',
                    'onclick' => "modx.tree.menuHandler(4);",
                ),
                'item8' => array(
                    'innerHTML' => '<i class="fa fa-arrow-circle-o-up fa-fw fa-lg"></i> Восстановить',
                    'title' => 'Восстановить',
                    'id' => 'item8',
                    'onclick' => "modx.tree.menuHandler(8);",
                ),
                'seperator2' => '',
                'item6' => array(
                    'innerHTML' => '<i class="fa fa-link fa-fw fa-lg"></i> Дочерняя веб-ссылка',
                    'title' => 'Дочерняя веб-ссылка',
                    'id' => 'item6',
                    'onclick' => "modx.tree.menuHandler(6);",
                ),
                'seperator3' => '',
                'item1' => array(
                    'innerHTML' => '<i class="fa fa-list fa-fw fa-lg"></i> Все товары',
                    'title' => 'Обзор ресурса',
                    'id' => 'item1',
                    'onclick' => "modx.tree.menuHandler(1);",
                ),
                'item12' => array(
                    'innerHTML' => '<i class="fa fa-eye fa-fw fa-lg"></i> Просмотр',
                    'title' => 'Просмотр',
                    'id' => 'item12',
                    'onclick' => "modx.tree.menuHandler(12);",
                ),
                'seperator4' => '',
                'item100' => array(
                    'innerHTML' => '<i class="fa fa-info fa-fw"></i> Пример своего пункта',
                    'title' => 'Title',
                    'id' => 'item1',
                    'onclick' => "main.location.href='/'",
                ),

                'image2' => array(
                    'innerHTML' => '<img src="/assets/images/modx-logo.png" width="200" />'
                )
            );
            //Незабываем проверять если документ опубликован то ссылка опубликовать не имеет смысла так же как и сортировка пунктов если это не папка. 
            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.