Два тусклых массива, несколько ролей для пользователя! Роли в собственных столбцах

Я использую разведчика затмения! Теперь я хочу перечислить всех пользователей! Это нормально, но моя структура БД выглядит так:

+----+--------+-----------+---------------+-----------+--------+----------+
| ID |  Name  |  Surname  | Administrator | Moderator | Editor | Operator |
+----+--------+-----------+---------------+-----------+--------+----------+
|  1 | myname | mysurname |             1 |         1 |      0 |        0 |
+----+--------+-----------+---------------+-----------+--------+----------+

Итак, когда я заполняю таблицу, мне нужно показать все роли одного пользователя! Например: Если пользователь «тест» имеет роли администратора, модератора, строка таблицы должна быть такой:

╔════╦═════════════╦══════════╦══════════════════════════╗
║ ID ║ Usernameame ║ Password ║          Roles           ║
╠════╬═════════════╬══════════╬══════════════════════════╣
║  1 ║ test        ║ test     ║ administrator, moderator ║
╚════╩═════════════╩══════════╩══════════════════════════╝

Как лучше всего это сделать?


person sysdba    schedule 30.03.2015    source источник


Ответы (1)


У вас есть разные возможности сделать это. Одна из возможностей — сделать это на стороне клиента; это решение, которое я опишу здесь:

Создайте таблицу, содержащую эти строки:

  • ID: длинный столбец
  • Имя: Строковый столбец
  • Фамилия: Строковый столбец
  • Администратор: логический столбец (не отображается)
  • Модератор: логический столбец (не отображается)
  • Редактор: логический столбец (не отображается)
  • Оператор: логический столбец (не отображается)
  • Роли: Столбец String, Игнорируется из данных таблицы (в formData или в TablePageData)

В этом примере таблица находится в TableField, но она работает точно так же и для TablePage.

@Order(10.0)
@FormData(sdkCommand = FormData.SdkCommand.USE, value = AbstractTableFieldBeanData.class, defaultSubtypeSdkCommand = FormData.DefaultSubtypeSdkCommand.CREATE)
public class PersonsTableField extends AbstractTableField<PersonsTableField.Table> {

  @Override
  protected int getConfiguredGridH() {
    return 5;
  }

  @Override
  protected int getConfiguredGridW() {
    return 2;
  }

  @Override
  protected String getConfiguredLabel() {
    return TEXTS.get("Persons");
  }

  @Order(10.0)
  public class Table extends AbstractExtensibleTable {

    public NameColumn getNameColumn() {
      return getColumnSet().getColumnByClass(NameColumn.class);
    }

    public SurnameColumn getSurnameColumn() {
      return getColumnSet().getColumnByClass(SurnameColumn.class);
    }

    public ModeratorColumn getModeratorColumn() {
      return getColumnSet().getColumnByClass(ModeratorColumn.class);
    }

    public EditorColumn getEditorColumn() {
      return getColumnSet().getColumnByClass(EditorColumn.class);
    }

    public OperatorColumn getOperatorColumn() {
      return getColumnSet().getColumnByClass(OperatorColumn.class);
    }

    public RolesColumn getRolesColumn() {
      return getColumnSet().getColumnByClass(RolesColumn.class);
    }

    public AdministratorColumn getAdministratorColumn() {
      return getColumnSet().getColumnByClass(AdministratorColumn.class);
    }

    public IdColumn getIdColumn() {
      return getColumnSet().getColumnByClass(IdColumn.class);
    }

    @Order(10.0)
    public class IdColumn extends AbstractLongColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("id");
      }
    }

    @Order(20.0)
    public class NameColumn extends AbstractStringColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("Name");
      }
    }

    @Order(30.0)
    public class SurnameColumn extends AbstractStringColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("Surname");
      }
    }

    @Order(40.0)
    public class AdministratorColumn extends AbstractBooleanColumn {

      @Override
      protected boolean getConfiguredDisplayable() {
        return false;
      }
    }

    @Order(50.0)
    public class ModeratorColumn extends AbstractBooleanColumn {
      @Override
      protected boolean getConfiguredDisplayable() {
        return false;
      }
    }

    @Order(60.0)
    public class EditorColumn extends AbstractBooleanColumn {
      @Override
      protected boolean getConfiguredDisplayable() {
        return false;
      }
    }

    @Order(70.0)
    public class OperatorColumn extends AbstractBooleanColumn {
      @Override
      protected boolean getConfiguredDisplayable() {
        return false;
      }
    }

    @Order(80.0)
    @ColumnData(SdkColumnCommand.IGNORE)
    public class RolesColumn extends AbstractStringColumn {

      @Override
      protected String getConfiguredHeaderText() {
        return TEXTS.get("Roles");
      }

      @Override
      protected void execDecorateCell(Cell cell, ITableRow row) throws ProcessingException {
        cell.setText(StringUtility.join(", ",
            BooleanUtility.nvl(getAdministratorColumn().getValue(row)) ? TEXTS.get("Administrator") : null,
            BooleanUtility.nvl(getModeratorColumn().getValue(row)) ? TEXTS.get("Moderator") : null,
            BooleanUtility.nvl(getEditorColumn().getValue(row)) ? TEXTS.get("Editor") : null,
            BooleanUtility.nvl(getOperatorColumn().getValue(row)) ? TEXTS.get("Operator") : null
            ));
      }
    }
  }
}

Обратите внимание на реализацию execDecorateCell в файле RolesColumn. Текст вычисляется в зависимости от значений, содержащихся в невидимых столбцах. Обратите также внимание на аннотацию ColumnData в верхней части этого столбца.

4 невидимых столбца имеют свойство Displayable, установленное на false.

На сервере, если вы хотите разместить какие-то данные, вы можете сделать это так:

PersonsTable tableData = formData.getPersonsTable();
PersonsTableRowData rowData = tableData.addRow();
rowData.setId(42L);
rowData.setName("John");
rowData.setSurname("Johnny");
rowData.setAdministrator(Boolean.TRUE);
rowData.setModerator(Boolean.TRUE);
rowData.setEditor(Boolean.FALSE);
rowData.setOperator(Boolean.FALSE);

Обратите внимание, что нет rowData.setRoles(String) или rowData.getRoles() из-за @ColumnData(SdkColumnCommand.IGNORE) в клиенте.

Конечно, я думаю, что вы хотите использовать оператор SQL, чтобы сделать это. Вы закончите что-то вроде этого:

SQL.selectInto("SELECT " +
    " id, " +
    " name, " +
    " surname, " +
    " administrator, " +
    " moderator, " +
    " editor, " +
    " operator " +
    " FROM persons " +
    " INTO " +
    " :{personsTable.id}, " +
    " :{personsTable.name}, " +
    " :{personsTable.surname}, " +
    " :{personsTable.administrator}, " +
    " :{personsTable.moderator}, " +
    " :{personsTable.editor}, " +
    " :{personsTable.operator}",
    formData);

Вот мой результат:

Пример MyForm — Eclipse Scout

person Jmini    schedule 02.04.2015