Задать вопрос
  • Как подключить глобальную переменную $DB в битрикс в отдельном файле?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Покажите код вашего файла.
    Возможно Вы не подключили prolog_before - служебную часть битрикса.
    Делается это следующим образом: в начале скрипта прописывается:
    require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php";
    Ответ написан
  • Как реализовать голосование за отдельный элемент с помощью инфоблоков в битрикс?

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

    Давайте разберемся с Вашей ситуацией:
    создала отдельный файл voting.php в шаблоне компонента

    Скорее всего Вы просто создали файл. И в нем соответственно НЕ подключили служебную часть.
    Я бы рекомендовал Вам использовать ORM Битрикса для такой ситуации (очен....
    Но как быстрое решение, можно и прямой запрос в базу (хотя это будет менее элегантное решение).
    В таком случае код будет выглядеть как-то так:

    <?
    require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php";
    
    /**
     * Тут можете проверить, что все переменные пришли
     * Я для себя буду использовать переменные:
     * - ELEMENT_ID 
     * - USER_ID
     * 
     * Просто писать факт голосования.
     * В таблицу project_element_vote ( ID, ELEMENT_ID, USER_ID )
     */
    
    global $USER;
    
    /* @var object Объект приложения */
    $oApplication = \Bitrix\Main\Application::getInstance();
    
    /* @var object Объект соединения с БД */
    $oConnection = $oApplication->getConnection();
    
    /* @var object Хелпер для безопасной записи в БД*/
    $oHelper = $oConnection->getSqlHelper();
    
    /* @var object Объект для работы с входящими переменными */
    $oRequest = $oApplication->getContext()->getRequest();
    
    
    if ( $oRequest->isAjaxRequest() && !empty( $oRequest->get('ELEMENT_ID') ) )
    {
    	$iUser    = $USER->GetId();
    	$iElement = $oHelper->forSql( $oRequest->get('ELEMENT_ID') );
    
    	$sql = "INSERT INTO project_element_vote('ELEMENT_ID','USER_ID') VALUES ('{$iElement}','{$iUser}')";
    	$res = $oConnection->query($sql);
    
    	if ( $res )
    	{
    		echo 'ok';
    		die();
    	}
    }
    echo 'bad';
    Ответ написан
    Комментировать
  • PHP 7 Как переделать из preg_replace в preg_replace_callback?

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

    Навскидку, код, который будет отвечать за вывод будет следующим:
    /* @var string Текст, в котором проводим замену*/
    $str = <<<STRTEXT
    [index:Звездочет]А тут хз что[/index]
    Тут текст [guest]Иванов[/guest]
    STRTEXT;
    
    $oTextParser= (new TextParser($str))
    				->addRule("#\\[index:(.+?)\\](.*?)\\[/index\\]#ies", "indexShow('\\1', '\\2')")
    				->addRule("#\\[guest](.*?)\\[/guest]#ies","checkGuest('\\1')")
    				->parse();
    
    /*
    На выходе хочу получить:
    -------------------------
    Звездочет(А тут хз что)
    Тут текст GUEST(Иванов)
    */
    
    echo "<pre>";
    var_dump($oTextParser->getText());
    echo "</pre>";

    Код функций который я буду использовать:
    function indexShow( $a, $b)
    {
    	return $a."(".$b.")";
    }
    
    function checkGuest( $a )
    {
    	return 'GUEST('.$a.')';	
    }


    Сама реализация:
    class TextParser
    {
    	/* @var string Результат выполнения парсинга */
    	public $parsed;
    
    	/* @var string[] Ассоциативный список правил в формате: регулярка => функция для замены */
    	public $rules = [];
    
    	public function __construct( $text )
    	{
    		$this->parsed = $text;
    	}
    
    	/**
    	 * Добавляет правило работы парсера
    	 * Для использования цепочек возвращает текущий экземпляр
    	 * 
    	 * @param string $regex 
    	 * @param string|callback $func 
    	 * @return TextParser
    	 */
    	public function addRule( $regex, $func )
    	{
    		$this->rules[ $regex ] = $func;
    		return $this;
    	}
    
    	/**
    	 * Выполняет разброр исходного текста
    	 * Для использования цепочек возвращает текущий экземпляр
    	 * 
    	 * @return TextParser
    	 */
    	public function parse()
    	{
    		array_walk(
    			$this->rules,
    			function($function, $regular)
    			{
    				$this->parsed = preg_replace($regular, $function, $this->parsed);
    			}
    		);
    		return $this;
    	}
    
    	/**
    	 * Возвращает результат парсера (или исходный текст, если был вызван до метода parse)
    	 * 
    	 * @return string
    	 */
    	public function getText()
    	{
    		return $this->parsed;
    	}
    
    }


    Естественно, решение имеет свои изъяны и слабые стороны, помимо плохого кода, нельзя будет использовать функции в текущем окружении ($this).
    Ответ написан
    4 комментария
  • Не возвращает на сайт после авторизации через google (laravel) в чём моя ошибка?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ошибка: Forbidden You don't have permission to access /google/callback on this server.
    Отдается уже Вашим сервером.

    Скорее всего Вы неправильно настроили (или не настроили или недонастроили) - Pretty url (насколько я понял)
    Сверьтесь с документацией - все ли Вы сделали правильно.

    https://laravel.com/docs/5.5#web-server-configuration
    Ответ написан
    Комментировать
  • Какие самые лучшие онлайн курсы по PHP?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Мой коллега, сейчас участвует в программе менторства по Базовому курсу php от HTLM Academia. Не могу говорить за всех, но в качестве данного курса я уверен:
    1) Должная подготовка - php, composer, github , mysql - знания которые вы получите на выходе, плюс понимание как это работает
    2) Работа с ментором позволит устранить узкие места в Вашем коде и если нужно поставит логику на место.

    По специалисту ничего не могу сказать, но из GeekBrains так себе специалисты (был опыт).

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    1) Выносите /bitrix/admin/user_search.php (исходный код, а не ссылку), куда-нибудь в /local/tools/
    2) Делаете класс-наследник от CIBlockPropertyUserID ( /bitrix/modules/main/tools/prop_userid.php )
    3) Перекрываете методы GetUserTypeDescription и (GetPropertyFieldHtml или FindUserIDNew)
    4) Правите в новом файле из п.1 Вашу группу

    Это вариант fix.
    В идеале: в своем наследнике CIBlockPropertyUserID добавить параметром группу пользователей, все запросы дополняете этой группой, а в своем файле user_search.php делаете доп. проверку. Так получается уже отличное свойство.
    Ответ написан
    Комментировать
  • Кто подключал онлайн-кассу в битрикс? Можно ли это сделать без обновления?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Можно ли подключить онлайн кассы для старого Битрикса?
    Да, можно.

    Можно ли подключить онлайн кассы для старого Битрикса, не привлекая разработчика или иных специалистов?
    Нет, нельзя.

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Впринципе не сложно.

    Для начала Вы подписываетесь на событие OnAdminListDisplay модуля Main.
    Именно оно отвечает за действие ДО вывода любого списка элементов в административной панели (за исключением под-листов у инфоблоков и модуля производительности).
    На вход оно принимает лишь 1 параметр - экзепляр класса CAdminList (см. /bitrix/modules/main/interface/admin_list.php)

    Чтобы обрабатывать нужную таблицу, нужно ограничить выборку. Т.е. Ваш обработчик будет выглядеть как-то так:

    <?php
    AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
    function MyOnAdminContextMenuShow(&$oAdminList)
    {
        /**
         * $type - тип кода инфоблока, например news, events и т.д.
         * $iblock - идентификатор инфоблока
         * 
         * Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
         */
        if ( $oAdminList->table_id == "tbl_iblock_list_".md5($type.".".$iblock) )
        {
            // полезные действия
        }
    }
    ?>


    Собственно так, мы получаем возможность работать с выводом.
    Для более подробного пояснения лучше прочитать про заказные элементы в административной панели в документации: https://dev.1c-bitrix.ru/api_help/main/general/adm...

    Собственно добавим нужные нам данные для работы. Предположим, я хочу логгировать выделенные элементы на странице, тогда мой код будет выглядеть так:
    AddEventHandler("main", "OnAdminListDisplay", "MyOnAdminContextMenuShow");
    function MyOnAdminContextMenuShow(&$oAdminList)
    {
        /**
         * $type - тип кода инфоблока, например news, events и т.д.
         * $iblock - идентификатор инфоблока
         * 
         * Если интересует каталог, то вместо tbl_iblock_list_ нужно использовать tbl_product_list_
         */
        if ( $oAdminList->table_id == "tbl_iblock_list_".md5("structure.4") )
        {
        	$arActions = $oAdminList->arActions;
    
        	$arActions['alert'] = 'Ругаться!';
    
        	$oAdminList->AddGroupActionTable($arActions);
        }
    }
    
    AddEventHandler("main", "OnAfterEpilog", "iblockAlert");
    
    function iblockAlert()
    {
    	$oRequest = \Bitrix\Main\Application::getInstance()->getContext()->getRequest();
    
    	// Проверяем, что работает только в админке
    	if ( $oRequest->isAdminSection() )
    	{
    		if (
    			// Интересуют только интерактивные запросы
    			$oRequest->get('mode')=='frame'
    			// Где передана переменна IBLOCK_ID
    			&& $oRequest->get('IBLOCK_ID')==4
    			// Соответствующие нашему action
    			&& $oRequest->get('action')=='alert'
    			)
    		{
    			/**
    			 * Вот тут можно сделать что угодно
    			 * Можно получить выделенные ID
    			 * через $oRequest->get('ID')
    			 * Если он пуст, значит действие на всех элементах инфоблока
    			 */
    		}
    	}
    }


    На самом деле параметров гораздо больше - есть еще custom области, которые можно выводить, но суть та же. Если захотите добавить свое поле (я добавлял простой action), то лучше глянуть в исходники и там уже по аналогии разрбраться
    Ответ написан
    3 комментария
  • Почему array.length возвращает 0?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Я использовал фрагмент кода и дополнил его (чтобы не ругался на неизвестные массивы). У меня получился фрагмент:

    all = {
    	"2017-08-10": 10,
    	"2017-08-11": 11,
    	"2017-08-12": 12,
    	"2017-08-13": 13,
    	"2017-08-14": 14
    };
    
    register = {
    	"2017-08-10": 10,
    	"2017-08-11": 11,
    	"2017-08-12": 12,
    	"2017-08-13": 13,
    	"2017-08-14": 14
    };
    
    percent = {
    	"2017-08-10": 10,
    	"2017-08-11": 11,
    	"2017-08-12": 12,
    	"2017-08-13": 13,
    	"2017-08-14": 14
    };
    
    result = ["2017-08-10","2017-08-11","2017-08-12","2017-08-13","2017-08-14"];
    compact = [];
    for (var i = 0; i < result.length; i++)
    {
    	compact.push([i+1,all[result[i]],register[result[i]], percent[result[i]] ]);
    }

    При выполнении указанных Вами комманд:
    console.log(Object.keys(compact).length)
    console.log(compact.length)


    В обох случаях возвращается 5.
    Что я делаю не так? и чем мой код отличается от Вашего?
    Ответ написан
    Комментировать
  • Как грамотней добавить лендинг на страницу 1с bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Есть пряморукое, но сомнительное решение: поработать через urlrewriter

    Если, как было выяснено в комментариях,

    /akcii/ - базовая страница компонента
    /akcii/skidka/ - страница, где выводится список элементов из инфоблока с кодом "skidka"
    /akcii/nacenka/ - страница, где выводится список элементов из инфоблока с кодом "nacenka"

    Тогда в urlrewrite.php можно внести правило:

    array(
    "CONDITION" => "#^/akcii/skidka/\\?#",
    "RULE" => "",
    "ID" => "",
    "PATH" => "/beginners/skidka/index.php",
    ),

    И проконтролировать, чтобы оно было выше обработчика самого /akcii/
    Тогда должно сработать и по адресу /akcii/skidka/ показывать директорию лендинга
    Ответ написан
    Комментировать
  • Как настроить права доступа на группу пользователей?

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

    А вот с группой 1 будет интересный вопрос: Вам на событиях придется отлавливать добавление и изменение элемента инфоблока (я бы посоветовал принудительно ставить флаг активности в N состояние).

    Или у Вас проблемы с непосредственным написанием кода?
    Ответ написан
  • Как правильно начинать новый проект на битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если Вы работаете с 1С-Битрикс и вы делаете "шаблонки", то бОльшая часть всего уже есть.
    Вообще вопрос сильно отличается от содержания и не очень понятно что изначально вы имеете ввиду.
    Вы хотите узнать можно ли решить данный кейс без написания собственного кода (т.е. без написания компонентов, а только правками шаблона)? Да можно.
    Можно ли сделать какие-либо сложные вещи без написания кода? Зависит от того что именно. Многие решения уже сделаны, а реализация других потребует сильного или значительного изменения кода.

    Можете уточнить вопрос?
    Ответ написан
  • Как привязать сайт к учету?

    gromdron
    @gromdron
    Работаю с Bitrix24
    В меня конечно сейчас попытаются запустить камнем, но - 1С-Битрикс имеет штатную интеграцию + модули для о...

    Правда выйдет недешево и если 1С-ка пиленая придется попотеть, но в целом документация по обмену хорошая.
    Ответ написан
    Комментировать
  • Как надежно выполнить несколько запросов mysql (mysqli)?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ответ - нет. Функция mysqli_multi_query выполнит все запросы так, как если бы Вы использовали обычное query.
    К тому же, она вернет FALSE, только если ПЕРВОЕ выражение вызвало ошибку.

    Для реализации обхода, как Вам уже указали используйте Транзакции через begin_transaction
    Ответ написан
    Комментировать
  • Есть php скрипт, надо записать его в крон. как сделать?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для начала, ознакомьтесь с имеющийся документацией: https://dev.1c-bitrix.ru/learning/course/?COURSE_I...
    Внизу странице (по ссылке выше) есть код агента, исполняющегося под cron. Он подойдет.

    Первое на что нужно обратить внимание: константа SITE_ID. Если предполагается работа из админ панели, то это константа языка, иначе - константа сайта (лучше задать вручную)
    Второе: проверьте $_SERVER["DOCUMENT_ROOT"] (если у Вас bitrix vm то это скорее всего тот же путь)
    И третье - вместо echo в cli режиме лучше использовать: fwrite( STDOUT, 'Строка' );
    Ответ написан
    Комментировать
  • Ограничение просмотров через сессию или куки?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для ограничения просмотров наиболее подходящим образом будет:
    1) Разрешения просмотра только для зарегистрированных пользователей
    2) Хранение факта проссмотра в отдельной таблице.

    Почему?
    1) Сессия сбрасывается со временем
    2) Куки можно подделать
    3) Отображение истории просмотра можно потом выводить для "автора" резюме
    Ответ написан
    Комментировать
  • Что нужно сделать чтобы убрать дублирование h1 тайтла?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Во-первых, в данный момент title и h1 у Вас различаются. Т.е. скорее всего Вы либо решили вопрос, либо "зашили" его в код страницы.
    Во-вторых, согласно документации и примечаниям, в месте вывода h1 вы можете прописать: $APPLICATION->ShowTitle(), а в title: $APPLICATION->ShowTitle(false)
    Тогда у Вас получить отложенный механизм и стандартный. (можете поменять местами как Вам нужно)
    Ответ написан
    Комментировать
  • Что лучше выбрать для интеграции интернет-магазина на 1С Битрикс с Amocrm и c Roistat?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Прежде всего давайте разберемся зачем Вам это нужно и что это такое.

    Что такое '1С-Битрикс Управление сайтом (ред. "Малый Бизнес")' - это интернет магазин. Витрина товаров с их оформлением.
    Пользователь создает заказ, видит его в кабинете, оплачивает и ждет доставку. Может ознакомиться с ассортиментом и т.п.
    По факту в Вашем случае это поставщик данных для CRM.

    AmoCRM - это CRM система для ведения клиентской базы, отслеживания заказов, бонусных программ и прочего.

    Roistat - это система аналитики для бизнеса. Работает она на основе полученных из других источников данных.

    Соответственно, для корректной и полной работы Вам нужно сделать следующее:

    1) Интеграция Битрикса -> AmoCRM. Передавать данные маркера (см ниже), сделках, клиентах. (можно двухстороннюю)
    2) Интеграция AmoCRM -> Roistat (передача маркера, данных сделки, статусов и т.п.)
    3) Интеграция Битрикса -> Roistat (передача маркеров, отслеживание событий и аналитики)

    Только при такой интеграции у вас получиться:
    1) Полная картина в Roistat (вы сможете отследить покупателя от момента захода на сайт, до финальных покупок)
    2) Получить необходимые данные в CRM системе
    3) Не нарушить стандартных механизмов работы системы.
    Ответ написан
    Комментировать
  • Вопрос по ролям в mvc?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если рассматривать указанный выше код, то по паттерну MVC, тут есть только V и C.

    Код который является View:
    "You asked for blog entry {$id}."

    Код который является контроллером ( без view):

    $id = (int) $request->getAttribute('id');
    $response = new Zend\Diactoros\Response();
    $response->getBody()->write(  );
    return $response;


    По факту Model части тут нет.
    Ответ написан
    2 комментария
  • Где посмотреть файл XML, который импортировался c 1С (УТ11) в Битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если Вы выгружали пачкой сразу на сайт и больше выгрузок не делали, то смотрите в /upload/1c_exchange/ там будут и xml и картинки и все что нужно.
    Но только с последней выгрузки.
    Ответ написан
    Комментировать