Обучаю битриксу программистов, интеграторов

Собрания и переговорки

Перешли на новые переговорки (раньше они на инфоблоках были).
У клиента одна переговорка, в базе она как "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();
?>
Если блог был полезным, можете угостить меня "чашечкой кофе" :)

Сбер по номеру телефона +7 (953) 585-13-09 Вероника.
Спасибо!