我正在运行Coldfusion8/MySQL 5.0.88
。
我的数据库中有两个表:
modules
textblocks
我的网站运行多种语言,因此我会在每个页面的开头执行此操作,以根据用户选择的语言从数据库加载文本块。
<cfquery datasource="#Session.datasource#" name="texte">
SELECT *
FROM textblocks
WHERE lang = <cfqueryparam value = "#Session.lang#" cfsqltype="cf_sql_varchar" maxlength="2">
</cfquery>
<cfoutput query="texte">
<cfset "#trim(label)#" = "#trim(content)#">
</cfoutput>
如果我需要一个文本块,我可以简单地使用label
,如此:
<cfoutput>#tx_hello_world#</cfoutput>
我的问题在于包含模块列表的第二个表。
每个模块都有自己的描述(标题,子标题,信息,项目符号1-5)。我必须循环遍历所有模块(25),所以我只是将labels
存储在数据库中,希望进行单循环并从数据库中输出labels
。不幸的是输出label123
会返回
#label123#
对我希望
"text from table textblocks stored at label123"
问题:
是否有可能在MySQL中存储“动态变量”并在输出这些变量时检索它们的基础值?如果没有,那么在单个循环中输出25个模块的更好方法是什么,而不是说“如果这是模块A,则取文本tx_module_a_title,否则如果......”
谢谢!
修改
所以我希望避免必须在每个循环上运行:
<cfif mods.module_name EQ "agents">
<cfset variables.module_header = tx_module_b2b_agents_title>
<cfset variables.module_subheader = tx_module_b2b_agents>
<cfset variables.module_info = tx_module_b2b_agents_info>
<cfset variables.module_bull_1 = tx_module_b2b_agn_accounts>
<cfset variables.module_bull_2 = tx_module_b2b_agn_price_clients>
<cfset variables.module_bull_3 = tx_module_b2b_agn_client_mgt>
<cfset variables.module_bull_4 = tx_module_b2b_agn_create_retailer>
<cfset variables.module_bull_5 = tx_module_b2b_exp_grace>
<cfset variables.module_usage_tx = tx_vertreter/tx_gen_month>
<cfelseif mods.module_name EQ "preorder">
<cfset variables.module_header = tx_module_b2b_preorder_title>
<cfset variables.module_subheader = tx_module_b2b_preorder>
<cfset variables.module_info = tx_module_b2b_preord_info>
<cfset variables.module_bull_1 = tx_module_b2b_pre_split_type>
<cfset variables.module_bull_2 = tx_module_b2b_pre_qty_y_n>
<cfset variables.module_bull_3 = tx_module_b2b_pre_deliverydate>
<cfset variables.module_bull_4 = tx_module_b2b_exp_grace>
<cfset variables.module_bull_5 = "">
<cfset variables.module_usage_tx = tx_gen_month >
<cfelseif mods.module_name EQ "export">
<cfset variables.module_header = tx_module_b2b_export_title>
<cfset variables.module_subheader = tx_module_b2b_export>
<cfset variables.module_info = tx_module_b2b_export_info>
<cfset variables.module_bull_1 = tx_module_b2b_exp_pricelists>
<cfset variables.module_bull_2 = tx_module_b2b_exp_currencies>
<cfset variables.module_bull_3 = tx_module_b2b_exp_customerlist>
<cfset variables.module_bull_4 = tx_module_b2b_exp_regional_assortme>
<cfset variables.module_bull_5 = tx_module_b2b_exp_grace>
<cfset variables.module_usage_tx = tx_gen_month>
... 22 else-ifs to go
</cfif>
如果我可以将文本块存储在数据库模块记录中的tx_
值后面,我可以从那里检索它们。
答案 0 :(得分:1)
当您从数据库输出内容时,您可以在内容上使用de()
和evalaute()
来处理变量。您可能需要使用嵌套组合。我忘记了确切的语法。
De(evaluate('#var#'))
或类似的东西。
但是,如果内容中的任何其他#
不是var,则会出现问题。我建议改用词典。请参阅此文Content Management : Processing Dynamic Content
答案 1 :(得分:1)
假设您的texte查询中包含可变内容您可以执行以下操作:
<cfloopquery="texte">
<cfset variables[trim(texte.label)] = trim(texte[content][texte.currentrow])>
</cfloop>
您的查询是一个可以像其他结构一样引用的结构,您可以使用内置的currentrow属性来引用结构中的currentrow
重新阅读你的问题后,看起来上下文存储在模块表中?然后你可以做到。无论哪种方式,你都应尽量避免使用评估,尽管这样可行。
<cfloop query="texte">
<cfloop query="modulesquery">
<cfset variables[trim(texte.label)] = trim(modulesquery[content][modulesquery.currentrow])>
</cfloop>
</cfloop>
答案 2 :(得分:0)
我只想专注于这一点:
问题:是否可以在MySQL和MySQL中存储“动态变量” 在输出这些时,检索它们的基础值?
我可能会做的是将文本存储为文件,并将文件的路径存储在数据库中。然后当你需要让CF来处理文件时 - 解决变量的唯一方法 - 只需从数据库中提取路径,然后将文件包含在该路径中。
如果文本需要进入数据库,那么你需要从数据库中读取它,将其写入文件,然后包含该文件。要处理CF变量,需要由CF处理,为此,您需要将文件传递给ColdFusion。就是这样。
然而,每次在需要时编写文件并包含它们都会很慢,因为文件需要在运行之前进行编译,编译过程相对较慢。
解决这个问题的方法是只在文件发生变化时编写文件,而不是每次需要时编写文件。在大多数网站上,数据的读取频率比其变化的频率更高,仅仅取决于网站的工作方式。