Ответ 1
Я думаю, что самый простой способ сделать это - начать с изменения версии redmine. Как только он работает, вы можете продолжить работу и попытаться извлечь эту функцию в плагин.
Обратите внимание, что я не разработчик ruby, поэтому некоторые вещи ниже - это только мои догадки. Но я сделал несколько небольших модификаций redmine, подобных этому раньше, и надеюсь, что мои мысли могут быть полезными.
Это также будет проще, если вы знакомы с некоторыми из MVC-фреймворков (для любого языка), потому что они в основном имеют сходную структуру с маршрутами, контроллерами, представлениями и моделями.
Идея
Ссылка на копию отдельной проблемы выглядит следующим образом: //redmine.myserver.com/projects/myapp/issues/12407/copy
.
Моя идея - добавить параметр num_copies
к этой ссылке и использовать его в коде для создания множества копий.
Для этого вам не нужен интерфейс, после реализации функция будет работать следующим образом:
- найдите нужный вам вопрос.
- выберите для него действие
copy
- после открытия формы вручную добавьте параметр
?num_copies=XX
в URL (//redmine.myserver.com/projects/myapp/issues/12407/copy?num_copies=50
) и нажмите 'Enter', чтобы перезагрузить форму - проверьте детали и отправьте форму - она создаст несколько копий в соответствии с параметром
num_copies
План внедрения
Теперь, как это сделать. Я имею в виду redmine mirror на github, который выглядит свежим.
1) Найдите, где выполняется ссылка .../copy
Когда вы откроете форму для копирования проблемы, вы увидите следующую форму:
<form action="/projects/myapp/issues" class="new_issue" id="issue-form" method="post">
<input id="copy_from" name="copy_from" type="hidden" value="12407">
<div class="box tabular">
<div id="all_attributes">
...
</form>
Обратите внимание на действие формы, оно указывает на ссылку /issues
и отправит параметр copy_from
(это идентификатор проблемы, которую мы копируем).
2) Найдите код, который обрабатывает отправку формы
Мы могли сначала пройти и проверить через config/routes.rb
, но мы можем просто предположить, что нам нужен controllers/issues_controller.rb
Найдите место, где copy_from
параметр используется.
Вы увидите метод build_new_issue_from_params
.
Теперь найдите его использование, и вы найдете this:
before_filter :build_new_issue_from_params, :only => [:new, :create]
Как он выглядит, я думаю, что он вызывается перед действиями new
и create
.
Рассматривая новые и создавая определения, действие new
отображает новую форму вопроса, а действие create
обрабатывает сообщение формы.
3) Добавьте параметр num_copies
в форму
Найдите файл просмотра, который используется действие новой проблемы,
Здесь есть шаблон для новой формы выпуска, попробуйте добавить параметр num_copies
, похожий на copy_from:
<%= title l(:label_issue_new) %>
<%= call_hook(:view_issues_new_top, {:issue => @issue}) %>
...
<%= error_messages_for 'issue' %>
<%= hidden_field_tag 'copy_from', params[:copy_from] if params[:copy_from] %>
Здесь я не уверен на 100%, если он будет работать, если вы добавите аналогичную строку для `num_copies. Вам также может потребоваться изменить route.
Когда закончите, у вас должна появиться новая проблема:
<form action="/projects/myapp/issues" class="new_issue" id="issue-form" method="post">
<input id="copy_from" name="copy_from" type="hidden" value="12407">
<input id="copy_from" name="num_copies" type="hidden" value="50">
<div class="box tabular">
<div id="all_attributes">
...
</form>
4) Обращайтесь с параметром num_copies
Это должно быть сделано в создать действие:
def create
...
call_hook(:controller_issues_new_before_save, { :params => params, :issue => @issue })
@issue.save_attachments(params[:attachments] || (params[:issue] && params[:issue][:uploads]))
if @issue.save
...
end
Здесь у вас уже есть переменная @issue
, созданная в методе build_new_issue_from_params
, и вам нужно проверить, установлен ли параметр num_copies
, и если он установлен, то скопируйте/сохраните @issue
в для создания дополнительных копий.
Я не могу предоставить для этого точный фрагмент кода, но он не должен быть очень сложным.
Проверьте этот код в методе bulk_update
, он выглядит так, как вам нужно:
issue = orig_issue.copy({},
:attachments => copy_attachments,
:subtasks => copy_subtasks,
:link => link_copy?(params[:link_copy])
)