Задать вопрос
  • Что означает обратный слеш перед вызовом функции?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Это оптимизация опкода PHP. Без обратного слеша в функциях в локальном неймспейсе вызывается 3 опкода, с обратным слешом - один.

    P.S. https://veewee.github.io/blog/optimizing-php-perfo...
    Ответ написан
    Комментировать
  • Что означает обратный слеш перед вызовом функции?

    MvcBox
    @MvcBox
    Software Engineer [C/C++/JS(for Node.js)/etc]
    Комментировать
  • Что означает обратный слеш перед вызовом функции?

    syamskoy
    @syamskoy
    <?php
    
    namespace myNameSpace;
    
    function in_array($value, $arr)
    {
        return 'Local function';
    }
    $arr = [1, 2, 3];
    $value = 1;
    
    var_dump(in_array($value, $arr));
    var_dump(\in_array($value, $arr));

    Результат:
    string(14) "Local function"
    bool(true)


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

    @ZZiliST
    Изучаю JS, CSS, HTML, PHP
    Что бы сделать две цены на один товар, нужно использовать "Торговые предложения". Если же вы хотите использовать разные типы цен ( не путать с ценой ), то вы должны в настройках компонента выбрать эти типы цен для отображения и в административном разделе сайта, в настройках "Тип Цены" (где вы её создавали) выбрать для каких пользователей, какой тип будет отображаться.

    Тип цены

    Торговые предложения

    1) Копируете шаблон компонента
    2) Открываете template.php
    3) Если проект рабочий, и пользователи уже пользуются ресурсом, выводите под админом $arResult или $arItem ( в зависимости какой у вас компонент ). Делается это так

    <?global $USER;
    		if ($USER->IsAdmin()){?>
                          <pre><?print_r($arResult)?></pre>
                 <?}?>


    Ищите в этом массиве ваши типы цены.

    Далее выводите

    <?echo $arResult["PRICE"]["PRICE_1"]["VALUE"]?> 
         <?echo $arResult["PRICE"]["PRICE_2"]["VALUE"]?>  // у вас пути до значения и названия типа цен могут отличаться


    Важно! Если вы используете комплексный компонент каталог. То при создании копии шаблона компонента путь до нужных teamplate.php будет примерно такой:

    /public_html/bitrix/templates/Название шаблона сайта/components/bitrix/catalog/название шаблона компонента/bitrix/catalog.element/.default - для карточки товара

    /public_html/bitrix/templates/Название шаблона сайта/components/bitrix/catalog/название шаблона компонента/bitrix/catalog.section/.default - для списка товаров
    Ответ написан
    8 комментариев
  • PHP CLI. Как запустить скрипт из терминала по SSH, закрыть терминал, а потом снова открыть и увидеть ход выполнения?

    Как вариант, запускать скрипт через nohup, тогда он не будет привязан к терминалу.
    nohup php script.php > file.log &
    Мониторить в реальном времени добавление строк в файл можно черезtail -f file.log
    Ответ написан
    Комментировать
  • PHP CLI. Как запустить скрипт из терминала по SSH, закрыть терминал, а потом снова открыть и увидеть ход выполнения?

    @malerix
    screen и tmux. Вот вам уже готовый рецепт.
    Как работает (примерно):
    $ ssh localhost
    $ screen
    запускается процесс screen, в нём bash или что-нибудь ещё.
    Запускаете вашу команду:
    $(screen) php script.php
    нажимаете Ctrl+A, Ctrl+D. Попадаете обратно в первый шелл.
    отключаемся
    $ exit
    пьём кофе.
    подключаемся вновь:
    $ ssh localhost
    $ screen -r
    Видим результат работы нашей команды и приглашение ввести новую.
    $(screen)

    Остальное описано в man screen.
    Ответ написан
    1 комментарий
  • Как грамотно сделать обработку ислючений в php?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Структура проекта какая-то странная, в нем, судя по всему, контроллером называется роутер, но на этом я останавливаться не буду, обработка исключений от этого не зависит.

    Основных правил при обработке исключений три:
    1. Не использовать исключения там, где они не нужны. Например, при проверке пользовательских данных.
    Собственно, эмпирическое правило звучит так: функция должна бросать исключение, если она не может выполнить ту работу, для которой она предназначена.

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

    Ситуации, когда введено меньше букв, или пользователь не найден, или пароль не подходит - не являются исключительными.

    2. Системные ошибки обрабатывает глобальный обработчик исключений, логируя саму ошибку, а на клиент отправляя статус 500 и какое-нибудь абстрактное сообщение о проблеме на сервере. Это самое важное в системных исключениях - текст ошибки никогда, не при каких обстоятельствах не уходит наружу.

    Пример такого исключения - когда запрос в БД порождает ошибку.

    3. Пользовательские исключения, там где они нужны, обычно обрабатываются по месту, но есть нюансы.
    Собственно, под обработкой исключений часто понимают два разных действия:
    - собственно обработку, когда программа совершает какие-то действия, чтобы нивелировать негативный эффект. Например, если не удалось подключение к какому-то сервису, то либо попробовать подключиться к другому, либо просто подождать и попробовать снова.
    - простое информирование пользователя

    Для информирования можно действительно ловить исключение через try..catch и писать какое-то свое сообщение.
    Но можно и автоматизировать этот процесс, вот две статьи, которые показывают примеры, как это можно сделать:
    https://angelovdejan.me/2022/11/24/centralized-exc...
    https://habr.com/ru/articles/688202/
    Ответ написан
    Комментировать
  • Как обезопасить данные на Макбуке в Apple сервисе?

    sergey-kuznetsov
    @sergey-kuznetsov
    Автоматизатор
    Если вы эти пароли не записали в заметках или каком нибудь другом незашифрованном месте, то никто их и не украдёт. А мастер в сервисе сможет залогиниться под гостем если понадобится. Только не забудьте разблокировать Гостя если он выключен.
    645ad39e0aa98516993992.png
    Хотя чтобы увидеть что батарея работает, не требуется заходить в систему. Просто не давайте паролей и всё.
    И любой сервис заставит вас подписать бумажку о том, что они не отвечают за сохранность ваших данных. Поэтому резервная копия в Time Machine у вас должна быть по определению.
    Ответ написан
    3 комментария
  • Почему не работают агенты на cron?

    @Kalibr
    Мне помогло
    добавил пользовател bitrix, помогло.
    */1 * * * * bitrix /usr/bin/php -f /home/bitrix/www/bitrix/php_interface/cron_events.php
    Ответ написан
    2 комментария
  • Ошибка 'bitrix:system.auth.authorize' is not a component?

    У вас нет компонента bitrix:system.auth.authorize
    Или части файлов (а конкретно component.php) в его каталоге. Возможно случайно удалили, возможно развернули из не полного архива, возможно не хватило место для записи файлов на диск при разархивировании, возможно по какой-то другой причине не дозаписалось.
    Если это штатный компонент и вы его не кастомизировали (почти наверняка это так), то он должен лежать по пути /bitrix/components/bitrix/system.auth.authorize.
    Проверяйте этот каталог.
    Но вообще плохой признак - нет его, вероятно нет и чего-то другого. Вы уверены что полностью перенесли ядро битрикс? Сверьте содержимое каталогов /bitrix

    UPD:
    Есть еще вариант - вы, или кто-то до вас кастомизировали его, и каталог компонента существует (что-то вроде /local/components/ЧтоТоТам/system.auth.authorize), но пуст - не содержит файла component.php или он недоступен.
    Ответ написан
    2 комментария
  • Как с помощью PHPExcel вставить ссылку в ячейку?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    зависит в том числе и от того в каком формате данные сохраняются, смотри примеры из папки examles и бери ту версию что на гитхабе, на сайте глючная.
    Ответ написан
    1 комментарий
  • Что в данном случае несет в себе this в цикле each?

    return this.each(function() {
        // this - Это DOM элемент (input) без jquery методов, такой же как document.querySelectorAll('input[name=\'filter_name\']')[0]
       // а $(this) - это jquery  коллекция с одним элементом, как $('input[name=\'filter_name\']:eq(0)')
      );
    Ответ написан
    8 комментариев
  • Что за ошибка Using $this when not in object context?

    Как уже сказал первый отвечающий: вы пытаетесь вызвать статистически метод GetFullName(). Нужно сделать хотя бы так:
    $user = new CUser();
    $userName = $user->GetFullName();
    if (!$userName)
      $userName = $user->GetLogin();
    Ответ написан
    Комментировать
  • Почему не работает remove?

    atomheart
    @atomheart
    Пишу на Python за карму и за деньги
    Потому что у вас новым элементам .remove_theme не назначено событие click.

    Т.е. ваш код по созданию события должен находиться в событии click кнопки add:

    $('#add_theme').click(function() {
            $('<div class="ft_inputs">\n' +
                '<input type="text" placeholder="Name theme"/>\n' + 
                '<textarea rows="5" placeholder="Desription theme"></textarea><div class="remove_theme">Delete</div></div>') . 
                fadeIn('slow').appendTo('.test');
    
            $('.remove_theme').click(function() {
                $('.ft_inputs').remove(); 
            });
        });


    Ну и кстати, кнопка Delete удалит все созданные объекты. Я так понимаю, задумывалось так, чтобы каждая кнопка Delete удаляла только свой родительский элемент? Если да, то копайте в сторону метода parent().
    Ответ написан
    3 комментария
  • Как выйти из phpstorme?

    @Zuzik3500
    Любитель...
    Сносишь папку с настройками. Либо всю, либо только то что относится к лицензии. На линуксе она находится в home каталоге.
    Ответ написан
    Комментировать
  • Как выйти из phpstorme?

    kimono
    @kimono
    Web developer
    Я бы порекомендовал вообще сделать полную очистку диска перед уходом с текущего места работы.
    Мало ли какие грязные руки и мысли будут у нового владельца компьютера.
    Ответ написан
    3 комментария
  • Существует ли товар в корзине Bitrix?

    @PetrPo
    Ждал красивого решения от битрикса? )) А вот и хрен. Чтобы получить твой \Bitrix\Sale\BasketItem $obItem придется передать все его $properties в 3-ий параметр getExistsItem, типа
    $obItem = $obBasket->getExistsItem('catalog', $productId, [
    	0 => ['CODE' => 'PROP1', 'VALUE' => 'electron'],
    	//......
    ]);

    вообще не понятно зачем этот метод public, если им хрен воспользуешься, надо знать все свойства товара в корзине, у меня это выглядело так
    $obItem = $obBasket->getExistsItem('catalog', $productId, [
    	0 => ['CODE' => 'ARTNUMBER', 'VALUE' => '235-81-03'],
    	1 => ['CODE' => 'COLOR_REF', 'VALUE' => 'Черный'],
    	2 => ['CODE' => 'SIZES_CLOTHES', 'VALUE' => 'XS'],
    	3 => ['CODE' => 'CATALOG.XML_ID', 'VALUE' => 'clothes_offers_s1'],
    	4 => ['CODE' => 'PRODUCT.XML_ID', 'VALUE' => '332#337'],
    ]);


    Вообщем решение конечно будет не таким красивым, как просто методом воспользоваться, но если метод getExistsItem посмотреть, там тоже самое делается, только еще кое-что
    \Bitrix\Main\Loader::includeModule('sale');
    
    $siteId = 's1';
    $fUserId = \Bitrix\Sale\FUser::getId();
    $productId = 139;
    $productByBasketItem = null;
    $bProductInBasket = false;
    
    $basket = \Bitrix\Sale\Basket::loadItemsForFUser($fUserId, $siteId);
    $basketItems = $basket->getBasketItems();
    
    if($basketItems) {
    	foreach($basketItems as $basketItem) {
    		if($basketItem->getField('PRODUCT_ID') == $productId) {
    			$productByBasketItem = $basketItem;
    			$bProductInBasket = true;
    			break;
    		}
    	}
    }
    
    var_dump($bProductInBasket);
    var_dump($productByBasketItem);

    В примере написал булево $bProductInBasket и записал сам объект \Bitrix\Sale\BasketItem в $productByBasketItem, там сам по ситуации выбирай как надо
    Ответ написан
    6 комментариев
  • Почему возникает Duplicate entry '0-1' for key при попытке создания заказа в магазине?

    AvocadoWall
    @AvocadoWall Автор вопроса
    По неизвестной причине, в db-базе, после крайнего заказа №73 появился заказ №0.
    А т.к. включен auto increment и заказ №1 уже есть - выбивало ошибку.
    Ответ написан
    2 комментария
  • Поздравление женской части коллектива от IT-отдела

    curlydevil
    @curlydevil
    Зависит, конечно, от размера ИТ-отдела и размера женской части коллектива. Можно каждой по тюльпану и в боулинг сводить. Ограничиваться сменой обоев на компах — не по-мужски как-то…
    Ответ написан
    Комментировать
  • Поздравление женской части коллектива от IT-отдела

    jarvis
    @jarvis
    Купите вкусный торт, соберите всех, поздравьте и скажите им, какие они красивые, милые и добрые. Пожелайте любви. Если до этого были плохо знакомы, то так и скажите, что давно хотели со всеми лично познакомиться. Пригласите вечером сходить куда-нибудь вместе. Результатом будете удивлены. ТИМБИЛДИНГ в действии. И не надо никаких поздравительных картинок. Да прибудет с вами Сила.
    Ответ написан
    Комментировать