Как сделать ARGUMENTS необязательным в ColdFusion 8? - PullRequest
3 голосов
/ 20 марта 2012

Я регулярно пользуюсь ColdFusion 8/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>

Ответы [ 2 ]

7 голосов
/ 20 марта 2012

В CFSCRIPT именованные аргументы являются обязательными, если не предоставлено значение по умолчанию (что нельзя сделать до CF9).

Чтобы сделать необязательные аргументы в CFSCRIPT в ColdFusion 8 и ниже, вам необходимо удалить аргумент из определения функции и проверить его существование в теле функции. Вы можете сделать это, воспользовавшись преимуществами обработки в 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;
}
3 голосов
/ 20 марта 2012

Шон правильный:

Имена аргументов, требуемых функцией.Количество аргументов, передаваемых в функцию, должно быть равным или превышать количество аргументов в скобках в начале определения функции.Если на вызывающей странице пропущен какой-либо из обязательных аргументов, 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].Убедитесь, что вы задокументировали, что ожидается для аргументов [3] в комментарии.

ps не забывайте, вам нужно сделать свою собственную МЕСТНУЮ область видимости в CF8 ... т.е. var LOCAL = {}

...