как реализовали доработки по-новому тут
Клиент использует СТАРЫЕ переговорки (они ему по функционалу зашли лучше, чем новые), которые в сервисах "Бронирование переговорных". Их же использует в собраниях. Битрикс уже что-то их совсем не тестирует и не поддерживает, в какой-то момент стали сыпаться и ошибки, и неправильно занятость смотреться стала, и создавал новую бронь переговорки при изменении старой при изменении собрания, а старая оставалась. Задача: починить |
- копируем шаблон компонента 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
- 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){ |
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']), ); |
if($params['room_id']!="E"){ $name = self::createInstance()->getRoomName($params['room_id']); //была только эта строка, меняем на условие } else{ $name = "Переговорная"; } |
$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"]," Бронирование переговорной для события")); } |
$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'] ]); |