ZolotukhinVM
3/2/2018 - 8:06 AM

Bitrix Add element in social network after iblock element add

Bitrix Add element in social network after iblock element add

<?


AddEventHandler("iblock", "OnAfterIBlockElementAdd", Array("MyClass_2", "OnAfterIBlockElementAddHandler"));
AddEventHandler('socialnetwork', 'OnFillSocNetLogEvents', array('MyClass_2', 'OnFillSocNetLogEvents'));
class MyClass_2{
    
function FormatEvent_News($arFields, $arParams, $bMail = false)
    {
        $GLOBALS["APPLICATION"]->SetAdditionalCSS("/bitrix/themes/.default/intranet_sonet_log.css");

        $arResult = array(
            "EVENT" => $arFields,
            "ENTITY" => CIntranetEventHandlers::GetEntity_News($arFields, $bMail),
            "URL" => "",
            "CACHED_CSS_PATH" => "/bitrix/themes/.default/intranet_sonet_log.css"
        );

        if (!CModule::IncludeModule("socialnetwork"))
            return $arResult;

        $title = "";
        if (strlen($arFields["TITLE_TEMPLATE"]) > 0)
        {

            if (!$bMail && strlen($arFields["URL"]) > 0)
                $title_tmp = '<a href="'.$arFields["URL"].'">'.$arFields["TITLE"].'</a>';
            else
                $title_tmp = $arFields["TITLE"];

            $title = str_replace(
                array("#TITLE#", "#ENTITY#"),
                array($title_tmp, ($bMail ? $arResult["ENTITY"]["FORMATTED"] : $arResult["ENTITY"]["FORMATTED"]["NAME"])),
                ($bMail ? GetMessage("INTR_SOCNET_LOG_NEWS_TITLE_MAIL") : GetMessage("INTR_SOCNET_LOG_NEWS_TITLE"))
            );
        }
        else
            $title_tmp = "";

        $url = false;

        if (
            strlen($arFields["URL"]) > 0
            && strlen($arFields["SITE_ID"]) > 0
        )
        {
            if (substr($arFields["URL"], 0, 1) === "/")
            {
                $rsSites = CSite::GetByID($arFields["SITE_ID"]);
                $arSite = $rsSites->Fetch();

                if (strlen($arSite["SERVER_NAME"]) > 0)
                    $server_name = $arSite["SERVER_NAME"];
                else
                    $server_name = COption::GetOptionString("main", "server_name", $GLOBALS["SERVER_NAME"]);

                $protocol = (CMain::IsHTTPS() ? "https" : "http");
                $url = $protocol."://".$server_name.$arFields["URL"];
            }
            else
            {
                $url = $arFields["URL"];
            }
        }

        $arResult["EVENT_FORMATTED"] = array(
            "TITLE" => $title,
            "MESSAGE" => ($bMail ? CSocNetTextParser::killAllTags($arFields["MESSAGE"]) : $arFields["MESSAGE"]),
            "IS_IMPORTANT" => true,
            "TITLE_24" => GetMessage("INTR_SONET_LOG_DATA_TITLE_IMPORTANT_24"),
            "TITLE_24_2" => $arFields["TITLE"],
            "STYLE" => "imp-post",
        );

        if ($arParams["MOBILE"] == "Y")
        {
            $arResult["EVENT_FORMATTED"]["STYLE"] = "item-top-text-important";
            $arResult["EVENT_FORMATTED"]["AVATAR_STYLE"] = "avatar-info";
        }
        else
            $arResult["EVENT_FORMATTED"]["STYLE"] = "info";

        if (strlen($url) > 0)
            $arResult["EVENT_FORMATTED"]["URL"] = $url;

        if (!$bMail)
        {
            if (
                intval($arFields["SOURCE_ID"]) > 0
                && CModule::IncludeModule("iblock")
            )
            {
                $rsIBlockElement = CIBlockElement::GetList(
                    array(),
                    array("ID" => $arFields["SOURCE_ID"]),
                    false,
                    false,
                    array("ID", "DETAIL_TEXT")
                );
                if ($arIBlockElement = $rsIBlockElement->GetNext())
                {
                    $arResult["EVENT_FORMATTED"]["MESSAGE"] = $arIBlockElement["DETAIL_TEXT"];
                }
            }

            if (
                $arParams["MOBILE"] != "Y"
                && $arParams["NEW_TEMPLATE"] != "Y"
            )
            {
                $parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);
                $arAllow = array("HTML" => "Y", "ANCHOR" => "Y", "BIU" => "Y", "IMG" => "Y", "QUOTE" => "Y", "CODE" => "Y", "FONT" => "Y", "LIST" => "Y", "SMILES" => "Y", "NL2BR" => "N", "MULTIPLE_BR" => "N", "VIDEO" => "Y", "LOG_VIDEO" => "N");
                $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
                    $parserLog->convert(htmlspecialcharsback(str_replace("#CUT#",    "", $arResult["EVENT_FORMATTED"]["MESSAGE"])), array(), $arAllow),
                    1000
                );
                $arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = CSocNetLogTools::FormatEvent_IsMessageShort($arResult["EVENT_FORMATTED"]["MESSAGE"], $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"]);
            }

            if ($arParams["MOBILE"] != "Y")
            {
                $rsRight = CSocNetLogRights::GetList(array(), array("LOG_ID" => $arFields["ID"]));
                $arRights = array();
                while ($arRight = $rsRight->Fetch())
                    $arRights[] = $arRight["GROUP_CODE"];
                $arResult["EVENT_FORMATTED"]["DESTINATION"] = CSocNetLogTools::FormatDestinationFromRights($arRights, $arParams);
            }
        }

