Иерархия компаний и поля с автокомпиляцией

Модератор: ykolesnikov

Siyet
OTRS Новобранец
Сообщения: 62
Зарегистрирован: 26 июн 2013, 16:56

Re: Иерархия компаний и поля с автокомпиляцией

Сообщение Siyet » 05 июл 2013, 11:00

Поправил в месте где создаем БД. Забыл написать про создание автоинкремента поля id.

Хочу заметить, что для сообщений и заявок дела с добавлением полей намного лучше. Как добавить поле в заявку можете посмотреть ссылке ниже.
http://doc.otrs.org/3.2/ru/html/dynamicfields.html
OTRS 3.2.8, Ubuntu 12.04, Apache, PostgreSQL

Siyet
OTRS Новобранец
Сообщения: 62
Зарегистрирован: 26 июн 2013, 16:56

Re: Иерархия компаний и поля с автокомпиляцией

Сообщение Siyet » 08 июл 2013, 10:04

Небольшое отступление: сделаем в форме редактирования компании поле "Комментарий" в виде textarea (т. е. не вместо одной строки ввода, многострочное поле ввода).

Во view'шке (верстке страницы) и controller'е (описание логики) разработчики предусмотрели только поля типа input и select.
Для начала поправим view'шку. Копируем Kernel/Output/HTML/AdminCustomerCompany.dtl в Custom/Kernel/Output/HTML/. Правим, скопированный файл:
Ищем:

Код: Выделить всё

<!-- dtl:block:PreferencesGenericInput -->
<!-- dtl:block:PreferencesGenericOption -->
Это конец блока Input и начало блока Option. Между этими двумя строками вставляем:

Код: Выделить всё

<!-- dtl:block:PreferencesGenericText -->
<label for="$QData{"Name"}" $Data{"MandatoryClass"}>
   $Data{"StarLabel"}
   $Text{"$Data{"Item"}"}:
</label>
<div class="Field">
   <textarea id="$QData{"Name"}" class="W50pc $Data{"RequiredClass"} $Data{"InvalidField"} $QData{"Action"}" name="$QData{"Name"}" title="Text" rows="10">$QData{"Value"}</textarea>
<!-- dtl:block:PreferencesGenericTextRequired -->
   <div id="$QData{"Name"}Error" class="TooltipErrorMessage">
      <p>$Text{"This field is required."}</p>
   </div>
   <div id="$QData{"Name"}ServerError" class="TooltipErrorMessage">
      <p>$Text{"This field is required."}</p>
   </div>
<!-- dtl:block:PreferencesGenericTextRequired -->
</div>
<div class="Clear"></div>
<!-- dtl:block:PreferencesGenericText -->
Теперь поправим логику. Правим файл Custom/Kernel/Modules/AdminCustomerCompany.pm:
Ищем наше "намыленное" место.
Ищем цикл:

Код: Выделить всё

for my $Entry ( @{ $Self->{ConfigObject}->Get('CustomerCompany')->{Map} } ) {
В нем условие:

Код: Выделить всё

if ( $Self->{ConfigObject}->Get('CustomerCompany')->{Selections}->{ $Entry->[0] } ) {
   my $OptionRequired = '';
   if ( $Entry->[4] ) {
      $OptionRequired = 'Validate_Required';
   }

   # build ValidID string
   $Block = 'Option';
   $Param{Option} = $Self->{LayoutObject}->BuildSelection(
      Data =>
         $Self->{ConfigObject}->Get('CustomerCompany')->{Selections}
         ->{ $Entry->[0] },
      Name  => $Entry->[0],
      Class => $OptionRequired . ' ' .
         ( $Param{Errors}->{ $Entry->[0] . 'Invalid' } || '' ),
      Translation => 0,
      SelectedID  => $Param{ $Entry->[0] },
      Max         => 35,
   );
}
После вставляем elsif на случай с полем "Комментарий":

Код: Выделить всё

            elsif ( $Entry->[0] =~ /^CustomerCompanyComment/i ) {
                my $OptionRequired = '';
                if ( $Entry->[4] ) {
                    $OptionRequired = 'Validate_Required';
                }
                $Block = 'Text';
                $Param{Value} = $Self->{LayoutObject}->BuildSelection(
                    Data  => $Param{ $Entry->[0] },
                    Name  => $Entry->[0],
                    Class => $OptionRequired . ' ' .
                        ( $Param{Errors}->{ $Entry->[0] . 'Invalid' } || '' ),
                    SelectedID => defined( $Param{ $Entry->[0] } ) ? $Param{ $Entry->[0] } : 1,
                );
            }
Проверяем и радуемся))
OTRS 3.2.8, Ubuntu 12.04, Apache, PostgreSQL

vovab
OTRS Новобранец
Сообщения: 17
Зарегистрирован: 27 фев 2013, 21:16

Re: Иерархия компаний и поля с автокомпиляцией

Сообщение vovab » 10 июл 2013, 19:17

А можно еще пару иллюстраций, так сказать для полноты картины? :)
Алексей Шульгин
SoftServe Business Systems
OTRS 3.3.12 + ITSM 3.3.12

Siyet
OTRS Новобранец
Сообщения: 62
Зарегистрирован: 26 июн 2013, 16:56

Re: Иерархия компаний и поля с автокомпиляцией

Сообщение Siyet » 11 июл 2013, 10:39

Какие именно иллюстрации нужны?
Вот создание компании клиента:
Вложения
pict.png
pict.png (24.46 КБ) 11264 просмотра
OTRS 3.2.8, Ubuntu 12.04, Apache, PostgreSQL

