• Почему я не могу получить значения пользовательского поля раздела инфоблока?

    udjin123
    @udjin123
    PHP, Golang, React
    При выборке пользовательских полей обязательно должен быть в фильтре IBLOCK_ID, без вариантов.

    По этому сначала по IBLOCK_CODE получаем его ID потом уже выборка разделов.
    Ответ написан
    Комментировать
  • Как сделать отправку форм для всех в PHP?

    AgentSmith
    @AgentSmith
    Это мой правильный ответ на твой вопрос
    POST-запросом
    Ответ написан
    3 комментария
  • Как реализовать онлайн проверку результатов?

    @qid00000000
    Мало что знаю, но информацию найду в гугле
    1. Берешь разработчиков
    2. Составляешь вместе с ними ТЗ
    3. Разработчики, за деньги, делают продукт

    Если коротко, что потребуется:
    1. бд с результатами
    2. нужно авторизировать пользователей только к их результатам (потребуется аутентификация + подтверждение, если берется из других источников)
    3. ну и скрипт, который все в html запихнет.
    Ответ написан
    2 комментария
  • Из-за чего вылезает ошибка при изменении значения в json?

    Aetae
    @Aetae
    Тлен
    Я сейчас покажу абсолютно секретный кусок кода, вы такой нигде больше не найдёте. Это чудо решает 99% проблем!
    spoiler
    $data  = file_get_contents('values.json');
    $data = json_decode($data , true); 
    var_dump($data);
    Ответ написан
  • Не устарел ли ещё курс Скиллбокс "Веб-верстка" декабря 2020 года?

    @antares4045
    У меня родственник решил потратить деньги на этот курс: акценты сильно смещены в сторону бесполезных свистоперлелок типа pixel perfect, и nvda, которые фронтендер, только сошедший с конвера ещё несколько лет не вкусит (а может и вообще никогда).
    + полностью отсутствует практика верстки не лендингов (внезапно, если на сайте будет больше одной страницы, есть куча специфики, с которой вам прийдётся знакомиться сразу на боевом проекте).

    Но (особенно после обновления зимы 20-21 (когда оно точно было не помню)) вся ключевая информация в курсе освнщена. Тем не менее фокус на ванильном html+js там совершенно излишен. Клиент и работодатель сейчас хотят реакт (большие компании вообще ангуляр).
    Ответ написан
    1 комментарий
  • Как выбрать язык программирования для своего web проекта?

    Mike_Ro
    @Mike_Ro
    Python, JS, WordPress, SEO, Bots, Adversting
    Какой язык и технологии мне следует использовать для максимально эффективной реализации

    Тот и ту, которые лучше знаете
    Ответ написан
    Комментировать
  • Можно ли использовать return;?

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

    В вашем случае это значение по умолчанию, но так как функция void то это можно игнорировать
    Ответ написан
    Комментировать
  • Можно ли использовать return;?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    return; - это бессмыслица, её надо убрать из кода
    И никакое false она не возвращает.
    Про "еще одно противоположное значение" вас тоже обманули

    Если функции нечего вернуть, то ничего возвращать она и не должна.

    Максимум, где можно использовать пустой return - если он используется для управления ходои исполнения. То есть чтобы досрочно завершить исполнение кода
    Ответ написан
    Комментировать
  • 0 Call to a member function get() on null как испаравить?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Не записывать null в $params.
    Ваш К.О.
    Ответ написан
    Комментировать
  • Как получить доступ к ключам многомерного массива?

    0xD34F
    @0xD34F
    echo implode("\n", array_map(fn($n) => "$n[0] $n[2]", array_filter($arr, fn($n) => $n[1])));
    Ответ написан
    2 комментария
  • Зачем .Net разработчику нужны отличные знания JavaScript?

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

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

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Первое. Половину требований в вакансиях можно смело отбрасывать. Это автогенерируемый мусор, чтобы быть конкурентными.
    .NET-разработчики разные бывают. Есть чистый бэкенд, которым не нужно знать ангуляр, но JS знать рекомендуется, а HTML обязательно знать вообще всем.
    ASP.NET-разработчик тесно связан с фронтендом, а значит все ангуляры и реакты ему знать нужно, чтобы можно было договориться с тру-фронтендщиками на том же ангуляре.
    Не надо так близко к сердцу принимать все прописываемые требования. Часто сами HR, а потом ещё и разработчики сами удивляются как та или иная технология попала в их список. Учитывать надо и то, что вакансия могла быть написана 5 лет назад, а за это время многое в компании поменялось
    Ответ написан
    4 комментария
  • Как доработать код?

    @Vitsliputsli
    Ничего страшного, допишите еще один case и метод, и все будет нормально. Да, это нарушает принцип, но все так делают, просто хрен кто признается. Не пытайтесь здесь вкрячить какого-нибудь монстра, сложный код - это потенциальные ошибки, если возможно написать просто, так и нужно сделать.
    Принципы - они принципы, а не законы, надо следовать не букве, а смыслу. Принцип открытости и закрытости оберегает нас от ошибок и дополнительных затрат на тестирование кода, который вроде бы и так уже работает и хорошо себя зарекомендовал. Т.е. если бы у вас был один метод и вы там внутри как-то хитро разруливали работу с разными типами и при добавлении нового типа изменяли бы его - это было бы ужасно. В текущей реализации, вам нужно будет добавить новый метод (это не изменит поведение класса до вмешательства), и добавить новый путь при использовании нового типа - да, вмешательство, но оно минимально. Если умудритесь накосячить здесь, то вас уже никакие принципы не спасут.
    Если же у нас, что-то гораздо более сложное, либо класс физически недоступен для изменений, или он уже вовсю используется, а новый тип нужен только для конкретной реализации, то, пожалуйста, есть наследование. Наследуете класс, в потомке добавляете метод и заменяете метод, выполняющий перенаправление (не забывайте, что есть вызов parent). Это будет полностью соответствовать принципу.
    Но я бы больше уделил внимание тому, почему мы ориентируемся для выбора метода на внутреннее свойство, точно ли это должны быть методы, а не отдельные классы. И вполне может быть получится так, что все эти танцы с бубнами не нужны.
    Ответ написан
    Комментировать
  • Что такое сегодняшняя разработка сайтов?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    На фронте всё так же html, css и js. Только jQuery заменили React, Angular и Vue, а также добавились всякие там сборщики. На бэке десятки разных языков и сотни фреймворков. Джентельменского набора на все случаи жизни не существует.
    Ответ написан
    3 комментария
  • Как вывести остатки товара на сайт?

    1) Наймите программиста
    2) Изучите битрикс и сделайте сами
    Ответ написан
    2 комментария
  • Как администратору войти в административную часть сайта под другим пользователем?

    @konsealex
    Настройки->Пользователи->Список пользователей->У нужного пользователя жмем "Бургер"->Авторизоваться

    https://i.imgur.com/Rb77hyR.png
    Ответ написан
    Комментировать
  • Как сделать микроразметку на сайте?

    1) Пройти курсы битрикса и сделать самому
    2) Нанять исполнителя за денежку
    Ответ написан
    Комментировать
  • Что хотел сказать работодатель?

    Объясните как это демоном ?
    Рисуете в консоли пентаграмму, по краям расставляете сокеты и вызываете нужного вам демона.
    Ответ написан
    2 комментария
  • Как не распыляться в обучении?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Съезжай от родителей.
    Ответ написан
    1 комментарий
  • Где и как лучше прехватывать/обрабатывать исключения?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Главная вещь, которую надо понимать про исключения, это то что они бывают двух основных видов.
    После этого вся обработка становится совершенно естественной и очевидной.

    - Error exceptions, или по простому говоря - ошибки. Обычные ошибки при выполнении программы. Обычно код бросает их сам. Решение "обрабатывать все ошибки через set_exception_handler" будет вполне логичным.
    - Business logic exceptions - это не ошибка в строгом понимании этого слова, а скорее нормальное поведение программы. Ситуация исключительная, но только для бизнес-логики. Их всегда кидает программист.

    И вот просто тупо исходя из того что их два типа, уже можно сказать что единого ответа "где лучше" не существует.
    У каждого типа своя логика обработки. Но при этом, как только ты уложил в голове различия, эта логика становится совершенно очевидной:

    - Error exceptions почти никогда не ловятся через try-catch, по крайней мере на месте. За исключением редких исключительных ситуаций обработка ошибок производится в единой точке, обработчике ошибок
    - Business logic exceptions всегда ловятся через try-catch

    Отсюда мы видим, что

    - //PDOException при коннекте (эммм... я понимаю что пример, но блин, new PDO в конструкторе репы, серьёзно?ладно, мы сейчас не об этом) - это однозначно ошибка
    - //PDOException в запросе - это тоже ошибка, тут два раза думать не надо
    - условно пустое имя. Ну вот здесь мы уже переходим в область бизнес-логики. Коду тут без разницы, пустое имя, или полное. Это важно нам - программисту, пользователю.

    Но тут есть один, блин, тонкий момент.
    Валидация, по сути, пытается разорваться между всеми слоями приложения.
    С одной стороны, это функция Сущности (которую ошибочно называют моделью) - проверять валидность своих данных.
    С другой - если нам надо донести результаты валидации до пользователя, то как быть с переводами? Тащить в модель переводчик, серьёзно? Ну ок, ладно, возвращаем ключи для перевода. Хотя тоже как-то...
    Но вот проверка емейла на уникальность. Её-то где делать?
    В Сущности? И тащить в нее соединение с БД?
    На уровне БД? А где ловить тогда исключение? В сервисе? И ломиться через несколько уровней абстракции к сырому PDOException? Не вариант.
    Или, к примеру, для модели естественно проверять каждое поле отдельно, и кидать исключение. А для пользовательского интерфейса это неприемлемо - надо выдавать все ошибки валидации скопом, а не скармливать по одной.
    Вопросы...

    Но "где валидировать данные" - это отдельная тема, которая не относится напрямую к вопросу "где ловить ошибки".

    В данном случае я предлагаю оставить Сущность Юзер без валидации, а всю валидацию делать в сервисе.

    Хотя опять же - в современных фреймворках валидацию (Не будем показывать пальцем, но это был Ларавель) вообще делают еще до запуска контроллера, в миддлвари. Это кстати спорное решение, которое нарушает целостность модели. Если мы обращаемся к модели через другую точку входа, не контроллер, а, к примеру, создаем юзера через командную строку, то нам нужна точно такая же валидация. Запускать команды через мидлварь? В сущности, это мысль... Но всё равно, мы в итоге бизнес-логику размазываем между моделью и точками входа в неё, а это костыль.
    И при всём при этом оставлять Сущность Юзер совсем без валидации тоже как-то не комильфо... А если оставлять - то получится по сути дублирование кода.
    Вопросы, вопросы...

    Но вернемся к нашим баранам, в смысле юзерам.

    Начнем с того, что проверка имени на равенство пустой строке или нулю - это какой-то детский лепет (и кстати, почему ноль нельзя? вот у Маска ребеночка зовут X Æ A-12 - почему у кого-то не может быть имя "0.0"?).

    Отдельно побурчу насчет empty. Вообще, это один из самых сложных операторов, на нем спотыкаются все поголовно. В частности,
    function f($name){
        if (empty($name))...

    - это бессмыслица. Звучит, в переводе на русский, немного шизофренически: "пусть у нас будет переменная $name. Если у нас нет переменной $name...". Ну как нет, если мы только что ее в функцию передали?
    empty() проверяет переменную на существование И "пустоту". И в данном случае первая проверка будет бессмысленной. Никогда не надо писать бессмысленный код.
    Поэтому логичнее будет написать просто if(!$name). Хотя по нынешним временам это тоже говнокод. Что мы имеем здесь в виду? Имя не может быть пустой строкой? Пустым массивом? Нулём? null? false? А true или заполненный массив - это, получается, хорошее, годное имя?
    Лучше все-таки четче определять свои претензии. К примеру, проверять длину строки.

    У имени можно сделать миллион проверок: Минимальную длину, максимальную длину. Проверить что это строка, а не массив, в конце концов, и не булево значение.
    И так по каждому полю.
    То есть, по-хорошему, валидация данных на соответствие правилам бизнес-логики - это отдельный большой бизнес!

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

    class ValidationError extends Exception{ ... };
     
    class User
    {
        private string $name;
    
        public function __construct(string $name)
        {
            $this->name = $name;
        }
    }
    
    class UserRepository
    {
        public function __construct(PDO $pdo)
        {
            $this->builder = $pdo;
        }
        public function add(User $user): User
        {
            $saved = $this->builder->query('INSERT INTO users (name) VALUES ("user")'); //PDOException
        }
    }
    
    class UserSerivce
    {
        private UserRepository $repository;
        private Validator $validator;
    
        public function new(array $data): User
        {
            $rules = [...] ;
            $errors = $this->validator->validate($data, $rules);
            if ($errors) {
                throw new ValidationException("", $errors);
            }
            $user = new User($data['name']); // в принципе, сучность может здесь бросить своё ValidationException
            return $this->repository->add($user);
        }
    }
    
    class UserController
    {
        private UserSerivce $service;
    
        public function store(array $data)
        {
            try {
                $user = $this->service->new($data);
            catch (ValidationError $e) {
                // рассказываем юзеру что он дурак
            }
            return redirect()->to('/' . $user->id);
        }
    }


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

    Как можно заметить, вот весь этот длинный и путанный текст посвящен исключительно ошибкам бизнес-логики.
    Поскольку с ошибками кода всё куда проще - единый хендлер тупо их обрабатывает в одном месте, как описано в статье по ссылке @Spartak-2205
    За исключением редких случаев, когда они ловятся по месту. Когда ошибка некритичная, или есть сценарий обработки - например, попробовать выполнить то же действие еще раз.
    Ответ написан
    3 комментария