<time class="news-date" datetime="2025-05-11">11.05.2025</time> |
$dateObj = DateTime::createFromFormat( \Bitrix\Main\Type\DateTime::getFormat(), // формат сайта $arItem['fields']["DATE_ACTIVE_FROM"] // дата сформирована из формата сайта ); |
["ACTIVE_FROM_X"] => "2025-10-02 00:00:00" |
["TIMESTAMP_X"] => "31.10.2025 14:29:54" ["ACTIVE_FROM_X"] => "2025-10-02 01:05:00" // ПОЧЕМУ ТОЛЬКО ТУТ ДЕФИС ["ACTIVE_FROM"] => "02.10.2025 01:05:00" ["DATE_ACTIVE_FROM"] => "02.10.2025 01:05:00" ["DATE_CREATE"] => "31.10.2025 13:32:09" ["~DATE_CREATE"] => "31.10.2025 13:32:09" |
["ACTIVE_FROM_X"]=> "2025-09-01 00:00:00" ["ACTIVE_FROM"]=> "01.09.2025" // НЕТУ ВРЕМЕНИ ["DATE_ACTIVE_FROM"]=> "01.09.2025" // ТОЖЕ |
use Bitrix\Main\Grid\Declension;
$yearDeclension = new Declension('год', 'года', 'лет');
$yearDeclension->get($year);
|
$subFilter['PROPERTY_LOCATION'] = 'Москва'; // БЕЗ "_VALUE" на конце |
$subFilter['PROPERTY_LOCATION_VALUE'] = 'Москва'; // хотя казалось бы... |
$subFilter['PROPERTY_LOCATION_VALUE'] = 'Москва'; // если свойство типа список |
$subFilter = [ 'IBLOCK_ID' => $programsIblockId, ]; $subFilter['PROPERTY_LOCATION_VALUE'] = 'Москва'; // строковое свойство $subQuery = CIBlockElement::GetList([], $subFilter, false, false, ['ID', 'NAME', 'PROPERTY_LOCATION']); |
$subFilter['PROPERTY_LOCATION'] = 'Москва'; // убираем _VALUE |
PROPERTY_<PROPERTY_CODE> - фильтр по значениям свойств, где PROPERTY_CODE - код свойства или символьный код. Для свойств типа "Список", "Число", "Привязка к элементам" и "Привязка к разделам" - фильтр Число. Для прочих - фильтр Маска; PROPERTY_<PROPERTY_CODE>_VALUE - фильтр по значениям списка для свойств типа "список" (фильтр Маска), поиск будет осуществляться по строковому значению списка, а не по идентификатору; |
$arResult["NavQueryString"] = htmlspecialcharsbx(DeleteParam($delParam)); |
function DeleteParam($ParamNames)
{
if (empty($_GET))
{
return '';
}
$aParams = $_GET;
foreach (array_keys($aParams) as $key)
{
foreach ($ParamNames as $param)
{
if (strcasecmp($param, $key) == 0)
{
unset($aParams[$key]);
break;
}
}
}
return http_build_query($aParams, "", "&");
}
|
if(($arParams["BASE_LINK"] ?? '') <> '')
{
if(($pos = mb_strpos($arParams["BASE_LINK"], "?")) !== false)
{
$arResult["sUrlPath"] = mb_substr($arParams["BASE_LINK"], 0, $pos);
$arResult["NavQueryString"] = mb_substr($arParams["BASE_LINK"], $pos + 1);
}
else
{
$arResult["sUrlPath"] = $arParams["BASE_LINK"];
$arResult["NavQueryString"] = "";
}
}
else
{
$arResult["sUrlPath"] = GetPagePath(false, false);
$delParam = array_merge(
array(
"PAGEN_".$dbresult->NavNum,
"SIZEN_".$dbresult->NavNum,
"SHOWALL_".$dbresult->NavNum,
"PHPSESSID",
),
\Bitrix\Main\HttpRequest::getSystemParameters()
);
$arResult["NavQueryString"] = htmlspecialcharsbx(DeleteParam($delParam));
}
$arResult['sUrlPathParams'] = $arResult['sUrlPath'].'?'.($arResult['NavQueryString'] <> ''? $arResult['NavQueryString'].'&' : '');
|
$url = "/news/"; |
<? $arDeleteParams = [ "PHPSESSID", "PAGEN_1", "SIZEN_1", "SHOWALL_1", //"PAGEN_2", "SIZEN_2", "SHOWALL_2", ]; $arDeleteSystemParams = \Bitrix\Main\HttpRequest::getSystemParameters(); $arDeleteParams = array_merge( $arDeleteParams, $arDeleteSystemParams); // https://dev.1c-bitrix.ru/community/webdev/user/25773/blog/45676/ // можно $url = getCurPageParamD7( [],$arDeleteParams ); $request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest(); $uriString = $request->getRequestUri(); $uri = new \Bitrix\Main\Web\Uri($uriString); $uri->deleteParams($arDeleteParams); // ничего не добавляем $uri->addParams($arAddParams); $url = $uri->getUri(); ?> |
<?$APPLICATION->IncludeComponent( "bitrix:news.list", ".default", [ *** "PAGER_BASE_LINK_ENABLE" => "Y", "PAGER_BASE_LINK" => $url, "PAGER_PARAMS_NAME" => "arrPager" ], false );?> |
<?php if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
//echo $arParams["BASE_LINK"]
// Askaron заново вычисляем путь, потому что стандартный компонент берёт url из $_GET и не работает нормально с ЧПУ
// Мы хотим убрать SECTION_CODEиз ссылок
// Вместо /catalog/tires/?SECTION_CODE=tires&PAGEN_1=2 сделать /catalog/tires/?PAGEN_1=2
// Если было $arResult["NavQueryString"] = htmlspecialcharsbx(DeleteParam($delParam));
$delParam = array_merge(
array(
"PAGEN_".$arResult["NavNum"],
"SIZEN_".$arResult["NavNum"],
"SHOWALL_".$arResult["NavNum"],
"PHPSESSID",
),
\Bitrix\Main\HttpRequest::getSystemParameters()
);
$path = "";
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$uriString = $request->getRequestUri();
$uri = new \Bitrix\Main\Web\Uri($uriString);
$uri->deleteParams($delParam);
//$arResult[ "sUrlPathParamsNoPagen" ] = $uri->getUri();
$arResult[ "sUrlPath" ] = $uri->getPath();
$arResult[ "NavQueryString" ] = $uri->getQuery();
$arResult[ "sUrlPathParams_no_last_amp" ] = $uri->getUri();
$arResult[ "sUrlPathParams" ] = $arResult[ "sUrlPathParams_no_last_amp" ];
if ( mb_strlen( $uri->getQuery() ) > 0 )
{
$arResult[ "sUrlPathParams" ] .= "&";
}
else
{
$arResult[ "sUrlPathParams" ] .= "?";
}
// Если хотим, чтобы не было ошибок валидатора:
//$arResult[ "~NavQueryString" ] = $arResult[ "NavQueryString" ];
//$arResult[ "~sUrlPathParams" ] = $arResult[ "sUrlPathParams" ];
//$arResult[ "NavQueryString" ] = htmlspecialcharsbx($arResult[ "~NavQueryString" ]);
//$arResult[ "sUrlPathParams" ] = htmlspecialcharsbx($arResult[ "~sUrlPathParams" ]); |
function getCurPageParamD7( array $arAddParams = [], array $arDeleteParams = [] ): string
{
$result = "";
$request = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
$uriString = $request->getRequestUri();
$uri = new \Bitrix\Main\Web\Uri($uriString);
$uri->deleteParams($arDeleteParams);
$uri->addParams($arAddParams);
$result = $uri->getUri();
return $result;
}
|
$url = getCurPageParamD7(); echo htmlspecialcharsbx($url); // Необязательно htmlspecialcharsbx. Замена & на & amp; для валидаторов html. Везде работает, но валидаторы не любят &. |
$_GET['ELEMENT_ID'] = 111; $_GET['SECTIOND_ID'] = 222; echo "<br>".htmlspecialcharsbx( $APPLICATION->GetCurPageParam() ); echo "<br>".htmlspecialcharsbx( getCurPageParamD7() ); |
/test.php?ELEMENT_ID=111&SECTIOND_ID=222 /test.php |
<?if ($USER->IsAuthorized()):?>
<?$url = $APPLICATION->GetCurPageParam("logout=yes&".bitrix_sessid_get(), array(
"logout", // обязательно указывать
"sessid", // обязательно указывать
"login",
"register",
"forgot_password",
"change_password",
"confirm_registration"));
?>
<a href="<?echo htmlspecialcharsbx($url);?>">Закончить сеанс (logout)</a>
<?else:?>
<?$url = $APPLICATION->GetCurPageParam("register=yes", array(
"register", // обязательно указывать
"login",
"logout",
"forgot_password",
"change_password",
"confirm_registration"));
?>
<a href="<?echo htmlspecialcharsbx($url);?>">Регистрация</a>
<?endif;?> |
<?if ($USER->IsAuthorized()):?> <?$url = getCurPageParamD7( [ "logout" => "yes", "sessid" => bitrix_sessid(), ], [ //"logout", // можно не указывать //"sessid", // можно не указывать "login", "register", "forgot_password", "change_password", "confirm_registration" ] ); ?> <a href="<?echo htmlspecialcharsbx($url);?>">Закончить сеанс (logout)</a> <?else:?> <?$url = getCurPageParamD7( [ "register" => "yes", ], [ //"register", // можно не указывать "login", "logout", "forgot_password", "change_password", "confirm_registration" ] ); ?> <a href="<?echo htmlspecialcharsbx($url);?>">Регистрация</a> <?endif;?> |
Страница /test.php?test1=2&test2=2&test3=3 $url1 = getCurPageParamD7( ["test1" => 1, "test2" => 2] ); $url2 = getCurPageParamD7( ["test2" => 2, "test1" => 1,] ); $url3 = getCurPageParamD7( ["test1" => 1, "test2" => 2], ["test1", "test2"] ); $url4 = getCurPageParamD7( ["test2" => 2, "test1" => 1,], ["test1", "test2"] ); Результат /test.php?test1=1&test2=2&test3=3 /test.php?test1=1&test2=2&test3=3 /test.php?test3=3&test1=1&test2=2 /test.php?test3=3&test2=2&test1=1 |
#RewriteCond %{REQUEST_FILENAME} !/bitrix/urlrewrite.php$
#RewriteRule ^(.*)$ /bitrix/urlrewrite.php [L]
RewriteCond %{REQUEST_FILENAME} !/bitrix/routing_index.php$
RewriteRule ^(.*)$ /bitrix/routing_index.php [L] |
Правила urlrewrite 6 => array ( 'CONDITION' => '#^/b2b/catalog/([^/]+)/product/([^/]+)/([^/]*)#', 'RULE' => 'IBLOCK_CODE=$1&ELEMENT_CODE=$2', 'ID' => '', 'PATH' => '/b2b/catalog/detail.php', 'SORT' => 100, ), 4 => array ( 'CONDITION' => '#^/b2b/catalog/([^/]+)/section/([^/]+)/([^/]*)#', 'RULE' => 'IBLOCK_CODE=$1&SECTION_CODE=$2', 'ID' => '', 'PATH' => '/b2b/catalog/index.php', 'SORT' => 100, ), 5 => array ( 'CONDITION' => '#^/b2b/catalog/([^/]+)/([^/]*)#', 'RULE' => 'IBLOCK_CODE=$1', 'ID' => '', 'PATH' => '/b2b/catalog/index.php', 'SORT' => 100, ), |
'routing' => ['value' => [ 'config' => ['mycatalog.php'] ]], |
<?php
return function (Bitrix\Main\Routing\RoutingConfigurator $routes)
{
$routes->any('/b2b/catalog/{IBLOCK_CODE}/product/{ELEMENT_CODE}/',
new \Bitrix\Main\Routing\Controllers\PublicPageController('/b2b/catalog/detail.php'),
)->name("mycatalog.element");
$routes->any('/b2b/catalog/{IBLOCK_CODE}/section/{SECTION_CODE}/',
new \Bitrix\Main\Routing\Controllers\PublicPageController('/b2b/catalog/index.php'),
)->name("mycatalog.section");
$routes->any('/b2b/catalog/{IBLOCK_CODE}/',
new \Bitrix\Main\Routing\Controllers\PublicPageController('/b2b/catalog/index.php'),
)->name("mycatalog.iblock");
$routes->any('/b2b/catalog/{IBLOCK_CODE}/product/{ELEMENT_CODE}/{END_PATH}',
new \Bitrix\Main\Routing\Controllers\PublicPageController('/b2b/catalog/404_routes.php'),
)->where('END_PATH', '.*');
$routes->any('/b2b/catalog/{IBLOCK_CODE}/section/{SECTION_CODE}/{END_PATH}',
new \Bitrix\Main\Routing\Controllers\PublicPageController('/b2b/catalog/404_routes.php'),
)->where('END_PATH', '.*');
$routes->any('/b2b/catalog/{IBLOCK_CODE}/{END_PATH}',
new \Bitrix\Main\Routing\Controllers\PublicPageController('/b2b/catalog/404_routes.php'),
)->where('END_PATH', '.*');
};
|
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Страница не найдена");
CHTTP::SetStatus("404 Not Found");
@define("ERROR_404","Y");
?>
Извините, страница не найдена
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?> |
/// страница /b2b/catalog/index.php
<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
$APPLICATION->SetTitle("Каталог");
?>
<?
$currentRoute = \Bitrix\Main\Application::getInstance()->getCurrentRoute();
if ( $currentRoute->getOptions()->getFullName() === "mycatalog.iblock" )
{
echo "<br>Инфоблок: ".$_REQUEST["IBLOCK_CODE"];
}
elseif($currentRoute->getOptions()->getFullName() === "mycatalog.section")
{
echo "<br>Инфоблок: ".$_REQUEST["IBLOCK_CODE"];
echo "<br>Раздел: ".$_REQUEST["SECTION_CODE"];
}
<?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php");?> |
Ищем в команду на попроектную основу разработчика Bitrix, который сможет разрабатывать и поддерживать веб-приложения на платформе Bitrix.
Вот основной список задач, которые нужно будет выполнять:
Кто нам нужен:
Внимательный php разработчик, который готов выполнять поставленные задачи в срок, желательно с опытом Front-разработки. Business-up часто изучает новую информацию, пополняя и обновляя свои знания. Поэтому, нам важно расширять команду опытными, но открытыми к новому сотрудниками.
В нашей команде ты сможешь пользоваться преимуществами, которые описаны ниже:
<span class="quickview" data-fancybox='' data-type='ajax' data-src="/bitrix/templates/aspro-allcorp2/components/bitrix/news.detail/catalog_modal/template.php?ID=<?=$arItem["ID"]?>" data-product-id="<?=$arItem["ID"]?>"></span> |
Далее создал скрипт-перехватчик для вызова модального окна через fancybox
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.quickview').forEach(function(element) {
element.addEventListener('click', function(event) {
event.preventDefault();
var productId = this.getAttribute('data-src');
if (!productId) return;
$.fancybox.open({
src: '/bitrix/templates/aspro-allcorp2/components/bitrix/news.detail/catalog_modal/template.php?ID=' + productId,
type: 'ajax',
ajax: {settings: {cache: false}}
});
console.log('PRODUCT_ID:', productId);
});
});
}); |
<?if(!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();?>
<?$this->setFrameMode(true);?>
<?
global $arTheme;
use \Bitrix\Main\Localization\Loc;?>
?>
<?if (!empty($arResult)) {?>
<div class="modal-content" style="padding: 20px; max-width: 80%; margin: auto;">
<h2><?=htmlspecialcharsbx($arResult['NAME']);?></h2>
<?
if($arResult['FIELDS']['PREVIEW_PICTURE']):
?>
<img src="<?=$arResult['PREVIEW_PICTURE']['SRC'];?>" alt="<?=$arResult['NAME'];?>" class="img-thumbnail" style="max-width: 100%;" />
<?endif;?>
<?if($arResult['DETAIL_TEXT']):?>
<div class="detail-text">
<?=htmlspecialcharsbx($arResult['DETAIL_TEXT']);?>
</div>
<?endif;?>
<?if($arParams['ORDER_VIEW'] === 'Y'):?>
<div class="price-block">
<?=\Aspro\Functions\CAsproAllcorp2::showPrice($arResult, $arParams, true, true);?>
</div>
<button class="btn btn-primary add-to-cart" oncl ick="addToCart(<?=$arResult['ID'];?>)"><?=Loc::getMessage('ADD_TO_CART');?></button>
<?endif;?>
</div> |
$connection = \Bitrix\Main\Application::getConnection($connection_name); $database_name = $connection->getDatabase(); $query = "SET SESSION information_schema_stats_expiry = 0;"; $dbResult = $connection->query($query); $query = "SEL ECT table_name AS table_name, data_length AS total_size, table_rows as table_rows FR OM information_schema.tables WHERE table_schema = '$database_name' AND table_name = '$table_name';"; $rs = $connection->query($query); $arInfo = $rs->fetch(); |
$result = \Bitrix\Catalog\Model\Price::delete($arFields["ID"]); $result->__destruct(); // Warning. Потому что произошла ошибка, и не сделали $result->isSuccess(), $result->getErrors(), $result->getErrorMessages() |
Warning: CAskaronMyTest: запрещено удалять значение цены in /bitrix/modules/main/lib/orm/data/result.php on line 87
Call Stack
# Time Memory Function Location
{main}( ) .../test5.php:0
Bitrix\Main\ORM\Data\Result->__destruct( ) .../test5.php:65
trigger_error( $message = 'CAskaronMyTest: запрещено удалять значение цены', $error_level = 512 ) .../result.php:87 |
$eventManager = \Bitrix\Main\EventManager::getInstance();
$eventManager->addEventHandler("catalog", "Bitrix\\Catalog\\Model\\Price::OnBeforeDelete",
array("CAskaronMyTest", "PriceOnBeforeDelete"),
false,
50
);
class CAskaronMyTest {
public static function PriceOnBeforeDelete( \Bitrix\Main\Event $event )
{
$result = new \Bitrix\Main\Entity\EventResult();
$arErrors = array();
$arErrors[] = new \Bitrix\Main\Entity\EntityError(
__CLASS__.": запрещено удалять значение цены"
);
$result->setErrors($arErrors);
return $result;
}
}
// Удалить цены для товара
$PRODUCT_ID = 15709;
if ( \Bitrix\Main\Loader::includeModule( "catalog" ) )
{
$res = \Bitrix\Catalog\PriceTable::getList(
array(
"filter" => array(
"=PRODUCT_ID" => $PRODUCT_ID,
),
)
);
while ($arFields = $res->fetch())
{
$result = \Bitrix\Catalog\Model\Price::delete($arFields["ID"]);
$result->__destruct();
// Warning. Потому что произошла ошибка, и не сделали $result->isSuccess(), $result->getErrors(), $result->getErrorMessages()
}
}
|
$result = \Bitrix\Catalog\Model\Price::delete( $arFields["ID"] );
if (!$result->isSuccess())
{
// нужна проверка isSuccess, чтобы не было Warning
// https://dev.1c-bitrix.ru/community/webdev/user/25773/blog/45090/
//echo "Ошибка";
//echo "<pre>"; print_r( $result->getErrors() ) ;echo "</pre>";
//echo "<pre>"; print_r( $result->getErrorMessages() ) ;echo "</pre>";
}
// $result->__destruct(); // не будет Warning |
В предыдущих примерах есть нюанс: запрос на обновление данных вызывается без проверки результата. Если запрос не прошел из-за "проваленной" валидации, и не была вызвана проверка isSuccess(), система сгенерирует E_USER_WARNING со списком ошибок, который можно будет увидеть в логе сайта (если соответствующим образом настроить .settings.php). |
Самое плохое, если Warning появляется при обмене с 1С, или при самодельном импорте/экспорте. В таких ситуациях, где мы не можем исправить чужой скрипт, вывод предупреждений на сайте надо отключить.
namespace My\Helper\Component;
use Bitrix\Main\Application;
use Bitrix\Main\IO;
use Bitrix\Main\IO\Directory;
use CBitrixComponent;
/**
* Добавляет компоненту функционал
* копирования расширения из шаблона в папку /local/js.
*/
trait Extensions
{
/**
* Преобразовывает класс компонента в часть пути для расширения.
* Пример: MyComponentClass в my/component/class
*/
protected function componentClassName2Path(): string
{
return strtolower(
preg_replace(
'/([A-Z])/',
'/$1', __CLASS__
)
);
}
/**
* Копирование расширений из директории /js/ шаблона компонента
* в директорию /local/js/ расширений.
* @return void
*/
public function installComponentExtensions(): void
{
/**
* @var $this CBitrixComponent
*/
$this->initComponentTemplate();
$template = $this->getTemplate();
if(!$template) return;
$path = $template->getFolder();
$serverRoot = Application::getDocumentRoot();
$templateJsPath = sprintf('%s%s/js', $serverRoot, $path);
$templateJsDir = new IO\Directory($templateJsPath);
try {
if(!$templateJsDir->isExists()) {
return;
}
$files = $templateJsDir->getChildren();
} catch (IO\FileNotFoundException) {
return;
}
/**
* @var IO\Directory|IO\File $extDir
*/
foreach ($files as $directory) {
if (!$directory->isDirectory()) continue;
/** @var IO\Directory $file */
$this->installComponentExtension($directory);
}
}
/**
* Копирует директорию в /local/js/my/component/class
* для компонента MyComponentClass.
* Получаем расширение my.component.class.dirname
* @param Directory $dir
* @return void
*/
public function installComponentExtension(IO\Directory $dir): void
{
$pathByTemplateJs = $dir->getName();
$pathByComponent = $this->componentClassName2Path();
$serverRoot = Application::getDocumentRoot();
$localDir = sprintf('%s/local/js/%s/%s',
$serverRoot,
$pathByComponent,
$pathByTemplateJs
);
$bundleTimestampFile = $dir->getPath() . '/.timestamp';
$localTimestampFile = $localDir . '/.timestamp';
$bundleTimestamp = (int)file_get_contents($bundleTimestampFile);
if($bundleTimestamp == 0) return;
$localTimestamp = (int)file_get_contents($localTimestampFile);
$isLocalNotExist = $localTimestamp == 0;
$isBundleNewer = !$isLocalNotExist && $localTimestamp < $bundleTimestamp;
if($isBundleNewer || $isLocalNotExist) {
copyDirFiles(
$dir->getPath(),
$localDir,
true,
true
);
}
}
}
|
use My\Helper\Component\Extensions;
class MyComponentClass extends CBitrixComponent
{
// Трейт копирования расширения из шаблона компонента в /local/js/
use Extensions;
public function executeComponent()
{
// Функция из трейта.
$this->installComponentExtensions();
$this->includeComponentTemplate();
}
}
|
const pluginVue = require('rollup-plugin-vue');
const path = require('path');
const fs = require('fs');
const dayjs = require('dayjs');
module.exports = {
input: 'src/index.js',
output: 'dist/callback.bundle.js',
namespace: 'BX.Catalog',
adjustConfigPhp: false,
browserslist: false,
sourceMaps: false,
plugins: {
resolve: true,
custom: [
pluginVue(),
{
name: 'bundle-timestamp',
buildEnd: async () => {
fs.writeFileSync(
path.resolve('.timestamp'),
dayjs().format('YYYYMMDDHHmm')
)
}
}
],
},
};
|
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
// my/component/class - название компонента.
// v1 - директория с расширением в директории /js/ шаблона компонента, в данном случае название равно версии расширения.
// dist/callback.bundle.js путь из конфига bundle.config.js для сборщика bitrix.
return [
'css' => '/local/js/my/component/class/v1/dist/callback.bundle.css',
'js' => '/local/js/my/component/class/v1/dist/callback.bundle.js',
'rel' => [],
'skip_core' => true,
];
|
<?php if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED !== true) die();
use Bitrix\Main\Application;
use Bitrix\Main\Localization\Loc;
// Чтобы использовать один файл фраз для js-расширения и шаблона.
$extLangFile = Application::getDocumentRoot() . $templateFolder . '/js/v1/config.php';
Loc::loadLanguageFile($extLangFile);
?>
<!-- Точка монтирования расширения -->
<div
data-catalog-callback
data-callback-hash="#call_me"
data-callback-fallback-url="mailto:mail@example.com"
hidden
></div>
<!-- Ссылка не активна до монтирования или отработки фоллбэка -->
<a href="#call_me" class="disabled">
<?= Loc::getMessage('MY_COMPONENT_CLASS_CALL_ME') ?>
</a>
|
...
// Выше поиск точки монтирования, сбор параметров и триггеры монтирования.
// Обязательная часть.
// Итоговое название расширения для загрузки:
// 1) название класса компонента MyComponentClass записываем как my.component.class.
// 2) добавляем название директории v1 с расширением из /js/ шаблона.
BX.loadExt('my.component.class.v1').then(function(exports) {
try {
// BX.Catalog - неймспейс из bundle.config.js
// Callback - название класса расширения.
new BX.Catalog.Callback({
el: node, // Нода в DOM c атрибутом data-catalog-callback
hash: hash, // Значение атрибута data-callback-hash
});
// Расширение готово к использованию.
$('[href="' + hash + '"]').removeClass('disabled');
} catch (e) {
showFallBack();
}
});
// Ниже функция фоллбэка.
...
|
import {Type} from 'main.core';
import {Vue} from 'ui.vue';
import app from './App.vue';
export class Callback
{
constructor(options)
{
const {
el,
hash,
} = options;
Vue.create({
el,
data: () => ({
hash,
}),
components: {
'catalog-callback-wrapper': app,
},
template: `<catalog-callback-wrapper :hash="hash"/>`
})
}
}
|
export default {
computed:
{
localize(state) {
const prefix = 'MY_COMPONENT_CLASS_';
const phrases = BX.Vue.getFilteredPhrases(prefix);
return Object.keys(phrases)
.reduce(
(carry, key) => {
carry[key.replace(prefix,'')] = phrases[key];
return carry;
}, {}
);
}
},
}
|
<?php $MESS['MY_COMPONENT_CLASS_CALL_ME'] = 'Перезвони мне'; $MESS['MY_COMPONENT_CLASS_INTRO'] = 'Оставьте свой номер телефона и мы свяжемся с вами в рабочее время'; $MESS['MY_COMPONENT_CLASS_INTRO_OFFICE_OPEN'] = 'Оставьте свой номер телефона и мы свяжемся с вами в течение 15 минут'; |
namespace My\Components\Controllers;
use Bitrix\Main\Engine;
class CatalogCallback extends Engine\JsonController
{
public function isOfficeOpenAction()
{
$isOpen = date('H') > 10 && date('H') < 20;
return [
// Возвращаем коды фраз.
'resultCode' => $isOpen ? 'INTRO_OFFICE_OPEN' : 'INTRO'
];
}
}
|
<sc ript>
import localize from './localize';
export default {
mixins: [localize],
data() {
return {
introText: '',
};
},
methods: {
getIntroText() {
const request = BX.ajax.runComponentAction(
'my:component.class',
'isOfficeOpen',
{
mode:'ajax',
json: {}
}
);
request.then(({data}) => {
this.introText = this.localize[data.resultCode] || this.localize.INTRO;
}).catch(() => {
this.introText = this.localize.INTRO;
});
}
},
mounted() {
this.introText = this.localize.INTRO;
this.getIntroText();
this.isOpenChecker = setInterval(this.getIntroText, 60*5*1000);
},
beforeDestroy() {
clearInterval(this.isOpenChecker);
}
};
</sc ript>
|
Nostalgie en Direct : Plongez dans l'univers intemporel de la musique
La musique a ce pouvoir magique de nous transporter dans le temps, de réveiller des souvenirs enfouis et de nous faire revivre des moments précieux. Si vous êtes un amoureux des grands classiques,
Nostalgie en direct est votre compagnon idéal pour un voyage musical inoubliable.
Бизнес-процессы (bizproc) 24.200.0 от 10.04.2024 |
Дизайнер бизнес-процессов (bizprocdesigner) 24.600.0 от 28.10.2024 Мобильные бизнес-процессы (bizprocmobile) 24.200.0 от 10.04.2024 CRM (crm) 24.1000.0 от 01.11.2024 |
Наш документ: {=System:HostUrl}{{=getdocumenturl()}}
1. Перейдите по ссылке и заполните форму для дополнительных сведений к документу:
{=System:HostUrl}/askaron/test.php?ELEMENT_ID={{ID элемента}}&WORKFLOW_ID={=Workflow:ID}
2. После заполнения формы нажмите «Утвердить дополнительные сведения к документу» в этой форме. |
location @php { |
location ~* /\.ht {
deny all;
}
location ~ ^/(?!(\.well-known)) {
if (!-e $request_filename) {
rewrite ^(.*)$ /bitrix/urlrewrite.php last;
}
}
if (!-f $request_filename) {
rewrite ^(.*)/index.php$ $1/ redirect;
} |