        $arResult["HAS_COMMENTS"] = (intval($arFields["SOURCE_ID"]) > 0 ? "Y" : "N");

        return $arResult;
    }

function FormatComment_News($arFields, $arParams, $bMail = false, $arLog = array())
    {
        $arResult = array(
                "EVENT_FORMATTED"    => array(),
            );

        if (!CModule::IncludeModule("socialnetwork"))
            return $arResult;

        if ($bMail)
        {
            $arResult["CREATED_BY"] = CSocNetLogTools::FormatEvent_GetCreatedBy($arFields, $arParams, $bMail);
            $arResult["ENTITY"] = CIntranetEventHandlers::GetEntity_News($arLog, $bMail);
        }
        elseif($arParams["USE_COMMENT"] != "Y")
        {
            $arLog["ENTITY_ID"] = $arFields["ENTITY_ID"];
            $arLog["ENTITY_TYPE"] = $arFields["ENTITY_TYPE"];
            $arResult["ENTITY"] = CIntranetEventHandlers::GetEntity_News($arLog, false);
        }

        if (
            !$bMail
            && array_key_exists("URL", $arLog)
            && strlen($arLog["URL"]) > 0
        )
            $news_tmp = '<a href="'.$arLog["URL"].'">'.$arLog["TITLE"].'</a>';
        else
            $news_tmp = $arLog["TITLE"];

        $title_tmp = ($bMail ? GetMessage("INTR_SOCNET_LOG_NEWS_COMMENT_TITLE_MAIL") : GetMessage("INTR_SOCNET_LOG_NEWS_COMMENT_TITLE"));

        $title = str_replace(
            array("#TITLE#", "#ENTITY#", "#CREATED_BY#"),
            array($news_tmp, $arResult["ENTITY"]["FORMATTED"], ($bMail ? $arResult["CREATED_BY"]["FORMATTED"] : "")),
            $title_tmp
        );

        $arResult["EVENT_FORMATTED"] = array(
            "TITLE" => ($bMail || $arParams["USE_COMMENT"] != "Y" ? $title : ""),
            "MESSAGE" => ($bMail ? $arFields["TEXT_MESSAGE"] : $arFields["MESSAGE"])
        );

        if ($bMail)
        {
            $url = CSocNetLogTools::FormatEvent_GetURL($arLog);
            if (strlen($url) > 0)
                $arResult["EVENT_FORMATTED"]["URL"] = $url;
        }
        else
        {
            static $parserLog = false;
            if (CModule::IncludeModule("forum"))
            {
                if (!$parserLog)
                    $parserLog = new forumTextParser(LANGUAGE_ID);

                $arAllow = array(
                    "HTML" => "N",
                    "ALIGN" => "Y",
                    "ANCHOR" => "Y", "BIU" => "Y",
                    "IMG" => "Y", "QUOTE" => "Y",
                    "CODE" => "Y", "FONT" => "Y",
                    "LIST" => "Y", "SMILES" => "Y",
                    "NL2BR" => "Y", "VIDEO" => "Y",
                    "LOG_VIDEO" => "N", "SHORT_ANCHOR" => "Y",
                    "USERFIELDS" => $arFields["UF"],
                    "USER" => "Y"
                );

                $parserLog->pathToUser = $arParams["PATH_TO_USER"];
                $parserLog->arUserfields = $arFields["UF"];

                $arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), $arAllow));
            }
            else
            {
                if (!$parserLog)
                    $parserLog = new logTextParser(false, $arParams["PATH_TO_SMILE"]);

                $arAllow = array(
                    "HTML" => "Y", "ANCHOR" => "Y", "BIU" => "Y",
                    "IMG" => "Y", "LOG_IMG" => "N",
                    "QUOTE" => "Y", "LOG_QUOTE" => "N",
                    "CODE" => "Y", "LOG_CODE" => "N",
                    "FONT" => "Y", "LOG_FONT" => "N",
                    "LIST" => "Y",
                    "SMILES" => "Y",
                    "NL2BR" => "Y",
                    "MULTIPLE_BR" => "N",
                    "VIDEO" => "Y", "LOG_VIDEO" => "N"
                );

                $arResult["EVENT_FORMATTED"]["MESSAGE"] = htmlspecialcharsbx($parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow));
            }

            if (
                $arParams["MOBILE"] != "Y"
                && $arParams["NEW_TEMPLATE"] != "Y"
            )
            {
                if (CModule::IncludeModule("forum"))
                    $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
                        $parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), $arAllow),
                        500
                    );
                else
                    $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"] = $parserLog->html_cut(
                        $parserLog->convert(htmlspecialcharsback($arResult["EVENT_FORMATTED"]["MESSAGE"]), array(), $arAllow),
                        500
                    );

                $arResult["EVENT_FORMATTED"]["IS_MESSAGE_SHORT"] = CSocNetLogTools::FormatEvent_IsMessageShort($arResult["EVENT_FORMATTED"]["MESSAGE"], $arResult["EVENT_FORMATTED"]["SHORT_MESSAGE"]);
            }
        }

        return $arResult;
    }



