В настоящее время я разрабатываю приложение Grails 1.3.7, которое будет использоваться для организации лекций, семинаров и других материалов, связанных с университетами.В этом контексте, репетиторы должны иметь возможность назначать темы, выбранные студентами ранее.Для этой цели я использую простую «матрицу» таблицы со студентами справа и доступными темами в качестве заголовков таблицы.Теперь преподаватели хотят, чтобы я понял, что строки таблицы перетаскиваемы.Я добился этого с помощью плагина jQuery, и все это прекрасно работает, но я также должен где-то сохранить новый порядок строк, поэтому я решил сохранить его как ArrayList в доменном классе.Я реализовал простую логику, чтобы стирать список и перестраивать его каждый раз, когда преподаватель сохраняет назначения тем.
Код для этих шагов:
Класс домена
class Seminar extends AbstractLecture {
...
ArrayList<Integer> studentOrder = new ArrayList<Integer>()
...
gsp: hiddenField содержит сериализованное представление нового порядка строк, установленное функцией javascript (работает нормально).
<g:form action="saveDistribution">
<g:hiddenField name="order" id="order" value=""/>
...
Контроллер
Функция сериализации плагина возвращает строку, которую я здесь разбиваю, это также не проблема, и идентификаторы правильно содержатся в списке после этого блока.
def saveDistribution = {
....
if (!params.order.toString().equals("")) {
seminar.studentOrder.clear() //seminar is the domain object
def temp = params.order.toString().replace('[','').replace(']','').replace("table-1=", "").replaceFirst('&', '')
def split = temp.split("&")
for (id in split) {
seminar.studentOrder.push(Integer.parseInt(id)) //Works fine
}
}
//If I check seminar.studentOrder here, the parsed values are present
//Now I redirect to another function (forward would also work, doesn't matter here)
redirect(action: "distributeTopics", id: params.id)
Но теперь большая проблема: когда яПосле того как после перенаправления, вы увидите check.studentOrder, список полностью пуст ... и я действительно, действительно, не знаю почему.Я сводил меня с ума в последние часы :( Я перепробовал все, что только мог себе представить, чтобы решить эту проблему, но у меня ничего не получалось. Теперь я убежден, что где-то упущен.
Я ценю все, что вы можете сделать, чтобы решить эту проблему. Если вам понадобится больше кода или даже полный код для этого контекста, я предоставлю его.
Заранее большое спасибо, Доминик
ОБНОВЛЕНИЕ (Полный код добавлен для обеих функций контроллера):
Вот код из distribteTopics: Класс TopicTableDataWrapper - это простой Java-класс для сбора необходимых данных, чтобы мне было легче в gsp.
КакВы можете видеть, я просто извлекаю объекты учеников из базы данных с предоставленными идентификаторами из ArrayList studentOrder, но так как список всегда пуст и сохранение тоже не работает ... ну, я застрял здесь.
def distributeTopics = {
def seminar = Seminar.findById(params.id)
if (!seminar) {
flash.message = "Error: Seminar not found. (Database error?)"
redirect(controller: "lecture", action: "list")
}
/*
* Gather all students and build an ArrayList<TopicTableDataWrapper>, which will be passed to the gsp.
*/
def wrapperList = new ArrayList<TopicTableDataWrapper>()
if (seminar.studentOrder.isEmpty()) {
for (student in seminar.students) {
//Selected topics
def topics = seminar.getPrioritizedTopics(student)
if (topics[0] == null) {
topics = null
}
//Already assigned topic
def assigned = seminar.getAssignedTopic(student)
//Comment
def comment = null
if (seminar.comments.containsKey(student.id.toString())) {
comment = seminar.comments.get(student.id.toString())
}
wrapperList.push(new TopicTableDataWrapper(student, assigned, comment, topics))
}
}
else {
for (studentId in seminar.studentOrder) {
def student = User.findById(studentId)
if (student == null) continue
//Selected topics
def topics = seminar.getPrioritizedTopics(student)
if (topics[0] == null) {
topics = null
}
//Possibly assigned topic
def assigned = seminar.getAssignedTopic(student)
//Comment
def comment = null
if (seminar.comments.containsKey(student.id.toString())) {
comment = seminar.comments.get(student.id.toString())
}
wrapperList.push(new TopicTableDataWrapper(student, assigned, comment, topics))
}
}
/*
* Now we also need a list of all topics.
* It is important that the list is sorted, because we must map the topic titles to the shortcuts in the gsp!
* We do this by building a hashmap which just maps 'T1', 'T2', ... as keys to the topics
*/
def topicList = seminar.topics.sort()
def map = new HashMap<String, Topic>()
def i = 1
for (topic in topicList) {
map.put("T" + i.toString(), topic)
i++
}
[seminar: seminar, wrapperList: wrapperList, topicMap: map, id: seminar.id]
}
def saveDistribution = {
def seminar = Seminar.findById(params.id)
if (!seminar) {
flash.message = "There was a problem while retrieving the seminar (database error?)."
redirect(controller: "lecture", action: "list")
}
/*
* Parse the corresponding radiogroup for every student in the seminar
*/
for (student in seminar.students) {
//Look if a topic has been assigned by checking the params -> "group <student.id>"
if (params.containsKey("group " + student.id)) {
//if that's the case, assign him this topic, but keep his selection for later corrections!
def topic = Topic.findById(Integer.parseInt(params.get("group " + student.id).toString()))
//Remove previously assigned topic for this seminar
def prevTopic = seminar.getAssignedTopic(student)
if (prevTopic != null) {
student.removeFromAssignedTopics(prevTopic)
}
student.addToAssignedTopics(topic)
}
}
if (!params.order.toString().equals("")) {
seminar.studentOrder.clear()
def temp = params.order.toString().replace('[','').replace(']','').replace("table-1=", "").replaceFirst('&', '')
def splitParam = temp.split("&")
for (id in splitParam) {
seminar.studentOrder.push(Integer.parseInt(id))
}
}
flash.message = "Distribution saved."
seminar.save(failOnError: true) //Still empty list after redirect
redirect(action: "distributeTopics", id: params.id)
}