• D7. Выборка разделов с подсчетом количества элементов?

    @Firsov36 Автор вопроса
    full-stack web developer
    Вопрос закрыт. Нашел у себя ошибку.
    Кому интересно, делается так:

    $iBlockId = 10;
    $sectionId = 53;
    
    $filter = [
        'IBLOCK_ID' => $iBlockId,
        'ACTIVE' => 'Y',
        'IBLOCK_SECTION_ID' => $sectionId
    ];
    
    $select = [
        'ID', 'IBLOCK_ID', 'countElements'
    ];
    
    $runtime = [
        'elements' => [
            'data_type' =>"Bitrix\Iblock\ElementTable",
            'reference' => [
                '=this.IBLOCK_ID' => 'ref.IBLOCK_ID',
                '=this.ID' => 'ref.IBLOCK_SECTION_ID',
                '=this.ACTIVE' => 'ref.ACTIVE',
            ],
            //'join_type' => "LEFT"
        ],
        'countElements' => [
            'data_type' => 'integer',
            'expression' => ['count(%s)', 'elements.ID']
        ]
    ];
    
    $res = Bitrix\Iblock\SectionTable::getList(
        [
            'filter' => $filter,
            'select' => $select,
            'runtime' => $runtime
        ]
    );
    
    while($section = $res->fetch())
    {
        \Bitrix\Main\Diag\Debug::dump($section, $section['ID']);
    }
    Ответ написан
    2 комментария
  • Как в Bitrix24 из пользовательского поля получить значение?

    @MrSen Автор вопроса
    Верное решение
    global $USER_FIELD_MANAGER;
    $value = $USER_FIELD_MANAGER->GetUserFieldValue('CRM_DEAL', 'UF_CRM_1446923077',1585568);
    
    // 1585568 - ID элемента
    Ответ написан
    1 комментарий
  • Как правильно получить токен в Битрикс24?

    s_panteleev
    @s_panteleev
    25 yo, Yaroslavl
    Посмотрите документацию по REST Битрикс24 и как получать/продлять токены –
    https://dev.1c-bitrix.ru/learning/course/index.php...

    или воспользуйтесь PHP SDK – https://github.com/mesilov/bitrix24-php-sdk
    Ответ написан
    3 комментария
  • Как настроить работу с gitHub в PHPStorm консоли, если включена двухфакторная авторизация?

    DevMan
    @DevMan
    двух-факторная авторизация работает только при логине по паролю.

    генерируете ключ и добавляете его в настройках github - https://help.github.com/articles/generating-ssh-ke...
    если дословно выполнили инструкцию, то на этом моменте все уже должно работать.
    если использовали кастомное название файла, нужно немного магии с .ssh/config - https://gist.github.com/jexchan/2351996

    есть еще способ с токеном, но я не в курсе как он работает с ide.
    Ответ написан
    5 комментариев
  • Поможете с функцией PHP?

    @v__V__v
    Разработчик
    По поводу самой ошибки вам уже подсказали, хочу только подчеркнуть один момент: передавая внутрь функции значения глобальных и суперглобальных переменных в явном виде, вы поступаете правильно. Делайте так всегда и игнорируйте тех, кто говорит, что это - ошибка, т.к. они доступны везде. Это сэкономит вам кучу времени и нервов. И тем, кто будет поддерживать ваш код после вас тоже.
    Ответ написан
    Комментировать
  • PHP Spout не работает ошибка Class 'ZipArchive' not found (0)?

    dyuriev
    @dyuriev
    A posteriori
    Class 'ZipArchive' not found

    у вас отсутствует модуль php-zip
    https://www.php.net/manual/ru/book.zip.php

    вроде модуль ZipArchive автоматически идёт

    вам показалось
    Ответ написан
    5 комментариев
  • Покритикуйте код! Какие грубые и негрубые ошибки совершил?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ну тут скорее ни одной почти строчки нормальной.
    • exit('Ошибка подключения к базе данных!'); дважды глупость. Пользователю сайта не интересно читать, что у тебя сломалось - база данных или деньги на пиво кончились. Как программисту, тебе эта бессмысленная фраза тем более бесполезна, она ничего не говорит о том, ЧТО КОНКРЕТНО сломалось, чтобы ты мог исправить
    • if ($numRows > 0) { бессмысленный кусок кода
    • while ($row = $result->fetch_assoc()) { заменяется на $result->fetch_all(MYSQLI_ASSOC)
    • $this->connect() коннектимся каждый раз, чтобы выполнить запрос, серьёзно?
    • А когда будет еще один класс, для другой таблицы, снова будешь писать код подключения к БД? И так в каждом?
    • Почему класс для работы с "позициями" называется DBh?
    • По сути это не класс, а набор функций. Если ты уберешь красивые слова class и this, то НИЧЕГО не изменится
    • SQL инъекции кругом
    • class Handler extends Dbh ВООБЩЕ непонятно зачем



    В общем, как-то так
    dbh.php
    class Dbh
    {
        public $conn;
    
        public function __construct($config)
        {
            mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
            $this->conn = new mysqli(...$config);
            $this->conn->set_charset('utf8mb4');
        }
    
        public function preparedQuery($sql, $params, $types = '')
        {
            $types = $types ?: str_repeat('s', count($params));
            $stmt = $this->conn->prepare($sql);
            $stmt->bind_param($types, ...$params);
            $stmt->execute();
            return $stmt;
        }
    
        public function selectResult($sql, $params, $types = '')
        {
            if (!$params) {
                return $this->conn->query($sql);
            }
            return $this->preparedQuery($sql, $params, $types)->get_result();
        }
        public function selectAll($sql, $params = [], $types = '')
        {
            return $this->selectResult($sql, $params, $types)->fetch_all(MYSQLI_ASSOC);
        }
        public function selectAssoc($sql, $params = [], $types = '')
        {
            return $this->selectResult($sql, $params, $types)->fetch_assoc();
        }
        public function selectRow($sql, $params = [], $types = '')
        {
            return $this->selectResult($sql, $params, $types)->fetch_row();
        }
        public function selectCell($sql, $params = [], $types = '')
        {
            $row = $this->selectRow($sql, $params, $types);
            return $row ? $row[0] : false;
        }
    }

    position.php
    class Position
    {
        protected $dbh;
    
        public function __construct(Dbh $dbh)
        {
            $this->dbh = $dbh;
        }
        // Получаем все позциии из БД и возвращаем их в массиве $output если записей больше нуля
        public function getAllPositions()
        {
            return $this->dbh->selectAll('SELECT * FROM positions');
        }
        protected function addPosition($content)
        {
            $count = $this->dbh->selectCell('SELECT count(*) FROM positions');
            if ($count < 10) {
                $this->dbh->preparedQuery("INSERT INTO positions (content) VALUES (?)", [$content]);
            }
        }
        protected function deletePosition($id)
        {
            $this->dbh->preparedQuery("DELETE FROM positions WHERE id = ?", [$id]);
        }
        //Поиск позиций в БД по столбцу content
        protected function searchPosition($content)
        {
            $content = "%$content%";
            return $this->dbh->selectAll('SELECT * FROM positions WHERE content LIKE ?',[$content]);
        }
    }

    config.php
    return [
          'db' => [
              'host' => '127.0.0.1',
              'username' => '',
              'password' => '',
              'dbname' => '',
              'port' => 3306,
          ],
      ];


    handler.php

    $config = require 'config.php';
    $dbh = new Dbh($config['db']);
    $position = new Position($dbh);
    
    switch ($_GET['action']) {
        case 'getpositions':
            $output = $position->getAllPositions();
            echo json_encode($output);
            break;
        case 'addposition':
            $content = $_GET['content'];
            $position->addPosition($content);
            break;
        case 'getsearchpositions':
            $content = $_GET['content'];
            $output = $position->searchPosition($content);
            echo json_encode($output);
            break;
        case 'deleteposition':
            $id = $_GET['id'];
            $position->deletePosition($id);
            break;
        default:
            header("HTTP/1.0 400 Bad Request");
    }
    Ответ написан
    2 комментария
  • Интеграция php с Excel-макросом?

    Adamos
    @Adamos
    Убедите "разработчиков" отказаться от технологий прошлого века и сделать онлайн-калькулятор. С API, если им пользуется еще кто-то. Через год они сами будут вам благодарны за эту эволюцию, так что для убеждения можно использовать шантаж и пытки.
    Ответ написан
  • Как гарантировать наличие метода в наследнике без привязки к аргументам?

    glaphire
    @glaphire Куратор тега PHP
    PHP developer
    Перегрузки методов в php нет. Лучше продумать правильно архитектуру, чтобы набор аргументов был стабильным на уровне абстрактного класса/интерфейса, чем передавать методу переменное количество аргументов и искать потом причины багов и повод для рефакторинга. Также переменное количество аргументов дает соблазн давать методу лишние полномочия, размазывая его первоначальное предназначение.
    На уровне конструктора класса можно через dependency injection передать классы для логгирования, вывода инфы в консоль, тогда в методе run их не нужно передавать, но можно использовать внутри метода.
    Ответ написан
    6 комментариев
  • Как соединить в массиве одинаковые значение?

    0xD34F
    @0xD34F
    это вообще реально?

    Нет, блин.

    Расходимся.
    foreach ($arr as $item) {
      $id = $item['id_product_attribute'];
      if (!isset($result[$id])) {
        $result[$id] = $item;
      } else {
        $result[$id]['attribute_name'] .= ', '.$item['attribute_name'];
      }
    }
    Ответ написан
    1 комментарий
  • Как сделать авторизацию в Google Spreadsheets на PHP?

    gzhegow
    @gzhegow Автор вопроса
    aka "ОбнимиБизнесмена"
    Получилось.
    Для того, чтобы получать доступ с другого компьютера (без участия пользователя) - созданы т.н. сервисные аккаунты. Когда мы создаем такой аккаунт - Гугл предупреждает, что `credentials` будут созданы в единственном экземпляре и их недопустимо "потерять".

    Таким образом нужно использовать в скрипте:
    $client_secret_fpath = __DIR__ . 'service-account-credentials.json';
    $client->setAuthConfig($client_secret_fpath);


    А поскольку в этом файлике зашит приватный ключ - получение разрешения на пользование не требуется вообще.
    Не забудьте расшарить доступ к таблице ли или другому сервису на сервисный емейл (он тоже есть в файле-ключе сервисного аккаунта).
    ===

    А вот если мы создаем доступ как "веб-приложение" - то это не значит что мы с сервера можем подключиться к аккаунту, это означает что "сайт сможет использовать возможность спросить пользователя о разрешении", таким образом "токен" у гугла является однозначным идентификатором разрешения человека, и требует нажатия кнопки "разрешить".
    Ответ написан
    Комментировать
  • Какой проект вы бы посоветовали сделать начинающему бекенду программисту на PHP?

    @andreyk0
    Найди то что тебе нравится - допустим фильмы, попробуй создать систему учёта фильмов, актёров, систему подсоса рейтингов с сервисов с открытым api, напиши админку, авторизацию, кэш на файлах и прочие иипоочие вещи. Потом перепиши запросы и структуру таблиц раз 10, используй систему селектов и быстрый поиск ajax и в тоге набери кило 20 лишнего веса и геммор и брось все нафиг и займись спортом
    Ответ написан
    1 комментарий
  • Почему не записываются cookie?

    babarun
    @babarun Куратор тега 1С-Битрикс
    Безумный план моих идей в руках больных людей
    вызываю этот скрипт через ajax jquery.
    - в ответе эти cookie присутствуют?

    Если протокол не https, тогда $cookie->setSecure(false);
    Ответ написан
    Комментировать
  • Почему программисту нужен английский?

    anton_reut
    @anton_reut
    Начинающий веб-разработчик
    Посмотри на Силиконовую Долину, потом на Сколково, потом ещё раз на Силиконовую Долину, и не задавай больше дурацких вопросов.
    Ответ написан
    3 комментария
  • Как сделать работающую форму обратной связи, используя только файл .html?

    OtshelnikFm
    @OtshelnikFm
    Обо мне расскажет yawncato.com
    Дело обстоит так: или вам обеспечивают нормальную работу, или пошло оно всё лесом.
    Ответ написан
    Комментировать
  • Есть ли генератор PHP кода?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Такое точно есть, но не в открытом доступе.
    Лексико-алгоритмический транслятор.
    Когда, например, пишите: "Если буква не "А", добавить 1 к результату и отобразить его".
    Всё остальное делает транслятор, и на выходе - готовый рабочий исходник на выбранном языке программирования.
    Ответ написан
    3 комментария
  • Битрикс загибается?

    И да и нет.
    Битрикс 24 как продукт компании куда как интересней и развивает он его явно активнее чем просто битрикс
    НО б24 сделан на битрикс так что полное вымирание ядра явно не грозит.
    Но кризис на лицо.
    Так же нужно понимать что рынок битрикс сужается
    снизу теперь его поджымают конструкторы, а в топе самопись.
    так же как вы заметили обратная совместимость битрикс дает о себе знать, на их месте я бы уже давно отказался от поддержки обновлений начиная с 7 версии, это же маразм никто в жизне не будет поднимать 7 битрикс до 20.
    Но политика партии, скорее всего все прийдет к тому же что и у php рано или поздно отказавшись от старого кода написав все заново, но время ввода D7 на рынок говорит то том что эта стратегия была провальна, выводить технологиию 10 лет это даже не смешно.
    Так же нужно понимать что у разрабов битрикса уже сложилось свое мнение.
    К примеру разговаривая с Садониным я спросил у него собираются ли они как-то изменять "эрмитаж" на что они сказали что он работает заебись, и никаких изменений не требуется!!!!
    Дада Вот это убожество по их мнению в 2020 совершенно нормально работает.

    В общем
    - Да интерес битрикс к битрикс падает в следствие б24
    - обратная совместимость делает невозможность сделать действительно достойный релиз.
    - застой технологии как таковой. С появлением kubernetas рано или поздно битрикс должен или перебраться полностью в облако или издохнуть или найти 3 путь, как и остальные движки.
    - Судьба php на данный момент находится ровно в той же позиции что и битрикс, оно все еще доминирует на рынке веба но есть куча мощьнейших конкурентов которые не дремлят.
    + Битрикс де факто еще является стандартом екомерц в РФ , и по факту его заменить тупо нечем.
    Делать проект с бюджетом в 1-10 млн на самописи это маразм, так что тут битриксу замены нет.
    В топовом сегменте битрикс никогда и не использовался, за исключением собственно чистого екомерц да и то как исключение.
    Ответ написан
    10 комментариев
  • Список литературы для самостоятельного изучения программированию?

    @McBernar
    Курс CS50.

    Сразу после — погружение в ту область, где хотите работать. Если игры, то unreal engine и c++. Но в эту область порог входа выше, чем в тот же веб или обычные мобильные приложения. Если без игр, то swift для ios, java для андроида. Книги не нужны — смотрите курсы на ютубе или идите в онлайн-школы.

    По книгам уже давно никто не учится — они к моменту печати уже устаревают, плюс часто печатают откровенную ересь. Конечно, есть вечная неустаревающая классика, но без опыта за плечами вы все равно не поймете — про что эти книги.

    Хотите войти в профессию — заварили чай, нагуглили видео-курс и погнали. Прям вот сейчас.
    Ответ написан
    5 комментариев
  • Список литературы для самостоятельного изучения программированию?

    Jacen11
    @Jacen11
    Вот вам первый урок по программированию.
    А что вы сами сделали чтобы ответить на этот вопрос, прежде чем сюда придти? Если ничего, то шли бы вы отсюда и от программирования подальше. Везде уже обсосан этот вопрос. Юнити или анриал для игр, Юнити проще для новичков. Книга хедферст от орейли, стартанлроид на Ютубе для андроида
    Ответ написан
    5 комментариев
  • Какие преимущества проекта на laravel нежели на CMS- битрикс?

    alexyarik
    @alexyarik
    Битрикс разработчик
    laravel нежели на CMS- битрикс?

    - как можно сравнивать продукт с фреймворком. Если взять любую доступную админку на Ларавел, то она даже близко не превзойдёт админку Битрикс.
    Если уж сравнивать тогда ларавел с коммерческим фреймворком Битрикс. По техническим моментам фреймворк битрикса скорее всего уступает ларавел, но как это упрощает и решает задачи бизнеса?
    прикрутить личный кабинет пользователя, с графиками + vue

    - на самом деле Битрикс это коммерческий фреймворк, а админка это продукт на его основе. Если вы будете писать новый функционал, которого нет в продукте, что в Битриксе, что в ларавел вы будете это делать с нуля, писать и там и там на фреймворке.
    1) Удобная система ( админ панель) с быстрой тех поддержкой

    - это реальный большой плюс, который сокращает расходы на поддержку проекта.
    2) Много функционала из коробки

    - это тоже реальный большой плюс, который сокращает расходы на создание аналогичного функционала.
    3) Удобно интегрировать с CRM битрикс

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

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