3

私はColdFusion8/9/10を定期的に使用しています。以下のコードは、CF9とCF10でうまく機能します。(私は9でそれを開発しました)。ただし、CF8では機能しません。

CF9およびCF10で以下のコード(下部)を実行すると、すぐ下にHTML結果が表示されます。

<select>
    <option value="1">Option 1</option>
    <option value="2">Option 2</option>
    <option selected="" value="3">Option 3</option>
</select>

CF8で以下のコードを実行すると、次のエラーが発生します。

The SELECTED parameter to the WrapOption function is required but was not passed in.

CF8では、このコードを変更して、CF8で「選択された」パラメーター(またはその他のパラメーター)をオプションにする方法を教えてください。

<cfscript>

Options = WrapOption("Option 1", 1);
Options = Options & WrapOption("Option 2", 2);
Options = Options & WrapOption("Option 3", 3, "Selected");
SelectBox = WrapSelect(Options);
writeOutput(SelectBox);

// WRAP OPTION
function WrapOption(Content, Value, Selected) {
    LOCAL.Content = ARGUMENTS.Content;
    LOCAL.Properties = " value='#ARGUMENTS.Value#'";
    // SELECTED
    if (structKeyExists(ARGUMENTS, "Selected")) {
        LOCAL.Properties = LOCAL.Properties & " selected";
    }
    LOCAL.Item = "<option #LOCAL.Properties#>#LOCAL.Content#</option>";
    return LOCAL.Item;
}
// WRAP SELECT
function WrapSelect(Options, Class, ID) {
    LOCAL.Options = ARGUMENTS.Options;
    LOCAL.Properties = "";
    // CLASS
    if (structKeyExists(ARGUMENTS, "Class")) {
        LOCAL.Properties = LOCAL.Properties & " class='#ARGUMENTS.Class#'";
    }
    // ID
    if (structKeyExists(ARGUMENTS, "ID")) {
        LOCAL.Properties = LOCAL.Properties & " id='#ARGUMENTS.ID#'";
    }
    LOCAL.Item = "<select #LOCAL.Properties#>#LOCAL.Options#</select>";
    return LOCAL.Item;
}
</cfscript>
4

2 に答える 2

7

CFSCRIPTでは、デフォルトが提供されていない限り、名前付き引数が必要です(CF9まで実行できません)。

ColdFusion 8以下のCFSCRIPTでオプションの引数を実行するには、関数定義から引数を削除し、関数の本体に引数が存在するかどうかを確認する必要があります。これを行うには、ColdFusionの序数(名前付きではなく順序付き)引数の処理を利用します。

function WrapOption(Content, Value) {
    if ( ArrayLen(Arguments) GTE 3 ) {
        ARGUMENTS.Selected = ARGUMENTS[3];
    }   
    LOCAL.Content = ARGUMENTS.Content;
    LOCAL.Properties = " value='#ARGUMENTS.Value#'";
    // SELECTED
    if (structKeyExists(ARGUMENTS, "Selected")) {
        LOCAL.Properties = LOCAL.Properties & " selected";
    }
    LOCAL.Item = "<option #LOCAL.Properties#>#LOCAL.Content#</option>";
    return LOCAL.Item;
}
于 2012-03-20T19:58:16.703 に答える
3

ショーンは正しいです:

関数に必要な引数の名前。関数に渡される引数の数は、関数定義の先頭にある括弧内の引数の数以上である必要があります。呼び出し元のページで必要な引数のいずれかが省略されている場合、ColdFusionは不一致の引数カウントエラーを生成します。

引用元:http://livedocs.adobe.com/coldfusion/8/htmldocs/UDFs_03.html

CFMLで書き直すことができれば、確実に機能すると思います。

// WRAP OPTION
<cffunction name="WrapOption" output="false">
  <cfargument name="Content" required="true">
  <cfargument name="Value" required="true">
  <cfargument name="Selected">
  <cfscript>
    LOCAL.Content = ARGUMENTS.Content;
    LOCAL.Properties = " value='#ARGUMENTS.Value#'";
    // SELECTED
    if (structKeyExists(ARGUMENTS, "Selected")) {
        LOCAL.Properties = LOCAL.Properties & " selected";
    }
    LOCAL.Item = "<option #LOCAL.Properties#>#LOCAL.Content#</option>";
    return LOCAL.Item;
  <cfscript>
</cffunction>

または、CF8の回避策として、関数宣言子で選択した値を定義しないでください。arguments[3]が定義されているかどうかを確認してください。コメントにarguments[3]に期待されることを必ず文書化してください。

psは忘れないでください、あなたはCF8であなた自身のローカルスコープを作る必要があります...すなわちvar LOCAL = {}

于 2012-03-20T18:14:27.417 に答える