Siyet
OTRS Новобранец
Сообщения: 62
Зарегистрирован: 26 июн 2013, 16:56

Re: Иерархия компаний и поля с автокомпиляцией

Сообщение Siyet » 11 июл 2013, 18:44

Итак, друзья мои, обещанный autocompete поля "Вышестоящая организация" в купе с autocomplete'ом поля "id клиента", а также кнопочкой "Добавить нового клиента от этой организации" при редактировании сведений о компании.

Для начала уберем излишний код. Из файла Custom/Kernel/Modules/AdminCustomerCompany.pm удаляем следующие строки:

Код: Выделить всё

elsif ( $Entry->[0] =~ /^CustomerCompanyParent/i ) {
   my $OptionRequired = '';
   if ( $Entry->[4] ) {
      $OptionRequired = 'Validate_Required';
   }
   $Block = 'Option';               
   $Param{Option} = $Self->{LayoutObject}->BuildSelection(
      Data  => { $Self->{CustomerCompanyObject}->CustomerCompanyList(), },
      Name  => $Entry->[0],
      Class => $OptionRequired . ' ' .
         ( $Param{Errors}->{ $Entry->[0] . 'Invalid' } || '' ),
      SelectedID => defined( $Param{ $Entry->[0] } ) ? $Param{ $Entry->[0] } : 1,
   );
}
Данный код генерировал ниспадающий список полю "Вышестоящая организация". Теперь он нам не нужен.

Далее на скрепке плагин, который необходимо установить. Распаковываем и через "управление плагинами" панели администратора устанавливаем.
Данный плагин взят здесь: http://complemento.net.br/en/products-p ... e-on-otrs/

Он рассчитан на OTRS версии 3.0.х и 3.1.х, поэтому если будете качать с сайта, то после необходимо открыть его в блокноте и добавить строчку:

Код: Выделить всё

<Framework>3.2.x</Framework>
после строк

Код: Выделить всё

<Framework>3.0.x</Framework>
<Framework>3.1.x</Framework>
Как я уже писал, данный плагин не рассчитан под OTRS 3.2.x, поэтому подправим его. Копируем файл Kernel/Output/HTML/Standart/CustomerCompanyExtensions.dtl в Custom/Kernel/Output/HTML/Standart/. В скопированном файле ищем строку:

Код: Выделить всё

$(".ActionList .Last").before('<li><a class="CallForAction" href="index.pl?Action=AdminCustomerUser;Source=CustomerUser;Subaction=AddAction;UserCustomerID='+$("input[name=CustomerCompanyID]").val()+'"><span>$QData{"ActionText"}</span></a></li>');
Заменяем на:

Код: Выделить всё

$(".ActionList .Last").before('<li><a class="CallForAction" href="index.pl?Action=AdminCustomerUser;Source=CustomerUser;Subaction=Add;UserCustomerID='+$("input[name=CustomerCompanyID]").val()+'"><span>$QData{"ActionText"}</span></a></li>');
Плагин добавляет кнопку для создания клиента на странице редактирования компании, но не русифицирует ее. Исправим и это. В файле Kernel/Language/re_Custom.pm после строки

Код: Выделить всё

# own translations
Вставляем строку

Код: Выделить всё

$Self->{Translation}->{'Add new Contact of this Company'} = 'Добавить нового клиента от этой организации';
Плохо то, что при нажатии на кнопку "Добавить клиента от этой организации", в открывшейся странице автоматом не вбита организация. Возможно, покапавшись, в дальнейшем я это исправлю.
На данный момент у Вас добавилась вышеупомянутая кнопка и autocompete в поле "id клиента" на странице создания/редактирования клиента.
Теперь добавим autocompete к полю "Вышестоящая организация" на странице создания/редактирования компании. В том же файле ищем строки:

Код: Выделить всё

if(Core.Config.Get('Action')!="AdminCustomerCompany"){
	startCompanySearch('UserCustomerID');
	startCompanySearch('CustomerID');
};
Заменяем на

Код: Выделить всё

if(Core.Config.Get('Action')!="AdminCustomerCompany"){
	startCompanySearch('UserCustomerID');
	startCompanySearch('CustomerID');
} else if (Core.Config.Get('Action')=="AdminCustomerCompany") {
	startCompanySearch('CustomerCompanyParent');
};
Готово!
Вложения
CustomerCompanyExtensions-1.0.0.7z
(8.09 КБ) 496 скачиваний
OTRS 3.2.8, Ubuntu 12.04, Apache, PostgreSQL

Siyet
OTRS Новобранец
Сообщения: 62
Зарегистрирован: 26 июн 2013, 16:56

Re: Иерархия компаний и поля с автокомпиляцией

Сообщение Siyet » 11 июл 2013, 18:48

Осталось три косяка:
Первое:
Плохо то, что при нажатии на кнопку "Добавить клиента от этой организации", в открывшейся странице автоматом не вбита организация. Возможно, покапавшись, в дальнейшем я это исправлю.
Второе:
Не кэшируются списки, создание которых описано в данном топике.
И третье:
Автокомплит чувствителен к регистру букв, а также выводит все найденные результаты (хорошо бы ограничить).

Я постараюсь данные косяки исправить, не знаю правда когда, в моей компании внедрении OTRS идет полным ходом, пока нет времени на такие маленькие неточности.
И последнее: подскажите, пожалуйста, где посмотреть как собирать свой собственный плагин. Я бы все изложенное в топике в него затолкал и сделал бы настроечки для удобства пользования. Пробежался беглым глазом по просторам Интернета, так и не нашел ничего по этому поводу.
OTRS 3.2.8, Ubuntu 12.04, Apache, PostgreSQL

Ответить