Добрый день сообществу!
Долгое время эксплуатируем OTRS 4, недавно мигрировали на OTRS 6 CE по причине невозможности прикрутить SSO аутентификацию из-за старого Debian, на который была установлена OTRS 4. SSO теперь работает, аллилуйя!
К теме. В прежней "четверке" шаблоны телефонной заявки были созданы по мануалам из данного форума, сориентирую тех, кто будет искать решение:
1. Создан файл перевода /opt/otrs/Kernel/Language/ru_Custom.pm
2. Отредактирован файл /opt/otrs/Kernel/Output/HTML/Standard/AgentTicketPhone.tt, определив выпадающее меню с наименованиями шаблонов, а также определил действия для этого меню и action-скрипт (JS). Использовал инспекцию страницы в браузере, чтобы определить значения полей.
Пытаюсь повторить все это на OTRS 6 CE, меню появилось, поля Subject, Body и Dest подставляются без проблем, но ServiceID и SLAID не заполняются, причем скорее всего из-за того, что они не активны до тех пор, пока не выберешь пользователя, а SLA не активно, пока не выберешь Service. Такого в 4 версии не было, и как решить - не знаю. Не могу найти параметр в самой OTRS, который регулирует эту зависимость активности полей. Может кто знает, как сделать так, чтобы в телефонной заявке сразу были доступны для редактирования все поля?
Стрелками отмечены неактивные поля в OTRS 6, пока последовательно не заполнить Пользователя и Сервис:
OTRS 4
OTRS 6 CE
Шаблоны телефонной заявки в OTRS 6 CE
Модератор: ykolesnikov
Re: Шаблоны телефонной заявки в OTRS 6 CE
Ну вот, сам себе отвечаю.
Как и предполагал, пока пользователь не определен, сервис ему подставить невозможно, чтобы эту зависимость исключить идем:
Настройка системы-Core-Ticket-Ticket::Service::Default::UnknownCustomer
и включаем его. Как гласит пояснение: "Разрешает установить Сервис по умолчанию для несуществующих клиентов."
После этого в конфигурационном файле /opt/otrs/Kernel/Output/HTML/Standard/AgentTicketPhone.tt можно указывать значения для ServiceID и SLAID тем, кому необходима категоризация заявки сразу при создании.
Приведу блоки из AgentTicketPhone.tt, сразу после этой строки:
# example template for customizations, see hidden form at the end of the file
можно описать либо выпадающее меню с шаблонами (что удобнее, если их много), либо кнопки (не использую):
# ------------------------------------ Здесь определяем либо кнопки, ----------------------------------------------------------------------------------------------------
# <label>[% Translate("Templates") | html %]:</label>
# <div class="Field">
# <button type="button" onclick="$('#Template1').submit()" value="[% Translate("Example Template") | html %]">[% Translate("Example Template") | html %]</button>
# </div>
# <div class="Clear"></div>
# ---------------------------------------------- либо выпадающее меню для шаблонов заявок --------------------------------------------------------------------------------
<label>[% Translate("Templates") | html %]:</label>
<div class="Field">
<form>
<select id="setemplates" size="1">
<option value="nothing" selected="selected">- Здесь можно выбрать шаблон типовой заявки - </option>
<option value="Cartridge">[% Translate("Cartridge") | html %]</option>
<option value="Share">[% Translate("Share") | html %]</option>
<option value="Install">[% Translate("Install") | html %]</option>
<option value="Unblock">[% Translate("Unblock") | html %]</option>
<option value="Inet">[% Translate("Inet") | html %]</option>
<option value="Mail">[% Translate("Mail") | html %]</option>
<option value="1C-1">[% Translate("1C-1") | html %]</option>
<option value="1C-2">[% Translate("1C-2") | html %]</option>
<option value="1C-3">[% Translate("1C-3") | html %]</option>
<option value="1C-4">[% Translate("1C-4") | html %]</option>
<option value="1C-5">[% Translate("1C-5") | html %]</option>
<option value="1C-6">[% Translate("1C-6") | html %]</option>
<option value="1C-7">[% Translate("1C-7") | html %]</option>
<option value="1C-8">[% Translate("1C-8") | html %]</option>
<option value="1C-9">[% Translate("1C-9") | html %]</option>
</select>
</form>
</div>
<div class="Clear"></div>
#--------------------------------------- Конец блока определения кнопок ---------------------------------------------------------------------------------------------------
[% RenderBlockStart("TicketType") %]
И второй блок с действиями для созданного меню, важно вставить в нужном месте:
# example template form for customizations
#<form action="[% Env("CGIHandle") %]" method="post" enctype="multipart/form-data" id="Template1">
# <input type="hidden" name="Action" value="[% Env("Action") %]"/>
# <input type="hidden" name="Subaction" value="StoreNew"/>
# <input type="hidden" name="FormID" value="[% Data.FormID | html %]"/>
# <input type="hidden" name="ExpandCustomerName" value="1"/>
# <input type="hidden" name="Subject" value="Example Subject"/>
# <input type="hidden" name="Body" value="Name:
#Product:
#Comment:"/>
#</form>
#-----------------Тут описаны действия присвояения значений полям при выборе шаблона из списка-----------------------------
#--------------------Cartridge--------------------------------
<form action="[% Env("CGIHandle") %]" method="post" enctype="multipart/form-data" id="Cartridge">
<input type="hidden" name="Action" value="[% Env("Action") %]"/>
<input type="hidden" name="Subaction" value="StoreNew"/>
<input type="hidden" name="FormID" value="[% Data.FormID | html %]"/>
<input type="hidden" name="ExpandCustomerName" value="1"/>
<input type="hidden" name="Subject" value="Установка расходного материала по заявке"/>
<input type="hidden" name="Body" value="Прошу согласовать выдачу расходных материалов согласно заявке:"/>
<input type="hidden" name="Dest" value="Первичная техническая поддержка"/>
<input type="hidden" name="ServiceID" value="16"/>
<input type="hidden" name="SLAID" value="4"/>
<input type="hidden" name="TimeUnits" value="3"/>
</form>
привел только первый шаблон, остальные по аналогии, и главное, в конце определения действий - action скрипт на JS, чтобы все это забегало:
#------------------- скрипт подстановки значений, без него шаблоны не работают --------------------------------------------
<script type="text/javascript">
var selectmenu=document.getElementById("setemplates")
selectmenu.onchange=function(){ //run some code when "onchange" event fires
var chosenoption=this.options[this.selectedIndex] //this refers to "selectmenu"
if (chosenoption.value!="nothing"){
document.getElementById(chosenoption.value).submit();
}
}
</script>
Надеюсь, внятно объяснил, как создать файл кастомного перевода написано здесь:
viewtopic.php?f=4&t=1395
Как и предполагал, пока пользователь не определен, сервис ему подставить невозможно, чтобы эту зависимость исключить идем:
Настройка системы-Core-Ticket-Ticket::Service::Default::UnknownCustomer
и включаем его. Как гласит пояснение: "Разрешает установить Сервис по умолчанию для несуществующих клиентов."
После этого в конфигурационном файле /opt/otrs/Kernel/Output/HTML/Standard/AgentTicketPhone.tt можно указывать значения для ServiceID и SLAID тем, кому необходима категоризация заявки сразу при создании.
Приведу блоки из AgentTicketPhone.tt, сразу после этой строки:
# example template for customizations, see hidden form at the end of the file
можно описать либо выпадающее меню с шаблонами (что удобнее, если их много), либо кнопки (не использую):
# ------------------------------------ Здесь определяем либо кнопки, ----------------------------------------------------------------------------------------------------
# <label>[% Translate("Templates") | html %]:</label>
# <div class="Field">
# <button type="button" onclick="$('#Template1').submit()" value="[% Translate("Example Template") | html %]">[% Translate("Example Template") | html %]</button>
# </div>
# <div class="Clear"></div>
# ---------------------------------------------- либо выпадающее меню для шаблонов заявок --------------------------------------------------------------------------------
<label>[% Translate("Templates") | html %]:</label>
<div class="Field">
<form>
<select id="setemplates" size="1">
<option value="nothing" selected="selected">- Здесь можно выбрать шаблон типовой заявки - </option>
<option value="Cartridge">[% Translate("Cartridge") | html %]</option>
<option value="Share">[% Translate("Share") | html %]</option>
<option value="Install">[% Translate("Install") | html %]</option>
<option value="Unblock">[% Translate("Unblock") | html %]</option>
<option value="Inet">[% Translate("Inet") | html %]</option>
<option value="Mail">[% Translate("Mail") | html %]</option>
<option value="1C-1">[% Translate("1C-1") | html %]</option>
<option value="1C-2">[% Translate("1C-2") | html %]</option>
<option value="1C-3">[% Translate("1C-3") | html %]</option>
<option value="1C-4">[% Translate("1C-4") | html %]</option>
<option value="1C-5">[% Translate("1C-5") | html %]</option>
<option value="1C-6">[% Translate("1C-6") | html %]</option>
<option value="1C-7">[% Translate("1C-7") | html %]</option>
<option value="1C-8">[% Translate("1C-8") | html %]</option>
<option value="1C-9">[% Translate("1C-9") | html %]</option>
</select>
</form>
</div>
<div class="Clear"></div>
#--------------------------------------- Конец блока определения кнопок ---------------------------------------------------------------------------------------------------
[% RenderBlockStart("TicketType") %]
И второй блок с действиями для созданного меню, важно вставить в нужном месте:
# example template form for customizations
#<form action="[% Env("CGIHandle") %]" method="post" enctype="multipart/form-data" id="Template1">
# <input type="hidden" name="Action" value="[% Env("Action") %]"/>
# <input type="hidden" name="Subaction" value="StoreNew"/>
# <input type="hidden" name="FormID" value="[% Data.FormID | html %]"/>
# <input type="hidden" name="ExpandCustomerName" value="1"/>
# <input type="hidden" name="Subject" value="Example Subject"/>
# <input type="hidden" name="Body" value="Name:
#Product:
#Comment:"/>
#</form>
#-----------------Тут описаны действия присвояения значений полям при выборе шаблона из списка-----------------------------
#--------------------Cartridge--------------------------------
<form action="[% Env("CGIHandle") %]" method="post" enctype="multipart/form-data" id="Cartridge">
<input type="hidden" name="Action" value="[% Env("Action") %]"/>
<input type="hidden" name="Subaction" value="StoreNew"/>
<input type="hidden" name="FormID" value="[% Data.FormID | html %]"/>
<input type="hidden" name="ExpandCustomerName" value="1"/>
<input type="hidden" name="Subject" value="Установка расходного материала по заявке"/>
<input type="hidden" name="Body" value="Прошу согласовать выдачу расходных материалов согласно заявке:"/>
<input type="hidden" name="Dest" value="Первичная техническая поддержка"/>
<input type="hidden" name="ServiceID" value="16"/>
<input type="hidden" name="SLAID" value="4"/>
<input type="hidden" name="TimeUnits" value="3"/>
</form>
привел только первый шаблон, остальные по аналогии, и главное, в конце определения действий - action скрипт на JS, чтобы все это забегало:
#------------------- скрипт подстановки значений, без него шаблоны не работают --------------------------------------------
<script type="text/javascript">
var selectmenu=document.getElementById("setemplates")
selectmenu.onchange=function(){ //run some code when "onchange" event fires
var chosenoption=this.options[this.selectedIndex] //this refers to "selectmenu"
if (chosenoption.value!="nothing"){
document.getElementById(chosenoption.value).submit();
}
}
</script>
Надеюсь, внятно объяснил, как создать файл кастомного перевода написано здесь:
viewtopic.php?f=4&t=1395