Как бы вы выполнили запрос к базе данных на основе значения из элемента выбора формы?

Я использую ColdFusion в качестве сервера приложений и SQL Server в качестве базы данных. У меня есть элемент формы выбора, в котором перечислены несколько транспортных средств: Volvo S60, BMW M6, VW Jetta.

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

Итак, теперь я хочу перечислить доступные варианты для этого «типа» автомобиля в виде группы флажков. Это должно быть простым случаем циклического просмотра набора результатов базы данных и создания флажка для каждой строки.

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


person volume one    schedule 24.12.2012    source источник
comment
начните с некоторых руководств по AJAX, их легко найти.   -  person charlietfl    schedule 25.12.2012
comment
Жаль вопрос закрыли. Если ОП все еще ищет, вам нужно что-то похожее на связанные выборки. Самый простой способ сделать это с помощью coldfusion — привязать ваши cfinputs к методам cfc. Документация по cfinput поможет вам.   -  person Dan Bracuk    schedule 25.12.2012
comment
@ДанБракук. Это еще один пример того, как у людей возникает небольшой энергетический трип на S/O (см. статью в моем блоге о другом недавнем случае: adamcameroncoldfusion.blogspot.co.uk/2012/11/). Это в первую очередь вопрос о ColdFusion, но ни один из доводчиков не имеет истории с ColdFusion на этом сайте. Какая куча неудачников. Это определенно вопрос, и законный вопрос. Дэн, предлагаю вам проголосовать за возобновление работы... может быть, мы найдем еще трех человек, которые проголосуют за то же самое, и мы сможем ответить на него.   -  person Adam Cameron    schedule 25.12.2012
comment
Голосование за повторное открытие, поскольку на этот вопрос, вероятно, может дать окончательный ответ кто-то, имеющий опыт работы с ColdFusion, но ответ нелегко установить с помощью быстрого поиска. Другими словами, если бы я не знал, куда смотреть дальше, не обращаясь за помощью или не находя такой вопрос (отвеченный). @DanBracuk - если это снова откроется, рассмотрите возможность расширения вашего комментария до ответа.   -  person Tim Medora    schedule 25.12.2012
comment
@AdamCameron - моя репутация составляет всего 12% от того, что требуется для голосования при закрытии или повторном открытии вопросов. Однако, поскольку один из моих собственных был закрыт ранее, я знаю, что ОП может добавлять комментарии в эту ветку. Было бы неплохо увидеть знак интереса с его стороны. Я читал блог Адама относительно формулировки причины закрытия. Это то же самое, что использовалось на моем. Я подозреваю, что это происходит из какого-то списка выбора.   -  person Dan Bracuk    schedule 25.12.2012
comment
@DanBracuk, о да, это определенно общий список оправданий, чтобы закрыть вопрос. Дело в том, что они не применимы ни в том, ни в этом случае. Я... занимаюсь этой проблемой (насколько я могу), пока мы разговариваем... Оставайтесь с нами.   -  person Adam Cameron    schedule 25.12.2012
comment
Первый том, я нашел ответ на ваш вопрос. Я не могу правильно опубликовать его здесь, потому что вопрос закрыт (я также слежу за этим), но ответ есть в моем блоге: adamcameroncoldfusion.blogspot.co.uk/2012/12/. Он также делает некоторые замечания о людях, которые закрыли ваш - совершенно законный - вопрос. Извините, что вы так плохо относились к StackOverflow.   -  person Adam Cameron    schedule 26.12.2012
comment
Спасибо за ответы, ребята, я просто просматриваю их все. Я немного медлил с ответом из-за количества алкоголя, выпитого на Рождество!   -  person volume one    schedule 27.12.2012


Ответы (4)


В своем предыдущем комментарии я упомянул, что самый простой способ сделать это в ColdFusion — привязать элементы формы к методам cfc. Поиск в Google по запросу «cfinput bind» приведет к множеству примеров, но, поскольку меня попросили дать ответ, я покажу пример, который когда-то написал. Это не совсем то, чего хочет ОП, но это показывает общую идею. Он заполнит одно текстовое поле на основе значения другого.

Обратите внимание, что файлы cfc и cfm должны находиться в одном и том же каталоге.

.cfm-файл

<!--- When you type a clinic code here: ---->
<div id="clinicCodeInput" class="hidden">
Clinic Code <input name="clinicCode" type="text" />
</div>

<!---- A query result will appear here ---->
<div id="clinicNameFromPatientSatisfaction" class="hidden">
Patient Satisfaction Name <cfinput type="text" 
name="NameOfClinic" 
bind="cfc:PatientSatisfactionClinics.GetClinicName({clinicCode})" 
bindonload="no"> 
</div>

.cfc-файл

