• Автоматическая подстановка значений при создании записей в сабпанели в SugarCRM

    В данной статье пойдет речь о том, как автоматизировать подстановку значений при создании новых записей в сабпанелях.

    В SugarCRM, при просмотре какой-либо записи, внизу страницы располагаются сабпанельки с записями других модулей, связанными с текущей записью. Например: при просмотре какого-либо контрагента, внизу страницы в виде сабпанели имеется информация о контактах, принадлежащих этому контрагенту:

    detail_view_subpanel_contacts.thumb.png.

    Или, при просмотре сделки, внизу в сабпанелях имеется информация о мероприятиях, проводимых в рамках этой сделки:

    detail_view_subpanel_activity_empty.thum

    Добавить новую встречу, которую надо провести по текущей сделке, можно нажав кнопку "Назначить встречу":

    detail_view_subpanel_activity_meetings_1

    Система предложит ввести данные о новой встрече.

    Допустим, нам надо автоматизировать ввод темы встречи. Тема должна быть в следующем формате:

    Встреча: <ТемаСделки>

    Для достижения желаемого результата нам надо отредактировать функционал, ответственный за формирование кнопки "Назначить встречу".

    Классы, отдающие 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;
    • <input type="text" name="name" id="name" size="30" maxlength="50" value="" title="" tabindex="100"> - подобный 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 .= '<input type="hidden" name="' . $key . '" value="' . $value . '" />' . "\n";
    	}
    }
    

    После сохранения изменений, перезагрузки страницы и нажатия кнопки "Назначить встречу", у вас должно получиться примерно следующее:

    detail_view_subpanel_activity_meetings_2

    Про работу с сабпанелями также можно почитать статьи: Настройка субпанелей в SugarCRM и Ручная настройка субпанелей в SugarCRM.