From 0aa24c1035673942d7eca491aa9c66664701bbe6 Mon Sep 17 00:00:00 2001 From: Alexander Vorobyev Date: Sun, 9 Apr 2023 23:17:16 +0300 Subject: [PATCH] 2.0.4 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Испарвлена ошибка генерации страцы тегов, при отсутсвтвующих проиндексированных страницах - Проверка на совместимость с php 8.1 - косметичесике правки --- .last_version/admin/menu.php | 3 +- .last_version/admin/tag_edit.php | 335 ++++----- .last_version/admin/tags.php | 438 ++++++------ .../components/vasoft/tags.page/class.php | 63 -- .last_version/install/version.php | 4 +- .last_version/lib/tags.php | 663 ++++++++++-------- .last_version/options.php | 2 +- README.md | 2 +- 8 files changed, 760 insertions(+), 750 deletions(-) diff --git a/.last_version/admin/menu.php b/.last_version/admin/menu.php index 56322a0..446ea42 100644 --- a/.last_version/admin/menu.php +++ b/.last_version/admin/menu.php @@ -4,12 +4,13 @@ * @author Воробьев Александр * @see https://va-soft.ru/ * @package vasoft.tags + * @todo перенести на событие построения меню */ use Bitrix\Main\Localization\Loc; $POST_RIGHT = $GLOBALS['APPLICATION']->GetGroupRight("vasoft.tags"); $menu = array(); -if ($POST_RIGHT != "D") { +if ($POST_RIGHT !== "D") { Loc::loadMessages(__FILE__); diff --git a/.last_version/admin/tag_edit.php b/.last_version/admin/tag_edit.php index a515808..9c27f18 100644 --- a/.last_version/admin/tag_edit.php +++ b/.last_version/admin/tag_edit.php @@ -1,12 +1,18 @@ -GetGroupRight("vasoft.tags"); -if ($POST_RIGHT == "D" || !\Bitrix\Main\Loader::includeModule('vasoft.tags')) { - $GLOBALS['APPLICATION']->AuthForm(GetMessage("ACCESS_DENIED")); +if ($POST_RIGHT === "D" || !Loader::includeModule('vasoft.tags')) { + $GLOBALS['APPLICATION']->AuthForm(GetMessage("ACCESS_DENIED")); } $aTabs = array( - array( - "DIV" => "main", - "TAB" => Loc::getMessage("VASOFT_TAGS_TAB"), - "ICON" => "main_user_edit", - "TITLE" => Loc::getMessage("VASOFT_TAGS_TAB_TITLE") - ), + array( + "DIV" => "main", + "TAB" => Loc::getMessage("VASOFT_TAGS_TAB"), + "ICON" => "main_user_edit", + "TITLE" => Loc::getMessage("VASOFT_TAGS_TAB_TITLE") + ), ); $tabControl = new CAdminTabControl("tabControl", $aTabs); -$ID = intval($ID); // идентификатор редактируемой записи +$ID = (int)$ID; // идентификатор редактируемой записи $message = null; // сообщение об ошибке $bVarsFromForm = false; // флаг "Данные получены с формы", обозначающий, что выводимые данные получены с формы, а не из БД. @@ -36,55 +42,59 @@ // ОБРАБОТКА ИЗМЕНЕНИЙ ФОРМЫ // // ******************************************************************** // $lastError = ''; +$needSave = isset($save) && $save !== ''; +$needApply = isset($apply) && $apply !== ''; if ( - $REQUEST_METHOD == "POST" // проверка метода вызова страницы - && ($save != "" || $apply != "") // проверка нажатия кнопок "Сохранить" и "Применить" - && $POST_RIGHT == "W" // проверка наличия прав на запись для модуля - && check_bitrix_sessid() // проверка идентификатора сессии + $REQUEST_METHOD === "POST" // проверка метода вызова страницы + && ($needSave || $needApply) // проверка нажатия кнопок "Сохранить" и "Применить" + && $POST_RIGHT === "W" // проверка наличия прав на запись для модуля + && check_bitrix_sessid() // проверка идентификатора сессии ) { - $tag = new TagsTable(); - $arFields = Array( - 'LID' => $LID, - "PHRASE" => $PHRASE, - "CODE" => $CODE, - "TITLE" => $TITLE, - "KEYWORDS" => $KEYWORDS, - "BROWSER_TITLE" => $BROWSER_TITLE, - "DESCRIPTION" => $DESCRIPTION, - "TEXT" => $TEXT, - 'TEXT_TYPE' => $TEXT_TYPE - ); - $res = false; - if ($ID > 0) { - $result = $tag->Update($ID, $arFields); - if ($result->isSuccess()) { - $res = true; - } else { - $lastError = implode('
', $result->getErrorMessages()); - } - } else { - $result = $tag->Add($arFields); - if ($result->isSuccess()) { - $ID = $result->getId(); - $res = true; - } else { - $lastError = implode('
', $result->getErrorMessages()); - } - } - - if ($res) { - if ($apply != "") - LocalRedirect("/bitrix/admin/vasoft_tags_tag_edit.php?ID=" . $ID . "&mess=ok&lang=" . LANG . "&" . $tabControl->ActiveTabParam()); - else - // если была нажата кнопка "Сохранить" - отправляем к списку элементов. - LocalRedirect("/bitrix/admin/vasoft_tags_tags.php?lang=" . LANG); - } else { - // если в процессе сохранения возникли ошибки - получаем текст ошибки и меняем вышеопределённые переменные - if ($e = $APPLICATION->GetException()) - $message = new CAdminMessage(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE"), $e); - $bVarsFromForm = true; - } + $tag = new TagsTable(); + $arFields = array( + 'LID' => $LID, + "PHRASE" => $PHRASE, + "CODE" => $CODE, + "TITLE" => $TITLE, + "KEYWORDS" => $KEYWORDS, + "BROWSER_TITLE" => $BROWSER_TITLE, + "DESCRIPTION" => $DESCRIPTION, + "TEXT" => $TEXT, + 'TEXT_TYPE' => $TEXT_TYPE + ); + $res = false; + if ($ID > 0) { + $result = $tag->Update($ID, $arFields); + if ($result->isSuccess()) { + $res = true; + } else { + $lastError = implode('
', $result->getErrorMessages()); + } + } else { + $result = $tag->Add($arFields); + if ($result->isSuccess()) { + $ID = $result->getId(); + $res = true; + } else { + $lastError = implode('
', $result->getErrorMessages()); + } + } + + if ($res) { + if ($needApply) { + LocalRedirect("/bitrix/admin/vasoft_tags_tag_edit.php?ID=" . $ID . "&mess=ok&lang=" . LANG . "&" . $tabControl->ActiveTabParam()); + } else { + // если была нажата кнопка "Сохранить" - отправляем к списку элементов. + LocalRedirect("/bitrix/admin/vasoft_tags_tags.php?lang=" . LANG); + } + } else { + if ($e = $APPLICATION->GetException()) { + // если в процессе сохранения возникли ошибки - получаем текст ошибки и меняем выше определённые переменные + $message = new CAdminMessage(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE"), $e); + } + $bVarsFromForm = true; + } } // ******************************************************************** // @@ -104,20 +114,21 @@ // выборка данных if ($ID > 0) { - $item = TagsTable::getById($ID); - $arItem = $item->fetch(); - if ($arItem) { - foreach ($arItem as $code => $value) { - ${'str_' . $code} = $value; - } - } else { - $ID = 0; - } + $item = TagsTable::getById($ID); + $arItem = $item->fetch(); + if ($arItem) { + foreach ($arItem as $code => $value) { + ${'str_' . $code} = $value; + } + } else { + $ID = 0; + } } // если данные переданы из формы, инициализируем их -if ($bVarsFromForm) - $DB->InitTableVarsForEdit(TagsTable::getTableName(), "", "str_"); +if ($bVarsFromForm) { + $DB->InitTableVarsForEdit(TagsTable::getTableName(), "", "str_"); +} // ******************************************************************** // // ВЫВОД ФОРМЫ // @@ -131,109 +142,107 @@ // конфигурация административного меню $aMenu = array( - array( - "TEXT" => Loc::getMessage("VASOFT_TAGS_LIST"), - "TITLE" => Loc::getMessage("VASOFT_TAGS_LIST"), - "LINK" => "vasoft_tags_tags.php?lang=" . LANG, - "ICON" => "btn_list", - ) + array( + "TEXT" => Loc::getMessage("VASOFT_TAGS_LIST"), + "TITLE" => Loc::getMessage("VASOFT_TAGS_LIST"), + "LINK" => "vasoft_tags_tags.php?lang=" . LANG, + "ICON" => "btn_list", + ) ); $context = new CAdminContextMenu($aMenu); $context->Show(); // если есть сообщения об ошибках или об успешном сохранении - выведем их. -if ($_REQUEST["mess"] == "ok" && $ID > 0) { - CAdminMessage::ShowMessage(array("MESSAGE" => Loc::getMessage("VASOFT_TAGS_SAVED"), "TYPE" => "OK")); +if ($_REQUEST["mess"] === "ok" && $ID > 0) { + CAdminMessage::ShowMessage(array("MESSAGE" => Loc::getMessage("VASOFT_TAGS_SAVED"), "TYPE" => "OK")); } if ($message) { - echo $message->Show(); -} elseif ($lastError != "") { - CAdminMessage::ShowMessage($lastError); + echo $message->Show(); +} elseif ($lastError !== "") { + CAdminMessage::ShowMessage($lastError); } ?> -
- Begin(); - $tabControl->BeginNextTab(); - ?> - - * - - - - * - - - - * - - - - - - - - - - - - - - - - - - - - - - - - 450, - 'width' => '100%' - ), - "N", - 0, - "", - "", - $str_LID, - true, - false, - array( - 'hideTypeSelector' => false, - ) - );?> - - Buttons( - array( - "disabled" => ($POST_RIGHT < "W"), - "back_url" => "vasoft_tags_tags.php?lang=" . LANG, - ) - ); - ?> - - 0 && !$bCopy): ?> - - - End(); - $tabControl->ShowWarnings("post_form", $message); - ?> - - * - -
- +
+ Begin(); + $tabControl->BeginNextTab(); + ?> + + * + + + + * + + + + * + + + + + + + + + + + + + + + + + + + + + + + + 450, + 'width' => '100%' + ), + "N", + 0, + "", + "", + $str_LID, + true, + false, + array( + 'hideTypeSelector' => false, + ) + ); ?> + + Buttons( + array( + "disabled" => ($POST_RIGHT < "W"), + "back_url" => "vasoft_tags_tags.php?lang=" . LANG, + ) + ); + ?> + + 0 && !$bCopy): ?> + + End(); + $tabControl->ShowWarnings("post_form", $message); + echo BeginNote(); ?> + * + +
+GetGroupRight("vasoft.tags"); -if ($POST_RIGHT == "D" || !\Bitrix\Main\Loader::includeModule('vasoft.tags')) { - $GLOBALS['APPLICATION']->AuthForm(GetMessage("ACCESS_DENIED")); +$POST_RIGHT = CMain::GetGroupRight("vasoft.tags"); +if ($POST_RIGHT === "D" || !Loader::includeModule('vasoft.tags')) { + $GLOBALS['APPLICATION']->AuthForm(GetMessage("ACCESS_DENIED")); } $sTableID = TagsTable::getTableName(); @@ -29,113 +34,126 @@ // ******************************************************************** // // *********************** CheckFilter ******************************** // -function CheckFilter() +function checkFilter(): bool { - global $FilterArr, $lAdmin; - foreach ($FilterArr as $f) global $$f; - // В данном случае проверять нечего. - // В общем случае нужно проверять значения переменных $find_имя - // и в случае возниконовения ошибки передавать ее обработчику - // посредством $lAdmin->AddFilterError('текст_ошибки'). - return count($lAdmin->arFilterErrors) == 0; // если ошибки есть, вернем false; + global $FilterArr, $lAdmin; + foreach ($FilterArr as $f) { + global $$f; + } + // В данном случае проверять нечего. + // В общем случае нужно проверять значения переменных $find_имя, + // и в случае возникновения ошибки передавать ее обработчику + // посредством $lAdmin->AddFilterError('текст_ошибки'). + return count($lAdmin->arFilterErrors) === 0; // если ошибки есть, вернем false; } // *********************** /CheckFilter ******************************* // // опишем элементы фильтра -$FilterArr = Array( - "find_phrase", - "find_code", - "find_title", - 'find_lid' -); +$FilterArr = [ + "find_phrase", + "find_code", + "find_title", + 'find_lid' +]; // инициализируем фильтр $lAdmin->InitFilter($FilterArr); -$arFilter = array(); -if (CheckFilter()) { - if ($find_code != '') $arFilter['CODE'] = $find_code; - if ($find_phrase != '') $arFilter['PHRASE'] = $find_phrase; - if ($find_title != '') $arFilter['TITLE'] = $find_title; - if ($find_lid != '') $arFilter['LID'] = $find_lid; +$arFilter = []; +if (checkFilter()) { + if ($find_code !== '') { + $arFilter['CODE'] = $find_code; + } + if ($find_phrase !== '') { + $arFilter['PHRASE'] = $find_phrase; + } + if ($find_title !== '') { + $arFilter['TITLE'] = $find_title; + } + if ($find_lid !== '') { + $arFilter['LID'] = $find_lid; + } } // ******************************************************************** // // ОБРАБОТКА ДЕЙСТВИЙ НАД ЭЛЕМЕНТАМИ СПИСКА // // ******************************************************************** // -if (isset($_REQUEST['map']) && $POST_RIGHT == "W") { - $cite = ($_REQUEST['map'] == 'all' || trim($_REQUEST['map']) == '') ? '' : $_REQUEST['map']; - TagsTable::generateMap($cite); +if (isset($_REQUEST['map']) && $POST_RIGHT === "W") { + $cite = ($_REQUEST['map'] === 'all' || trim($_REQUEST['map']) === '') ? '' : $_REQUEST['map']; + TagsTable::generateMap($cite); } // сохранение отредактированных элементов -if ($lAdmin->EditAction() && $POST_RIGHT == "W") { - // пройдем по списку переданных элементов - foreach ($FIELDS as $ID => $arFields) { - if (!$lAdmin->IsUpdated($ID)) - continue; - - // сохраним изменения каждого элемента - $DB->StartTransaction(); - $ID = IntVal($ID); - $cData = new TagsTable(); - if (($rsData = $cData->GetByID($ID)) && ($arData = $rsData->Fetch())) { - foreach ($arFields as $key => $value) - $arData[$key] = $value; - if (!$cData->Update($ID, $arData)) { - $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE"), $ID); - $DB->Rollback(); - } - } else { - $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE") . Loc::getMessage("VASOFT_TAGS_ERROR_NOT_EXISTS"), $ID); - $DB->Rollback(); - } - $DB->Commit(); - } +if ($lAdmin->EditAction() && $POST_RIGHT === "W") { + // пройдем по списку переданных элементов + foreach ($FIELDS as $ID => $arFields) { + if (!$lAdmin->IsUpdated($ID)) { + continue; + } + + // сохраним изменения каждого элемента + $DB->StartTransaction(); + $ID = IntVal($ID); + $cData = new TagsTable(); + if (($rsData = $cData->GetByID($ID)) && ($arData = $rsData->Fetch())) { + foreach ($arFields as $key => $value) + $arData[$key] = $value; + if (!$cData->Update($ID, $arData)) { + $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE"), $ID); + $DB->Rollback(); + } + } else { + $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE") . Loc::getMessage("VASOFT_TAGS_ERROR_NOT_EXISTS"), $ID); + $DB->Rollback(); + } + $DB->Commit(); + } } // обработка одиночных и групповых действий -if (($arID = $lAdmin->GroupAction()) && $POST_RIGHT == "W") { - // если выбрано "Для всех элементов" - if ($_REQUEST['action_target'] == 'selected') { - $cData = new TagsTable(); - $rsData = $cData->getList(array($by => $order), $arFilter); - while ($arRes = $rsData->Fetch()) - $arID[] = $arRes['ID']; - } - - // пройдем по списку элементов - foreach ($arID as $ID) { - if (strlen($ID) <= 0) - continue; - $ID = IntVal($ID); - - // для каждого элемента совершим требуемое действие - switch ($_REQUEST['action']) { - // удаление - case "delete": - @set_time_limit(0); - $DB->StartTransaction(); - if (!TagsTable::delete($ID)) { - $DB->Rollback(); - $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_DELETE"), $ID); - } - $DB->Commit(); - break; - - // активация/деактивация - case "activate": - case "deactivate": - $cData = new TagsTable(); - if (($rsData = $cData->GetByID($ID)) && ($arFields = $rsData->Fetch())) { - $arFields["ACTIVE"] = ($_REQUEST['action'] == "activate" ? "Y" : "N"); - if (!$cData->Update($ID, $arFields)) - $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE"), $ID); - } else - $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE") . Loc::getMessage("VASOFT_TAGS_ERROR_NOT_EXISTS"), $ID); - break; - } - } +if (($arID = $lAdmin->GroupAction()) && $POST_RIGHT === "W") { + // если выбрано "Для всех элементов" + if ($_REQUEST['action_target'] === 'selected') { + $cData = new TagsTable(); + $rsData = $cData->getList(array($by => $order), $arFilter); + while ($arRes = $rsData->Fetch()) + $arID[] = $arRes['ID']; + } + + // пройдем по списку элементов + foreach ($arID as $ID) { + if (strlen($ID) <= 0) + continue; + $ID = IntVal($ID); + + // для каждого элемента совершим требуемое действие + switch ($_REQUEST['action']) { + // удаление + case "delete": + @set_time_limit(0); + $DB->StartTransaction(); + if (!TagsTable::delete($ID)) { + $DB->Rollback(); + $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_DELETE"), $ID); + } + $DB->Commit(); + break; + + // активация/деактивация + case "activate": + case "deactivate": + $cData = new TagsTable(); + if (($rsData = $cData->GetByID($ID)) && ($arFields = $rsData->Fetch())) { + $arFields["ACTIVE"] = ($_REQUEST['action'] === "activate" ? "Y" : "N"); + if (!$cData->Update($ID, $arFields)) { + $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE"), $ID); + } + } else { + $lAdmin->AddGroupError(Loc::getMessage("VASOFT_TAGS_ERROR_SAVE") . Loc::getMessage("VASOFT_TAGS_ERROR_NOT_EXISTS"), $ID); + } + break; + } + } } // ******************************************************************** // @@ -146,20 +164,20 @@ function CheckFilter() $rsSites = CSite::GetList($by1 = "sort", $order1 = "asc"); $currentCite = ''; while ($arSite = $rsSites->Fetch()) { - $arSites[$arSite['LID']] = $arSite; - if ($_SERVER['DOCUMENT_ROOT'] == $arSite['ABS_DOC_ROOT']) { - $currentCite = $arSite['LID']; - } + $arSites[$arSite['LID']] = $arSite; + if ($_SERVER['DOCUMENT_ROOT'] === $arSite['ABS_DOC_ROOT']) { + $currentCite = $arSite['LID']; + } } // выберем список рассылок $cData = new TagsTable(); $arOptions = array( - 'order' => array($by => $order), + 'order' => array($by => $order), ); if (!empty($arFilter)) { - $arOptions['filter'] = $arFilter; + $arOptions['filter'] = $arFilter; } $rsData = $cData->getList($arOptions); @@ -177,87 +195,87 @@ function CheckFilter() // ******************************************************************** // $lAdmin->AddHeaders(array( - array("id" => "ID", - "content" => "ID", - "sort" => "ID", - "align" => "right", - "default" => true, - ), - array("id" => "PHRASE", - "content" => Loc::getMessage("VASOFT_TAGS_FIELD_PHRASE"), - "sort" => "PHRASE", - "default" => true, - ), - array("id" => "CODE", - "content" => Loc::getMessage("VASOFT_TAGS_FIELD_CODE"), - "sort" => "CODE", - "default" => true, - ), - array("id" => "TITLE", - "content" => Loc::getMessage("VASOFT_TAGS_FIELD_TITLE"), - "sort" => "TITLE", - "default" => true, - ), - array("id" => "LID", - "content" => Loc::getMessage("VASOFT_TAGS_FIELD_LID"), - "sort" => "LID", - "default" => true, - ), - array("id" => "BROWSER_TITLE", - "content" => Loc::getMessage("VASOFT_TAGS_FIELD_BROWSER_TITLE"), - "sort" => "BROWSER_TITLE", - "default" => false, - ), - array("id" => "KEYWORDS", - "content" => Loc::getMessage("VASOFT_TAGS_FIELD_KEYWORDS"), - "sort" => "KEYWORDS", - "default" => false, - ), + array("id" => "ID", + "content" => "ID", + "sort" => "ID", + "align" => "right", + "default" => true, + ), + array("id" => "PHRASE", + "content" => Loc::getMessage("VASOFT_TAGS_FIELD_PHRASE"), + "sort" => "PHRASE", + "default" => true, + ), + array("id" => "CODE", + "content" => Loc::getMessage("VASOFT_TAGS_FIELD_CODE"), + "sort" => "CODE", + "default" => true, + ), + array("id" => "TITLE", + "content" => Loc::getMessage("VASOFT_TAGS_FIELD_TITLE"), + "sort" => "TITLE", + "default" => true, + ), + array("id" => "LID", + "content" => Loc::getMessage("VASOFT_TAGS_FIELD_LID"), + "sort" => "LID", + "default" => true, + ), + array("id" => "BROWSER_TITLE", + "content" => Loc::getMessage("VASOFT_TAGS_FIELD_BROWSER_TITLE"), + "sort" => "BROWSER_TITLE", + "default" => false, + ), + array("id" => "KEYWORDS", + "content" => Loc::getMessage("VASOFT_TAGS_FIELD_KEYWORDS"), + "sort" => "KEYWORDS", + "default" => false, + ), )); while ($arRes = $rsData->NavNext(true, "f_")): - $row =& $lAdmin->AddRow($f_ID, $arRes); + $row =& $lAdmin->AddRow($f_ID, $arRes); - $row->AddInputField("PHRASE", array("size" => 20)); - $row->AddInputField("CODE", array("size" => 20)); - $row->AddInputField("TITLE", array("size" => 20)); - $row->AddInputField("BROWSER_TITLE", array("size" => 20)); - $row->AddViewField("PHRASE", '' . $f_PHRASE . ''); - $row->AddViewField("LID", '[' . $f_LID . '] ' . $arSites[$f_LID]['NAME']); + $row->AddInputField("PHRASE", array("size" => 20)); + $row->AddInputField("CODE", array("size" => 20)); + $row->AddInputField("TITLE", array("size" => 20)); + $row->AddInputField("BROWSER_TITLE", array("size" => 20)); + $row->AddViewField("PHRASE", '' . $f_PHRASE . ''); + $row->AddViewField("LID", '[' . $f_LID . '] ' . $arSites[$f_LID]['NAME']); - $arActions = Array(); + $arActions = array(); - $arActions[] = array( - "ICON" => "edit", - "DEFAULT" => true, - "TEXT" => Loc::getMessage(" VASOFT_TAGS_EDIT"), - "ACTION" => $lAdmin->ActionRedirect("vasoft_tags_tag_edit.php?ID=" . $f_ID) - ); + $arActions[] = array( + "ICON" => "edit", + "DEFAULT" => true, + "TEXT" => Loc::getMessage(" VASOFT_TAGS_EDIT"), + "ACTION" => $lAdmin->ActionRedirect("vasoft_tags_tag_edit.php?ID=" . $f_ID) + ); - // удаление элемента - if ($POST_RIGHT >= "W") - $arActions[] = array( - "ICON" => "delete", - "TEXT" => Loc::getMessage("VASOFT_TAGS_DELETE"), - "ACTION" => "if(confirm('" . Loc::getMessage("VASOFT_TAGS_DELETE_CONFIRM") . "')) " . $lAdmin->ActionDoGroup($f_ID, "delete") - ); + // удаление элемента + if ($POST_RIGHT >= "W") + $arActions[] = array( + "ICON" => "delete", + "TEXT" => Loc::getMessage("VASOFT_TAGS_DELETE"), + "ACTION" => "if(confirm('" . Loc::getMessage("VASOFT_TAGS_DELETE_CONFIRM") . "')) " . $lAdmin->ActionDoGroup($f_ID, "delete") + ); - $row->AddActions($arActions); + $row->AddActions($arActions); endwhile; // резюме таблицы $lAdmin->AddFooter( - array( - array("title" => Loc::getMessage("MAIN_ADMIN_LIST_SELECTED"), "value" => $rsData->SelectedRowsCount()), // кол-во элементов - array("counter" => true, "title" => Loc::getMessage("MAIN_ADMIN_LIST_CHECKED"), "value" => "0"), // счетчик выбранных элементов - ) + array( + array("title" => Loc::getMessage("MAIN_ADMIN_LIST_SELECTED"), "value" => $rsData->SelectedRowsCount()), // кол-во элементов + array("counter" => true, "title" => Loc::getMessage("MAIN_ADMIN_LIST_CHECKED"), "value" => "0"), // счетчик выбранных элементов + ) ); // групповые действия -$lAdmin->AddGroupActionTable(Array( - "delete" => Loc::getMessage("MAIN_ADMIN_LIST_DELETE"), // удалить выбранные элементы +$lAdmin->AddGroupActionTable(array( + "delete" => Loc::getMessage("MAIN_ADMIN_LIST_DELETE"), // удалить выбранные элементы )); // ******************************************************************** // @@ -266,24 +284,24 @@ function CheckFilter() // сформируем меню из одного пункта - добавление рассылки $aContext = array( - array( - "TEXT" => Loc::getMessage("VASOFT_TAGS_ADD"), - "LINK" => "vasoft_tags_tag_edit.php?lang=" . LANG, - "TITLE" => Loc::getMessage("VASOFT_TAGS_ADD"), - "ICON" => "btn_new", - ), - array( - "TEXT" => Loc::getMessage("VASOFT_TAGS_GENMAP_SITE") . $currentCite, - "LINK" => "vasoft_tags_tags.php?lang=" . LANG . '&map=' . $currentCite, - "TITLE" => Loc::getMessage("VASOFT_TAGS_GENMAP_SITE") . $currentCite, - ), + array( + "TEXT" => Loc::getMessage("VASOFT_TAGS_ADD"), + "LINK" => "vasoft_tags_tag_edit.php?lang=" . LANG, + "TITLE" => Loc::getMessage("VASOFT_TAGS_ADD"), + "ICON" => "btn_new", + ), + array( + "TEXT" => Loc::getMessage("VASOFT_TAGS_GENMAP_SITE") . $currentCite, + "LINK" => "vasoft_tags_tags.php?lang=" . LANG . '&map=' . $currentCite, + "TITLE" => Loc::getMessage("VASOFT_TAGS_GENMAP_SITE") . $currentCite, + ), ); if (count($arSites) > 1) { - $aContext[] = array( - "TEXT" => Loc::getMessage("VASOFT_TAGS_GENMAP_SITE_ALL"), - "LINK" => "vasoft_tags_tags.php?lang=" . LANG . '&map=all', - "TITLE" => Loc::getMessage("VASOFT_TAGS_GENMAP_SITE_ALL"), - ); + $aContext[] = array( + "TEXT" => Loc::getMessage("VASOFT_TAGS_GENMAP_SITE_ALL"), + "LINK" => "vasoft_tags_tags.php?lang=" . LANG . '&map=all', + "TITLE" => Loc::getMessage("VASOFT_TAGS_GENMAP_SITE_ALL"), + ); } // и прикрепим его к списку @@ -308,39 +326,39 @@ function CheckFilter() // создадим объект фильтра $oFilter = new CAdminFilter( - $sTableID . "_filter", - array( - Loc::getMessage('VASOFT_TAGS_FIELD_PHRASE'), - Loc::getMessage('VASOFT_TAGS_FIELD_CODE'), - Loc::getMessage('VASOFT_TAGS_FIELD_TITLE'), - Loc::getMessage('VASOFT_TAGS_FIELD_LID') - ) + $sTableID . "_filter", + array( + Loc::getMessage('VASOFT_TAGS_FIELD_PHRASE'), + Loc::getMessage('VASOFT_TAGS_FIELD_CODE'), + Loc::getMessage('VASOFT_TAGS_FIELD_TITLE'), + Loc::getMessage('VASOFT_TAGS_FIELD_LID') + ) ); ?> -
- Begin(); ?> - - : - - - - : - - - - : - - - - : - - - Buttons(array("table_id" => $sTableID, "url" => $APPLICATION->GetCurPage(), "form" => "find_form")); - $oFilter->End(); - ?> -
- -GetCurPage() ?>"> + Begin(); ?> + + : + + + + : + + + + : + + + + : + + + Buttons(array("table_id" => $sTableID, "url" => $APPLICATION->GetCurPage(), "form" => "find_form")); + $oFilter->End(); + ?> + + +DisplayList(); require($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/include/epilog_admin.php"); diff --git a/.last_version/install/components/vasoft/tags.page/class.php b/.last_version/install/components/vasoft/tags.page/class.php index 5e92e29..32b881b 100644 --- a/.last_version/install/components/vasoft/tags.page/class.php +++ b/.last_version/install/components/vasoft/tags.page/class.php @@ -14,69 +14,6 @@ Loc::loadLanguageFile(__FILE__); -/* -CACHE_TIME -SET_TITLE Устанавливать заголовок страницы [Y|N] При отмеченной опции в качестве заголовка страницы будет установлено Профиль пользователя. -SET_BROWSER_TITLE Y/N Устанавливать мета-тег 'Description' [Y|N] При отмеченной опции в коде страницы будет дописываться мета-тег 'Description' с содержанием первого сообщения темы. -SET_META_KEYWORDS Y/N -SET_META_DESCRIPTION Y/N - -PAGER_ID -PAGER_ALLOW_ALL Показывать ссылку "Все" [Y|N] При отмеченной опции в постраничную навигацию будет добавлена ссылка Все, с помощью которой можно отобразить все элементы каталога. -PAGER_SIZE -PAGER_TITLE Название категорий Задается название категорий, по которым происходит перемещение по элементам. -PAGER_TEMPLATE Шаблон постраничной навигации Указывается название шаблона постраничной навигации. Если поле пусто, то выбирается шаблон по умолчанию (.default). - -FILTER - Массив, содержащий условия поиска в виде наборов "название поля"=>"значение". - - Название поля может принимать значение: - QUERY - Строка запроса. Обязательный элемент. Должна быть сформирована в соответствии с правилами языка запросов. - TAGS - Список тегов. В результате поиска будут возвращены все элементы имеющие данные теги. - SITE_ID - Сайт, в информации которого производится поиск. Не обязательный параметр, по умолчанию равен текущему. - MODULE_ID - Код модуля, данными которого ограничивается поиск. Если этот параметр равен false, то поиск производится по всем модулям. Не обязательный параметр, по умолчанию равен false. - ITEM_ID - Код проиндексированного элемента. Используется для ограничения области поиска по коду элемента. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false. - PARAM1 - Первый параметр элемента или массив первых параметров. Используется для ограничения области поиска по произвольному параметру. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false. - PARAM2 - Второй параметр элемента или массив вторых параметров. Используется для ограничения области поиска по произвольному параметру. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false. - URL - маска адреса относительно корня сайта, по которому доступен данный элемент или массив масок адресов; - DATE_CHANGE - время изменения элемента в формате сайта (включает время); - CHECK_DATES - если задан и равен Y, то найдены будут только активные элементы; - - -QUERY трока запроса. Обязательный элемент. Должна быть сформирована в соответствии с правилами языка запросов. -SORT - Массив, содержащий признак сортировки в виде наборов "название поля"=>"направление". - - Название поля может принимать значение: - ID - идентификатор в поисковом индексе; - MODULE_ID - идентификатор модуля; - ITEM_ID - идентификатор элемента поискового индекса (например для форума это идентификатор сообщения); - TITLE - заголовок; - PARAM1 - Первый параметр элемента или массив первых параметров. Используется для ограничения области поиска по произвольному параметру. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false. - PARAM2 - Второй параметр элемента или массив вторых параметров. Используется для ограничения области поиска по произвольному параметру. Если параметр имеет значение false, то ограничение не производится. Не обязательный параметр, по умолчанию равен false. - DATE_FROM - дата начала активности элемента; - DATE_TO - дата окончания активности элемента; - RANK - вычисленное значение релевантности; - TITLE_RANK - количество вхождений подстрок запроса в заголовок. Позволяет повысить значимость заголовка в результатах поиска; - CUSTOM_RANK - заданное значение релевантности; - DATE_CHANGE - время изменения элемента; - Направление сортировки может принимать значение: - ASC - по возрастанию; - DESC - по убыванию. - Пример (именно это значение считается по умолчанию): - array("CUSTOM_RANK"=>"DESC", "RANK"=>"DESC", "DATE_CHANGE"=>"DESC") - В случае когда параметр bTagsCloud равен true, допустимыми полями являются: - DATE_CHANGE - время изменения элемента; - NAME - значение тег; - CNT - частота тега; - - -PERIOD Период выборки тегов (дней) Параметр определяет период выборки тегов (дней). -CHECK_DATES - Искать только в активных по дате документах [Y|N] При отмеченной опции поиск будет осуществляться только в активных по дате документах. -MAX -MIN -*/ - class VasoftDetailimgComponent extends CBitrixComponent { /** diff --git a/.last_version/install/version.php b/.last_version/install/version.php index 6b1dfa2..e82eaa1 100644 --- a/.last_version/install/version.php +++ b/.last_version/install/version.php @@ -1,5 +1,5 @@ '2.0.1', - 'VERSION_DATE' => '2018-05-01' + 'VERSION' => '2.0.4', + 'VERSION_DATE' => '2023-04-09' ); diff --git a/.last_version/lib/tags.php b/.last_version/lib/tags.php index 43a6a02..bea5b54 100644 --- a/.last_version/lib/tags.php +++ b/.last_version/lib/tags.php @@ -1,353 +1,398 @@ - true, - 'autocomplete' => true - )), - new Entity\StringField('LID', array( - 'required' => true, - )), - new Entity\DatetimeField('DATEUPDATE', array( - 'required' => true - )), - new Entity\StringField('CODE', array( - 'required' => true, - 'unique' => true - )), - new Entity\StringField('PHRASE', array( - 'required' => true, - )), - new Entity\StringField('TITLE', array()), - new Entity\StringField('BROWSER_TITLE', array()), - new Entity\StringField('KEYWORDS', array()), - new Entity\StringField('DESCRIPTION', array()), - new Entity\TextField('TEXT', array()), - new Entity\StringField('TEXT_TYPE', array( - 'default' => 'html', - 'reuired' => true - )) + public static function getMap() + { + return array( + new Entity\IntegerField('ID', array( + 'primary' => true, + 'autocomplete' => true + )), + new Entity\StringField('LID', array( + 'required' => true, + )), + new Entity\DatetimeField('DATEUPDATE', array( + 'required' => true + )), + new Entity\StringField('CODE', array( + 'required' => true, + 'unique' => true + )), + new Entity\StringField('PHRASE', array( + 'required' => true, + )), + new Entity\StringField('TITLE', array()), + new Entity\StringField('BROWSER_TITLE', array()), + new Entity\StringField('KEYWORDS', array()), + new Entity\StringField('DESCRIPTION', array()), + new Entity\TextField('TEXT', array()), + new Entity\StringField('TEXT_TYPE', array( + 'default' => 'html', + 'reuired' => true + )) - ); - } + ); + } - /** - * Преобразует строку или массив тегов в массив ссылок на страницы тегов - * @param mixed $param строка (сразделитель запятая) или массив тегов + /** + * Преобразует строку или массив тегов в массив ссылок на страницы тегов + * @param mixed $param строка (разделитель запятая) или массив тегов * @return array - * @throws \Bitrix\Main\ArgumentException - * @throws \Bitrix\Main\ObjectPropertyException - * @throws \Bitrix\Main\SystemException + * @throws ArgumentException + * @throws ObjectPropertyException + * @throws SystemException + * @noinspection PhpMissingReturnTypeInspection + * @noinspection ReturnTypeCanBeDeclaredInspection */ - public static function getTagsArray($param) - { - $arResult = array(); - $arTags = array(); - if (!empty($param)) { - $arParam = is_array($param) ? $param : explode(',', trim($param)); - $path = self::getSection(LANG); - foreach ($arParam as $tag) { - $tag = trim($tag); - if ($tag !== '') { - $arTags[] = $tag; - $arResult[$tag] = [ - 'NAME' => $tag, - 'DETAIL_PAGE_URL' => $path . urlencode($tag) . '/' - ]; - } - } - if (!empty($arTags)) { - $iterator = self::getList([ - 'filter' => ['PHRASE' => $arTags], - 'select' => ['CODE', 'PHRASE'] - ]); - while ($arPhrase = $iterator->fetch()) { - $arResult[$arPhrase['PHRASE']]['DETAIL_PAGE_URL'] = $path . urlencode($arPhrase['CODE']) . '/'; - } - } - } - return $arResult; - } + public static function getTagsArray($param) + { + $arResult = array(); + $arTags = array(); + if (!empty($param)) { + $arParam = is_array($param) ? $param : explode(',', trim($param)); + $path = self::getSection(LANG); + foreach ($arParam as $tag) { + $tag = trim($tag); + if ($tag !== '') { + $arTags[] = $tag; + $arResult[$tag] = [ + 'NAME' => $tag, + 'DETAIL_PAGE_URL' => $path . urlencode($tag) . '/' + ]; + } + } + if (!empty($arTags)) { + $iterator = self::getList([ + 'filter' => ['PHRASE' => $arTags], + 'select' => ['CODE', 'PHRASE'] + ]); + while ($arPhrase = $iterator->fetch()) { + $arResult[$arPhrase['PHRASE']]['DETAIL_PAGE_URL'] = $path . urlencode($arPhrase['CODE']) . '/'; + } + } + } + return $arResult; + } - /** - * Возвращает результат поиска по тегу - * - * Внутри функции кеширования не производится. - * @param string $tag тег - * @param array $arOptions массив параметров поиска - * - FILTER - фильтр для дополнительной фильрации выборки. Обязтеьно дополняется TAGS и SITE_ID - * - SORT - Массив, содержащий признак сортировки в виде наборов "название поля"=>"направление". - * - MIN - * -MAX - * @return array - * @throws SystemException В случае отсутсвия модуля поиска - * @throws \Bitrix\Main\ArgumentException - * @throws \Bitrix\Main\LoaderException - * @throws \Bitrix\Main\ObjectPropertyException - * @throws \Bitrix\Main\SystemException + /** + * Возвращает результат поиска по тегу + * + * Внутри функции кеширования не производится. + * @param string $tag тег + * @param array $arOptions массив параметров поиска + * - FILTER - фильтр для дополнительной фильтрации выборки. Обязательно дополняется TAGS и SITE_ID + * - SORT - Массив, содержащий признак сортировки в виде наборов "название поля"=>"направление". + * - MIN + * -MAX + * @return array + * @throws SystemException В случае отсутствия модуля поиска + * @throws ArgumentException + * @throws LoaderException + * @throws ObjectPropertyException + * @throws SystemException + * @noinspection PhpMissingReturnTypeInspection + * @noinspection ReturnTypeCanBeDeclaredInspection + * @depricated Будет удален в будущих версиях + * @noinspection PhpIssetCanBeReplacedWithCoalesceInspection + * @noinspection NullCoalescingOperatorCanBeUsedInspection + * @noinspection PhpMissingParamTypeInspection + * @noinspection PhpUndefinedClassInspection */ - public static function getSearchResult($tag, $arOptions = array()) - { - $arResult = array( - 'ALL_CNT' => 0, - 'ITEMS' => array(), - 'TEXT' => '', - 'TAG' => $tag, - 'PHRASE' => $tag, - 'CLOUD' => [], - 'SEO' => array( - 'TITLE' => '', - 'KEYWORDS' => '', - 'BROWSER_TITLE' => '', - 'DESCRIPTION' => '' - ) - ); - if (Loader::includeModule('search')) { - $arFilter = isset($arOptions['FILTER']) ? $arOptions['FILTER'] : array(); - if (isset($arOptions['QUERY'])) { - $arFilter['QUERY'] = trim($arOptions['QUERY']); - } - if (!array_key_exists('SITE_ID', $arFilter)) { - $arFilter['SITE_ID'] = LANG; - } - if ($tag !== '') { - $arSEO = self::getList([ - 'filter' => ['CODE' => $tag], - 'select' => ['PHRASE', 'TITLE', 'BROWSER_TITLE', 'KEYWORDS', 'DESCRIPTION', 'TEXT', 'TEXT_TYPE'] - ])->fetch(); - if (!$arSEO) { - $arSEO = self::getList([ - 'filter' => ['PHRASE' => $tag], - 'select' => ['CODE'] - ])->fetch(); - if ($arSEO) { - $url = preg_replace("|/" . $tag . "/|ui", "/" . $arSEO['CODE'] . "/", $GLOBALS['APPLICATION']->GetCurDir()); - header('HTTP/1.1 301 Moved Permanently'); - header('Location: ' . $url); -// LocalRedirect($url, false, '301 Moved permanently'); - die(); - } - } - if ($arSEO) { - $arResult['PHRASE'] = $arSEO['PHRASE']; - $arResult['SEO'] = array( - 'TITLE' => trim($arSEO['TITLE']), - 'KEYWORDS' => trim($arSEO['KEYWORDS']), - 'BROWSER_TITLE' => trim($arSEO['BROWSER_TITLE']), - 'DESCRIPTION' => trim($arSEO['DESCRIPTION']) - ); - $arResult['TEXT'] = trim($arSEO['TEXT']); - } else { - $arResult['PHRASE'] = $tag; - } - - $arFilter['TAGS'] = $arResult['PHRASE']; - if (!array_key_exists('PAGER_ID', $arOptions)) { - $arOptions['PAGER_ID'] = 'tags_pager'; - } - if (!array_key_exists('PAGER_ALLOW_ALL', $arOptions)) { - $arOptions['PAGER_ALLOW_ALL'] = true; - } - if (!array_key_exists('PAGER_SIZE', $arOptions)) { - $arOptions['PAGER_SIZE'] = 20; - } - if (!array_key_exists('PAGER_TITLE', $arOptions)) { - $arOptions['PAGER_TITLE'] = Loc::getMessage('VASOFT_TAGS_PAGER_TITLE'); - } - if (!array_key_exists('PAGER_TEMPLATE', $arOptions)) { - $arOptions['PAGER_TEMPLATE'] = 'arrows'; - } + public static function getSearchResult($tag, $arOptions = array()) + { + $arResult = array( + 'ALL_CNT' => 0, + 'ITEMS' => array(), + 'TEXT' => '', + 'TAG' => $tag, + 'PHRASE' => $tag, + 'CLOUD' => [], + 'SEO' => array( + 'TITLE' => '', + 'KEYWORDS' => '', + 'BROWSER_TITLE' => '', + 'DESCRIPTION' => '' + ) + ); + if (Loader::includeModule('search')) { + $arFilter = isset($arOptions['FILTER']) ? $arOptions['FILTER'] : array(); + if (isset($arOptions['QUERY'])) { + $arFilter['QUERY'] = trim($arOptions['QUERY']); + } + if (!array_key_exists('SITE_ID', $arFilter)) { + $arFilter['SITE_ID'] = LANG; + } + if ($tag !== '') { + $arSEO = self::getList([ + 'filter' => ['CODE' => $tag], + 'select' => ['PHRASE', 'TITLE', 'BROWSER_TITLE', 'KEYWORDS', 'DESCRIPTION', 'TEXT', 'TEXT_TYPE'] + ])->fetch(); + if (!$arSEO) { + $arSEO = self::getList([ + 'filter' => ['PHRASE' => $tag], + 'select' => ['CODE'] + ])->fetch(); + if ($arSEO) { + $url = preg_replace("|/" . $tag . "/|ui", "/" . $arSEO['CODE'] . "/", $GLOBALS['APPLICATION']->GetCurDir()); + header('HTTP/1.1 301 Moved Permanently'); + header('Location: ' . $url); + die(); + } + } + if ($arSEO) { + $arResult['PHRASE'] = $arSEO['PHRASE']; + $arResult['SEO'] = array( + 'TITLE' => trim($arSEO['TITLE']), + 'KEYWORDS' => trim($arSEO['KEYWORDS']), + 'BROWSER_TITLE' => trim($arSEO['BROWSER_TITLE']), + 'DESCRIPTION' => trim($arSEO['DESCRIPTION']) + ); + $arResult['TEXT'] = trim($arSEO['TEXT']); + } else { + $arResult['PHRASE'] = $tag; + } - $arSort = (array_key_exists('SORT', $arOptions) - ? $arOptions['SORT'] - : ["CUSTOM_RANK" => "DESC", "RANK" => "DESC", "DATE_CHANGE" => "DESC"]); + $arFilter['TAGS'] = $arResult['PHRASE']; + if (!array_key_exists('PAGER_ID', $arOptions)) { + $arOptions['PAGER_ID'] = 'tags_pager'; + } + if (!array_key_exists('PAGER_ALLOW_ALL', $arOptions)) { + $arOptions['PAGER_ALLOW_ALL'] = true; + } + if (!array_key_exists('PAGER_SIZE', $arOptions)) { + $arOptions['PAGER_SIZE'] = 20; + } + if (!array_key_exists('PAGER_TITLE', $arOptions)) { + $arOptions['PAGER_TITLE'] = Loc::getMessage('VASOFT_TAGS_PAGER_TITLE'); + } + if (!array_key_exists('PAGER_TEMPLATE', $arOptions)) { + $arOptions['PAGER_TEMPLATE'] = 'arrows'; + } - $obSearch = new \CSearch; - $obSearch->Search($arFilter, $arSort); - $obSearch->NavStart($arOptions['PAGER_SIZE'], false); - while ($arItem = $obSearch->NavNext()) { - $arResult['ITEMS'][] = $arItem; - } - $navComponentObject = null; - $arResult["NAV_STRING"] = $obSearch->GetPageNavStringEx( - $navComponentObject, - $arOptions['PAGER_TITLE'], - $arOptions["PAGER_TEMPLATE"], - $arOptions['PAGER_ALLOW_ALL'] - ); - $arResult["NAV_CACHED_DATA"] = $navComponentObject->GetTemplateCachedData(); - $arResult["NAV_RESULT"] = $obSearch; - if (count($arResult['ITEMS']) === 0) { - $arResult['SEO'] = array( - 'TITLE' => '', - 'KEYWORDS' => '', - 'BROWSER_TITLE' => '', - 'DESCRIPTION' => '' - ); - } - } else { - $arFilter["!TAGS"] = false; - if (isset($arOptions['PERIOD']) && 0 < (int)$arOptions['PERIOD']) { - $arFilter['DATE_CHANGE'] = Date( - \CDatabase::DateFormatToPHP(\CLang::GetDateFormat("FULL", LANG)), - time() - ($arOptions["PERIOD"] * 24 * 3600) + \CTimeZone::GetOffset() - ); - } - if (isset($arOptions["CHECK_DATES"]) && $arOptions["CHECK_DATES"]) { - $arFilter["CHECK_DATES"] = "Y"; - } - $obSearch = new \CSearch(); - $obSearch->Search($arFilter, array("CNT" => "DESC"), array(), true); - $max = 0; - $arCount = array(); - $arTags = array(); + $arSort = (array_key_exists('SORT', $arOptions) + ? $arOptions['SORT'] + : ["CUSTOM_RANK" => "DESC", "RANK" => "DESC", "DATE_CHANGE" => "DESC"]); - $all = 0; - while ($arStat = $obSearch->Fetch()) { - $arResult['CLOUD'][] = $arStat; - if ($arStat['CNT'] > $max) $max = $arStat['CNT']; - $all += $arStat['CNT']; - $arCount[$arStat['CNT']] = 0; - $arTags[] = $arStat['NAME']; - } - $rsCodes = self::getList(array( - 'filter' => array('PHRASE' => $arTags), - 'select' => array('PHRASE', 'CODE') - )); - $arTags = array(); - while ($arCode = $rsCodes->fetch()) { - $arTags[$arCode['PHRASE']] = $arCode['CODE']; - } - $sum = 0; - foreach ($arCount as $cnt => $val) { - $sum += $cnt; - } - $medium = $sum / count($arCount); + $obSearch = new CSearch; + $obSearch->Search($arFilter, $arSort); + $obSearch->NavStart($arOptions['PAGER_SIZE'], false); + while ($arItem = $obSearch->NavNext()) { + $arResult['ITEMS'][] = $arItem; + } + $navComponentObject = null; + $arResult["NAV_STRING"] = $obSearch->GetPageNavStringEx( + $navComponentObject, + $arOptions['PAGER_TITLE'], + $arOptions["PAGER_TEMPLATE"], + $arOptions['PAGER_ALLOW_ALL'] + ); + $arResult["NAV_CACHED_DATA"] = $navComponentObject->GetTemplateCachedData(); + $arResult["NAV_RESULT"] = $obSearch; + if (count($arResult['ITEMS']) === 0) { + $arResult['SEO'] = array( + 'TITLE' => '', + 'KEYWORDS' => '', + 'BROWSER_TITLE' => '', + 'DESCRIPTION' => '' + ); + } + } else { + $arFilter["!TAGS"] = false; + if (isset($arOptions['PERIOD']) && 0 < (int)$arOptions['PERIOD']) { + $arFilter['DATE_CHANGE'] = Date( + CDatabase::DateFormatToPHP(CLang::GetDateFormat("FULL", LANG)), + time() - ($arOptions["PERIOD"] * 24 * 3600) + CTimeZone::GetOffset() + ); + } + if (isset($arOptions["CHECK_DATES"]) && $arOptions["CHECK_DATES"]) { + $arFilter["CHECK_DATES"] = "Y"; + } + $obSearch = new CSearch(); + $obSearch->Search($arFilter, array("CNT" => "DESC"), array(), true); + $max = 0; + $arCount = array(); + $arTags = array(); - $maxMedium = $max / $medium; - /** - * $top - это максимальны уровень, - * обеспечиваем так, чтоб строилось относительно середины диапазона - */ - $max = isset($arOptions['MAX']) ? $arOptions['MAX'] : 130; - $min = isset($arOptions['MIN']) ? $arOptions['MIN'] : 70; - /** + while ($arStat = $obSearch->Fetch()) { + $arResult['CLOUD'][] = $arStat; + if ($arStat['CNT'] > $max) { + $max = $arStat['CNT']; + } + $arCount[$arStat['CNT']] = 0; + $arTags[] = $arStat['NAME']; + } + $rsCodes = self::getList(array( + 'filter' => array('PHRASE' => $arTags), + 'select' => array('PHRASE', 'CODE') + )); + $arTags = array(); + while ($arCode = $rsCodes->fetch()) { + $arTags[$arCode['PHRASE']] = $arCode['CODE']; + } + $sum = 0; + foreach ($arCount as $cnt => $val) { + $sum += $cnt; + } + if (empty($arCount)) { + $medium = 0; + $maxMedium = 0; + } else { + $medium = $sum / count($arCount); + $maxMedium = $max / $medium; + } + /** + * $top - это максимальны уровень, + * обеспечиваем так, чтоб строилось относительно середины диапазона + */ + $max = isset($arOptions['MAX']) ? $arOptions['MAX'] : 130; + $min = isset($arOptions['MIN']) ? $arOptions['MIN'] : 70; + /** * @var $arResult array[] * @var int $i * @var array $arStat */ - foreach ($arResult['CLOUD'] as $i => &$arStat) { - $code = isset($arTags[$arStat['NAME']]) ? $arTags[$arStat['NAME']] : $arStat['NAME']; - $arStat['URL'] = str_replace('//', '/', self::getSection(LANG) . $code . '/'); - $arStat['KOEF'] = ($arStat['CNT'] * ($max - $min) / ($medium * $maxMedium)) + $min; - } - unset($arStat); - } - } else { - throw new \SystemException(Loc::getMessage("ERROR_NEED_SEARCH_MODULE")); - } - return $arResult; - } + foreach ($arResult['CLOUD'] as &$arStat) { + $code = isset($arTags[$arStat['NAME']]) ? $arTags[$arStat['NAME']] : $arStat['NAME']; + $arStat['URL'] = str_replace('//', '/', self::getSection(LANG) . $code . '/'); + $arStat['KOEF'] = ($arStat['CNT'] * ($max - $min) / ($medium * $maxMedium)) + $min; + } + unset($arStat); + } + } else { + throw new \SystemException(Loc::getMessage("ERROR_NEED_SEARCH_MODULE")); + } + return $arResult; + } /** * @param string $siteId - * @throws \Bitrix\Main\ArgumentException - * @throws \Bitrix\Main\ArgumentNullException - * @throws \Bitrix\Main\ArgumentOutOfRangeException - * @throws \Bitrix\Main\ObjectPropertyException - * @throws \Bitrix\Main\SystemException + * @throws ArgumentException + * @throws ArgumentNullException + * @throws ArgumentOutOfRangeException + * @throws ObjectPropertyException + * @throws SystemException + * @noinspection ReturnTypeCanBeDeclaredInspection + * @noinspection PhpMissingParamTypeInspection + * @noinspection HttpUrlsUsage */ - public static function generateMap($siteId = '') - { - $rsSites = \CSite::GetList($by = "sort", $order = "asc"); - $defaultPath = Option::get('vasoft.tags', 'PATH'); - $defaultProtocol = Option::get('vasoft.tags', 'PROTOCOL'); - while ($arSite = $rsSites->Fetch()) { - if ($siteId === '' || $siteId == $arSite['LID']) { - $arSite['TAG_PATH'] = (Option::get('vasoft.tags', 'PROTOCOL', $defaultProtocol, $arSite['LID']) . '://'); - $arSite['TAG_PATH'] .= ('/' . $arSite['SERVER_NAME'] . '/'); - $arSite['TAG_PATH'] .= (Option::get('vasoft.tags', 'PATH', $defaultPath, $arSite['LID'])); - $arSite['TAG_PATH'] = str_replace('//', '/', $arSite['TAG_PATH']); - $arSites[] = $arSite; - } - } + public static function generateMap($siteId = '') + { + $rsSites = CSite::GetList(); + $defaultPath = Option::get('vasoft.tags', 'PATH'); + $defaultProtocol = Option::get('vasoft.tags', 'PROTOCOL'); + $arSites = []; + while ($arSite = $rsSites->Fetch()) { + if ($siteId === '' || $siteId === $arSite['LID']) { + $arSite['TAG_PATH'] = (Option::get('vasoft.tags', 'PROTOCOL', $defaultProtocol, $arSite['LID']) . '://'); + $arSite['TAG_PATH'] .= ('/' . $arSite['SERVER_NAME'] . '/'); + $arSite['TAG_PATH'] .= (Option::get('vasoft.tags', 'PATH', $defaultPath, $arSite['LID'])); + $arSite['TAG_PATH'] = str_replace('//', '/', $arSite['TAG_PATH']); + $arSites[] = $arSite; + } + } - foreach ($arSites as $arSite) { - $xml = ''; - $xml .= ''; - $rsLinks = self::getList([ - 'filter' => ['!TITLE' => false, 'LID' => $arSite['LID']], - 'select' => ['CODE', 'DATEUPDATE'] - ]); - while ($arLink = $rsLinks->fetch()) { - $xml .= ('' . $arSite['TAG_PATH'] . $arLink['CODE'] . '/'); - } - $xml .= ''; - file_put_contents($arSite['ABS_DOC_ROOT'] . '/sitemap_tags_' . $arSite['LID'] . '.xml', $xml, LOCK_EX); - } - } + foreach ($arSites as $arSite) { + $xml = ''; + $xml .= ''; + $rsLinks = self::getList([ + 'filter' => ['!TITLE' => false, 'LID' => $arSite['LID']], + 'select' => ['CODE', 'DATEUPDATE'] + ]); + while ($arLink = $rsLinks->fetch()) { + $xml .= ('' . $arSite['TAG_PATH'] . $arLink['CODE'] . '/'); + } + $xml .= ''; + file_put_contents($arSite['ABS_DOC_ROOT'] . '/sitemap_tags_' . $arSite['LID'] . '.xml', $xml, LOCK_EX); + } + } /** - * @param string $LID + * @param string $lid * @return mixed - * @throws \Bitrix\Main\ArgumentNullException - * @throws \Bitrix\Main\ArgumentOutOfRangeException */ - public static function getSection($LID = '') - { - if ($LID == '') $LID = LANG; - if (!isset(self::$arPaths[$LID])) { - $defaultPath = Option::get('vasoft.tags', 'PATH'); - self::$arPaths[$LID] = '/' . trim(Option::get('vasoft.tags', 'PATH', $defaultPath, $LID), '/') . '/'; - } - return self::$arPaths[$LID]; - } + public static function getSection($lid = '') + { + if ($lid === '') { + $lid = LANG; + } + if (!isset(self::$arPaths[$lid])) { + $defaultPath = Option::get('vasoft.tags', 'PATH'); + self::$arPaths[$lid] = '/' . trim(Option::get('vasoft.tags', 'PATH', $defaultPath, $lid), '/') . '/'; + } + return self::$arPaths[$lid]; + } /** - * @param mixed $ID + * @param mixed $id * @param array $arFields - * @return \Bitrix\Main\ORM\Data\UpdateResult - * @throws \Bitrix\Main\ObjectException - * @throws \Exception + * @return UpdateResult + * @throws ObjectException + * @throws Exception + * @noinspection PhpMissingReturnTypeInspection + * @noinspection ReturnTypeCanBeDeclaredInspection */ - public static function update($ID, array $arFields) - { - $arFields['DATEUPDATE'] = new \Bitrix\Main\Type\DateTime(); - return parent::update($ID, $arFields); - } + public static function update($id, array $arFields) + { + $arFields['DATEUPDATE'] = new DateTime(); + return parent::update($id, $arFields); + } /** * @param array $arFields - * @return \Bitrix\Main\ORM\Data\AddResult - * @throws \Bitrix\Main\ObjectException - * @throws \Exception + * @return AddResult + * @throws ObjectException + * @throws Exception + * @noinspection PhpMissingReturnTypeInspection + * @noinspection ReturnTypeCanBeDeclaredInspection */ - public static function add(array $arFields) - { - $arFields['DATEUPDATE'] = new \Bitrix\Main\Type\DateTime(); - return parent::add($arFields); - } + public static function add(array $arFields) + { + $arFields['DATEUPDATE'] = new DateTime(); + return parent::add($arFields); + } } diff --git a/.last_version/options.php b/.last_version/options.php index 4139f2d..d4aef46 100644 --- a/.last_version/options.php +++ b/.last_version/options.php @@ -12,7 +12,7 @@ Loc::loadMessages(__FILE__); $module_id = "vasoft.tags"; -$MODULE_RIGHT = $APPLICATION->GetGroupRight($module_id); +$MODULE_RIGHT = CMain::GetGroupRight($module_id); if ($MODULE_RIGHT >= "R" && Loader::includeModule($module_id)) { $arDisplayOptions = array( "PATH" => array( diff --git a/README.md b/README.md index c175779..e76d585 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Sitemap для этих страниц генерируется вручную ## Компоненты ### Компонент вывода тегов материала vasoft:tags.list -Предназначен для вывода списка тегов элемента с ссылками на посадочные страницы. +Предназначен для вывода списка тегов элемента со ссылками на посадочные страницы. ### Компонент посадочной страницы тега vasoft:tags.page Предназначен для формирования посадочной страницы заданного тега.