【问题标题】:looping over a list with multiple and selected the selected ones循环遍历多个列表并选择选定的列表
【发布时间】:2014-12-07 11:24:48
【问题描述】:

我正在处理我得到两个列表的代码。我正在尝试使用这些列表来预先选择具有“多个”属性的选择框中的项目。但是,我无法维护这些选择。

代码:

<select name="sbbox" id="sbbox" class="can" multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(k,getproducts.ptype)#>selected</cfif>>#k#</option>
  </cfloop> 
</select>

示例值:

  • lstFinds = abc,xyz
  • getproducts.ptype 还包含像 abc,xyz 这样的值

如果用户的两个值都存在,我想保持两者都被选中。如果存在一个,则保持选中一个。如果没有选择,则保持无。

我也尝试过使用listContains,但没有成功。

从 pastebin 链接转移

ptype 值在数据库中以逗号分隔,即“abc,wed,mon,def”。无论这些值是什么,我都需要匹配并选择 listFind 中具有相同值的值。我希望我说得更清楚。

<cfset lstFinds = 'abc,xyz,def,www,kkr,mon,tue,wed'>

<cfquery name="getproducts" datasource="cdfg">
        select ptype
         from
        mytable  
        where
        ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#id#">
</cfquery>


<select name="sbbox" id="sbbox" class="can" multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(k,getproducts.ptype)#>selected</cfif>>#k#</option>
  </cfloop>
</select>

【问题讨论】:

  • 为 listFind 切换你的论点。该列表是第一个参数。如有疑问,请查看文档
  • 我没有明白你到底想说什么,请你澄清一下
  • 您的 listFind 函数应该将列表作为第一个参数,将要查找的值作为第二个参数
  • 改变了它,但这并不能解决问题,我正面临
  • getproducts.ptype 的值也是这样的:“abc,xyz” 如果可能,不要存储分隔列表。那种非规范化结构suffers from a number of weaknesses(容易出错,难以查询,不能很好地扩展)并使数据库难以有效地完成工作。更好的结构是将相关值存储在联结表中。

标签: coldfusion


【解决方案1】:

好的,提问者通过Pastebin提供了以下代码

<cfset lstFinds = 'abc,xyz,def,www,kkr,mon,tue,wed'>

<cfquery name="getproducts" datasource="cdfg">
    select ptype
     from
    mytable  
    where
    ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#id#">
</cfquery>

these are coming from database column ptype of a table as: abc,wed,mon,def

<select name="sbbox" id="sbbox" class="can" multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(k,getproducts.ptype)#>selected</cfif>>#k#</option>
  </cfloop>
</select>

我在 cflive.net 上运行了以下代码

<cfset lstFinds = 'abc,xyz,def,www,kkr,mon,tue,wed'>

<cfset getProducts = {pType = "abc,wed,mon,def"}>

<cfoutput><select name="sbbox" id="sbbox" class="can"  multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(getproducts.ptype,k)#>selected</cfif>>#k#</option>
  </cfloop>
  </select></cfoutput>

当我运行此代码时,选择了 abc、def、mon 和 wed。不应该选择这些,还是应该检查其他?

此代码似乎正在执行您的要求。我所做的唯一更改

  • 根据 Matt 在问题 cmets 中的建议更改了逻辑。
  • 因为我没有要运行查询的数据,所以我设置了一个 getProducts 结构,其中包含键“pType”和 Asker 建议的值。出于此处的目的,我的示例结构在功能上与单行查询相同。

最后,您是否有可能尝试从多行中提取此信息?你可以试试

<cfset variables.ptypes = valuelist(getproducts.ptype)>
<cfoutput><select name="sbbox" id="sbbox" class="can" multiple>
  <cfloop list="#lstFinds#" index="k" delimiters=",">
    <option value="#k#" <cfif #listfindnocase(variables.ptypes,k)#>selected</cfif>>#k#</option>
  </cfloop>
  </select></cfoutput>

【讨论】:

  • 您添加的样式属性很杂乱。这家伙正试图解决一个逻辑问题。
  • 是的,这是一个我厌倦了滚动的小盒子,但你是 100 对,我会把它们从答案中拉出来。在我回答之前应该有。
【解决方案2】:

这有三个问题:

<cfloop list="#lstFinds#" index="k" delimiters=",">
<option value="#k#" <cfif #listfindnocase(k,getproducts.ptype)#>selected</cfif>>#k#</option>
</cfloop>

首先,正如其他人所提到的,在 listfindnocase 函数中,列表排在第一位。

接下来,整理第一个问题后没有得到想要的结果的原因是 getproducts.ptype 不是一个列表。它是查询第一行的值。要获取列表中的所有值,请使用 valuelist() 函数。

最后,选择选项的正确语法是selected="selected"。所以上面的代码块应该是这样的:

<cfloop list="#lstFinds#" index="k" delimiters=",">
<option value="#k#" 
<cfif listfindnocase(ValueList(getproducts.ptype), k)>
selected="selected"
</cfif>>#k#
</option>
</cfloop>

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    相关资源
    最近更新 更多