• Почему Метод Fetch() в произвольном php коде бизнес процесса Битрикс24 не возращает false?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Мне кажется, что дело не в методе fetch. Основной вопрос заключается в том, что находится в переменной $em, в тот момент, когда находятся элементы.

    Вы же знаете, что при значении $em = true, это аналогично $em = 1, а $em = false - ничего не найдет.

    После присвоения $em допишите код:
    ob_start();
    echo "<pre>";
    var_dump( array(
      'ENTITY_ID' => 'LEAD',
      'VALUE' =>$em , 
      'COMPLEX_ID' => 'EMAIL_WORK' 
    ));
    file_put_contents($_SERVER['DOCUMENT_ROOT'].'/test_bp_val.txt', ob_get_clean(), FILE_APPEND);

    И поймете почему он возвращает то или иное значение
    Ответ написан
  • Как проверять на существование лидов с таким же Email. Битрикс24. Коробочная версия?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Сделать нужно немножечко подругому:

    Изучите нижеследующий код и rest-метод crm.duplicate.findbycomm. Смотрите в /home/bitrix/www/bitrix/modules/crm/classes/general/restservice.php

    use \Bitrix\Main;
    use \Bitrix\Crm;
    
    /* @var string Email, который будем искать */
    $sEmail = 'swap@google.com';
    
    /* @var array ID лидов, которые попадаются под условия */
    $arLeadIds = [];
    
    if ( Main\Loader::IncludeModule('crm') )
    {
    	// Формируем критерий, подсовываем Email
    	$criterion = new Crm\Integrity\DuplicateCommunicationCriterion( Crm\CommunicationType::EMAIL_NAME, $sEmail);
    
    	// Выполняем поиск первых 20 клиентов
    	$duplicate = $criterion->find( \CCrmOwnerType::Lead, 20);
    
    	// Если найдены entity проитерируем их
    	$entities = $duplicate->getEntities();
    	if ( !empty($entities) )
    	{
    		foreach($entities as $entity)
    		{
    			$arLeadIds[] = $entity->getEntityID();
    		}
    	}
    }
    
    // А тут будут ID сделок
    var_dump($arLeadIds);
    Ответ написан
    3 комментария
  • Как опубликовать сообщение в группе с помощью API?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Чтобы отправить сообщение в живую ленту нужно еще более изощренный метод.

    Подключаем модуль Соц.сети:
    CModule::IncludeModule("socialnetwork");

    Чтобы отправить сообщение в ленту, нужно чтобы существовал пост, который будет отправлен в ленту, поэтому создаем сначала пост:

    $arFields = array(
     "TITLE" => "Заголовок записи",
     "DETAIL_TEXT" => "Тело сообщения",
     "BLOG_ID" => 1, //ID отправителя
     "AUTHOR_ID" => 1, //ID блога, в котором будет запись
     "DATE_PUBLISH" => '11.02.2014 09:08', // дада
     "PUBLISH_STATUS" => BLOG_PUBLISH_STATUS_PUBLISH, // Читаем в API
     "ENABLE_TRACKBACK" => 'N',
     "ENABLE_COMMENTS" => 'Y'
    );


    При успешном добавлении ($ID = CBlogPost::Add($arFields);) получим ID blogPost записи

    Затем необходимо отправить это сообщение в ленту, для нам нужен фрагмент кода (заменить соответствующим образом):

    $arEvent = array (
    	'EVENT_ID'     => 'blog_post',
    	'=LOG_DATE'    => 'now()',
    	'TITLE_TEMPLATE' => '#USER_NAME# добавил(а) сообщение "#TITLE#" в блог',
    	'TITLE'    => "Заголовок записи",
    	'MESSAGE'  => "Текст записи",
    	'TEXT_MESSAGE'  => "Текст записи",
    	'MODULE_ID'     => 'blog',
    	'CALLBACK_FUNC' => false,
    	'SOURCE_ID'     => $ID,
    	'ENABLE_COMMENTS'  => 'Y',
    	'RATING_TYPE_ID'   => 'BLOG_POST',
    	'RATING_ENTITY_ID' => $newID,
    	'ENTITY_TYPE' => 'U',
    	'ENTITY_ID'   => '1',
    	'USER_ID'     => '1',
    	'URL' => '/company/personal/user/1/blog/'.$ID.'/',
    );


    Создаём запись в ленте через: CSocNetLog::Add, на выходе получаем eventID (в случае успеха)

    Если все прошло хорошо, то выставляем права на пост (в премере отправляем ВСЕМ ПОЛЬЗОВАТЕЛЯМ G3)

    // Выдает права
    CSocNetLogRights::Add ( $eventID, array ("G3") );
    // Отправляет уведомление о новом сообщении
    CSocNetLog::SendEvent ( $eventID, 'SONET_NEW_EVENT' );


    Радуемся =)

    Все параметры получаются по средствам GetList например.
    Ответ написан
    4 комментария
  • Как в 1С Битрикс добавить изображения товара?

    gromdron
    @gromdron
    Работаю с Bitrix24
    В Битриксе не картинка добавляется к товару, а у товара изменяется свойство.
    Т.е. чтобы у товара была картинка - нужно изменить свойства товара (а картинку битрикс сам загрузит куда-нужно).

    Вы же добавление через CIblockElement::Add делаете?
    Там есть пример:
    "DETAIL_PICTURE" => CFile::MakeFileArray($_SERVER["DOCUMENT_ROOT"]."/image.gif")
    Ответ написан
  • Сколько нужно изучать Битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Сколько вообще надо изучить его, чтобы устроиться на работу?

    В зависимости от уровня оплаты иногда достаточно и просто знать php/html/js, чтобы устроиться junior'ом.

    У нас цикл подготовки занимает от 1-го до 3 месяцев.
    При этом первый месяц ТОЛЬКО чтение мануалов (т.е. прохождение всех курсов от Контент-менеджера до Bitrix Framework). Второй месяц - подготовка и сдача экзаменов Битрикса.
    Крайне не рекомендую изучать Битрикс по видеокурсам - получиться не то что Вы хотите.

    А дальше - только практика.
    Ответ написан
    Комментировать
  • Есть ли в Битрикс метод увеличивающий значение свойства элемента?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Прямо вот метода нет, но если знаете ID товара, можете написать SQL запрос.
    Хотите ускориться - придется запачкаться, ну или позапросно.
    Ответ написан
    Комментировать
  • У 1с-битрикс есть апи?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Внешнего API, т.е. позволяющего работать другим приложениям с Вашим сайтом нет.
    Из коробки есть только синхронизация с 1С, да и это не то что Вам нужно
    Ответ написан
  • В чем отличие template_styles.css от styles.css в битриксе?

    gromdron
    @gromdron
    Работаю с Bitrix24
    template_styles.css отвечает за стили шаблона, который будет отображаться у пользователя на странице
    styles.css - стили которые будут использовать в ВИЗУАЛЬНОМ РЕДАКТОРЕ при создании/редактировании страницы.

    Например: в template_styles.css может быть определен стиль:

    div {
    	font-weight:bold;
    }


    И для всего сайта у вас весь текст в div будет жирный.
    Но в визуальном редакторе может быть прописано:

    div {
    	font-weight: normal;
    }


    Таким текст на всем сайте у Вас будет жирный, а в визуальном редакторе нет. Вот и получиться, что Ваш визуальный редактор не такой уж и визуальный.
    Для того чтобы этого не произошло, дополнительно и существует этот файл :)
    Ответ написан
    Комментировать
  • Как сделать композит на битриксе?

    gromdron
    @gromdron
    Работаю с Bitrix24
    В учебных курсах, есть прекрасная статья про отладку композита.
    Если Вы откроете файл: /home/s/new/new.beget.tech/public_html/bitrix/html_pages/new.beget.tech/patients/o-nas/index@/page.html.delete.1509433132.4885, то скорее всего увидите кто именно на данной странице голосовал против композита.
    Ответ написан
    Комментировать
  • Как заставить битрикс не кешировать определенные участки кода в шаблоне?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Простите конечно, но дичь в данном случае то, что предлагаете Вы. Ни один фрейморк не поддерживает "не кеширование определенной области внутри кешируемой" (найдете опровержение - с удовольствием побеседуем и рассмотрим как возможно применение данного алгоритма).

    Собственно в Битриксе есть 2 механизма для решения Вашего кейса:

    1) Убрать кеширование результата (html) и сделать кеширование данных.
    На мой взгляд не лучший вариант, так как на рендеринг тоже нужны ресурсы, которые и так дорогие

    2) Определить дополнительный ключ кеширования.
    В StartResulCache во 2 параметр можно добавить свои ключи, и в данном случае у Вас это будет ключ устройства пользователя (mobile / desktop), после чего будет хранится 2 кеша: для мобильных и для десктопных клиентов.
    Ответ написан
    4 комментария
  • Битрикс: http стили грузятся, https - нет, почему?

    gromdron
    @gromdron
    Работаю с Bitrix24
    На самом деле все просто как 2х2: у Вас сайт работает и по http и по httpS, а CDN работает ЛИБО для http ЛИБО для httpS.

    На странице: /bitrix/admin/bitrixcloud_cdn.php?lang=ru
    На вкладке дополнительно, нужно отметить опцию "Сайт использует https".

    Дело в том, что все ресурсы отдаются грузятся с Вашего сайта, но отдаются с другого домена.
    Если Вы посмотрите на строку, то они грузятся с "//brima.ru.opt-css.1c-bitrix-cdn.ru/", а при активации ссылка примет вид: "//opt-******.ssl.1c-bitrix-cdn.ru/", где ****** это будет Ваш уникальный ID (все будет автоматически после активации галочки).
    Ответ написан
    Комментировать
  • Как правильно переименовать папки сайтов в VM Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для выполнения данной операции, Вам не нужно переименовывать папки - Вам нужно поправить файл hosts (чтобы с site1.ru был переход на site1.loc), потому что иначе, без зарегистрированного домена все будет очень плохо.
    А чтобы site1.ru открывался Вам нужно отредактировать конфигурацию nginx.

    Собственно название папок это скорее для Вас чтобы не запутались. Папки могут называться хоть www.supertest.batch.main, а открываться по www.site1.ru, хоть по site1.io
    Ответ написан
    Комментировать
  • Как записать данные в базу при установке модуля?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ну окей, погнали.

    (file_exists($f = dirname(__FILE__).'/db/mysql/install.sql'))

    1) Как вообще получилась такая адовая конструкцию? Она же не читается, да и не нужна она (см. ниже)

    2) Файл dirname(__FILE__).'/db/mysql/install.sql') всегда присутствует в директории модуля.
    За свою практику, я еще не встречал шибко-умных-парней, которые бы лезли в чужой модуль и удаляли файлы, поэтому если он есть в модуле, то он есть всегда.
    Хочешь проверить дополнительно? Проверяй, только если он не найден - хотя бы ошибку выводи, а то сейчас все в холостую - нет файла -> нет события -> непонятно почему не работает

    3) Хочешь выполнить батч? Ну так и делайте это как битрикс. Посмотри хотя бы на модуль торгового каталога:

    if(!$DB->Query("SELECT 'x' FROM b_catalog_group", true))
        $errors = $DB->RunSQLBatch($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/catalog/install/db/".strtolower($DB->type)."/install.sql");


    Обрати внимание на: strtolower($DB->type), если планируешь делать модуль оставь хотя бы лазейку, чтобы потом не переделывать.

    4) Переходи уже на d7!
    В папке модуля в include.php оставь пустой комментарий с тегами php

    И в /lib/demodata.php пропиши:

    namespace Partner\Demosite;
    
    class DemoData


    Тогда тебе не нужно будет править автолоадер при появлении нового класса и геморроя будет меньше

    5) После п.4 смотри на новый лоадер (и раз уж пишешь по-старинке, вот старый код, новый можешь в том же модуле торгового каталога посмотреть):

    RegisterModuleDependences('main', 'OnPageStart', $this->MODULE_ID, '\Partner\Demosite\DemoData', 'AddDemoDataOptions');


    P.S. Я надеюсь в uninstall ты удаляешь подписки на события.

    А теперь ответ на вопрос: если хочешь загрузить какие-нибудь данные в БД - делай это в методе DoInstall() в самом конце после успешной регистрации модуля, а не на событиях. Если их слишком много - выдели несколько шагов.
    Ответ написан
    2 комментария
  • Битрикс Корпоративный портал бизнес процесс, как добавить триггер времени?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Прямо как Вы описали нет, НО!
    Если БП со статусами, то Вы можете сделать отдельный статус для подтверждения.
    Поставить тайм-аут на событие в 30 минут, и в другом статусе проверить были ли они выполнены. При невыполнении - вернуть заново на тот же статус.

    Реализация похуже, но кейс решает.
    Ответ написан
    Комментировать
  • Как можно посчитать часы и минуты по тарифу?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Посмотрите как работает в date G и i, как php читает запятую при приведении типов.

    Немного дополненный пример.

    /* @var float Стоимость минуты разговора, в данном случае 55 рублей 56 копеек */
    $rateMinutes = 55.56;
    
    /* @var DateTime Время начало разговора/события */
    $oStartDate = new \DateTime('11.10.2017 10:37:00');
    
    /* @var DateTime Время оконачания разговора/события */
    $oEndDate = new \DateTime('11.10.2017 10:47:00');
    
    /* @var int Длительность события в секундах */
    $durationSeconds = abs($oEndDate->getTimestamp()-$oStartDate->getTimestamp());
    
    /* @var int Длительность события в минутах, округленных в большую сторону */
    $durationMinutes = round($durationSeconds/60);
    
    /* @var float Стоимость разговора/события */
    $price = $durationMinutes * $rateMinutes;
    
    // Выводим стомость разговора/события
    var_dump($price);
    Ответ написан
    Комментировать
  • Как вывести данные в админке?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ну есть один вариант:
    - Создаете пользовательское поле типа "число" без права редактирования пользователем
    - Пишете код, который при добавлении/удалении/обновлении элемента устанавливает значение поля в соответствующее значение, если дата баллов не истекла
    - Пишете агента, который каждый день получает элементы инфоблока баллов, которые кончились вчера и обновляет данные о пользователе на текущую дату
    Ответ написан
    Комментировать
  • Кто нибудь может накидать вариантов почему такие разрывы в коде?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Окей, почему такие большие разрывы в коде?

    1) Возможно ошибка в самом файле шаблона. Нужно проверить все шаблоны на предмет символов в цикле.
    Можно попробовать заменить свой шаблон меню, стандартным шаблоном битрикса. Помогло? Ошибка в шаблоне. Нет? Ошибка в другом месте.

    2) Возможно ошибка кроется в result_modifier.php шаблона.
    Файла нет или ошибки в нем нет? Ошибка в другом месте.

    3) Возможно кто-то вынес меню в local или изменил файл в ядре (/bitrix/components/bitrix/menu).
    Ядро не менялось и компонента в local нет? Ошибка в другом месте.

    4) Возможно используется расширенное меню и ошибка в нем.
    Если расширенное меню не используется или в нем нет ошибки, то ошибка в другом месте

    5) Возможно ошибка при формировании меню.
    Например пункты меню формируются php кодом или внутри происходит какой-то include/require

    Ошибка по-прежнему не найдена?
    Поздравляю - Вы попали на очень хороший дебаг и может стоит обратиться в техническую поддержку?
    Ответ написан
    Комментировать
  • Насколько верны результаты get_ini?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Коллеги, мне кажется Вы забываете об уровнях изоляции.
    PHP ini подгружается не в самом php, а в apache, соответственно при обработке .htaccess он имеет бОльший приоритет.
    Соответственно в ini_get Вы получите те значения, которые действуют в момент вызова ini_get в рамках данного хита.

    Примечание: не все значения можно переопределить в .htaccess (например mbstring.func_overload)
    Ответ написан
    Комментировать
  • Как создать агента в своём модуле?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А в чем собственно вопрос? Делайте как по документации

    1) При установки модуля добавляем агент:
    \CAgent::AddAgent( "\\Your\\Module\\SuperClass::superAgent();", "your.module", "N", 10 * 24 * 3600, "", "Y");

    где
    "\\Your\\Module\\SuperClass::superAgent();" - код php который должен выполняться (точка с запятой в конце строго!!!)
    "your.module" - название вашего модуля
    "N" - периодичность
    10 * 24 * 3600 = периодичность запуска
    '' - первая дата проверки (оставлять пустой)
    "Y" - активность агента

    2) При удалении - очищаем агенты
    \CAgent::RemoveModuleAgents("your.module");
    3) Если файлы располагаются по канонам d7 ( /your.module/lib/superclass.php ), то ничего больше делать не нужно, если старый - то нужно прописать в include.php автолоадер для вашего класса с агентом
    Ответ написан
    2 комментария
  • В ORM Битрикса есть сеттеры и геттеры?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Очень интересная задача.

    Если Вам нужно оперировать только после получения данных, то Вам отлично подойдет механизм "Форматирования значений" из документации по ORM.
    При этом можете использовать сериализацию или json на ваше усмотрение (рекомендую сериализацию - нативнее и есть шанс что в модуле производительности заработает).

    Если у Вас MySQL выше 5,7 версии, можно добавить несколько Expression полей и доставать из JSON ключи так же как и поля. Пока не пробовали данный вариант - руки не доходили.
    Ответ написан
    Комментировать