-
Автоматическая подстановка значений при создании записей в сабпанели в SugarCRM
В данной статье пойдет речь о том, как автоматизировать подстановку значений при создании новых записей в сабпанелях.
В SugarCRM, при просмотре какой-либо записи, внизу страницы располагаются сабпанельки с записями других модулей, связанными с текущей записью. Например: при просмотре какого-либо контрагента, внизу страницы в виде сабпанели имеется информация о контактах, принадлежащих этому контрагенту:
Или, при просмотре сделки, внизу в сабпанелях имеется информация о мероприятиях, проводимых в рамках этой сделки:
Добавить новую встречу, которую надо провести по текущей сделке, можно нажав кнопку "Назначить встречу":
Система предложит ввести данные о новой встрече.
Допустим, нам надо автоматизировать ввод темы встречи. Тема должна быть в следующем формате:
Встреча: <ТемаСделки>
Для достижения желаемого результата нам надо отредактировать функционал, ответственный за формирование кнопки "Назначить встречу".
Классы, отдающие HTML-код той или иной кнопки, находятся в папке /include/generic/SugarWidgets. Нам нужны файлы, имеющие префикс SugarWidgetSubPanel. Но, как мы видим, таких файлов нашлось достаточно много. Какой же файл отвечает за вывод требуемой нам кнопки "Назначить встречу"?
Для ответа на этот вопрос мы должны посмотреть в файл, ответственный за формирование списка сабпанелей, и кнопок на них. Открываем файл /modules/Opportunities/metadata/subpaneldefs.php:
$layout_defs['Opportunities'] = array( // list of what Subpanels to show in the DetailView 'subpanel_setup' => array( 'activities' => array( 'order' => 10, 'sort_order' => 'desc', 'sort_by' => 'date_start', 'title_key' => 'LBL_ACTIVITIES_SUBPANEL_TITLE', 'type' => 'collection', 'subpanel_name' => 'activities', //this values is not associated with a physical file. 'module'=>'Activities', 'top_buttons' => array( array('widget_class' => 'SubPanelTopCreateTaskButton'), array('widget_class' => 'SubPanelTopScheduleMeetingButton'), array('widget_class' => 'SubPanelTopScheduleCallButton'), array('widget_class' => 'SubPanelTopComposeEmailButton'), ), 'collection_list' => array( 'meetings' => array( 'module' => 'Meetings', 'subpanel_name' => 'ForActivities', 'get_subpanel_data' => 'meetings', ), 'tasks' => array( 'module' => 'Tasks', 'subpanel_name' => 'ForActivities', 'get_subpanel_data' => 'tasks', ), 'calls' => array( 'module' => 'Calls', 'subpanel_name' => 'ForActivities', 'get_subpanel_data' => 'calls', ), ) ),
Это верхний участок конфигурационного массива, содержащий настройки для отображения сабпанели "Мероприятия". Как видим из представленного листинга, у сабпанели должно быть четыре кнопки, описанные классами, указанными в массиве top_buttons:
- SubPanelTopCreateTaskButton
- SubPanelTopScheduleMeetingButton
- SubPanelTopScheduleCallButton
- SubPanelTopComposeEmailButton
Нам нужна вторая кнопка, описанная классом SubPanelTopScheduleMeetingButton. Ищем одноименный файл в папке /include/generic/SugarWidgets: /include/generic/SugarWidgets/SugarWidgetSubPanelTopScheduleMeetingButton.php
Нам нужна функция _get_form() класса SugarWidgetSubPanelTopScheduleMeetingButton. Предназначение данной фукнции: формирование HTML-кода кнопки. Как она будет подставляться в общий HTML-шаблон страницы: на данный момент нас не интересует. Наша задача на данный момент: добавить в HTML-код нужные нам конструкции.
Думаю, надо немного рассказать, как работает автоподстановка значений. В данном примере нас интересует поле "Тема" модуля "Встречи". Системное название этого поля: "name". Все, связанное с этим полем, имеет название "name":
- Свойство класса Meeting (Встречи), хранящее значения поля Тема - имеет название name;
- Название поля в базе данных, хранящее значения поля Тема - имеет название name;
- - подобный HTML-код генерится для ввода значения воля "Тема".
Т.е. по названию поля в системе работа идет из с базой данных, и с свойством класса, и с HTML-кодами. И такая ситуация практически по всем полям всех модулей.
При добавлении/редактировании записи, если SugarCRM "видит" значение в массиве $_REQUEST, имя которого совпадает с названием поля, то система автоматически подставляет это значение при выводе шаблона редактирования. Т.е. нам не стоит беспокоиться о том, как подставить нужное значение в HTML-шаблон редактирования полей модуля. Нам надо лишь позаботиться о том, что в страницу поступило соответствующее значение через $_GET или $_POST.
Хочется отметить то, что каждая кнопка, по сути, является отдельно живущей на странице формой, имеющей свои характеристики и массу скрытых параметров. Наша задача: добавить в список скрытых параметров переменную с ключем name и нужным нам значением. Наполнение формы скрытыми полями идет при помощи наполнения массива $additionalFormFields:
// Добавление названия встречи if($defines['focus']->module_dir == 'Opportunities') { // Если кнопка выводится при просмотре карточки Сделки $additionalFormFields['name'] = "Встреча: " . $defines['focus']->name; }
Здесь переменная $defines['focus'] - это экземпляр класса просматриваемой записи. В нашем случае это Сделка.
Добавьте этот код в файл /include/generic/SugarWidgets/SugarWidgetSubPanelTopScheduleMeetingButton.php до конструкции
// fill in additional form fields for all but action foreach($additionalFormFields as $key => $value) { if($key != 'action') { $button .= '' . "\n"; } }
После сохранения изменений, перезагрузки страницы и нажатия кнопки "Назначить встречу", у вас должно получиться примерно следующее:
Про работу с сабпанелями также можно почитать статьи: Настройка субпанелей в SugarCRM и Ручная настройка субпанелей в SugarCRM.
-