function AddComment_News($arFields)
    {
        if (!CModule::IncludeModule("forum"))
            return false;

        if (!CModule::IncludeModule("iblock"))
            return false;

        if (!CModule::IncludeModule("socialnetwork"))
            return false;

        $dbResult = CSocNetLog::GetList(
            array("ID" => "DESC"),
            array("TMP_ID" => $arFields["LOG_ID"]),
            false,
            false,
            array("ID", "SOURCE_ID", "PARAMS")
        );

        $bFound = false;
        if ($arLog = $dbResult->Fetch())
        {
            if (intval($arLog["SOURCE_ID"]) > 0)
            {
                $arFilter = array("ID" => $arLog["SOURCE_ID"]);
                $arSelectedFields = array("IBLOCK_ID", "ID", "CREATED_BY", "NAME", "PROPERTY_FORUM_TOPIC_ID", "PROPERTY_FORUM_MESSAGE_CNT");
                $db_res = CIBlockElement::GetList(array(), $arFilter, false, false, $arSelectedFields);
                if ($db_res && $res = $db_res->GetNext())
                {
                    $arElement = $res;

                    $val = COption::GetOptionString("intranet", "sonet_log_news_iblock_forum");
                    if (strlen($val) > 0)
                        $arIBlockForum = unserialize($val);
                    else
                        $arIBlockForum = array();

                    if (array_key_exists($arElement["IBLOCK_ID"], $arIBlockForum))
                        $FORUM_ID = $arIBlockForum[$arElement["IBLOCK_ID"]];

                    if (intval($FORUM_ID) > 0)
                    {
                        CSocNetLogTools::AddComment_Review_CheckIBlock($arElement);

                        $dbMessage = CForumMessage::GetList(
                            array(),
                            array("PARAM2" => $arElement["ID"])
                        );

                        if (!$arMessage = $dbMessage->Fetch())
                        {
                            // Add Topic
                            $TOPIC_ID = CSocNetLogTools::AddComment_Review_CreateRoot($arElement, $FORUM_ID);
                            $bNewTopic = true;
                        }
                        else
                            $TOPIC_ID = $arMessage["TOPIC_ID"];

                        if(intval($TOPIC_ID) > 0)
                        {
                            // Add comment
                            $messageID = false;

                            $bError = false;
                            if (CForumMessage::CanUserAddMessage($TOPIC_ID, $GLOBALS["USER"]->GetUserGroupArray(), $GLOBALS["USER"]->GetID(), false))
                            {
                                $bSHOW_NAME = true;
                                $res = CForumUser::GetByUSER_ID($GLOBALS["USER"]->GetID());
                                if ($res)
                                    $bSHOW_NAME = ($res["SHOW_NAME"]=="Y");

                                if ($bSHOW_NAME)
                                    $AUTHOR_NAME = $GLOBALS["USER"]->GetFullName();

                                if (strlen(Trim($AUTHOR_NAME))<=0)
                                    $AUTHOR_NAME = $GLOBALS["USER"]->GetLogin();

                                if (strlen($AUTHOR_NAME)<=0)
                                    $bError = true;
                            }

                            if (!$bError)
                            {
                                $arFieldsMessage = Array(
                                    "POST_MESSAGE" => $arFields["TEXT_MESSAGE"],
                                    "USE_SMILES" => "Y",
                                    "APPROVED" => "Y",
                                    "PARAM2" => $arElement["ID"],
                                    "AUTHOR_NAME" => $AUTHOR_NAME,
                                    "AUTHOR_ID" => IntVal($GLOBALS["USER"]->GetParam("USER_ID")),
                                    "FORUM_ID" => $FORUM_ID,
                                    "TOPIC_ID" => $TOPIC_ID,
                                    "NEW_TOPIC" => "N",
                                    "GUEST_ID" => $_SESSION["SESS_GUEST_ID"],
                                    "ADD_TO_LOG" => "N"
                                );

                                $AUTHOR_IP = ForumGetRealIP();
                                $AUTHOR_IP_tmp = $AUTHOR_IP;
                                $AUTHOR_REAL_IP = $_SERVER['REMOTE_ADDR'];
                                if (COption::GetOptionString("forum", "FORUM_GETHOSTBYADDR", "N") == "Y")
                                {
                                    $AUTHOR_IP = @gethostbyaddr($AUTHOR_IP);
                                    if ($AUTHOR_IP_tmp==$AUTHOR_REAL_IP)
                                        $AUTHOR_REAL_IP = $AUTHOR_IP;
                                    else
                                        $AUTHOR_REAL_IP = @gethostbyaddr($AUTHOR_REAL_IP);
                                }

                                $arFieldsMessage["AUTHOR_IP"] = ($AUTHOR_IP!==False) ? $AUTHOR_IP : "<no address>";
                                $arFieldsMessage["AUTHOR_REAL_IP"] = ($AUTHOR_REAL_IP!==False) ? $AUTHOR_REAL_IP : "<no address>";

                                $messageID = CForumMessage::Add($arFieldsMessage, false);
                                if (intVal($messageID)<=0)
                                    $bError = true;
                                else
                                {
                                    if (CModule::IncludeModule("statistic"))
                                    {
                                        $arForum = CForumNew::GetByID($FORUM_ID);
                                        $F_EVENT1 = $arForum["EVENT1"];
                                        $F_EVENT2 = $arForum["EVENT2"];
                                        $F_EVENT3 = $arForum["EVENT3"];
                                        if (strlen($F_EVENT3)<=0)
                                        {
                                            $arForumSite_tmp = CForumNew::GetSites($FORUM_ID);
                                            $F_EVENT3 = CForumNew::PreparePath2Message($arForumSite_tmp[SITE_ID], array("FORUM_ID"=>$FORUM_ID, "TOPIC_ID"=>$TOPIC_ID, "MESSAGE_ID"=>$messageID));
                                        }
                                        CStatistic::Set_Event($F_EVENT1, $F_EVENT2, $F_EVENT3);
                                    }
                                    CForumMessage::SendMailMessage($messageID, array(), false, "NEW_FORUM_MESSAGE");
                                    CSocNetLogTools::AddComment_Review_UpdateElement($arElement, $TOPIC_ID, $bNewTopic);
                                }
                            }
                        }
                    }
                }
            }
        }

        if (intval($messageID) <= 0)
            $strError = GetMessage("SONET_ADD_COMMENT_SOURCE_ERROR");

        return array(
                "SOURCE_ID"    => $messageID,
                "RATING_TYPE_ID" => "FORUM_POST",
                "RATING_ENTITY_ID" => $messageID,
                "ERROR"        => $strError,
                "NOTES"        => ""
            );
    }

