Как добавить несколько полей enum для создания и редактирования форм в Grails 4? - PullRequest
1 голос
/ 04 мая 2020

В моей модели предметной области некоторые классы имеют коллекцию перечислений в виде поля. Я смоделировал его двумя различными способами, как встроенную коллекцию:

class A {
  String name
  Set<Enumeration> enumerations

  static embedded = ['enumerations']
}

enum Enumeration {
  ENUM_VALUE_1,
  ENUM_VALUE_2,
  ENUM_VALUE_3
}

А также как коллекцию hasMany :

class A {
  String name

  static hasMany = [enumerations:Enumeration]
}

enum Enumeration {
  ENUM_VALUE_1,
  ENUM_VALUE_2,
  ENUM_VALUE_3
}

В обоих случаях я Можно добавить значения перечисления в коллекцию в BootStrap. groovy следующим образом:

A.withTransaction { status ->
  def a1 = new A( name:"a1" )
  a1.addToEnumerations( Enumeration.ENUM_VALUE_1 )
  a1.addToEnumerations( Enumeration.ENUM_VALUE_2 )
}

Используя скаффолдинг, я могу видеть содержимое коллекции перечисления в index и показывают страницы, но на edit и create страницы отображается только метка, виджет не отображается.

Какой самый простой способ показать виджет, например множественный выбор, для полей этого типа в Grails 4 (я использую Grails 4.0.3)?

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 05 мая 2020

Какой самый простой способ показать виджет, например множественный выбор, для полей этого типа в Grails 4 (я использую Grails 4.0.3)?

Вы можете используйте тег select.

<g:select multiple="true" name="someName" from="${somePackage.SomeEnumClassName}"/>
0 голосов
/ 06 мая 2020

Это более простое решение без необходимости генерировать представления, т.е. не нужно изменять edit.gsp и create.gsp. Просто используйте плагин fields , как предложено @ jeff-scott-brown.

Предположим, что это класс вашего домена:

package mypackage

class MyClass {
  // ...
  // properties
  // ...
  Set<MyEnumeration> enumerations

  // no need to declare it as embedded
  // static embedded = ['enumerations'] 
}

enum MyEnumeration {
  ENUM_VALUE_1,
  ENUM_VALUE_2,
  ENUM_VALUE_3
}

И что вы создали скаффолд контроллер для него, т.е.

package mypackage

class MyClassController {
    static scaffold = MyClass
}

Единственное, что вам нужно сделать, это создать файл grails-app/views/_fields/myClass/enumerations/_widget.gsp со следующим содержимым:

<g:select 
    multiple="true" 
    name="${property}" 
    from="${mypackage.MyEnumeration}"
    value="${myClass?.enumerations}"
/>

Он также работает, если вы объявляете коллекцию перечислений как hasMany ассоциация, то есть

package mypackage

class MyClass {
  // ...
  // properties
  // ...

  static hasMany = [enumerations:MyEnumeration]
}

enum MyEnumeration {
  ENUM_VALUE_1,
  ENUM_VALUE_2,
  ENUM_VALUE_3
}
0 голосов
/ 05 мая 2020

Хорошо, если это для проверки данных для вашей базы данных, вы можете использовать ограничение «inList» для вашего домена в качестве того же ограничения, извлекая его в «Список» для использования:

def class = grailsApplication.getDomainClass(className)
def props = class.getConstrainedProperties()
props.each(){ k,v ->
    if(k=='theColumnName-you-are-trying-to-get'){
        return v.getInList()
    }
}
0 голосов
/ 05 мая 2020

Это процесс, которому я следовал после ответа @ jeff-scott-brown:

  1. Я создал представления для класса A:
generate-views A
Затем в grails-app/views/a/edit.gsp и grails-app/views/a/create.gsp я изменил этот элемент:
<f:all bean="a"/>

на эти другие элементы:

<f:with bean="a">
    <f:field property="name"/>
    <f:field property="enumerations">
        <g:select 
            multiple="true" 
            name="${property}" 
            from="${Enumeration}"
            value="${a?.enumerations}"
        />
    </f:field>
</f:with>

И он работает как для встроенный и подходы hasMany .

Не должно ли это быть скаффолдингом по умолчанию для коллекций перечислений в Grails?

...