Как установить имя динамического ключа в структуре?

Я просматриваю запрос и хочу динамически установить имя ключа структуры и его значение. Но я не могу заставить его работать, потому что он неправильно интерпретирует динамическое значение - он думает, что это фактическое имя ключа. Вот что я имею в виду

<cfloop query="rsSettings">
 <cfset APPLICATION.Config.Settings[rsSettings.CompanyID] = StructNew()>
 <cfset APPLICATION.Config.Settings[rsSettings.CompanyID].#rsSettings.Name#" = rsSettings.SettingValue/>
</cfloop>

Мне нужно, чтобы часть #rsSettings.Name# была значением имени, хранящимся в этом наборе записей, например. "МаксОрдерс"

Я пытался заключать его в кавычки, вот так <cfset APPLICATION.Config.Settings[rsSettings.CompanyID]."rsSettings.Name" = rsSettings.SettingValue/>, но это не сработало.

Что я могу сделать, чтобы он принял имя динамического ключа?


person volume one    schedule 14.04.2015    source источник
comment
[rsSettings.CompanyID] делает то, что вы хотите, так что свяжите их [rsSettings.CompanyID].[rsSettings.Name]   -  person Antony    schedule 14.04.2015
comment
Итак, как мне установить значение [rsSettings.CompanyID].[rsSettings.Name] ? Я думал, что это создает еще одно измерение в структуре   -  person volume one    schedule 14.04.2015
comment
<cfset APPLICATION.Config.Settings[rsSettings.CompanyID][rsSettings.Name]" = rsSettings.SettingValue/> структуры не имеют размеров, у них есть глубина (я полагаю) (и в моем первом комментарии есть опечатка, . между двумя ключами не должно быть там   -  person Antony    schedule 14.04.2015
comment
Функция StructInsert — это очень простой способ сделать именно то, что вы хотите сделать.   -  person Dan Bracuk    schedule 14.04.2015
comment
Вы уже устанавливаете динамический ключ с помощью APPLICATION.Config.Settings[rsSettings.CompanyID]. Почему бы вам не следовать тому же синтаксису?   -  person Scott Stroz    schedule 14.04.2015
comment
Если это внутри CFC, который мы обсуждали вчера, поместите Config в область переменных CFC и поместите саму CFC в область приложения.   -  person Joe Rinehart    schedule 14.04.2015
comment
Кроме того, вы действительно не хотите использовать structNew() для каждого for вашего запроса... иначе вы сбросите структуру для каждой строки.   -  person Joe Rinehart    schedule 14.04.2015
comment
@JoeRinehart Спасибо за совет. Что я сделал, так это создал файл Settings.cfc, который я создал в Application.cfc. Settings.cfc, в котором есть функции для выполнения CRUD настроек компании. Итак, эта первая функция получает все настройки для каждого CompanyID. Я не понимаю, что означает размещение Config в области переменных cfc. Не могли бы вы сообщить мне больше? Я думал, что мне нужно создать StructNew() для каждого идентификатора компании, чтобы хранить все их настройки... какая альтернатива?   -  person volume one    schedule 14.04.2015
comment
Да, вы захотите создать структуру, но вам нужно будет сделать это только ОДИН РАЗ для каждого идентификатора компании. Как написано, вы будете стирать все предыдущие настройки компании на каждой итерации их цикла. Читая этот и некоторые из ваших предыдущих постов, вы, вероятно, не пожалеете, если освоите фреймворк (я бы рекомендовал FW/1), который справится со многими из этих проблем, с которыми вы сталкиваетесь.   -  person Joe Rinehart    schedule 14.04.2015


Ответы (1)


Чтобы сделать динамические ключи в структуре, вам нужно использовать квадратные [] фигурные скобки. Вы можете сделать это следующим образом:

<cfloop query="rsSettings">
     <cfset APPLICATION.Config.Settings[rsSettings.CompanyID] = StructNew()>
     <cfset APPLICATION.Config.Settings[rsSettings.CompanyID][rsSettings.Name] = rsSettings.SettingValue/>
</cfloop>

Если у вас есть несколько настроек для компании (как упомянул Джо), которые вы получаете из запроса rsSettings, то в этом случае вам может потребоваться проверить, существует ли идентификатор компании в APPLICATION.Config.Settings. Как это:

    <cfloop query="rsSettings">
         <cfif NOT structKeyExists(APPLICATION.Config.Settings, rsSettings.CompanyID) >
              <cfset APPLICATION.Config.Settings[rsSettings.CompanyID] = StructNew()>
         </cfif>
         <cfset APPLICATION.Config.Settings[rsSettings.CompanyID][rsSettings.Name] = rsSettings.SettingValue/>
    </cfloop>
person Pankaj    schedule 14.04.2015
comment
Как указал Джо, для каждого элемента в запросе rsSettings вы будете создавать новую структуру, эффективно перезаписывая значения из последней итерации. - person Scott Stroz; 14.04.2015
comment
Привет, @ScottStroz, спасибо, что указал на это. Я обновил свой ответ, чтобы решить проблему. - person Pankaj; 15.04.2015
comment
Теперь проблема заключается в том, как настройки не будут обновляться в области приложения при их изменении. - person Scott Stroz; 15.04.2015
comment
@ScottStroz Всякий раз, когда администратор компании обновляет свои настройки, я запускаю функцию RefreshSettings(), которая будет обновлять только переменные области приложения для их идентификатора компании. - person volume one; 15.04.2015