function OnFillSocNetLogEvents(&$arSocNetLogEvents)
    {
        $arSocNetLogEvents["news"] = array(
            "ENTITIES" =>    array(
                SONET_SUBSCRIBE_ENTITY_NEWS => array(
                    "TITLE" => "Новость",
                    "TITLE_SETTINGS" => "Новость",
                    "TITLE_SETTINGS_1" => "Новость",
                    "TITLE_SETTINGS_2" => "Новость",
                ),
            ),
            "CLASS_FORMAT" => "MyClass_2",
            "METHOD_FORMAT" => "FormatEvent_News",
            "FULL_SET" => array("news", "news_comment"),
            "COMMENT_EVENT" => array(
                "EVENT_ID" => "news_comment",
             /*   "CLASS_FORMAT" => "CIntranetEventHandlers",
                "METHOD_FORMAT" => "FormatComment_News",
                "ADD_CALLBACK" => array("CIntranetEventHandlers", "AddComment_News")*/
            ),
            "XDIMPORT_ALLOWED" => "Y"
        );
    }
         
    function OnAfterIBlockElementAddHandler(&$arFields, $Is_Add=TRUE)
    { global $USER;  
      if ($arFields["IBLOCK_ID"]=="31") { 
          //$_SESSION["TEST"]=$arFields;
           $ELEMENT_ID=$arFields["ID"];
          $IBLOCK_ID=$arFields["IBLOCK_ID"];
          $arFilter = Array("IBLOCK_ID"=>$IBLOCK_ID, "ID"=>$ELEMENT_ID);
          $res = CIBlockElement::GetList(Array(), $arFilter, false, Array("nPageSize"=>50));
          while($ob = $res->GetNextElement()){ 
            $arFields_el = $ob->GetFields();  
            $DETAIL_PAGE_URL=$arFields_el["DETAIL_PAGE_URL"];
            $TIMESTAMP_X=$arFields_el["TIMESTAMP_X"];
            $IBLOCK_TYPE_ID=$arFields_el["IBLOCK_TYPE_ID"];
            $ACTIVE=$arFields_el["ACTIVE"];
            $NAME=$arFields_el["NAME"];
            $DETAIL_TEXT=$arFields_el["DETAIL_TEXT"];  
            $LID=$arFields_el["LID"];  
          };        

           $arFields_2["ENTITY_TYPE"]="N";
           $arFields_2["ENTITY_ID"]=$IBLOCK_ID;
           $arFields_2["EVENT_ID"]=$IBLOCK_TYPE_ID;
           $arFields_2["USER_ID"]=$USER->GetID();
           $arFields_2["LOG_UPDATE"]="";
           $arFields_2["LOG_DATE"]=$TIMESTAMP_X;
           $arFields_2["SITE_ID"]=$LID;
           $arFields_2["TITLE_TEMPLATE"]="Добавлена или изменена новость: \"#TITLE#\"";
           $arFields_2["TITLE"]=$NAME;
           $arFields_2["MESSAGE"]=$DETAIL_TEXT;
           $arFields_2["TEXT_MESSAGE"]="";
           $arFields_2["URL"]=$DETAIL_PAGE_URL;
           $arFields_2["MODULE_ID"]="intranet";
           $arFields_2["SOURCE_ID"]=$ELEMENT_ID;
           $arFields_2["ENABLE_COMMENTS"]="Y";
           $LOG_ID=0;
           
           if ($Is_Add==TRUE) {
             $LOG_ID=CSocNetLog::Add($arFields_2,true);
             if (intval($LOG_ID) > 0)
             {
               CSocNetLog::Update($LOG_ID, array("TMP_ID" => $LOG_ID));
               CSocNetLogRights::Add($LOG_ID, "G2");
             };
           } 
           else {
              $dbResult = CSocNetLog::GetList(Array(), Array("ENTITY_ID" => $IBLOCK_ID, "SOURCE_ID"=>$ELEMENT_ID),Array("ID"));
              if ($arResult = $dbResult->GetNext()){
                $LOG_ID=$arResult["ID"];
              };
              if (intval($LOG_ID) > 0){   
                CSocNetLog::Update($LOG_ID, $arFields_2);
                CSocNetLog::Update($LOG_ID, array("TMP_ID" => $LOG_ID));
              }             
           };
       };
    }
};
?>