API-module

Критически важные изменения

  • Пользователи: добавлена возможность блокировать пользователей, необходимо добавить в таблицу users новое поле locked:
    ALTER TABLE `users`
        ADD `locked` TINYINT(1) NOT NULL DEFAULT '0' AFTER `auth_id`;
    
    А также создать новый файл api/app/RunAfter/Users/LockUnlock.php со следующим содежримым:
    <?php
    /**
     * После блокировки \ разблокировки пользователя
     *
     * @version 03.06.2019
     * @author  Дмитрий Щербаков <atomcms@ya.ru>
     */
    
    namespace Lemurro\Api\App\RunAfter\Users;
    
    use Lemurro\Api\Core\Abstracts\Action;
    use Lemurro\Api\Core\Helpers\Response;
    
    /**
     * Class LockUnlock
     *
     * @package Lemurro\Api\App\RunAfter\Users
     */
    class LockUnlock extends Action
    {
        /**
         * Выполним действие
         *
         * @param array $data Массив данных для ответа
         *
         * @return array
         *
         * @version 03.06.2019
         * @author  Дмитрий Щербаков <atomcms@ya.ru>
         */
        public function run($data)
        {
            return Response::data($data);
        }
    }
    
  • Пользователи: добавлен блок "Наборы прав доступа", необходимо добавить новую таблицу access_sets:
    -- Наборы прав доступа
    CREATE TABLE IF NOT EXISTS `access_sets`
    (
        `id`         INT(11)      NOT NULL AUTO_INCREMENT,
        `name`       VARCHAR(255) NOT NULL,
        `roles`      TEXT,
        `created_at` DATETIME,
        `updated_at` DATETIME,
        `deleted_at` DATETIME,
        PRIMARY KEY (`id`)
    )
        ENGINE = InnoDB
        DEFAULT CHARSET = utf8
        COLLATE = utf8_unicode_ci;
    
  • File: добавлена возможность вернуть все загруженные файлы обратно во временное хранилище если в вашем коде случилась ошибка и вы пойдете заново пытаться сохранить файлы из временного хранилища в постоянное, подробнее читайте здесь

Изменения средней важности

  • Компоненты Symfony обновлены до версии 4.3
  • До новых версий обновлены библиотеки:
    • monolog/monolog: v1.24;
    • nesbot/carbon: v2.18;
    • pimple/pimple: v3.2;
  • Новый хелпер LogException
  • Все не пойманные Exception отлавливаются в ядре и логируются в main.log
  • File: при загрузке файла во временное хранилище без аутентификации в качестве суффикса используется uniqid('', true)

WEB-module

