Как сохранить первичный ключ и значение для отправки формы - PullRequest
0 голосов
/ 01 марта 2012

У меня есть ряд строк таблицы, таких как:

<cfloop query="qryPlayer">
   (...snip...)
   <input data-playerid="#PlayerID#" name="PlayerSort" value="#PlayerSort#">
   (...snip...)
</cfloop>

В нижней части формы у меня есть одно поле:

<input type="hidden" name="PlayerIDs"> <!--- Populated by js --->

Всякий раз, когда пользователь изменяет значениев любой строке я заполняю PlayerID списком первичных ключей, связанных с полями, которые необходимо обновить:

$('input[name=PlayerSort]').change(function() {
    $('input[name=Save]').show();
    var arrPlayerID = [];
    $('input[name=PlayerSort]').each(function() {
        if ($(this).val()) {
            arrPlayerID.push($(this).data('playerid'));
        }
    });
    $('input[name=PlayerIDs]').val(arrPlayerID.join(','));
});

Затем, когда пользователь нажимает кнопку Сохранить, я обновляю все поля, имеющие значенияв них.

Q: Это то, что мне нужно делать?Это работает, но я забыл какой-то фундаментальный способ обработки отправки формы?

Кстати, клиент не хочет, чтобы он был AJAXified, потому что он хочет дать пользователю возможность нажать reset и начать заново.,Итак, введите набор значений, нажмите «Сохранить», и ColdFusion обновит все значения PlayerSort, связанные с form.PlayerIDs.

<cfloop list="#form.PlayerIDs#" index="local.PlayerID">
   <cfset local.Index = local.Index + 1>
   UPDATE dbo.Player SET
   PlayerSort = <cfqueryparam cfsqltype="cf_sql_integer" value="#ListGetAt(form.PlayerSort,local.Index)#">
   WHERE PlayerID = <cfqueryparam cfsqltype="cf_sql_integer" value="#local.PlayerID#">;
</cfloop>

1 Ответ

1 голос
/ 01 марта 2012

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

Используйте это для своего кода формы:

 <cfloop query="qryPlayer">
    (...snip...)
    <input name="PlayerSort_#PlayerID#" value="#PlayerSort#">
    (...snip...)
 </cfloop>

Тогда ваш код действия будет таким:

 <cfloop collection="#Form#" item="field">
    <cfif ListLen(field,"_") IS 2 AND ListFirst(field,"_") IS "PlayerSort">
        <cfquery datasource="YourDatasource">
        UPDATE  dbo.Player
        SET     PlayerSort = <cfqueryparam cfsqltype="cf_sql_integer" value="#Form[field]#">
        WHERE   PlayerID = <cfqueryparam cfsqltype="cf_sql_integer" value="#ListLast(field,'_')#">
        </cfquery>
    </cfif>
 </cfloop>
...