3

いくつかのレガシー コードを扱っていると、かなり厄介な状況に遭遇しました。<cfoutput query="x">タグを使用してクエリをループしています。そのクエリには「url」という名前の列があります。そのループ内で、url スコープ内にキーが存在するかどうかを確認する必要があります。CF は一般的なページ スコープよりもクエリの内容を優先するためstructKeyExists(url,"key")、この時点で CF に関する限り、url はクエリの現在の行の値を含む文字列であるため、使用できません。

クエリ スコープから抜け出して、URL の内容を調べるにはどうすればよいですか?

一時的に isDefined("url.key") を使用していますが、クエリ スコープから抜け出す方法があるかどうかを知りたいです。

また、列へのすべての参照を変更するために数時間の作業を追跡しなければ、列やクエリの列名を実際に変更することはできないため、可能であればそれを回避します。

編集: このコードがどのように設定されているか、および単純な解決策が適用されない理由について、いくつかの混乱があるようです。完全な例を挙げるのは難しいですが、状況を明確にしようと思います。

次の例では、「pageA」としてカウントされるページが多数あります。物事の仕組みを変えるには、スコープの変更と時間への投資が必要ですが、割り当てられた時間内には起こりません。

PageA は、url という名前の列の 1 つでクエリを実行し、cfoutput を介して出力ループを開始します。そのループ内に PageB が含まれます。ある PageA は、別の PageA とは異なる変数を URL スコープに持つ場合があります。実際にはそれらは同じですが、名前が異なる場合があります (varID=x の場合は vid=x)。PageB の内部では、その url スコープの値を使用する必要があるため、さまざまな可能な名前を実行したいと考えています (キー 'varID' が url に存在する場合はそれを使用し、それ以外の場合は 'vid' を使用します)。

これが、クエリの url 列ではなく、クエリ スコープを「パンチスルー」して url 構造を取得したい理由です。他の方法では、多くの PageAs を変更する必要があるようです。

したがって、問題はこの問題を具体的にどのように解決するかということではありません。それを行うには多くの方法があるため、実装とテストに多くの時間を追加するため、それらを避けたいと思います。url がクエリ列として存在し、クエリ スコープ内にいる場合、変数として url スコープにアクセスする方法はありますか?

4

5 に答える 5

3

URLスコープを返す関数を作成することはうまくいくかもしれないと思いましたが、テストすると、ローカルスコープのクエリ(関数がクエリ自体を使用するのを防ぎます)を使用してurlも、関数内での使用はまだ破損しています:

<cffunction name="getUrlScope"><cfreturn Url /></cffunction>
...
<cfoutput query="x">
<cfif StructKeyExists( getUrlScope() , 'key' )>
    <!--- still fails :( --->


ただし、文書化されていない (サポートされておらず、変更される可能性がある) オプションがあります。ダンプgetPageContext()すると、スコープの処理など、興味深いことを行う一連の関数が表示されます。

を使用getPageContext().SymTab_findBuiltinScope('URL')して URL スコープを取得できます。

getPageContext().getCfScopes()スコープの配列を取得するために使用することもできます。順序が固定されていることが保証されているかどうかはわかりませんが、[cgi,?,url,form,cookie,?] が CF10 と cflive (CF9) の両方でチェックされているようですので、そうである可能性があります。

(CF8 には、配列ではなく構造体を返すメソッド getBuiltinScopesがありました。これはもはや存在しないようであり、これらのメソッドのサポートされていない変更可能な性質全体が強化されています。)

Railo ではそれらは機能しませんがgetPageContext.UrlScope()、他のスコープ用の同様の名前の関数があります。

于 2013-08-24T18:28:24.550 に答える
0

structKeyExists(url,"key") を cfoutput ブロックの外に移動して、それを変数に格納できませんでしたか? または、structAppend を実行して、url 構造体を別の名前の別の構造体にコピーしますか?

于 2013-08-24T01:09:49.287 に答える