Критически важные изменения

  • Верхнее меню "только для админов" не скрывалось для "простых пользователей", необходимо в файле /src/html/include/menu_topbar.html в элементе li, там где выпадающее меню с разделами "Справочники" и "Пользователи" добавить классы d-none js-role js-role__admin:

    Было Стало
    <li class="m-nav__item m-topbar__user-profile...>
        <a href="#" class="m-nav__link m-dropdown__toggle">
            <span class="m-topbar__username">
                <span class="text-muted">
                    <i class="fas fa-cogs"></i>
    <li class="d-none js-role js-role__admin m-nav__item m-topbar__user-profile...>
        <a href="#" class="m-nav__link m-dropdown__toggle">
            <span class="m-topbar__username">
                <span class="text-muted">
                    <i class="fas fa-cogs"></i>
  • Пользователи: добавлена возможность блокировать пользователей, в файл /src/html/pages/users/tpl_item.html вносим следующие изменения:

    • Кнопку Войти необходимо обернуть в тег {{#unless locked}}...{{/unless}}:

      {{#unless locked}}
      <li class="m-nav__item js-login-by-user">
          <a href="javascript:lemurro.users.loginByUser('{{id}}');" class="btn m-btn--icon">
              <span>
                  <i class="fas fa-fw fa-sign-in-alt"></i>
                  <span>Войти</span>
              </span>
          </a>
      </li>
      {{/unless}}
      
    • После кнопки Войти добавить блок кнопок Заблокировать \ Разблокировать:

      <!-- кнопка Войти -->
      <li class="m-nav__item">
          {{#if locked}}
          <a href="javascript:lemurro.users.unlock('{{id}}');" class="btn m-btn--icon">
              <span>
                  <i class="fas fa-fw fa-unlock"></i>
                  <span>Разблокировать</span>
              </span>
          </a>
          {{else}}
          <a href="javascript:lemurro.users.lock('{{id}}');" class="btn m-btn--icon">
              <span>
                  <i class="fas fa-fw fa-lock"></i>
                  <span>Заблокировать</span>
              </span>
          </a>
          {{/if}}
      </li>
      <!-- кнопка Удалить -->
      
    • А также заглушку кнопки для пользователя с id=1:

      <!-- кнопка Войти -->
      <li class="m-nav__item">
          <span class="btn m-btn--icon disabled">
              <span>
                  <i class="fas fa-fw fa-lock"></i>
                  <span>Заблокировать</span>
              </span>
          </span>
      </li>
      <!-- кнопка Удалить -->
      
    • В столбце с auth_id пользователя:

      Было Стало
      <td class="align-middle text-nowrap">
          <span class="auth_id">{{auth_id}}</span>
      </td>
      <td class="align-middle text-nowrap">
          <span class="auth_id">{{auth_id}}</span>
          {{#if locked}}
          <i class="fas fa-fw fa-lock text-warning" title="Пользователь заблокирован"></i>
          {{/if}}
      </td>
  • Пользователи: добавлен блок "Наборы прав доступа"

    • Скопируйте новые файлы:
      • /src/html/pages/users/access_sets.html;
      • /src/html/pages/users/tpl_access_sets__item.html;
      • /src/html/pages/users/tpl_access_sets__roles.html;
    • В файле /src/html/pages/users/form.html есть блок выглядящий примерно так:
      <div class="form-group m-form__group">
          <label>Права доступа</label>
          <div class="m-checkbox-inline">
              <label class="m-checkbox">
                  <input type="checkbox" class="js-role js-user-id-1" data-role="admin"> Администратор
                  <span></span>
              </label>
          </div>
          <table id="js-user__roles" class="table table-hover">
              <tr>
                  <td class="w1 text-nowrap">
                      <strong>Справочники</strong>
                  </td>
                  <td>
                      <div class="m-checkbox-inline">
                          <label class="m-checkbox">
                              <input type="checkbox" class="js-role" data-role="guide" data-access="read"> Просмотр
                              <span></span>
                          </label>
                          <label class="m-checkbox">
                              <input type="checkbox" class="js-role" data-role="guide" data-access="create-update"> Добавление и изменение
                              <span></span>
                          </label>
                          <label class="m-checkbox">
                              <input type="checkbox" class="js-role" data-role="guide" data-access="delete"> Удаление
                              <span></span>
                          </label>
                      </div>
                  </td>
              </tr>
              <!-- Сюда будет загружен список всех ролей из настроек -->
          </table>
      </div>
      
      Приводим его вот к такому виду:
      <div class="row">
          <div class="col-8">
              <label>Права доступа</label>
              <div class="m-checkbox-inline m--margin-left-10 m--margin-top-10">
                  <label class="m-checkbox">
                      <input type="checkbox" class="js-role js-user-id-1" data-role="admin"> Администратор
                      <span></span>
                  </label>
              </div>
          </div>
          <div class="col-4">
              <div id="js-user__access-sets" class="hidden">
                  <label>Применить набор прав доступа</label>
                  <select class="form-control m-input" onchange="lemurro.accessSets.apply()">
                      <!-- Сюда будет загружен список наборов прав доступа -->
                  </select>
              </div>
          </div>
      </div>
      <div class="form-group m-form__group">
          <table id="js-user__roles" class="table table-hover">
              <!-- Сюда будет загружен список всех ролей из настроек -->
          </table>
      </div>
      
    • В файле /src/html/pages/users.html добавьте новую вкладку:
      <!-- <li><a href="#tab-form">...</li> -->
      <li class="nav-item">
          <a href="#tab-access-sets" class="nav-link" data-toggle="tab" data-target="#tab-access-sets">
              <i class="fas fa-box-open"></i> Наборы прав доступа
          </a>
      </li>
      
      <!-- <div id="tab-form">...</div> -->
      <div class="tab-pane" id="tab-access-sets" role="tabpanel">
          <!-- include "users/access_sets.html" -->
      </div>
      
    • В файле /src/js/0-app/100-config.js в объект app.config.userRoles.list добавьте новый элемент:
      {
          name  : 'guide',
          title : 'Справочники',
          access: [
              'read',
              'create-update',
              'delete'
          ]
      }
      

Изменения средней важности

  • До новых версий обновлены библиотеки:
    • @fortawesome/fontawesome-free: v5.8.2;