Использование ||ИЛИ в Coldfusion, если заявление с isDefined - PullRequest
0 голосов
/ 05 декабря 2018

Я использую переменные сеанса в Coldfusion 2018, и я пытаюсь выяснить, как добавить переменную в соответствии с настройкой операторов if if.

<cfif isDefined("session")
            and structKeyExists(session, 'checkout')
                and structKeyExists(session.checkout, 'info')
                    and structKeyExists(session.checkout.info, 'andor_1') >
        <cfif session.checkout.info.andor_1 eq "And">
      <strong>- All signatures are required.</strong>
      </cfif>
      </cfif>

or 

<cfif isDefined("session")
            and structKeyExists(session, 'checkout')
                and structKeyExists(session.checkout, 'info')
                    and structKeyExists(session.checkout.info, 'bandor_1') >
        <cfif session.checkout.info.bandor_1 eq "And">
      <strong>- All signatures are required.</strong>
      </cfif>
      </cfif>

Операторы if почти идентичны andor_1 или bandor_1, но любой из них может существовать не всегда, поэтому я использую isDefined.

Я пытался использовать || и or.

 <cfif isDefined("session")
                and structKeyExists(session, 'checkout')
                    and structKeyExists(session.checkout, 'info')
                        and structKeyExists(session.checkout.info, 'andor_1') 
|| isDefined("session")
                and structKeyExists(session, 'checkout')
                    and structKeyExists(session.checkout, 'info')
                        and structKeyExists(session.checkout.info, 'bandor_1')>
            <cfif session.checkout.info.andor_1 eq "And" || session.checkout.info.bandor_1 eq "And">
          <strong>- All signatures are required.</strong>
          </cfif>
          </cfif>

Любая помощьСочетание этих cfifs будет с благодарностью.

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Если вы используете CF2016, вы можете использовать Safe Navigation Operator или ?. (https://www.adobe.com/devnet/coldfusion/articles/language-enhancements-cf-2016.html).). Вам также следует начать использовать cfscript для таких логических операций.

<cfscript>
// Setup my struct. Session is a struct. I renamed it for my example since it's a special word.
s = {
    checkout : {
        info : { 
            andor_1 : "And" , 
            bndor_1 : "And" 
        }
    }
} ;

//writeDump(session);

// If CF2016+ Safe Navigation Operator To The Rescue!

if( s?.checkout?.info?.andor_1 == "And" || s?.checkout?.info?.bndor_1 == "And" ) {
  writeOutput("<strong>- All signatures are required.</strong>");
}
</cfscript>

https://trycf.com/gist/a82b8466c427fb40b53bbc506e4d419d/lucee5?theme=monokai

0 голосов
/ 06 декабря 2018

Другой вариант (хотя и менее производительный, чем при использовании structKeyExists().

<cfif isDefined("session.checkout.info.andor_1") AND session.checkout.info.andor_1 eq "And" 
  OR isDefined("session.checkout.info.bandor_1") AND session.checkout.info.andor_1 eq "And">

  <strong>- All signatures are required.</strong>
</cfif>

. Нужно установить некоторые значения по умолчанию, чтобы вам не нужно было запускать isDefined или structKeyExistsпроверок. Это может немного очистить ваш код и сделать его более читабельным.

Конечно, будут исключения или сценарии, где они необходимы (например, получение ответа от API).

0 голосов
/ 06 декабря 2018

Правильный путь в CF - это «ИЛИ», в отличие от ||.

Однако в первом примере вы поместили «ИЛИ» вне своих выражений IF.Попробуйте это:

 <cfif isDefined("session") AND structKeyExists(session, 'checkout') AND structKeyExists(session.checkout, 'info')
                AND (
                        (structKeyExists(session.checkout.info, 'andor_1') AND session.checkout.info.andor_1 eq "And")
                        OR
                        (structKeyExists(session.checkout.info, 'bandor_1') AND session.checkout.info.bandor_1 eq "And")
                    )>

     <strong>- All signatures are required.</strong>
</cfif>
...