Апдейт, на новом ядре не работает, таки перешли на новые переговорки
как реализовали доработки по-новому тут
Клиент использует СТАРЫЕ переговорки (они ему по функционалу зашли лучше, чем новые), которые в сервисах "Бронирование переговорных". Их же использует в собраниях. Битрикс уже что-то их совсем не тестирует и не поддерживает, в какой-то момент стали сыпаться и ошибки, и неправильно занятость смотреться стала, и создавал новую бронь переговорки при изменении старой при изменении собрания, а старая оставалась.
Задача: починить |
- копируем шаблон компонента meeting.edit .default или в дефолдный шаблон сайта /bitrix/templates/.default/components/bitrix/metting.edit/.default/ (или в папку /local/templates/.default/components/bitrix/metting.edit/.default/)
- копируем файл /bitrix/modules/meeting/tools/ajax_meeting.php в нашу папку с шаблоном
- в инфоблоке бронирований переговорных добавляем текстовое свойство MEETING_ID
меняем tpl_edit.php
- autocomplete="off" добавила в инпут <input type="text" name="PLACE" value="<?=$arResult['MEETING']['PLACE']?>" onchange="onMeetingRoomChange()" autocomplete="off"/>
- меняем путь до нашего файла и добавляем параметр MEETING_ID_NIKA (просто MEETING_ID нельзя, он используется)
var queryData = {
PLACE_ID: document.forms.meeting_edit.PLACE_ID.value,
EVENT_ID: <?=intval($arResult['MEETING']['EVENT_ID'])?>,
DATE_START_DATE: document.forms.meeting_edit.DATE_START_DATE.value,
DATE_START_TIME: document.forms.meeting_edit.DATE_START_TIME.value,
DURATION: parseInt(document.forms.meeting_edit.DURATION.value) * parseInt(document.forms.meeting_edit.DURATION_COEF.value),
MEETING_ID_NIKA: <?=$arResult['MEETING']["ID"]??0?>,
};
BX.ajax.loadJSON(''<?=$this->GetFolder();?>/ajax_meeting.php'', queryData, function(res){ |
меняем ajax_meeting.php
if($eventId > 0){
$arEvent = CMeeting::GetEvent($eventId);
if(is_array($arEvent) && is_array($arEvent['LOCATION']) && $arEvent['LOCATION']['mrevid'] > 0)
{
$reservationId = $arEvent['LOCATION']['mrevid'];
$arFilter["!=ID"] = $reservationId;
}
elseif(is_array($arEvent) && is_array($arEvent['LOCATION'])&& !empty($_REQUEST['MEETING_ID_NIKA'])){ //вот это условие добавляем
$arFilter["!PROPERTY_MEETING_ID"] = $_REQUEST['MEETING_ID_NIKA'];
}
} |
добавляем обработчик в init.php
он будет удалять дубли, заполнять свойство MEETING_ID
AddEventHandler("iblock", "OnBeforeIBlockElementAdd", "MyOnBeforeIBlockElementAdd");
function MyOnBeforeIBlockElementAdd(&$arFields){
if($arFields["IBLOCK_ID"]==43){
if(
!empty($arFields["DETAIL_TEXT"]) && (strpos($arFields['DETAIL_TEXT']," Бронирование переговорной для события")!==false) &&
!empty($arFields["PROPERTY_VALUES"]) && is_array($arFields["PROPERTY_VALUES"])
){
$meetingId = substr($arFields["DETAIL_TEXT"],0, strpos($arFields["DETAIL_TEXT"]," Бронирование переговорной для события"));
$arFields["PROPERTY_VALUES"]["MEETING_ID"] = $meetingId;
if($meetingId>0){
$arFilter = Array(
"IBLOCK_ID"=>43,
"ACTIVE"=>"Y",
"PROPERTY_MEETING_ID" => $meetingId
);
$arSelect = Array("ID");
$res = CIBlockElement::GetList(Array("sort"=>"asc"), $arFilter, false, Array("nPageSize"=>500,"iNumPage"=>1), $arSelect);
while($arItem = $res->Fetch()){
CIBlockElement::Delete($arItem["ID"]);
}
}
}
}
} |
А теперь правим ядро (после обновления слетит, надо будет дописать)
1.
/bitrix/modules/meeting/classes/general/meeting.php метод
AddEvent (стр.412 примерно)
arEventFields = array(
'ID' => $arFields['EVENT_ID'],
'CAL_TYPE' => 'user',
'OWNER_ID' => $arFields['OWNER_ID'],
'DT_FROM' => $arFields['DATE_START'],
'DT_TO' => ConvertTimeStamp(MakeTimeStamp($arFields['DATE_START']) + $arFields['DURATION'], 'FULL'),
'NAME' => $arFields['TITLE'],
'DESCRIPTION' => "<a href='https://b24.nikaverro.ru/timeman/meeting/meeting/".$MEETING_ID."/' target='_self'>[".$MEETING_ID."]</a> ".CCalendar::ParseHTMLToBB($arFields['DESCRIPTION']), //вот эту строчку меняем, добавляем ссылку на собрание
'IS_MEETING' => true,
'MEETING_HOST' => $arFields['OWNER_ID'],
'MEETING' => array(
'HOST_NAME' => CCalendar::GetUserName($arFields['OWNER_ID'])
),
'ATTENDEES' => array_keys($arFields['USERS']),
); |
2.
/bitrix/modules/calendar/lib/rooms/manager.php метод
reserveRoom (стр. 256 примерно)
if($params['room_id']!="E"){
$name = self::createInstance()->getRoomName($params['room_id']); //была только эта строка, меняем на условие
}
else{
$name = "Переговорная";
}
|
3.
/bitrix/modules/calendar/lib/rooms/iblockmeetingroom.php метод
checkMeetingRoom (стр. 303 примерно)
$filter = [
'ACTIVE' => 'Y',
'IBLOCK_ID' => $params['RMiblockId'],
'SECTION_ID' => $params['mrid'],
'<DATE_ACTIVE_FROM' => $params['dateTo'],
'>DATE_ACTIVE_TO' => $params['dateFrom'],
'PROPERTY_PERIOD_TYPE' => 'NONE',
];
//вот это добавляем
if(isset($params["description"]) && (strpos($params["description"], " Бронирование переговорной для события")!==false)){
$filter["!PROPERTY_MEETING_ID"] = substr($params["description"],0, strpos($params["description"]," Бронирование переговорной для события"));
} |
4. /bitrix/modules/calendar/lib/rooms/util.php метод setLocation (стр. 191 примерно)
$description = "";
if(
isset($params["parentParams"]["arFields"]["DESCRIPTION"]) &&
(strpos($params["parentParams"]["arFields"]["DESCRIPTION"], "https://b24.nikaverro.ru/timeman/meeting/meeting/")!==false)
)
{
$href = str_replace("<a href='https://b24.nikaverro.ru/timeman/meeting/meeting/";, "", $params["parentParams"]["arFields"]["DESCRIPTION"]);
$href = substr($href, 0, strpos($href, "/"));
$description = $href." ".Loc::getMessage('EC_RESERVE_FOR_EVENT').': '.$params['name'];
}
if(empty($description)){
$description = Loc::getMessage('EC_RESERVE_FOR_EVENT').': '.$params['name'];
}
$mrevid = IBlockMeetingRoom::reserveMeetingRoom([
'RMiblockId' => $RMiblockId,
'mrid' => $locNew['mrid'],
'dateFrom' => $params['dateFrom'],
'dateTo' => $params['dateTo'],
'name' => $params['name'],
'description' => $description,
'persons' => $params['persons'],
'members' => $params['attendees']
]); |