Задать вопрос
Ответы пользователя по тегу PHP
  • Для чего нужен wakeUp в Битрикс?

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

    1. Использование в целях тестирования.

    Предположим у вас есть некоторый класс объекта Record, который является объектом для RecordTable.
    Вы написали некоторую функицю, которая выполняет сложную проверку (например что дата записи не в прошедшем времени, что указанный пользователь является активным и т.п.).
    Допустим вот такая:
    {
    	public function isAcceptable( Record $record): bool
    	{
    		if ( $this->container()->getDateSerivce()->isEarlyDate($record->getDate()) )
    		{
    			return false;
    		}
    
    		if ( !$this->container()->getUserRepository()->isActiveUser($record->getUserId()))
    		{
    			return false;
    		}
    
    		// ... 
    
    		return true;
    	}
    }


    Как вам ее протестировать?
    Наверное нужно получить объект класса Record из БД и отправить в функцию, но что делать если такой записи нет? Создать ее? Но это же тест, а создание это запись в БД, которая может отразиться над ругих тестах.
    Решение - wakeUp:

    // Now - 20.03.2025
    $earlyDateObject = Record::wakeUp([
    	'ID' => -1,
    	'DATE' => DateTime::createFromTimestamp(strtotime("10.03.2025"))
    ]);
    
    assertFalse( $checker->isAcceptable($earlyDateObject) );
    
    $unexistedUserRecord = Record::wakeUp([
    	'ID' => -1,
    	'DATE' => DateTime::createFromTimestamp(strtotime("21.03.2025")),
    	'USER_ID' => -1
    ]);
    
    assertFalse( $checker->isAcceptable($earlyDateObject) );
    
    $normalRecord = Record::wakeUp([
    	'ID' => -1,
    	'DATE' => DateTime::createFromTimestamp(strtotime("21.03.2025")),
    	'USER_ID' => 1
    ]);
    
    assertTrue( $checker->isAcceptable($earlyDateObject) );


    Таким образмо мы написали псевдо-юнит тест который покрывает нашу функцию и при этом не создает и не использует ничего лишнего из БД.

    2. Восстановление данных из кеша.

    Предположим, заходя на страницу вы закешировали ID ресурсов отображаемых на ней, но есть некоторая произвольная величина закешировать которую вы ну никак не можете.
    Механизм вычисления этой величины описан в функции calculatePriority, но она принимает объект Record, а у вас массив из кеша.

    Таким образом получается некоторый такой код:

    $myCachedIds = Container::getInstance()->getCacheService()->get('MY_SUPER_KEY');
    
    $records = RecordTable::createCollection();
    
    foreach($myCachedIds as $recordId)
    {
    	$records->add(
    		Record::wakeUp([
    			'ID' => $recordId
    		])
    	);
    }
    
    $records->fill();
    
    foreach( $records as $record )
    {
    	$arResult['RECORDS'][] = [
    		'ID' => $record->getId(),
    		'PRIORITY' => getPriority($record) 
    	];
    }


    3. Получение данных из других источников.

    Допустим у нас есть несколько табилц: Автор и Книга.

    Автор содержит:
    - ID
    - ФИО (NAME)
    - Город (CITY)

    Книга содержит:
    - ID
    - ID автора
    - Название

    Предположим мы делаем постраничную навигацию для каталога книг и нам нужно вывести ФИО автора.

    $authorCollection = AuthorTable::createCollection();
    
    $books = BookTable::getList()->fetchCollection();
    
    foreach( $books as $book)
    {
    	$authorCollection->add(
    		Author::wakeUp([
    			'ID' => $book->getAuthorId()
    		])
    	);
    }
    
    $authorCollection->fill(['CITY', 'NAME']);


    Согласен, здесь пример кажется немного отстраненным, ведь для связи 1:n можно было бы просто дозапросить данные из БД в 1 запрос, но если у вас таких таблиц уже не 2, а скажем 4-6, то последовательные запросы на получение только необходимой информации серьезно сократят время на получение данных.
    Ответ написан
    Комментировать
  • Bitrix 24 как добавить редактирование своего поля?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Никак.

    На этой форме вы видите товарные позиции И данные доступные из товаров, при условии что товарные позиции были не созданы а выбраны из каталога.
    Так как у самих товарных позиций нет этого свойства, то сделать его редактирование нельзя.

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    - А каково вообще нормальное значение для современных скриптов?


    Нельзя мести всех под одну гребенку и какого-то единого значения нет.
    Есть рекомендованные значения вендора движка и есть "индивидуальные разработки", после которых естественно никто не проверяет характеристики. Код любого дополнительного модуля может в ходе своего выполнения требовать абсолютно разное количество памяти, но дело тут не в "современности" скриптов, а в банальной недальновидности или криворукости.

    У него вообще морда не треснет от 256 метров на процесс? -)


    В зависимости от настроек, например 1С-Битрикс может требовать 257/512 со старта, а некоторые нерадивые разработчики и вовсе увеличивают лимиты до 1ГБ. Здесь все зависит от характера выполняемой работы и подходить нужно индивидуально.

    Каково нормальное значение memory_limit (PHP как модуля Apache)


    Не существует единого "нормального значения", но практика показывает - чем меньше тем лучше.
    Ответ написан
    4 комментария
  • Как получить id лида созданного через плагин WooCommerce(Интеграция wooCommerce с bitrix)?

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


    Замените вызов архаичного метода с логином и паролем на вебхук crm.lead.add
    В результате вызова он вернет вам идентификатор созданного лида, который вы сможете использовать для заполнения товарных позиций
    Ответ написан
    1 комментарий
  • PHP Fatal error: Uncaught TypeError: array_rand(): Argument #1 ($array) must be of type array, string given in?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Метод array_rand принимает первым аргументом массив, а вы передаете в него строку.

    Возможно вам бы смогли подсказать как именно модифицировать код, если бы вы сказали что он должен делать.
    Ответ написан
  • Каким PHP CURL_* константам соответствуют данные опции CURL?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А чем CURLOPT_SSLCERT (cert), CURLOPT_SSLKEY (key) и CURLOPT_CAINFO (cacert) не подходят?

    Например:
    curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');


    Подробнее в доке: https://www.php.net/manual/ru/function.curl-setopt.php
    Ответ написан
  • Как связать контакт и сделку в Битрикс24 с помощью REST API?

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


    Это недоработка со стороны Битрикс24: связать контакт со сделкой через rest api нельзя. Ждем обновлений REST API.

    Есть так же проблема с производительностью, массив очень большой, и скрипт обрабатывается долго, как можно это улучшить?


    Сейчас вы выполняете синхронные запросы по 1. Если на обработку одного запроса нужно 1 секунда, то 60 запросов = 60 секунд. Вы можете группировать запросы в batch, таким образом 60 запросов превратятся в 2 запроса и будут обработаны за ~2 секунды

    Еще, я бы рекомендовал использовать готовую библиотеку для отправки запросов: https://github.com/mesilov/bitrix24-php-sdk/tree/2.x
    Ответ написан
  • Как заблокировать возможность скачивания файлов по прямой ссылке?

    gromdron
    @gromdron
    Работаю с Bitrix24
    В статье "Отдаем файлы эффективно с помощью PHP" рассмотрены эффективные способы.
    Ответ написан
    Комментировать
  • Можно ли давать такое название класса?

    gromdron
    @gromdron
    Работаю с Bitrix24
    С точки зрения самого языка - можно.
    Ответ написан
    5 комментариев
  • Возможно ли интегрировать 1С-Предприятие и PHP сайт используя DMService?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Почитав немного документацию и некоторые маны с известных ресурсов могу сказать что да.

    Библиотек для сторонних языков нет (по крайней мере я не нашел ни одной, тем более для php).
    Но прочитав ссылки выше - предполагаю что это обычный xml-пакет завернутый сверху в что-то типа wsdl (xml over xml короче).

    По вашей ситуации можно зайти с нескольких сторон (очевидные самые простые решения):
    • со стороны ленивого разработчика: потребовать документацию с примерами http запросов и ответов (или другими протоколами)
    • со стороны php разработчика: открыть ссылку в браузере (может быть это обычный wsdl)
    • со стороны 'сетевика/сисадмина': поставить fiddler на компьютер 1С-ника и попросить написать клиент и отправить несколько разных запросов и скинуть лог вам
    Ответ написан
    Комментировать
  • Как мне вывести к товару отзыв для этого товара?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А в чем проблема вместо 125 использовать этот самый "$arResult["ID"]", который и так содержит ID товара который вы смотрите?

    Т.е. по факту вы пишете следующее:
    1) Разрабатываете компонент который на основе ID товара выведет его отзывы
    2) В шаблоне вывода компонента добавляете вызов своего компонента.
    Ответ написан
  • Почему не получается вывести данные из БД?

    gromdron
    @gromdron
    Работаю с Bitrix24
    false возвращается в случае если запрос по какой-то причине не удалось выполнить.
    Посмотреть конкретную причину можно через функцию mysqli_error

    В своем коде, вам так же всегда требуется проверять возвращаемый результат и логировать подобные ошибки.
    Ответ написан
  • Как интегрировать Nethouse event и Bitrix24 через вебхуки?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если мы говорим про Nethouse (шаблон сайты/лендинги) то интегрировать его с Битрикс24 по api на момент написания ответа нельзя. Можно сделать отправку на email, а его подключить к битрикс24 и вручную (или через другие приложения битрикс24) получать из него информацию.

    Если мы говорим про "Nethouse. События", то это можно сделать через приложение "WebHook".
    В таком случае Вам необходимо:
    1) Иметь хостинг для того чтобы принимать веб-хук со стороны Nethouse
    2) Создать веб-хук для созданного события в системе Nethouse (см статью выше)
    3) Создать входящий веб-хук в Битрикс24 с правами CRM от пользователя с правами создания лидов в CRM
    4) Написать код (на любом языке программирования) который бы принимал запрос от Nethouse и отправлял данные в Битрикс24.

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

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

    Я бы порекомендовал дополнительно:
    1) Разделить шаблон на 2 части: result_modifier.php (логика, запросы, обработка результатов) и template.php (чисто визуальное отображение), иначе вы запутаетесь.
    2) Проверить чтобы $arParams['PARENT_SECTION'] была не нулевая (не null, 0, false не пустой массив), иначе есть шанс получить все разделы
    3) Не использовать запросы в цикле
    Ответ написан
    Комментировать
  • Из за чего возникает ошибка Internal server error при попытке отправить POST через CURL для оплаты частями от Privat Bank?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Окей.

    'partsCount' => 5,

    partsCount Integer notNull, min=2, max=25 Количество частей на которые делится сумма транзакции (Для заключения кредитного договора) Должно быть > 1.


    'amount' => 2,
    amount Да Double notNull, Min=300, Max=50 000 Окончательная сумма покупки

    Минимальная сумма 300, у вас 2.
    Далее, вы хотите чтобы 2 разделилось каким-то образом на 5?
    Правильно ли я понимаю, что вы хотите чтобы пользователь провел 5 транзакций по 40 копеек?

    Кроме того - у тебя еще и ошибка в сигнатуре:
    'signature' => base64_encode ( SHA1 ( '75bef16bfdce4d0e9c0ad5a19b9940df'.'4AAD1369CF734B64B70F'.'12211212121'.' 200'.' 5'.' PP'.'https://adsasd'.'https://saddsa'.' test1200'.' 75bef16bfdce4d0e9c0ad5a19b9940df' ))

    Если внимательно посмотришь - у тебя пробелы перед 200, 5 и PP стоят.
    Далее: у тебя есть параметр 'recipientId', который ты передаешь, но в хеш-сумме он остутствует, а по правилам должен быть. Либо убирай, либо добавляй в формирование.

    Поделаешь то что нужно и получишь другую ошибку:
    Array
    (
        [orderId] => 12211212121
        [signature] => +JYghcAp9oIQq3xR/Zn1PftEvQ8=
        [state] => FAIL
        [message] => bad value: Scheme not found for given store
        [storeId] => 4AAD1369CF734B64B70F
    )


    Но это все потому, что scheme - это Идентификатор схемы. Выделяется Банком. По умолчанию не передается.

    Удаляешь его и получаешь заветное:
    Array
    (
        [orderId] => 12211212121
        [signature] => S4cN/oBUIIJeHlcJgTTM+gcZddQ=
        [state] => FAIL
        [message] => bad value: Payment with sent orderId already exists
        [storeId] => 4AAD1369CF734B64B70F
    )


    А это потому, что кто-то уже прогнал твой запрос через api или через веб-морду. Меняешь orderid и получаешь заветное:
    Array
    (
        [orderId] => fdsa1
        [signature] => x2m4GaLFv3ptcxZLynRzwuy/t5g=
        [token] => ADFEDB2FB0C7485CB968148D4BFD6B5A
        [state] => SUCCESS
        [storeId] => 4AAD1369CF734B64B70F
    )
    Ответ написан
    1 комментарий
  • BitrixVM. Push and Pull не работает. Сообщения не приходят в реальном времени. В чем проблема?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Не туда смотрите: сначала в консоль браузера, затем в случае nodejs (а у вас именно такой случай) - /var/log/push-server/ и там уже смотрите логи :)
    Ответ написан
    Комментировать
  • Как правильно задать параметры в REST API Битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Например вот так:

    $queryUrl = 'https://***.bitrix24.ru/rest/161/***/crm.duplicate.findbycomm/';
    
    $order_shipping_phone = [
    	'89032365544'
    ];
    
    $queryData = [
    	'type'        => 'PHONE',
    	'values'      => $order_shipping_phone,
    	'entity_type' => 'CONTACT'
    ];
    
    $curl = curl_init();
    
    \curl_setopt_array(
    	$curl,
    	[
    		CURLOPT_SSL_VERIFYPEER => false,
    		CURLOPT_POST => true,
    		CURLOPT_HEADER => false,
    		CURLOPT_RETURNTRANSFER => true,
    		CURLOPT_URL => $queryUrl,
    		CURLOPT_POSTFIELDS => http_build_query($queryData)
    	]
    );
    
    $result = curl_exec($curl);
    curl_close($curl);
    
    var_dump($result);
    Ответ написан
    Комментировать
  • Как убрать ошибку Cannot modify header information - headers already sent by?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ошибка возникает в случае, если вы УЖЕ отправили что-то на вывод в браузере и да - пробел это тоже вывод.

    В вашем случае часть кода должна выглядеть как-то так:

    <?php 
    require "db.php"
    
    if ( isset($_SESSION['logger_user']) )
    {
    	header("Location: http://fit-pro.tk/home.php");
    	exit();
    }
    ?><!DOCTYPE html>
    <html lang="en">
    Ответ написан
    Комментировать
  • Fatal error: require_once(): Failed opening required?

    gromdron
    @gromdron
    Работаю с Bitrix24
    require_once($_SERVER['DOCUMENT_ROOT'].'/engine/core/connect.php');
    Ответ написан
    2 комментария
  • Как добавить запись в базу данных SQLITE?

    gromdron
    @gromdron
    Работаю с Bitrix24
    1. А кто будет скобки правильно писать? У вас php-ошибка: (одной скобки не хватает):
    $st->execute(array($username);

    2. Почитайте про обработку ошибок в php - php.net/manual/ru/pdo.error-handling.php

    $webroot = $_SERVER['DOCUMENT_ROOT'];
    
    try
    {
    	$db = new PDO("sqlite:$webroot/db/database.db");
    
    	$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    	
        $username = $_GET['username'];
    	
    	if ( empty($username) )
    	{
    		throw new \Exception("User name is empty");
    	}
    	
        $st = $db->prepare("INSERT INTO reports_blacklist_table (user_nick) VALUES (?)");
    	
    	$st->execute([$username]);
    }
    catch( \Exception $e )
    {
    	var_dump($e->getMessage());
    }
    Ответ написан
    1 комментарий