• Почему не подключается композер к битриксу?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А Вы уверены что файл существует?
    Попробуйте поставить не голый require_once, а с проверкой

    if ( file_exists($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php') )
    {
    	require_once($_SERVER['DOCUMENT_ROOT'].'/vendor/autoload.php');
    }
    Ответ написан
    Комментировать
  • Как сделать правильное отображение у товаров цен со скидками при включеном кэше?

    gromdron
    @gromdron
    Работаю с Bitrix24
    И правильно, что не подсказала.
    Правила корзины зависят не только от товара, но и других условий.

    Самый простой и топорный вариант как это сделать: подписываетесь на d7 события и обновляете кеш компонента.
    Интересующие Вас события:
    - \Bitrix\Modules\Sale\Internals\Discount::onAfterAdd (после создания)
    - \Bitrix\Modules\Sale\Internals\Discount::onAfterUpdate (после обновления)

    Как очистить кеш:
    - https://dev.1c-bitrix.ru/api_help/main/functions/o...
    - https://dev.1c-bitrix.ru/api_help/main/reference/c...
    Ответ написан
    4 комментария
  • Как вывести description в bitrix без мета тега?

    gromdron
    @gromdron
    Работаю с Bitrix24
    UPDATE 19.07.2018:

    Судя по прямой постановке вопроса, для получения значения свойства нужно использовать CMain::GetProperty():

    $description = $APPLICATION->GetProperty("description");


    Однако данный механизм работает по технологии отложенных функций, а это значит, что в зависимости от места вызова может вернутся разный результат.
    Автор предполагает использование CMain::ShowProperty(), через

    echo $APPLICATION->ShowProperty("page_title");

    Однако такая возможность существует лишь в шаблоне сайта и не подразумевает дальнейших манипуляций с полученным результатом.

    Например, для того чтобы добавить в description город пользователя использовать ShowProperty для манипуляции с данными категорически нельзя, вместо этого следует подписаться на событие onEpilog модуля main и через GetProperty + SetProperty изменить значение строки
    Ответ написан
  • Как правильно релизиться в больших компаниях?

    gromdron
    @gromdron
    Работаю с Bitrix24
    На РИТ++ в этом году был прекрасный (на мой взгляд) доклад от Андрея Евсюкова из Lamoda. Рекомендую присмотреться. Записи увы нет, но по слайдам думаю будет понятна исходная суть.
    Кстати, там рассмотрены именно Ваши проблемы (Time-to-market) и часть Ваших страхов
    Ответ написан
    Комментировать
  • Как реализовать сервис уведомлений внутри Интранет сети?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Мне кажется, что вопрос изначально стоит не в том чтобы написать свой сервис, а в том чтобы отправить соответствующие уведомления.
    Опять же, уведомления отправляются куда-то - например в приложение или на почту, но тогда у всех сотрудников должно быть.
    А что есть в увсех сотрудников, которые работают на таком большом предприятии? Правильно - почта.

    В чем преимущества использовании почты перед остальными вариантами?
    1) Она есть у всех офисных сотрудников.
    2) Она кроссплатформенная. Т.е. и Android, iOS, Windows, Mac etc
    3) Она уже сохраняет отправленные уведомления (не нужно заботиться о хранении, т.к. всегда знаем кто, когда и кому отправил)
    4) У многих серверов уже есть прослойка в виде Web-API или готовых протоколов (smtp) и множество реализаций

    В чем недостатки:
    1) Не у всех сотрудников она может быть. Например у грузчиков ее может и не быть, но я не думаю что Вы им будете отправлять уведомления. В крайнем случае можно и завести
    2) Отправляет лишь текстовые сообщения (не push, не комманды и т.п.). Но вроде как Вам это и нужно.

    В итоге - не нужно ничего писать, просто заведите корпоративную почту и все.

    P.S. Если уж очень хочется написать свой неоптимальный дублирующий велосипед, то можете перед ней поставить буфером свое приложение, на которое все остальные будут ссылаться.
    Ответ написан
  • Как вывести значения свойства типа "справочник"?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если предположить, что Вы в инфоблоке добавили новое свойство и добавили ему тип Справочник, то думаю это для Вас)

    Я создал тестовое свойство (TEST) - привязка к справочнику и у стандартного компонента news.detail захотел вывести картинку. Для того чтобы его получить я написал небольшой (неоптимальный) фрагмент кода в result_modifier.php.
    В результате работы в свойства появляется ключ EXTRA_VALUE, в котором уже содержатся необходимые описания каждого элемента (в том числе и картинка), а его обрабатывать и выводить уже нужно в шаблоне (template.php) компонента
    use \Bitrix\Main\Loader;
    use \Bitrix\Highloadblock as HL;
    
    /**
     * @var array Массив описывающий свойство типа справочник 
     */
    $arHighloadProperty = $arResult["PROPERTIES"]['TEST'];
    
    /**
     * @var string название таблицы справочника
     */
    $sTableName = $arHighloadProperty['USER_TYPE_SETTINGS']['TABLE_NAME'];
    
    /**
     * Работаем только при условии, что
     *    - модуль highloadblock подключен
     *    - в описании присутствует таблица
     *    - есть заполненные значения 
     */
    if ( Loader::IncludeModule('highloadblock') && !empty($sTableName) && !empty($arHighloadProperty["VALUE"]) )
    {
    	/**
    	 * @var array Описание Highload-блока
    	 */
    	$hlblock = HL\HighloadBlockTable::getRow([
    		'filter' => [
    			'=TABLE_NAME' => $sTableName
    		],
    	]);
    
    	if ( $hlblock )
    	{
    		/**
    		 * Магия highload-блоков компилируем сущность, чтобы мы смогли с ней работать
    		 * 
    		 */
    		$entity      = HL\HighloadBlockTable::compileEntity( $hlblock );
    		$entityClass = $entity->getDataClass();
    		
    		$arRecords = $entityClass::getList([
    			'filter' => [
    				'UF_XML_ID' => $arHighloadProperty["VALUE"]
    			],
    		]);
    		foreach ($arRecords as $record)
    		{	
    			/**
    			 * Тут любые преобразования с записью, полученной из таблицы.
    			 * Я транслировал почти все напрямую. 
    			 * 
    			 * Нужно помнить, что например в UF_FILE возвращается ID файла,
    			 * а не полный массив описывающий файл
    			 */
    			$arRecord = [
    				'ID'                  => $record['ID'],
    				'UF_NAME'             => $record['UF_NAME'],
    				'UF_SORT'             => $record['UF_SORT'],
    				'UF_XML_ID'           => $record['UF_XML_ID'],
    				'UF_LINK'             => $record['UF_LINK'],
    				'UF_DESCRIPTION'      => $record['UF_DESCRIPTION'],
    				'UF_FULL_DESCRIPTION' => $record['UF_FULL_DESCRIPTION'],
    				'UF_DEF'              => $record['UF_DEF'],
    				'UF_FILE'             => [],
    				'~UF_FILE'            => $record['UF_FILE'],
    			];
    
    			/**
    			 * Не очень быстрое решение - сколько записей в инфоблоке, столько файлов и получим
    			 * Хорошо было бы вынести под код и там за 1 запрос все получить, а не плодить
    			 * по дополнительному запросу на каждый файл
    			 */
    			if ( !empty($arRecord['~UF_FILE']) )
    			{
    				$arRecord['UF_FILE'] = \CFile::getById($arRecord['~UF_FILE'])->fetch();
    			}
    
    			$arHighloadProperty['EXTRA_VALUE'][] = $arRecord;
    		}
    	}
    }
    Ответ написан
  • Использовать ли регулярные выражение?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Иными словами: у Вас есть некоторая строка длинной X и Вы хотите оставить в ней только символы по маске а-яА-Яa-zA-Z0-9 (прописные и строчные буквы русского и латинского алфавита + цифры + пробел). Если тотально не доверяете пользователю, я бы рекомендовал все же использовать регулярное выражение, так как в unicode более 8 тысяч символов и ни один из существующих php-функций не вернет Вам их все. В таком случае, регулярное выражение обеспечит наиболее удобный, легкочитаемый и быстрый вариант.

    Но есть одно НО - длинна строки (pcre.recursion_limit). Например при строке в 4096 символов Вы в легкую можете получить Segmentation fault и работа скрипта прекратится.
    Ответ написан
    Комментировать
  • Где находиться эта страница в cms битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Почитайте про обработку адресов.
    Скорее всего у Вас есть папка /catalog/ и в ней находится index.php в котором подключается комплексный компонент
    Ответ написан
  • Во сколько обойдется интернет магазин на битриксе?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для того чтобы открыть интернет магазин, нужно как минимум 3 вещи:
    1) Иметь код интернет магазина (т.е. пройти этапы дизайна, верстки, интеграци и т.п.)
    2) Где-то его разместить (хостинг + домен + сертификат)
    3) Подключить онлайн платежи и кассу*

    Если рассматривать 1 и 2 пункты, то можно взять готовое решение.

    Например: Маркет - адаптивный интернет-магазин + БУС Малый бизнес обойдется в 50 тысяч.

    Нормальный сервер под Битрикс выйдет еще где-то в 12 тысяч в год (сертификат на год обычно дается бесплатно, да и самый дешевый 500 рублей стоит)
    Итого: 62 тысячи единоразовый платеж за 1 год**

    * - в онлайн кассах все очень разнится, поэтому в оценке их нет
    ** - через год, при льготном продлении, это будет стоить 22% от цены за битрикс + 12 тысяч за хостинг/домен в год.
    Ответ написан
    Комментировать
  • Почему битрикс отправляет письма не сразу?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Чтобы не было сильных тормозов сайта отправка почты происходит на агентах в пачках по несколько штук за раз.
    Агенты могут исполняться как на хитах, так и на cron. Если агенты исполняются на хитах, то если на сайте нет пользователей, то и агенты не выполняются (соответственно почта не уходит). Перевидите агенты на cron и она будет работать быстрее.
    Ответ написан
    Комментировать
  • Как в битрикс сделать параметры url в нижнем регистре?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если хотите извращаться то, вот тут дали нормальный ответ.

    spoiler
    in a serverwide httpd.conf:
    RewriteEngine On
    RewriteMap  lc int:tolower
    RewriteCond %{REQUEST_URI} [A-Z]
    RewriteRule (.*) ${lc:$1} [R=301,L]


    Но как уже сказал Вам Алексей Емельянов - предупредите, что из-за этого внутренние механизмы платформы могут быть сломаны, интернет-магазин перестанет нормально работать/продавать и сайт выпадет из выдачи. Возьмите письменное распоряжение утвержденное Вашим руководителем, что ответственный будет SEO-шник. Скорее всего его это напугает и он отстанет.
    Ответ написан
    Комментировать
  • Как оптимизировать битрикс, где найти ошибку?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для начала нужно осознать, что проблема не на всех страницах. Например главная очень даже хорошо отображается.
    Что касается остальных:
    1) Для начала держим битрикс обновленным (иначе некоторые фишки могут не всегда корректно работать)
    2) В настройках главного модуля нужно обязательно отметить опции "Объединять CSS файлы" и "Объединять JS файлы". В идеале конечно все из блока "Оптимизация CSS", но на практике иногда после этого большие проблемы с кешированием в браузерах.
    3) Затем необходимо проверить форму входа - капча именно там выводится:
    spoiler
    <form action='http://borelli.beget.tech/bitrix/templates/eshop_bootstrap_blue/send_msg_form.php'  method='GET'>
       <input name='name' type='text' placeholder='Имя*' class='name_form' ></input>
       <input name='email' type='email' placeholder='E-mail*' class='email_form' ></input><br><br>
       <input name='topic' type='text' placeholder='Тема*' class='topic_form' ></input><br><br>
       <textarea name='msg' placeholder='Сообщение*'></textarea><br><br>
       <img src='http://borellifashiongroup.ru/bitrix/templates/eshop_bootstrap_blue/captcha.php' class='captcha' />
       <input type='text' name='norobot' placeholder='Введите текст с картинки*' class='captcha_code' ></input>
       <button>отправить</button>
      </form>


    4) Далее нужно разобраться с картинками - слишком тяжелые. На странице каталога видел по 3МБ. Вообще в легкую без потери качества можно сжать минимум в 2х раза (а то и больше). Всякие JPEG 2000/XP и WebP не предлагаю, так как битрикс не работает с ними, но банально снизить качество (хотя бы до 80%) и разрешение можно.
    5) Проведите рефакторинг в компонентах. В идеале inline javascript и css кода на странице быть не должно, а у Вас его куча.
    Ответ написан
    Комментировать
  • Как создать динамический фон в шапке для каждого раздела сайта?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Вариантов масса и все зависит от конкретной задачи (Вашу задачу я интерпретировал 3 способами)
    Навскидку, можно сделать так:
    1) Использовать включаему область для фона (и другого html-содержимого).
    2) Можно через свойства страницы
    3) Можно сделать компонент с параметром (типа файл) и через отложенные функции изменять код
    Ответ написан
  • Как сделать поиск по свойству в Битрикс search.title?

    gromdron
    @gromdron
    Работаю с Bitrix24
    $eventManager = \Bitrix\Main\EventManager::getInstance();
    
    $eventManager->addEventHandlerCompatible('search', 'BeforeIndex',    ['\\CatalogProductIndexer','handleBeforeIndex']);
    
    
    class CatalogProductIndexer
    {
    	/**
    	 * @var int Идентификатор инфоблока каталога 
    	 */
    	const IBLOCK_ID = '30';
    
    	/**
    	 * Дополняет индексируемый массив нужными значениями
    	 * подписан на событие BeforeIndex модуля search
    	 * @param array $arFields 
    	 * @return array
    	 */
    	public static function handleBeforeIndex( $arFields = [] )
    	{
    		if ( !static::isInetesting( $arFields ) )
    		{
    			return $arFields;
    		}
    
    		/**
    		 * @var array Массив полей элемента, которые нас интересуют
    		 */
    		$arSelect = [
    			'ID',
    			'IBLOCK_ID',
    			'PROPERTY_TEST1',
    			'PROPERTY_TEST2'
    		];
    
    		/**
    		 * @var CIblockResult Массив описывающий индексируемый элемент
    		 */
    		$resElements = \CIBlockElement::getList(
    			[],
    			[
    				'IBLOCK_ID' => $arFields['PARAM2'],
    				'ID'        => $arFields['ITEM_ID']
    			],
    			false,
    			[
    				'nTopCount'=>1
    			],
    			$arSelect
    		);
    
    		/**
    		 * В случае, если элемент найден мы добавляем нужные поля 
    		 * в соответсвующие столбцы поиска
    		 */
    		if ( $arElement = $resElements->fetch() )
    		{
    			$arFields['TITLE'] .= ' '.$arElement['PROPERTY_TEST1_VALUE'];
    			$arFields['BODY'] .= ' '.$arElement['PROPERTY_TEST2_VALUE'];
    		}
    
    		return $arFields;
    	}
    
    	/**
    	 * Возвращает true, если это интересующий нас элемент
    	 * @param array $fields 
    	 * @return boolean
    	 */
    	public static function isInetesting( $fields = [] )
    	{
    		return ( $fields["MODULE_ID"] == "iblock" && $fields['PARAM2'] == static::IBLOCK_ID );
    	}
    
    }
    Ответ написан
  • Как вывести товары в корзине Битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    У Вас происходит подмена понятий.
    Если Вы хотите интегрировать верстку (т.е. заменить верстку корзины, на свою), то Вам совершенно не обязательно писать код получения товара из корзины. Вам нужно создать отдельный шаблон для уже существующего компонента корзины и манипулируя доступными $arResult и $arParams переменными в шаблоне вывести корзину. Подробнее в главе по Интеграции дизайна в курсе Разработчик Bitrix Framework

    Если Вы хотите написать корзину с нуля (собственный компонент), то придется сильно попотеть, так как это задача отнюдь не для начинающего разработчика. Придется разобраться в том, как устроен битрикс изнутри, как взаимодействуют модули и многое другое. Иными словами пройти почти все курсы от Контент-менеджера до разработчика Bitrix Framework
    Ответ написан
    3 комментария
  • Можно ли штатными средствами битрикс добавить несколько торговых предложений в корзину?

    gromdron
    @gromdron
    Работаю с Bitrix24
    В старом ядре это достаточно просто делалось из обычных функций торгового каталога.
    В новом ядре есть новые методы по работе с добавлением товара в корзину и некоторые из них являются заменой старым.

    Все что Вам нужно - получить в одном месте список товаров и отправить запрос на свою страничку, где Вы добавите этот товар в корзину (либо можете по одному запросу на каждую позицию на скрипт корзины отправлять).
    Ответ написан
    Комментировать
  • Как можно включить уведомления для всех пользователей сразу?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Для коробочной версии, может работать:

    \Bitrix\Main\Loader::IncludeModule('im');
    
    /**
     * @var integer Чьи настройки берем (id)
     */
    $fromUserId = 1;
    
    /**
     * @var integer Кому их сохраняем (id)
     */
    $toUserId = 2;
    
    $userSettings = CIMSettings::Get($fromUserId);
    
    foreach ($userSettings as $type => $value)
    {
    	CIMSettings::Set($type, $value, $toUserId);
    }
    Ответ написан
    1 комментарий
  • Почему так долго очищается кэш?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Вы наверное не знаете как очищается кеш.
    Сначала битрикс получает все директории первого уровня кеша.
    Затем он рекурсивно заходит в каждую директорию и удаляет каждый файлик (в случае если удаляется все, в случае если только устаревшее он еще и сверяет дату с текущей).
    Ресурсы в основном тратятся на получение списка директорий/элементов, а не на удаление.

    Если Вы хотите быстро удалить весь кеш, то лучше зайти на сервер и удалить содержимое папок: /bitrix/cache, /bitrix/managed_cache и /bitrix/stack_cache
    Ответ написан
  • Как сделать бессмертный битрикс24 с бесплатным тарифом?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Или может кто-нибудь знает другие способы создания активности на портале?


    За 1тысячу рублей в год покупаете самый дешевый VPS и пишете на нем selenium скрипт (или phantomjs) который заходит на портал, создает лид, двигает его по статусам и удаляет.
    Ответ написан
    Комментировать
  • Intranet structure visual Битрикс. Поломался. Как починить?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Подскажите, где находятся настройки модуля структуры компании и как починить?


    Это не таблицы, а разделы инфоблоков.
    В админке: Контент - Оргструктура - Подразделения
    Если с технической точки зрения, то орг.структура строится из разделов инфоблока, код которого лежит в b_option (модуль: intranet. название: iblock_structure)

    Орг. структура строится самостоятельно исходя из существующих разделов и их иерархий. Если структура позволяет, то приоритет отдается выравниванию вниз, если много подразделений одного уровня, то в ширь (при условии что они не вытянулись вниз).
    Ответ написан
    Комментировать