2015-08-07 3 views
2

У меня проблема с функциями внутри моего cfc. Они действуют смешно, когда я пытаюсь ввести условную логику для назначения запроса сетке. В основном в URL-адресе у меня будет ?GRIDID=x, и он сообщит, что функция cfc запускается, но когда я вставляю тег cffunction внутри операторов if, он выдает ошибку. Вот код.Функция Coldfusion в условной логике

<cffunction name="grabInfo" access="remote" output="false" returntype="any"> 
    <cfargument name="page" required="yes"> 
    <cfargument name="pageSize" required="yes"> 
    <cfargument name="gridsortcolumn" required="yes"> 
    <cfargument name="gridsortdirection" required="yes"> 
    <cfargument name="filtercolumn" required="no" default=""> 
    <cfargument name="filter" required="no" default=""> 
    <cfargument name="gridID" required="yes"> 
    <cfif arguments.gridsortcolumn eq ""> 
     <cfset arguments.gridsortcolumn = "PatientsName" /> 
     <cfset arguments.gridsortdirection = "asc" /> 
    </cfif> 



<cfif ARGUMENTS.gridID EQ "1"> 
    <cfquery name="x" datasource="#dsn#"> 
    <!--- .... ---> 
    </cfquery> 
<cfreturn QueryConvertForGrid(qGrabInfo, Arguments.page, Arguments.pagesize)> 
</cffunction> 
</cfif> 

<cfif ARGUMENTS.gridID EQ "2"> 
<cfquery name="x" datasource="#dsn#"> 
    <!--- .... ---> 
    </cfquery> 
<cfreturn QueryConvertForGrid(qGrabInfo, Arguments.page, Arguments.pagesize)> 
</cffunction> 
</cfif> 

Это даст мне ошибку Context validation error for the cfif tag., но как вы можете видеть, все заявления Cfif закрыты. Если взять первый аргумент и поместить его с закрытием cffunction тега вне если заявления он будет работать, как так

<cfif ARGUMENTS.gridID EQ "1"> 
    <cfquery name="x" datasource="#dsn#"> 
    <!--- .... ---> 
    </cfquery> 
<cfreturn QueryConvertForGrid(qGrabInfo, Arguments.page, Arguments.pagesize)> 

</cfif> 

<cfif ARGUMENTS.gridID EQ "2"> 
<cfquery name="x" datasource="#dsn#"> 
    <!--- .... ---> 
    </cfquery> 
<cfreturn QueryConvertForGrid(qGrabInfo, Arguments.page, Arguments.pagesize)> 

</cfif> 
</cffunction> 

Причина мне нужно сделать это, потому что мне нужно несколько других функций выполняются, когда GridID EQ 2, поэтому мне нужно закрыть эту функцию и открыть ее следующим образом:

<cfif ARGUMENTS.gridID EQ "2"> 
<cfquery name="x" datasource="#dsn#"> 
    <!--- .... ---> 
    </cfquery> 
<cfreturn QueryConvertForGrid(qGrabInfo, Arguments.page, Arguments.pagesize)> 
</cffunction> 

<cffunction name="otherFunction"> 
    <!--- .... ---> 
</cffunction> 
</cfif> 
+2

* Причина, по которой мне нужно это делать * Нет, вы не делаете ;-). Вы вводите в заблуждение объявление функции и использование. Функции компонента должны быть определены спереди - не условно, т.е. в выражении 'cfif'. Используйте 'cfif', чтобы контролировать, какие из функций вы хотите * вызывать *, и когда. – Leigh

ответ

6

Добавить дополнительные функции в ваш компонент.

