предварительное заявление cfif - PullRequest
2 голосов
/ 06 августа 2010

Как бы я создал это утверждение в CF?

<cfif (not isdefined("URL.room") or #URL.room# EQ "")
      and (not isdefined("URL.system" or #URL.system# EQ "")
      and (not isdefined("URL.date") or #URL.date# EQ "")>

Очевидно, что скобки не работают, но иллюстрируют то, что я пытаюсь выполнить.Какой синтаксис для этого?

РЕДАКТИРОВАТЬ: Хорошо, я понимаю, как использовать EQ и все такое.Я отправил это в некоторой спешке.Мой вопрос о скобках.Синтаксически правильно ли использовать их таким образом?

Ответы [ 6 ]

15 голосов
/ 06 августа 2010

РЕДАКТИРОВАТЬ: Хорошо, я понимаю, как использовать эквалайзер и все такое. Я опубликовал это немного спешить. Мой вопрос о скобки. Это синтаксически правильно использовать их таким образом?

Синтаксически да. Синтаксис кода правильный и не выдает синтаксических ошибок.

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

<cfif (not isdefined("URL.room") or URL.room EQ "")
    and (not isdefined("URL.system" or URL.system EQ "")
    and (not isdefined("URL.date") or URL.date EQ "")
    >


И я был бы более склонен написать это так:

<cfif NOT
    (  ( isDefined('Url.Room')   AND Len(Url.Room)   )
    OR ( isDefined('Url.System') AND Len(Url.System) )
    OR ( isDefined('Url.Date')   AND Len(Url.Date)   )
    )>

Потому что это гораздо более читабельно и делает более очевидным, что каждая строка проверяет одно и то же.


Во всяком случае, это предполагает, что я делал это в одном операторе IF.

Если вы начнете получать множество условий для проверки, вы можете рассмотреть возможность сделать что-то вроде этого:

<cfset FieldList = "Room,System,Date" />
<cfset AllFieldsValid = true />
<cfloop index="Field" list="#FieldList#">
    <cfif NOT ( StructKeyExists(Url,Field) AND Len(Url[Field]) )>
        <cfset AllFieldsValid = false />
        <cfbreak/>
    </cfif>
</cfloop>

<cfif AllFieldsValid>
...

Поначалу это может показаться пугающим, но гораздо проще в обслуживании - вы просто добавляете новый элемент в FieldList (и у вас уже может быть переменная, которая служит этой цели).

В любом случае, надеюсь, все это поможет - дайте мне знать, если есть какие-либо вопросы по этому поводу.

4 голосов
/ 06 августа 2010

Я бы предпочел ...

<cfparam name="URL.room" default="">
<cfparam name="URL.system" default="">
<cfparam name="URL.date" default="">


<cfif len(URL.room) EQ 0 and len(URL.system) EQ 0 and len(URL.date) EQ 0>
   ...
</cfif>

Или, если вам удобно смешивать не булевы функции и булево выражение

<cfif len(URL.room) and len(URL.system) and len(URL.date)>
   ...
</cfif>
3 голосов
/ 06 августа 2010

заменить = на

2 голосов
/ 06 августа 2010

В CFML операторы сравнения используют символы, а не символы:

==  EQ   
!=  NEQ  
>   GT    
>=  GTE   
<   LT    
<=  LTE   

Аналогично логическим операторам:

!   NOT
&&  AND
||  OR

Вы все еще можете использовать традиционные символы в режиме CFScript.

Также стоит упомянуть, что Railo , альтернативный механизм CFML для Adobe ColdFusion, позволяет использовать символы в коде на основе тегов, если нет двусмысленности с закрывающим тегом (например, условие заключено круглые скобки).

1 голос
/ 06 августа 2010

@ Генри:

 <cfif len(URL.room) EQ 0 and len(URL.system) EQ 0 and len(URL.date) EQ 0>
    ...
 </cfif>

Короче:

 <CFIF Len(URL.room) AND Len(URL.system) and Len(URL.date)>

Len () лучше, чем EQ ""

0 голосов
/ 06 августа 2010

Вам нужно немного обдумать свою логику.

Вы не можете проверить, является ли комната пустой строкой, если она не определена.

Вероятно, вам действительно нужно:Если (structkeyexist (URL, "room") и (Len (URL.room) eq 0 или URL.room eq 'blah')) Сделайте что-нибудь еще Сделайте что-то еще

Боюсь, стекопоток обрезает вашпример состояния на моем телефоне, но, надеюсь, это иллюстрирует, что вам нужно сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...