09.02.2023
15:47
09.02.2023 15:47:05
Перешли на новые переговорки (раньше они на инфоблоках были). У клиента одна переговорка, в базе она как "calendar_745"
Задачи
- Название События календаря "Занятость переговорных" не отображалось. Исправить
- Сделать невозможным "нахлест" собраний и событий друг на друга (ошибка, есть тике у Битрикса)
- Из События нужна ссылка на Собрание (если было создано оттуда), чтобы из Календаря можно было перейти в Собрание (никогда такого не было)
- Не добавлять Событие этого календаря в новость ЖЛ
|
- копируем шаблон компонента 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 в нашу папку с шаблоном
1. меняем tpl_edit.php в скопированном шаблоне meeting.edit
2. autocomplete="off" добавила в инпут <input type="text" name="PLACE" value="<?=$arResult['MEETING']['PLACE']?>" onchange="onMeetingRoomChange()" autocomplete="off"/>
3. путь меняем до ajax_meeting.php
BX.ajax.loadJSON('<?=$this->GetFolder();?>/ajax_meeting.php', queryData, function(res){ |
4. файл ajax_meeting.php
elseif(isset($_REQUEST['PLACE_ID']))
{
$arPlace = CMeeting::CheckPlace($_REQUEST['PLACE_ID']);
if(is_array($arPlace) && $arPlace['ROOM_IBLOCK'] > 0 && $arPlace['ROOM_ID'] > 0){
//тут код Битрикса
}
else{
if($_REQUEST['PLACE_ID']=="calendar_745"){
global $DB;
$dateFrom = $_REQUEST["DATE_START_DATE"]." ".$_REQUEST["DATE_START_TIME"];
$date = new DateTime($dateFrom);
$dateFrom = $date->format("Y-m-d H:i:s");
$date->modify("+".$_REQUEST['DURATION']." second");
$dateTo = $date->format("Y-m-d H:i:s");
$strSql = "SELECT ID FROM b_calendar_event WHERE ";
if(!empty($_REQUEST['EVENT_ID'])){
$strSql.= "ID!=".$_REQUEST['EVENT_ID']." AND "; //sql запрос
}
$strSql .= "LOCATION LIKE 'calendar_745_%' AND ( ((DATE_FROM>='".$dateFrom."') AND (DATE_FROM<='".$dateTo."'))OR((DATE_TO>='".$dateFrom."') AND (DATE_TO<='".$dateTo."'))OR((DATE_FROM<='".$dateFrom."') AND (DATE_TO>='".$dateTo."')));" ;
$res = $DB->Query($strSql); //выполняет запрос SELECT,INSERT,DELETE,UPDATE
if($row = $res->Fetch()){
$bReserved = true;
}
else{
$bReserved = false;
}
Header('Content-Type: application/json');
echo "{result:'".($bReserved ? 'reserved' : 'ok')."'}";
}
else{
Header('Content-Type: application/json');
echo "{result:'error',error:'wrong_place_id_blya'}";
}
}
} |
в init.php 2 обработчика
1й добавляет ссылку на собрание
AddEventHandler('meeting', 'OnAfterMeetingUpdate', 'MyOnAfterMeetingUpdate');
function MyOnAfterMeetingUpdate($id,$arFields){
AddMessage2Log([$id,$arFields]);
if(!empty($arFields["EVENT_ID"])){
global $DB;
$strSql = "UPDATE b_calendar_event SET DESCRIPTION='[URL=/timeman/meeting/meeting/".$id."/]Собрание[/URL] ' WHERE ID=".$arFields["EVENT_ID"];
$res = $DB->Query($strSql);
}
} |
2й удаляет собрания из ЖЛ
AddEventHandler('socialnetwork', 'OnBeforeSocNetMessagesAdd', 'MyOnBeforeSocNetMessagesAdd');
function MyOnBeforeSocNetMessagesAdd($arFields){
if($arFields["EVENT_ID"]=='calendar') return false;
} |
в
/calendar/rooms.php добавляем обработчик
<script>
$(document).ready(function(){
$(document).on('click','.calendar-view-switcher-list-item',function(){
setTimeout(UpdateCalendarRoom,1000);
});
});
BX.addCustomEvent('oncalendarafterbuildviews', function(event){
setTimeout(UpdateCalendarRoom,1000);
});
function UpdateCalendarRoom(){
let ids = [];
$('.calendar-views-container div').each(function(ind,el){
if($(this).data('bx-calendar-entry')>0){
ids.push($(this).data('bx-calendar-entry'));
}
});
//console.log(ids);
if(ids.length>0){
var postData = {
'sessid': BX.bitrix_sessid(),
'site_id': BX.message('SITE_ID'),
'action': 'getEvents',
'ids': ids,
'quantity': 1,
};
BX.ajax({
url: '/calendar/ajax.php',
method: 'POST',
data: postData,
dataType: 'json',
onsuccess: function(result){
let row, el;
for (var i = result.length - 1; i >= 0; i--) {
row = result[i];
el = $('div[data-bx-calendar-entry='+row.ID+'] .calendar-event-block-text:not(.goodName)');
if(el.length>0){
el.html('"'+row.NAME+'"'+' '+el.html());
el.addClass('goodName');
}
else{
el = $('div[data-bx-calendar-entry='+row.ID+'] .calendar-event-line-text>span:not(.goodName)');
if(el.length>0){
el.html('"'+row.NAME+'"'+' '+el.html());
el.addClass('goodName');
}
}
}
},
onfailure: function(result){
}
});
}
}
</script> |
создаем файл /calendar/ajax.php
<?
define("STOP_STATISTICS", true);
if (array_key_exists('site_id', $_REQUEST) && is_string($_REQUEST['site_id'])){
$siteId = $_REQUEST['site_id'];
if($siteId !== '' && preg_match('/^[a-z0-9_]{2}$/i', $siteId) === 1){
define('SITE_ID', $siteId);
}
}
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
//подключаем нужные модули
use Bitrix\Main\Loader,
Bitrix\Main\Application;
CUtil::JSPostUnescape();
if (!check_bitrix_sessid() || $_SERVER["REQUEST_METHOD"] != "POST") return;
$arRes = array();
if (!empty($_POST["action"]) && ($_POST["action"]="getEvents") && !empty($_POST['ids']) ){
global $DB;
$ids = implode(",",$_POST['ids']);
$strSql = "SELECT ID,NAME FROM b_calendar_event WHERE ID in (".$ids.") AND LOCATION LIKE 'calendar_745_%'";
$res = $DB->Query($strSql);
while($row = $res->Fetch()){
$arRes[] = $row;
}
}
$APPLICATION->RestartBuffer();
header('Content-Type: application/json; charset='.LANG_CHARSET);
echo json_encode($arRes);
die();
?> |
09.02.202315:4709.02.2023 15:47:05
Если блог был полезным, можете угостить меня "чашечкой кофе" :)
Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!