• Как отсортировать товары по популярности?

    @Deemc
    веб-программист
    Комментировать
  • Как связать приложение в битрикс через push and pull?

    Вот как у меня:

    Пользователь подписыается на события связанные с объектом $dctList['UUID']:
    \CPullWatch::Add($UserID, $dctList['UUID']);

    Отправляем уведомление всем пользователям при событии связанным с объектом с индентификатором $list_uuid
    \CPullWatch::AddToStack($list_uuid,
    				Array(
    					'module_id' => 'list',
    					'command' => 'exchange',
    					'params' => [
    							'provocative' => $dctData['head']['UID'],
    							'list_uuid'=> $list_uuid
    						]
    				)
    			);


    загрузка модуля:
    BX.loadScript('/bitrix/js/pull/protobuf/protobuf.js', ()=>{
    					BX.loadScript('/bitrix/js/pull/protobuf/model.js', ()=>{
    							BX.loadScript('/bitrix/js/rest/client/rest.client.js', ()=>{
    									BX.loadScript('/bitrix/js/pull/client/pull.client.js',()=>{APP.bitrixreinit._pullinit()});
    								});
    						});
    				});


    Подписка на события в методе _pullinit:
    // подписываемся на события P&P
    		BX.addCustomEvent("onPullEvent", function(module_id,command,params) {
    			
    			if (APP.getConfigParam('uid') == params.provocative) {
    				//if ('production' != APP.getConfigParam('mode')) console.log('собственное событие пропущено');
    				return;
    			}
    			if ('exchange' == command) {
    				APP.exchange({basis: 'pull', context: params});
    			}
    		});
    
    		BX.addCustomEvent("onPullStatus", function(status) {
    			if ('online' != APP.$store.state.status.push_and_pull
    					&& 'online' == status) {
    				// не онлайн сменился на онлайн
    				//let last_sync_time = APP.$store.state.db.sync.last.time.client || 0
    				//let now_time = Date.now()/1000
    				//if (now_time - last_sync_time < 30) {
    				//	
    				//} else {
    				//	
    				//}
    				APP.exchange({basis: 'reconnect'});
    			}
    			APP.$store.commit("updateStatus",{key:'push_and_pull',data:status})
    		});
    		
    		BX.PULL.start();
    Ответ написан
    Комментировать
  • Почему неправильно отображается страница работы с инфоблоками битрикс?

    @Sangfroid Автор вопроса
    Молодой web Разработчик
    использую open server, решил проблему: в конфигурационном файле apache нужно закомментировать:
    <LocationMatch "/\.(?!well-known)">
        Require             all denied
    </LocationMatch>

    Должно получиться вот так:
    #<LocationMatch "/\.(?!well-known)">
        #Require             all denied
    #</LocationMatch>


    Всё происходит из-за того, что apache блокировал подключение файлов с точкой в начале
    Ответ написан
    2 комментария
  • Как использовать vue.js в битрикс?

    Битрикс это фреймворк и CMS - короче бэкенд. Какое отношение он вообще имеет к фронту? Делайте его на Vue, на React, на чем хотите и используйте как хотите.

    То что битрикс поддерживает Vue означает лишь то, что в набор библиотек js для битрикс добавлена Vue и теперь подключить ее к странице можно через API.
    Кроме того встроенная библа помещена в объект BX и обращаться вы к ней должны так - BX.Vue + к ней добавлено несколько плюшек.

    Но насколько я знаю в штатных шаблонах она нигде не используется и ее там никак использовать нельзя, так как все они оперируют с DOM, т.е. по сути несовместимы с реактивными библиотеками.

    Полная дока по использованию тут: https://dev.1c-bitrix.ru/learning/course/index.php...

    Но я бы не стал это использовать.

    Вообще говоря есть некоторый конфликт Битрикс и Vue - с одной стороны шаблоны современных компонентов битрикс полностью заточены по функционалу и идеологии под реактивный фреймворк, с другой стороны их совершенно невозможно на них переписать, так как для них необходим серверный рендеринг ( что по крайней мере пока никак на битрикс не прикрутить) иначе вы останетесь без индексации, а какой-нибудь пререндер 80% пользователей Битрикс не осилит.

    В итоге остается только мечтать о Vue в будущем, а пока в штатных компонентах рендерить на сервере HTML, а потом манипулировать DOM на клиенте, превращая в ад, кастомизацию штатных шаблонов.

    Одним словом хотите использовать Vue с Bitrix - используйте, но забудьте о штатных шаблонах вообще. Да и Vue используйте свой, а не встроенный.
    Ответ написан
    3 комментария
  • Как правильно создавать страницу в Битрикс со своей вёрсткой?

    no_one_safe
    @no_one_safe
    Лучше делать через шаблон сайта и в настройках сайта поставить условия подключения этого шаблона (для конкретной директории)
    Ответ написан
    2 комментария
  • Битрикс почему get параметр logout=yes не разлогинивает?

    @prgrant
    Такая же ерунда и у меня, похоже прилетело после обновления ядра.

    Решил добавлением идентификатора сессии в get-параметр ссылки: bitrix_sessid_get()
    <?=$APPLICATION->GetCurPageParam("logout=yes&".bitrix_sessid_get(), array(
    			"login",
    			"logout",
    			"register",
    			"forgot_password",
    			"change_password"));?>"><?=GetMessage("AUTH_LOGOUT_BUTTON")?>
    Ответ написан
    1 комментарий
  • Почему возникает ошибка при запуске Битрикс в docker?

    smilingcheater
    @smilingcheater
    Вы указали в конфигах подключения в MYSQL хост Localhost, но база у вас в отдельном контейнере, db.
    Указывайте его в качестве хоста для подключения
    Ответ написан
    1 комментарий
  • 1C-Битрикс. Как сделать на одной странице корзину и оформление заказа, чтобы пересчитывалось "Итого" везде?

    dikey58
    @dikey58 Автор вопроса
    Самоучка - web-разработчик
    Всё гениальное просто как оказывается!
    У компонента "Корзина" есть вот такой параметр, который эту проблему решает:
    "BASKET_WITH_ORDER_INTEGRATION" => "Y"
    При этом компонент "Оформление заказа" должен быть добавлен на страницу корзины cart/index.php

    Одно мне не понравилось - при удалении всех элементов корзины форма оформления заказа остается неизменной. Если кто найдет решение этой проблемы - отпишитесь, пожалуйста.
    Ответ написан
    1 комментарий
  • Как поведет себя купленное решение, если поменять ключ Битрикса?

    файлы останутся, будет ругаться на отсутствии лицензии, обновляться не будет
    Ответ написан
    Комментировать
  • Почему визуальный редактор Bitrix ломает Vue компонент?

    h4mpy
    @h4mpy
    Можно задать правила обработки конкретных тегов, тогда сам тег резаться не должен.
    в файле bitrix/php_interface/admin_header.php
    <script>
    BX.addCustomEvent('OnEditorInitedBefore', function(toolbar) {
    	var _this = this;
    	BX.addCustomEvent(this, 'OnGetParseRules', BX.proxy(function() {
    		this.rules.tags['my-component'] = {}; // с дефисом
    		this.rules.tags.mycomponent = {}; // без дефиса
    	}, this));
    });
    </script>

    вроде бы других вариантов нет
    Ответ написан
    1 комментарий
  • Как через getlist выводить элементы по порядку?

    @PetrPo
    но при перезагрузке страницы выводились следущие 50 элементов

    что это значит? ты же понимаешь что, для того чтобы запрос выдал что-то другое, в нем должно что-то изменится? Например параметр в GET-е (как собственно в битриксе и сделано, параметр ?PAGEN_1=2) или у тебя в куке какой-то инкремент, от чего зависит показ следующих 50 элементов?

    В общем случае запрос будет выглядеть так
    \Bitrix\Main\Loader::includeModule('iblock');
    
    $iblockId = 2;
    $nPageSize = 50;
    $iNumPage = 1;
    
    $arElements = array();
    $dbRes = CIBlockElement::GetList(array('ID' => 'ASC'), array('IBLOCK_ID' => $iblockId), false, array('nPageSize' => $nPageSize, 'iNumPage' => $iNumPage), array('ID', 'NAME'));
    
    while($arRes = $dbRes->Fetch()) {
    	$arElements[] = $arRes;
    }
    
    echo '<pre>';
    print_r($arElements);
    echo '</pre>';

    Увеличиваай $iNumPage и будешь получать сдвиг $nPageSize записей
    Ответ написан
    Комментировать
  • Почему копию сайта на локальном сервере Open Server перекосило?

    reaferon
    @reaferon
    Предположу, что не подтянулись CSS-файлы компонента списка товаров (не знаю какой в данном случае используется, комплексный или отдельный). Возможно, стили лежат в папке .default, которые локальный OpenServer не видит (директория считается системной/скрытой).
    Ответ написан
    1 комментарий
  • Зачем нужен Babel и где его использовать?

    @lomaster
    .NET и веб-разработчик
    Babel.JS – это транспайлер, переписывающий код на ES6 (ES-2015) в код на предыдущем стандарте ES5.
    Он состоит из двух частей:
    • Собственно транспайлер, который переписывает код.
    • Полифилл, который добавляет методы Array.from, String.prototype.repeat и другие.
    https://learn.javascript.ru/es-modern-usage
    Ответ написан
    Комментировать
  • Как индексировать содержимое PDF файлов в системе Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Все зависит от того какая именно редакция битрикса.
    Например в Битрикс24 есть модуль Интранет, внутри которого (в настройках) есть "ссылки на внешние программы" для индексации содержимого.
    За pdf отвечает следующая комманда:
    pdftotext "#FILE_PATH#" -enc UTF-8 -nopgbrk -
    где #FILE_PATH# - это полный путь к файлу, который нужно проиндексировать.

    В теории для Управления сайтом можно написать обработчик создания/редактирования элемента инфоблока, куда заливаете файлы и дописывать в SEARCH_CONTENT / поисковый индекс содержимое файла.
    Ответ написан
    2 комментария
  • $$$ что значит в php?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега PHP
    Это называется переменная с переменным именем (variable variable).

    class Foo {
      public $deepest = 'Limbo';
      
      public function __toString()
      {
        return 'deep';
      }
    }
    
    $deeper = 'deepest';
    $deep = 'deeper';
    $b = new Foo();
    
    echo $b->$$$b;


    Выражение выполняется справа налево:
    1. $b->$$($b) превращается в $b->$$($b->__toString()), поскольку именно так ведут себя объекты, когда на них пытаются натравить echo;
    2. $b->$$($b->__toString()) превращается в $b->$(${'deep'}), именно это значение возвращает метод __toString класса Foo, инстансом которого является $b;
    3. $b->$(${'deep'}) превращается в $b->$($deep), это как раз вызов переменной при помощи значения из другой переменной;
    4. $b->$($deep) превращается в $b->${'deeper'}, поскольку именно такое значение находится в переменной $deep;
    5. $b->${'deeper'} превращается в $b->($deeper);
    6. $b->($deeper) превращается в $b->deepest;
    7. наконец, получается значение свойства 'deepest' из $b, а там как раз хранится 'Limbo', оно и выводится в echo.

    dd178a12658f41679b71884846669132.jpg
    Ответ написан
    8 комментариев
  • Как оптимизировать запрос к базе в битрикс?

    Оптимизировать запрос - это неправильная постановка вопроса. Чтобы снизить нагрузку на сервер на основании той информации, которую вам предоставил админ, вы должны:
    - найти api битрикс, к-я генерирует этот запрос
    - найти место в коде сайта: компонент или просто код на странице, где данная апи вызывается
    - посмотреть, не происходит ли ее вызов в цикле по неизвестному количеству элементов, учитывайте, что цикл может быть не очевиден, если, например, вызов этой апи находится в файле, который дергается в цикле по ajax
    - вынести данную апи за цикл, как это делать читайте в книге "совершенный код" Стива Макконнелла - это шикарная книга, которая всегда выручает меня в подобных ситуациях.
    - обернуть кешем место, где идет вызов этой апи
    - проверить, что кеш работает, как надо
    Ответ написан
    Комментировать
  • Как убрать PAGEN из пагинации в каталоге товаров Битрикс?

    Как это можно реализовать?

    так:
    Задать новый паттерн для обработки адресов в файле urlrewrite.php

    Что мешает-то? Как пробовали? Надеюсь сам шаблон пагинации вы изменили соотвествующим образом, под правило в urlrewrite?

    Что пробовали из блога Антона не понятно. Тем более не понятно что не заработало.

    Да - есть еще вариант - найти грамотных сеошников.
    p.s. если таких найдете, скниньте контакт в личку - я не встречал.
    Ответ написан
    3 комментария
  • Битрикс: CSaleBasket::Update - почему модифицируется количество, а цена нет?

    ragnar_ok
    @ragnar_ok Автор вопроса
    Вот и ответ:
    $arFields = array(
                "CALLBACK_FUNC" => "",
                "PRODUCT_PROVIDER_CLASS" => "",
                "CUSTOM_PRICE"      => "Y",
                "IGNORE_CALLBACK_FUNC"  => "Y"
            );

    Существует два параметра: "CUSTOM_PRICE", "IGNORE_CALLBACK_FUNC". Они позволяют отключать GetOptimalPrice и использовать кастомную цену.
    Ответ написан
    Комментировать
  • Почтовый шаблон битрикс не работает?

    AlexeyGfi
    @AlexeyGfi
    YouTube >>> Битриксоид из Колхоза
    Вот, какие ключи предусмотрены в системе для почтового события по смене статуса:
    $arFields = Array(
    	"ORDER_ID" => (...),
    	"ORDER_DATE" => (...),
    	"ORDER_STATUS" => (...),
    	"EMAIL" => (...),
    	"ORDER_DESCRIPTION" => (...),
    	"TEXT" => "",
    	"SALE_EMAIL" => (...)
    );


    Среди них нет данных по пользователю, соответственно сделать в лоб (прописав в шаблонах почтовых типов ключ #ORDER_USER#) не получится.

    Однако, при отправке почтового уведомления непосредственно про смену статуса среди прочих срабатывает событие
    OnOrderStatusSendEmail, которому одним из параметров передаются поля — указатель на $arFields:

    foreach(GetModuleEvents("sale", "OnOrderStatusSendEmail", true) as $arEvent)
    	if (ExecuteModuleEventEx($arEvent, Array($ID, &$eventName, &$arFields, $arOrder["STATUS_ID"]))===false)
    		$bSend = false;


    Вы можете подписаться на это событие и например поступить так:
    1. Добавляете в почтовый шаблон статуса ключ #ORDER_USER#
    2. При реакции на событие формируете нужное значение для #ORDER_USER# и дополняете ним $arFields

    Либо при перехвате события отправить свою версию почтового типа, из функции-реакции вернуть false и тогда пользователю уйдёт только письмо, сформированное вами.
    Ответ написан
    1 комментарий
  • Как сделать подсветку одних и тех же слов в Atom?

    JohnnyDv
    @JohnnyDv Автор вопроса
    Нашёл пакет, решающий эту задачу, может кому тоже пригодиться: Highlight Selected
    ebedae6da4cb41908410d5b18d7b58a0.gif
    Ответ написан
    Комментировать