<cffunction name="grabInfo" access="remote" output="false" returntype="any"> 
    <cfargument name="page" required="yes"> 
    <cfargument name="pageSize" required="yes"> 
    <cfargument name="gridsortcolumn" required="yes"> 
    <cfargument name="gridsortdirection" required="yes"> 
    <cfargument name="filtercolumn" required="no" default=""> 
    <cfargument name="filter" required="no" default=""> 
    <cfargument name="gridID" required="yes"> 
    <cfif arguments.gridsortcolumn eq ""> 
    <cfset arguments.gridsortcolumn = "PatientsName" /> 
    <cfset arguments.gridsortdirection = "asc" /> 
    </cfif> 

    <cfif ARGUMENTS.gridID EQ "1"> 
    <cfquery name="x" datasource="#dsn#"> 
     <!--- .... ---> 
    </cfquery> 
    <cfreturn QueryConvertForGrid(qGrabInfo, Arguments.page, Arguments.pagesize)> 
    </cfif> 

    <cfif ARGUMENTS.gridID EQ "2"> 
    <cfquery name="x" datasource="#dsn#"> 
     <!--- .... ---> 
    </cfquery> 
    <!--- call your other functions ---> 
    <cfset otherFunction(arg1, arg2)> 
    <cfset anotherFunction(arg1, arg2)> 
    <cfreturn QueryConvertForGrid(qGrabInfo, Arguments.page, Arguments.pagesize)> 
    </cfif> 
</cffunction> 

Новые функции в одном компоненте

<cffunction name="otherFunction" access="remote" output="false" returntype="any"> 
    <cfargument name="arg1"> 
    <cfargument name="arg2"> 
    <!--- do things ---> 
</cffunction> 

<cffunction name="anotherFunction" access="remote" output="false" returntype="any"> 
    <cfargument name="arg1"> 
    <cfargument name="arg2"> 
    <!--- do things ---> 
</cffunction> 
6

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

Функции являются дискретными единицами обработки и должны быть автономными. То, что вы пытаетесь сделать, абсолютно не имеет смысла с точки зрения кода. Это также демонстрирует отсутствие понимания того, как работают функции. Они не выполняют, если они объявлены (т.е.. <cffunction>/</cffunction> блока, они работают, когда они называют

Мэтты получили вы на правильном пути, но повторяют, вы не делаете это:

<cffunction name="mainFunction"> 
    <!--- some stuff ---> 
    <cfif someCondition> 
     <!--- some other stuff ---> 
     <!--- finish off ---> 
     </cffunction> 
    <cfelse> 
     <!--- different stuff ---> 
     <cffunction name="theOtherFunction"> 
      <!--- different function ---> 
     </cffunction> 
     </cffunction><!--- this is for the outer function ---> 
    </cfif> 

это ... ну это не правильно

то, что вы хотите, это:.

<cffunction name="mainFunction"> 
    <!--- some stuff ---> 
    <cfif someCondition> 
     <!--- some other stuff ---> 
     <!--- different function ---> 
     <cfset something = theOtherFunction()> 
    </cfif> 
    <!--- finish off ---> 
</cffunction> 

<cffunction nname="theOtherFuction"> 
    <!--- different stuff ---> 
</cffunction> 

Обратите внимание, что каждая структура кодирования является автономной.

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

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

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

+0

* Они не выполняются, когда они объявлены (например: '/' * Хорошо сказано. Чтобы не допустить этого, даже игнорируя ошибки синтаксиса в исходном коде, а CF может позволить вам установить * полную * функцию определение внутри тегов cfif, т.е. ' ....' - вы не должны этого делать. – Leigh

+1

@Leigh Я не тестировал, но мое воспоминание о том, что объявления функций извлекаются и скомпилирован отдельно от окружающего кода, поэтому условность вроде бы была бы бессмысленной. Думаю, я должен перепроверить это. –

+0

Да, но это * * * точка (из-за отсутствия лучшего слова) ;-) Исходная проблема было не просто, что код должен быть «синтаксически действительным». CF позволит вам вложить объявление функции * complete * внутри условного выражения .., что может способствовать неправильному пониманию пользователем того, как работают функции. Хотя CF может считать этот тип кода синтаксически действительным, как вы говорите выше, это совершенно бессмысленно. Функции будут извлечены и предварительно скомпилированы, поэтому на самом деле они не делают то, что они думают в любом случае. – Leigh