Изменить значение настраиваемого поля в Redmine Hook
Эта проблема:
Мои проблемы в настоящее время имеют 3 пользовательских поля, скажем, FieldA (выбрать список), FieldB (не имеет значения) и FieldC (текст).
Что должно произойти, так это то, что при сохранении FieldC принимает значение <FieldA>-<date in Ymd>-<number from database>
В качестве примера, давайте предположим, что FieldA имеет значение "Test", и сегодня это 8 января 2015 года. Тогда FieldC должен быть Test-20150108-001, где 001 берется из пользовательской таблицы в базе данных, которая уникальна для значения FieldA и сбрасывает каждый год.
Что я сделал сейчас:
Я использовал скрипт командной строки для генерации плагина через
ruby script/rails generate redmine_plugin subticket
И модель через
ruby script/rails generate redmine_plugin_model subticket subticket_ids fa:string lastnum:integer year:integer
(где fa - это значение поля FieldA, lastnum - это последнее число, используемое для этого значения, а year - текущий год, к которому применимо lastnum).
Затем я приступил к подготовке init.rb
Чтобы добавить прослушиватель хуков, чтобы улучшить пресавные хуки:
require_dependency 'subticket_hooks'
И создал файл lib/subticket_hooks.rb
со следующим содержанием:
class SubticketHooksListener < Redmine::Hook::ViewListener
def controller_issues_edit_before_save(context={})
issue = context[:issue]
end
end
Однако я не могу найти никакой документации о том, как получить доступ / записать значение настраиваемого поля здесь. Все еще работаю над тем, чтобы заставить модель работать, но я предполагаю, что документация достаточно ясна для этого, чтобы я мог экспериментировать (конечно, любая информация приветствуется!)
Обратите внимание, что это далеко за пределы моих способностей, поскольку мой основной опыт на совершенно другом языке - делайте это медленно!
1 ответ
У меня была такая же задача
Мое решение: каждый настраиваемый объект Redmine имеет custom_field_values
поле, это значение является массивом CustomFieldValue
, CustomFieldValue содержит текущее значение, описание настраиваемого поля и настраиваемый объект.
Необходимые значения, которые я читаю и изменяю, перебирая. Может быть, это не лучший вариант, но я не так давно познакомился с рубиновым языком.
Метод чтения значений пользовательских полей:
def object_custom_field_value(object, field_name)
object.custom_field_values.each do |field|
if field.custom_field.name == field_name
return field.value
end
end
end
И для изменения:
def object_custom_field_set_value(object, field_name, value)
object.custom_field_values.each do |field|
if field.custom_field.name == field_name
field.value = value
end
end
end
Надеюсь это поможет!
Обновление настраиваемого поля проекта с именем "Электронная почта":
project = Project.find(1)
cv = CustomValue.where(customized_type: "Project", customized_id: project.id).includes(:custom_field).where(custom_fields: {type: 'ProjectCustomField', name: 'Email'}).first
cv.update value: 'email@mail.com'
Получить: object.custom_field_value(field.id)
Обновить: object.custom_field_values = {field.id => val}
. Не забудьте сохранить:object.save_custom_field_values
. Однако это не работает для создания ценности, поэтому проверьте черезobject.custom_value_for(field.id).id?
Создать / обновить:
Легко. Просто добавьте строкуobject.custom_vield_values
перед обновлением кода. Он возвращает список значений и запускает создание пустого значения. пример
u = User.find(1)
cf = CustomField.where('name', 'mobile phone').first
u.custom_field_values # returns values, triggers creation
u.custom_field_values = {cf.id = "+123456789"} # set value
u.save_custom_field_values # save
Документы: rubydoc