0

さて、人々は私の質問をはっきりと理解していなかったので、他の誰かからすでに質問があったURLを削除しましたが、完璧な答えは得られませんでした。

だからここに質問があります........

私はColdFusion内で動的ドロップダウンリストをコーディングしようとしています。私が欲しいのは、ドロップダウンリストに上記のドロップダウンリストが表示されることです(例:Select Province(BC)は、CityドロップダウンリストにそのProvince内のすべての都市を入力します)。州のデータはColdFusionクエリから収集され、市のデータと同じになります。

JavaScript、AJAX、ColdFusion CFC、ColdFusionタグの数を超えないでください...:(ロジックコードは1つの.cfmファイル自体に含まれている必要があります。

  • 編集 -

@チャールズヒギンズ

それを機能させることができないようです。「CFCBinFcns.cfcの呼び出しエラー:内部サーバーエラー」がスローされます。「どこで間違っているのか教えてください。コードは次のとおりです。

これは「index.cfm」です

<cfquery name="qstates" datasource="info">
  SELECT states
  FROM info

  GROUP BY states
</cfquery> 
<html> 
<head> 
</head> 
<body> 
<cfform>
<cfselect name="DropDown1" bind="cfc:BinFcns.Method({DropDown1})">
    <cfoutput query="qstates"><option>#states#</option></cfoutput>
</cfselect>
<cfselect name="DropDown2" bind="cfc:BinFcns.Method({DropDown1})" /> 
</cfform>
</body> 
</html>

これは.cfc、「BinFcns.cfc」です

<cfcomponent output="true">
   <!--- set function name --->
   <cffunction name="Method" access="remote" returnType="array">
    <!--- this is what you passed to the CFC via the {} think in the select --->
      <cfargument name="Selected" type="numeric" required="true">
      <!--- Define array to produce the drop down --->
      <cfset var data="">
      <cfset var result=ArrayNew(2)>
      <cfset var i=0>
      <!--- Get data --->
      <cfquery name="data" datasource="info">
      SELECT *
      FROM info
      Order by cities
      </cfquery> 
      <!--- Convert results to array --->
      <cfloop index="i" from="1" to="#data.RecordCount#">
             <cfset result[i][1]=data.DropDownID[i]>
             <cfset result[i][2]='#DropDownTEXT#'>      
             <!--- determine which is selected via what you passed and something in the database --->
            <cfif data.DropDownID[i] eq #Selected#>
                <cfset result[i][3]=true>
            </cfif>
      </cfloop>

      <!--- And return it --->
      <cfreturn result>
   </cffunction>
</cfcomponent>     
4

5 に答える 5

1

あなたのCFC複雑ではありません、私がその最良のオプションを学ぶと信じてください、私はこのコードをテストしていませんが、それは動作に近いはずです..私のコードのほとんどのように醜いです。

<cfcomponent output="false">
   <!--- set function name --->
   <cffunction name="Method" access="public" returnType="array">
    <!--- this is what you passed to the CFC via the {} think in the select --->
      <cfargument name="Selected" type="numeric" required="true">
      <!--- Define array to produce the drop down --->
      <cfset var data="">
      <cfset var result=ArrayNew(2)>
      <cfset var i=0>
      <!--- Get data --->
      <cfquery name="data" datasource="#THIS.dsn#">
      SELECT *
      FROM 2ndDropDownData
      Order by DataName
      </cfquery> 
      <!--- Convert results to array --->
      <cfloop index="i" from="1" to="#data.RecordCount#">
             <cfset result[i][1]=data.DropDownID[i]>
             <cfset result[i][2]='#DropDownTEXT#'>      
             <!--- determine which is selected via what you passed and something in the database --->
            <cfif data.DropDownID[i] eq #Selected#>
                <cfset result[i][3]=true>
            </cfif>
      </cfloop>

      <!--- And return it --->
      <cfreturn result>
   </cffunction>
</cffunction>      

CFMシンプル!

DropDown1と呼ばれるドロップダウン。次に、ドロップダウン2の次のコードを介してcfcに渡します。

<cfselect name="DropDown2" bind="cfc:cfcname.Method({DropDown1})" /> 

その単純な...2つのドロップダウン、2つ目はCFCを呼び出します..学ぶ価値があります。

必要に応じて、2日にBindonloadを使用して事前選択することができます。

とにかく、それがあなたがCFCを恐れるのを止めることを願っています..彼らは非常に役に立ちます。

于 2012-11-16T19:59:14.850 に答える
0

まず、最初のドロップダウンをcfcにバインドするか、ページのクエリから入力することができますが、両方を行うことはできません。どちらの方法でも機能します。いずれかを選択してください。

次に、Methodcfcの関数に引数がありますが、それを適切に使用していません。句cfqueryで使用する必要がありますwhere。また、都市を事前に選択しようとしないでください。カスケード選択のコンテキストでは意味がありません。

于 2012-11-17T23:18:27.820 に答える
0

ページの上部に、cfqueryデータベースにアクセスしてデータを取得するを書き込むことができます。次に、ページ内でcfselectクエリ属性を持つタグを利用できます。これにより、から取得した値が選択ボックスに表示されますcfquery

これにより、ページをすばやく生成できますが、再利用性は低く、一般的に不適切な方法と見なされます。cfselect、、cfformなどのタグには近づかない傾向があります。cfqueryまた、サイト全体でアクセスできるように、中央の.cfcファイルに自分を追加します。これにより、クエリが変更され、特定の電話をかけた場所をサイト全体で探している時間を節約できます。

とにかく、質問があれば、これが役立つことを願っています!

- -編集 - -

更新された質問への回答。cfqueryページに2つのタグを付けることができます。ページの最初のロードで起動し、Provinceリストにデータを入力します。選択すると、フォームが送信され、URL変数が設定されます。次に、その変数を秒に渡してcfquery、都市リストに入力します。私の上のユーザーによって提供されたコードサンプルは、この点で機能します。

繰り返しますが、これが役立つことを願っています。特定のコードが必要な場合は、私が提供できますが、そのロジックによって正しい道を進むことができます。

于 2012-11-16T15:00:24.393 に答える
0

私は通常、jQueryを使用して独自のAJAX呼び出しを作成するだけなので、ColdFusionのデータバインディングについてはあまり詳しくありません。CFC /NOTCFCの概念は実際には同じです。サーバーにデータを要求している場合、.cfmファイルまたは.cfcを使用してデータを返す場合、コードは非常に似ています。

CFSelect Docsから、戻り値は次のようになります。

  • 2次元配列。各配列行の最初の要素はオプション値であり、行の2番目の要素はオプションリストに表示するテキストです。
  • バインドでCFC関数、クエリが指定されている場合、またはバインドでURLが指定されている場合は、クエリのJSON表現。クエリには、名前がcfselectタグ値と表示属性の値である列を含める必要があります。追加の列を返すことはできますが、クライアント側のコードでそれらを使用することはできません。CFC関数を呼び出す場合、クエリを自分でJSON形式に変換する必要はありません。変換はColdFusionが自動的に行います。この形式を使用するには、value属性を指定する必要があります。display属性を省略する場合は、クエリに値を含む列を1つだけ含める必要があります。値は、表示されるテキストとしても使用されます。

データのバインドからフォームフィールドへ

バインド式の使用バインド式を指定するには、次のいずれかの形式を使用します。

  • cfc:componentPath.functionName(parameters)注:コンポーネントパスはマッピングを使用できません。componentPath値は、Webルートまたは現在のページを含むディレクトリからのドット区切りのパスである必要があります。
  • javascript:functionName(parameters)
  • url:URL?parameters
  • URL?パラメータ
  • {firstname}。{lastname}@{domain}など、{bindparameter}の1つ以上のインスタンスを含む文字列
于 2012-11-16T11:43:52.027 に答える
0

恐ろしく悲鳴を上げる人もいると思いますが、ダイナミックな選択が必要な場合は、これが初心者として私が行っていたものです。

テーブルをクエリして、値を取得します

<cfquery datasource="xy" name="get">
 Select *
 From Data
</cfquery>

選択範囲内に出力を貼り付けるだけです。気を悪くしたい場合は、CFIFを使用して、表示しているビットを判別してください。CFSELECTを使用する必要はありませんが、selectを使用できます。

<cfselect name="select">
  <cfoutput query="get">
    <option value="#URLTAKENFROMDATABASE#"
    <cfif #CGI.SCRIPT_NAME# eq '#URLTAKENFROMDATABASE#'>selected</cfif>
     >#LINKNAME#</option
  </cfoutput>
</cfselect>

クエリまたは出力をグループ化して、ドロップダウン内のサブヘッダーに固定することができます。たとえば、次のようになります。

<cfoutput query"get" group="SECTIONA">
  <option value="">#SECTIONA#</option>
      <cfoutput>
        <option value="#URLTAKENFROMDATABASE#"
        <cfif #CGI.SCRIPT_NAME# eq '#URLTAKENFROMDATABASE#'>selected</cfif>
         >#LINKNAME#</option
      </cfoutput>   
</cfouput>
于 2012-11-16T17:15:08.900 に答える