<cffunction name="GetClinicName" access="remote" returntype="string">
<cfargument name="clinicCode" type="string" required="yes">
<cfscript>
var clinicName = QueryNew("a");
var returnString = "No Record for Clinic Code " & arguments.clinicCode & ".";
var clinicCodeAsInt = 0;

if (isNumeric(arguments.clinicCode) 
and round(arguments.clinicCode) is arguments.clinicCode)
clinicCodeAsInt = arguments.clinicCode;
</cfscript>

<cfif clinicCodeAsInt gt 0>
<cfquery name="clinicName" datasource="dw">
select name
from patient_satisfaction_clinic
where clinic_code = 
<cfqueryparam cfsqltype="cf_sql_integer" value="#clinicCodeAsInt#">
</cfquery>

<cfif clinicName.recordcount gt 0>
<cfset returnString = clinicName.name[1]>
</cfif>
</cfif>  <!--- clinicCodeAsInt gt 0 --->

<cfreturn returnString>

</cffunction>
person Dan Bracuk    schedule 26.12.2012

В документах Adobe ColdFusion для <cfajaxproxy>, которые демонстрируют необходимые приемы. Это не делает точно то, что вы хотите, но это вопрос изменения разметки с простого текста на флажки в соответствии с вашими требованиями. здесь слишком много кода, чтобы воспроизводить его, но ключ в том, что вы используете <cfajaxproxy> для настройки прокси-сервера между JS на стороне клиента и CFC на стороне сервера, чтобы позволить JS получать данные с сервера.

Использование <cfajaxproxy> устраняет необходимость развертывания собственной обработки JS AJAX или использования для этого JQuery (и т. д.). Тем не менее, сделать это вручную не так уж сложно... было бы достаточно легко использовать методы, продемонстрированные в этом документе, чтобы полностью отделить CF от внешнего кода (есть хороший аргумент в пользу того, чтобы не использовать CF для выполнения клиентских операций). -сторонние вещи)... все это просто сводится к тому, чтобы обработчики событий прослушивали соответствующие события, а затем выполняли какой-то способ AJAX-вызова на сервер для получения данных, а затем помещали его в <div> или что-то в этом роде. В этом случае CF полагается только на проксирование: вам все равно придется делать все остальное самостоятельно.

person Adam Cameron    schedule 26.12.2012

Хорошо, вот что я сделал, что, кажется, работает для меня до сих пор. Но я собираюсь просмотреть добрые ответы Адама и Дэна.

Я создал форму на своей странице Vehicle.cfm со всеми элементами формы, кроме флажков.

Я создал новый шаблон CFM с именем VehicleOptions.cfm, который принимает параметр, выполняет SQL-запрос, а затем выводит фактический HTML для создания флажков.

Затем я перешел в область в моей форме на странице Vehicle.cfm, где я хотел, чтобы мои флажки отображались, и набрал это: <cfdiv bind="url:cfincludes/vehicleOptions.cfm?VehicleModel={Model}" />

«Модель» — это идентификатор элемента в моей форме, который содержит значение, для которого выбрано транспортное средство. Итак, теперь, когда пользователь изменяет модель в раскрывающемся списке, область каждый раз обновляется с разными флажками. Это действительно замечательно, и мне не пришлось писать ни строчки Javascript!

Это решение работает для того, что я хочу, но я предполагаю, что это не самое элегантное использование ColdFusion AJAX? Как я уже сказал, я рассмотрю ответы и постараюсь найти лучшее решение. Спасибо за вашу помощь, товарищи разработчики CF!

person volume one    schedule 26.12.2012
comment
Есть еще один способ получить ваши флажки, которые вам могут понравиться или не понравиться лучше, чем то, что у вас есть. В методе cfc используйте cfsavecontent для создания html-контента, который вы хотите разместить в своем div. Это может быть или не быть быстрее, чем метод, который вы придумали. Комплименты, кстати. - person Dan Bracuk; 27.12.2012
comment
Это звучит как вполне разумный подход для меня, и гораздо меньше ерунды, чем та вещь в документах, на которую я вам указал. - person Adam Cameron; 30.12.2012

Это просто. Каждая опция должна иметь закодированное в ней значение, например

<select>
<option class="car" name="car" value="volvo">Volvo</option>
<option class="car" name="car" value="honda">Honda</option>
<option class="car" name="car" value="ford">Ford</option>
</select>

Затем вы используете jQuery.

$('#go').on('click', function() {
    var car = $('.car:selected').val(); 
    // make ajax call here
});​

Вот рабочий пример: http://jsfiddle.net/Yxmjk/. Он не демонстрирует вызов AJAX, но демонстрирует, как можно получить данные, которые вы включаете в свой вызов AJAX.

person ktm5124    schedule 25.12.2012