Задать вопрос
  • Как написать такое регулярное выражение?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Немножечко быдло-регулярка, но результат кода:

    /* @var string Регулярное выражение для проверки */
    $regex = '#^http(s?):\/\/domain\.com\/?(index\.html|test\.html)?$#';
    
    /* @var array Проверяемые варианты */
    $arVariant = [
    	'http://domain.com',
    	'https://domain.com',
    	'http://domain.com/',
    	'https://domain.com/',
    	'http://domain.com/index.html',
    	'https://domain.com/index.html',
    	'http://domain.com/test.html',
    	'https://domain.com/test.html',
    	'http://domain.com/blabla.html',
    	'https://domain.com/blabla.html',
    	'https://domain.com/test.html?page=1',
    ];
    
    foreach( $arVariant as $variant )
    {
    	if ( preg_match($regex, $variant) )
    	{
    		echo "Ссылка '{$variant}' не прошла валидацию".PHP_EOL;
    	}
    }


    Следующий:

    Ссылка 'http://domain.com' не прошла валидацию
    Ссылка 'https://domain.com' не прошла валидацию
    Ссылка 'http://domain.com/' не прошла валидацию
    Ссылка 'https://domain.com/' не прошла валидацию
    Ссылка 'http://domain.com/index.html' не прошла валидацию
    Ссылка 'https://domain.com/index.html' не прошла валидацию
    Ссылка 'http://domain.com/test.html' не прошла валидацию
    Ссылка 'https://domain.com/test.html' не прошла валидацию
    Ответ написан
    Комментировать
  • Почему PHP вместо скрипта запускает интерактивную консоль?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Только что провел данный эксперимент - результат - отработало.
    Единственное - моя комманда отличается от Вашей.

    1) Я не стал вводить path, я указал рабочую директорию (при создании задачи вы можете это сделать)
    2) Я указал явно какую программу использовать

    У меня получилось:

    1) Название программы: php.exe
    2) Переданные параметры: "E:\test\test.php"
    3) Рабочая папка E:\PHP-7\

    Открыл список задач, нашел нужную задачу, посмотрел на вкладке "Действия" комманду которая выполняется ( у меня вывело 'php.exe "E:\test\test.php"' )
    Комманда отрабатала прекрасно.

    P.S. просто так ничего не бывает - кто и что делал? Возможно задача зависла и новая не запустилась, потому как старая не закончилась
    Ответ написан
  • Битрикс CRM Получить ID контакта?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Есть как минимум 2 варианта (без прямых запросов в базу) как это сделать:

    1) Высокоуровневый (работает всегда). Метод с поддержкой обратной совместимости: CCrmContact::GetList (bxapi.ru/src/?id=183244)

    Применение (за основу взял код описанный Артем):

    /* @var array Список контактов */
    $arContacts = array();
    
    if ( \Bitrix\Main\Loader::IncludeModule('crm') )
    {
    	/* @var array Сортировка полученного списка контактов */
    	$arOrder  = array('ID' => 'DESC');
    
    	/* @var array Условия получаемого списка контактов */
    	$arFilter = array(
    		"NAME"      => "Имя",
    		"LAST_NAME" => "Фамилия",
    		'CHECK_PERMISSIONS' => 'N' // Данный ключ необходим для того чтобы получить всех пользоватей,
    								   // иначе, будет найден только если ответственным за него является тот,
    								   // под кем запускается скрипт в битриксе
    	);
    
    	/* @var array Получаемые поля для списка контактов */
    	$arSelect = array(
    		'ID'
    	);
    
    	// NOTE: Запрашивайте только необходимые поля
    	$res = CCrmContact::GetList( $arOrder, $arFilter, $arSelect );
    
    	while( $arContact = $res->fetch() )
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    }
    
    // Тут в $arContacts либо пустой массив, либо массив с ID контактами, которые соответствуют условию поиска


    2) Низкоуровневый DataMapper (новый подход d7)

    use \Bitrix\Main\Loader;
    use \Bitrix\Crm;
    
    /* @var array Список контактов */
    $arContacts = array();
    
    if ( Loader::IncludeModule('crm') )
    {
    
    	$resContacts = Crm\ContactTable::getList(array(
    		'select' => array('ID'),
    		'filter' => array(
    			"NAME"      => "Имя",
    			"LAST_NAME" => "Фамилия",
    		),
    		'order' => array('ID' => 'DESC')
    	));
    
    	while( $arContact = $resContacts->fetch() )
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    
    	/*
    	Начиная с 17 версии (вроде бы), можно делать так:
    	foreach( $resContacts as $arContact)
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    	вместо while цикла
    	*/
    }


    Преимущество первого подхода:
    - Работает всегда, как для новых, так и для старых проектов
    - Можно использовать уровни доступа

    Преимущество нового подхода:
    - Технологически универсален за счет d7 (можно в runtime прибавлять связи, доставать связанные сущности и т.п.)
    - В DataMapper есть технология кеширования, т.е. можно закешировать результат просто добавив в массив getList еще один ключик
    - Субъективно код легче воспринимается
    Ответ написан
    3 комментария
  • Как при создании таблицы поставить полю значение null?

    gromdron
    @gromdron
    Работаю с Bitrix24
    За создание таблицы в MySQL отвечает метод MysqlCommonConnection::createTable(), где в не зависимости от ситуации включается - NOT NULL
    Ответ написан
    2 комментария
  • Как сделать так чтобы бала активная ссылка?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Я так понял, у вас есть какое-то меню, например:

    /top/index.php
    /root/index.php
    /test/index.php

    И в /root/ есть пункт меню (вложенного) меню, в котором есть ссылка на /catalog/index.php
    И вы хотите, чтобы при заходе на /catalog/index.php пункт меню /root/index.php выделялся??

    Если да, то в 3 параметр меню у /root/index.php укажите ссылку /catalog/index.php

    См. комментарий Пётр Невенчанный
    https://dev.1c-bitrix.ru/api_help/main/reference/c...
    Ответ написан
    Комментировать
  • Curl php + прокси не работает?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А все ли вы правильно делаете? Почему у вас CURLOPT_PROXY аж 2 штуки?
    Посмотрите на примеры: https://stackoverflow.com/questions/5211887/how-to...
    Возможно он с паролем
    Ответ написан
    Комментировать
  • Как войти на сайт через CURL с CSRF токеном?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если сайт построен не на js клиент-фреймворке, то делайте 2 хита:

    Шаг 1 - заходите на страницу, собираете csrf запрос, cookie
    Шаг 2 - отправляете данные своей авторизации
    Ответ написан
    6 комментариев
  • Где битрикс хранит данные из корзины?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Содержимое корзины Битрикс записывает в базу данных, но напрямую доставать из нее не советую - лучше используйте API.

    Если интересует прямо таблица с товарами, то b_sale_basket и b_sale_basket_props. Они вяжутся в sale_user из таблицы b_sale_fuser
    Ответ написан
  • Как найти ошибку в битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Наилучшим решением служит обращение в техническую поддержку Битрикса, но только после того как перенесете/развернете сайт штатными средствами битрикса.
    Ответ написан
    1 комментарий
  • PHP скрипт не авторизируется, какие параметры передавать?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для того чтобы провести авторизацию необходимо сделать следующее:

    1) Скачать страницу.
    1.1) Нужно получить COOKIE, которые вернутся со страницей
    1.2) Достать ВСЕ поля из формы (там передаются еще 2 доп. параметра, которых у тебя нет)
    2) Отправить запрос с COOKIE, параметрами из п.1.2 на url авторизации (на ту же страницу с которой производил загрузку)
    Ответ написан
  • Работа с Closure в php?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А вы точно ничего не перепутали?
    Рекомендую ознакомиться со статьей: https://habrahabr.ru/post/147620/
    Ответ написан
    Комментировать
  • Вытащить данные из массива без цикла?

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

    Делается это так:

    // Готовим значение titile по-умолчанию
    $title = '';
    
    // Начинаем буферизация
    ob_start();
    echo "<html><head><title>#title#</title></head>";
    
    // получаем статьи
    $articles = Model::GetArticles();
    
    $iSetTitle = false;
    foreach($articles as $v)
    {
    	if ( ! $iSetTitle ) 
    	{
    		$title = $v['title'];
    		$iSetTitle = true;
    	}
    	echo '<div class="title"><p><?=$v["title"]; ?></p></div>';
    	// вывод контента
    }
    
    $page = ob_get_clean();
    echo str_replace('#title#',$title, $page);


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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Есть 3 способа решения Вашего вопроса:

    1) Топрный: Не использовать указание возвращаемого типа функции
    2) Костыльный: Сделать класс обертку на PartnersPhotoModel, который могла бы возвращать пустой объект данного класса
    3) Прямой: при вызове $this->findOne($criteria); проверять есть ли значение, и в случае его отсутствия бросать исключение
    Ответ написан
    Комментировать
  • Каким способом изучать API Битрикса?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Добрый день,

    Давайте начнем с того, что названия переменных значения не играют. Т.е. Вы можете поменять в коде местами $arSelect и $arFilter и результат от этого не изменится (если Вы все сделали правильно). Что касается их названий - они помогают лично Вам понять что в них находятся и работают по принципу венгерской нотации, с типами и camelCase. То есть в переменной $arFilter находится массив полей, по которому производится фильтрация, а в $arSelect - массив полей, который нужно получить.

    Что касается документации - вранье, она обширная и разжевана до мелочей. Если Вы хотите получить план по развитию, то:
    1) Пройдите всю цепочку битрикса от "Контент-менеджера" до "Администратора" (все 3) и поймите как это работает в админке
    2) Пройдите курс Bitrix Framework и поймите как с этим работать с точки зрения разработчика
    3) Активно читайте справочную литературу - https://dev.1c-bitrix.ru/api_help/ и https://dev.1c-bitrix.ru/api_d7/
    4) Смотрите на официальные курсы по битриксу https://academy.1c-bitrix.ru/training/course/
    5) Сдавайте официальные экзамены (там примеры заданий и четкие решения) https://academy.1c-bitrix.ru/certification/exams.php

    Я Вас уверяю, при сдаче и первого и второго экзамена, Вы уже будете понимать все что нужно для уровня Junior-Middle
    Ответ написан
    6 комментариев
  • Битрикс CRM Где находиться форма смена ответственного из сделки?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вам не нужно для этого изменять внешний вид сделки и crm.entity.quickpanelview Вам тоже трогать не нужно.

    Вы должны подписаться на событие OnAfterCrmDealUpdate и уже в нем инициировать поиск и смену ответственных у привязанных вещей. Так же если вы хотите, чтобы при смене ответственного за компанию менялись ответственные за сделки, нужно подписаться и на событие OnAfterCrmCompanyUpdate.

    P.S. Я как практикующий Битрикс24 разработчик, могу с уверенностью сказать, что из-за решения которое Вы хотели реализовать (через crm.entity.quickpanelview) битрикс и не любят. Т.е. кто-то кастомит компонент, а другим потом разбираться.
    Ответ написан
    2 комментария
  • Как сделать безопасный запрос к БД?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Смотря что именно Вы хотите сделать.
    Если Вас интересует как правильно это делать, то смотрите сообщение от Ильдар Гизетдинов, там подробно описано
    Если Вас интересует как исправить Ваш запрос, то перед вставкой значений в запрос, нужно использовать метод ForSql()
    Ответ написан
    Комментировать
  • Как узнать правильное время выполнения php скрипта?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Правильно ли я понимаю, что Вы хотите узнать все время, которое прошло с момента получения веб-серверов/веб-прокси запроса, до момента его выдачи клиенту?
    Если да, то это можно настроить в Apache и Nginx - в access_log будут не просто указаны запросы, но и время, которое потребовалось на их обработку и php тут не причем.

    Если смотреть на Selenium-тест, то на него еще и скорость соединения с интернетом будет играть роль. А если вы будете еще и dom load событие ждать, то еще и сервер selenium (время обработки страницы, загрузки доп. ресурсов и т.п.)
    Ответ написан
    Комментировать
  • Urlrewrite битрикс. Как написать правило исключающее из url символьный код элемента?

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

    Шаг 1.
    1) Создайте страницу /catalog/index.php, на этой странице выведите $_REQUEST
    2) Создайте правило (взял из примера выше, у пользователя Артём Лучников )

    array(
        "CONDITION" => "#^/([a-zA-Z0-9_-]*)/catalog/.*#",
        "RULE" => "city_code=\$1",
        "PATH" => "/catalog/index.php",
    )


    3) Проверьте, что при заходе, например на /moscow/catalog/, открывается страница и в выведенном массиве есть city_code=moscow

    Шаг 2.
    1) Скопируйте в свое пространство компонент catalog (комплексный) [например custom:catalog], вынесите его на страницу /catalog/index.php
    2) Добавьте в component.php еще одну разделяемую переменную в arComponentVariables - назовите ее, например CITY_CODE, напишите обработчики в тело комплексного компонента, которые будут "переваривать" введенный текст и будут перенаправлять на нужные страницы. В шаблоне sections.php сделайте вывод $_REQUEST
    3) Проверьте, что при заходе, например на /moscow/catalog/, открывается страница и в выведенном массиве есть city_code=moscow

    Шаг 3.
    1) В вынесенном компоненте (из примера выше это custom:catalog), сделайте обработчик указанной переменной city_code, которая и определяет, есть ли указанный город в инфоблоке
    2) Проверьте что все работает корректно

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для технической реализации стартапа у Вас есть 2 пути:
    1) Найти партнера/сотрудника (далее компаньон) для разработки технической части проекта
    2) Самому разобраться в технической части проекта

    Оба подхода хоть и оттакливаются от одного и того же минимального набора знаний, но являются противоположными.
    Если Вы ищите компаньона, то Вы должны в первую очередь быть в нем уверены, потому что ПОЧТИ ВСЮ техническую часть Вы отдадите ему. Ваша задача - идеи, маркетинг, бизнес и т.п. Вы обсуждаете с ним чего хотите, а у него уже болит голова как это сделать чтобы всем было хорошо
    Если Вы хотите все контролировать, то увы, но Вам придется разобраться во многих тонкостях работы IT-специалиста (языки программирования, технологии, базы данных и т.п.)

    Единственная метрика которая у Вас есть достаточно проста и логична - контролировать качество полученного продукта не на уровне кода или архитектуры, а на уровне бизнес-смысла. То есть - какая разница какой язык программирования или базу данных вы используете, если Ваше складское ПО не может отгрузить товар. То есть Вы должны опираться на то, что использует конечный потребитель, и проверять именно его удобство и функциональные возможности
    Ответ написан