Coldfusion: вставка родительских / дочерних динамических полей формы - PullRequest
0 голосов
/ 13 июля 2011

нужна помощь, чтобы обдумать, как к этому подойти.

У меня есть динамическая форма, которая позволяет пользователю создавать вопросы. У них может быть один ко многим вопросам.

Вопросы могут, в свою очередь, иметь один-много ответов, связанных с ними.

Пользовательский интерфейс управляется jquery и выполняется. Имена полей публикуются на странице обработки следующим образом:

Вопросы выглядят так: Вопрос1, Вопрос2, Вопрос3 и т. Д.

Ответы выглядят следующим образом: Вопрос1-Ответ1, Вопрос1-Ответ2, Вопрос2-Ответ1 и т. Д.

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

Что касается того, как технически подойти к этому, мое первое предположение состоит в том, чтобы построить массив вопросов, причем второй столбец массива представляет собой массив ответов. Тогда я бы просто перебрал массив.

Помощь? :) Спасибо!

Ответы [ 3 ]

0 голосов
/ 13 июля 2011

Что-то вроде этого поможет:

<cfloop list="#form.fieldNames#" index="field">
<!--- yes, i used len('question') rather than '8' for readability--->
<cfif len(field) gt len('Question') AND left(lCase(field), len('Question')) eq 'question'  and listLen(field,'-') eq 1>
    <cfset question = form[field]>
    <!--- insert question into database  --->
    <cfloop list="#form.fieldNames#" index="answerField">
        <cfif findNoCase(field, answerField) and listLen(answerField) gt 1>
            <cfset answer = form[answerField] >
            <!--- answer for same question, insert into database --->
        </cfif>
    </cfloop>
</cfif>

То, что мы делаем, - это циклический просмотр полей из формы и поиск вопросов. Когда мы находим один, мы вставляем в базу данных. Затем мы делаем цикл, чтобы найти ответы на этот вопрос и вставить их в базу данных

Как мы находим поле вопроса:

 <cfif len(field) gt len('Question') 
    AND left(lCase(field), len('Question')) eq 'question'  and 
    listLen(field,'-') eq 1>

если поле длиннее строки 'question' а оставшиеся 8 символов - это «вопрос» и нет тире с большим количеством символов

Как мы находим ответ:

 <cfif findNoCase(field, answerField) and listLen(answerField) gt 1>

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

Имеет смысл?

0 голосов
/ 19 июля 2011

Я работал над подобной проблемой и раньше, за исключением того, что у нас было до 5 уровней иерархических данных в форме. В этом случае мы использовали Javascript для построения структуры данных, преобразования их в JSON и отправки их через AJAX на сервер. Затем CF просто использовал JSONDeSerialize (), чтобы превратить его в иерархическую структуру структур в одной строке кода. Вы вкладываете больше работы в клиента, но это место, где структура уже определена, так что вам будет проще сделать это там?

0 голосов
/ 13 июля 2011

Вместо того, чтобы вставлять все ваши вопросы и ответы в массовую инструкцию с большим количеством циклов и логики, вставляйте их по мере их добавления пользователем.то есть звучит так, как будто вам понадобится кнопка «добавить еще один вопрос», использующая javascript [Ajax?] для добавления другого поля вопроса - используйте эту кнопку, чтобы вставить вопрос в базу данных.

...