Задать вопрос
  • Почему не работает POST изи postman в yii2?

    @FernandoErrNando
    Скорее всего, у вас где-то не прошло сохранение из-за ошибки валидации: поле parent_id у вас в модели integer, а передаете в теле запроса строку, но не факт, что единственная ошибка. Проблема в том, что вы не видите ошибки, потому что не проверяете данные, которые пришли к вам. Также непонятно, что у вас все-таки - HTML-форма или АПИ-эндпоинт. В первом случае код должен выглядеть как-то так
    $model = new СategoryForm();
    
            if (Yii::$app->request->isPost) {
                $model->load(Yii::$app->request->post());
                if ($model->validate()) {
                    if ($model->save())) {
                        return $this->redirect(['index]);
                    }
                }
            }
    
            return $this->render('create', [
                'model' => $model,
            ]);

    , а во втором как-то так
    public function actionCreate()
        {
            $categoryForm = new CategoryForm();
            $categoryForm->load(Yii::$app->request->post(), '');
            if (!$categoryForm->validate()) {
                Yii::$app->response->setStatusCode(400);
                return $categoryForm->errors;
            }
            try {
                if (!$categoryForm->save()) {
                    throw new BadRequestHttpException(Yii::t('app', 'Категория не добавлена'));
                }
                
            } catch (\Throwable $e) {
                throw new BadRequestHttpException($e->getMessage());
            }
    
            return ;
        }
    Ответ написан
    Комментировать
  • Почему нельзя/можно писать бизнес-логику в sql?

    @FernandoErrNando
    Вам указывали недостатки, но, почему-то для вас "Всё минусы какие-то мутные (кроме зависимости от конкретной БД)".
    Давайте попробуем посмотреть повнимательнее:
    1. Сложность отладки и тестирования - в то время, когда я работал с такими приложениями была проблема с тем, что средства отладки были слишком неразвиты, зачастую приходилось пользоваться dbms_output и все, чтобы отладить процедуру. думаю, нормыльные даббагеры потом появились, но я уже к тому времени ушел. Как сейчас обстоит с этим в РСУБД?
    2. Затрудненная версионность - а разве не так? На больших проектах со множеством разработчиков это ещё как будет стрелять. Просто посмотрите как мучаются люди с данной проблемой https://habr.com/ru/articles/330662/, тогда как те, кто использует БЛ вне базы просто пользуются гитом
    3. Зависимость от конкретной СУБД. Вы уверены, что БД у вас всегда будет подходить под требования бизнеса на 10 лет? Что, если за 10 лет появятся задачи, которые лучше решать другими инструментами? А если появятся задачи которые можно решить только сторонними инструментами?
    4. "Ограниченные возможности языка" - можно ли решить все проблемы с помощь SQL/PL-SQL?
    5. Сложности с масштабированием/оптимизацией - здесь тоже намного сложнее все. Кэширование вы тоже на СУБД будете возлагать? Что будет, когда у вас серверов БД будет больше 1?
    6. Что насчет интеграций? Что будет, если вам надо будет ходить по АПИ в третьесторонний сервис? вы это тоже заложите в логику в БД?
    Ответ написан
  • Я залил сайт yii2 на хостинг beget, а н выдает ошибку, как это исправить?

    @FernandoErrNando
    По инструкции делал? вангую, что composer install не выполнился до конца или вообще не запускался.
    Ответ написан
    Комментировать
  • Нужна ли общая таблица?

    @FernandoErrNando
    Если я правильно понял, то ты хочешь сделать полиморфные связи. Но у тебя в любом случае не получится обойтись 1 колонкой, там используются 2 колонки (entity_id, entity_type), зато это универсальное решение, если у тебя появится ещё какая-нибудь сущность, на которую можно будет откликаться, то у тебя будет по прежнему 2 колонки.

    Минусы: более сложные запросы, невозномность постановки констрейтов, т.е. уровень контроля целостности в данном случае ложится на уровень приложения
    Ответ написан
  • Установка интерпретатора языка программирования PHP 7.2, расширений, для его работы с Apache и MySQL?

    @FernandoErrNando
    Раз не видит пакетов - значит что-то не то с репозиториями. Попробуйте подключить репозиторий с различными версиями PHP и обновить в системе список пакетов:
    sudo add-apt-repository ppa:ondrej/php
    sudo apt update

    А потом уже пытайтесь установить как вы и писали
    Ответ написан
    1 комментарий
  • Как в YII2 сделать фильтрацию из mssql чтобы поля не повторялись?

    @FernandoErrNando
    Если я правильно понял задачу, то вы хотите, чтобы у вас была фильтрация в таблице по статусу, но у вас 1 и тот же статус может иметь разные ID. Тогда решаем 2 задачи:
    1. Объединение ID по названию в фильтре
    2. Фильтрация основной таблице.

    Если вы хотите, чтобы в выпадающем списке не было дублей, то вам правильно написали, воспользуйтесь GROUP BY. Сделайте запрос типа
    SELECT GROUP_CONCAT(DISTINCT status_id) as ids, status FROM table GROUP BY status
    дальше дублей не будет. Полученное значение ids уже можно использовать в фильтрации через WHERE IN, если поле пришло ненулевое.

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

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

    Также есть определенный запрос на человека на позицию миддла со знаниями сеньора или лида, а зарплатой джуна.

    Я бы забил в данном случае, рассылал бы резюме дальше, с теми с кем сматчился, уже вел дальнейшую работу.
    Ответ написан
    Комментировать
  • Совсем новичок. Как заменить ключ API?

    @FernandoErrNando
    https://github.com/lis-dev/nova-poshta-api-2#%D1%8... - тут описано создание экземпляра класса АПИ. Там описана куда осещуествляется подстановка ключа АПИ. Поищите по исходникам вашего сайта значение "NovaPoshtaApi2(" и там найдете старый ключ АПИ, который может быть захардкожен, а может подставляется из конфига.
    В первом случае, поменяйте его везде, где найдете. А во втором - просто замените в конфиге старый ключ на новый
    Ответ написан
  • Как исправить ошибку "Class not found"?

    @FernandoErrNando
    Попробуйте быть чуток внимательней, я дам подсказку: вы пытаетесь в сидере вызвать фабрику класса (MyuserFactory), которой у вас нет, но есть TestFactory. Значит, надо поменять ...
    Ответ написан
    Комментировать
  • Как добавить GitHub репозиторий в действующий проект Bitrix на хостинге?

    @FernandoErrNando
    Почитайте подробней про гит, как он работает и зачем он нужен. Если кратко, то вы должны:
    1. Добавить файлы в репозиторий у себя компьютере и сделать коммит. При создании репозитория в гитхабе даны подробные инструкции, как это сделать:
    spoiler

    git init
    git add .
    git commit -m "first commit"
    git branch -M main
    git remote add origin https://github.com/%YOURUSER%/%REPONAME%.git


    2. Залить изменения на гитхаб (git push -u origin main)
    3. на удаленном сервере сделать git clone (если ещё не делали это) или git pull.

    WinSCP вам теперь не понадобиться, вам нужно подключиться к серверу по ssh и там воспользоваться командной строкой. Командная строка есть в винде по умолчанию
    Ответ написан
  • Как самостоятельно оценивать объем работы и стоимость разработки?

    @FernandoErrNando
    обычно есть 2 пути:
    1. Оценка по фикс-прайсу
    2. Или Time&material.

    Первый путь начинается с анализа ТЗ, конечно же. Иногда, у заказчика есть какое-то описание в виде текстового файлика, мокапа, дизайна или ещё чего-нибудь. Если же нет, то тебе придется как-то формализовать его хотелки, перевести в понятный вид и написать тз самому, не для него, а для себя прежде всего. В нем ты описываешь весь функционал, который требуется, поведение пользователей, примерные нагрузки и т.д.
    Чем детальней написано тз - тем лучше.
    Например:
    Плохое ТЗ: В приложении можно авторизоваться через email/соцсети.
    Хорошее ТЗ: В приложении можно авторизоваться через email и соцсети facebook, vk, instagram. Пользователь может проходить авторизацию через любую соцсеть, при этом при авторизации через ещё непривязанную соцсеть мы должны обновлять данные пользователя.

    Дальше ты разбиваешь ТЗ на отдельные части, которые ты можешь оценить.
    Например:
    Авторизация по email: 2-3ч + 3-5 на каждую соцсеть.
    На те вещи, которую ты знаешь и много раз делал закладываешь разброс поменьше, то что не делал - побольше. НА интеграции с третьесторонними сервисами типа соц.сетей, платежных систем, закрытых API, невнятно описанных вещей в ТЗ и т.д. делаешь большой рейндж, т.к. велик риск проблем с доступами, сложностей получения, неактульных документаций и прочим. Если что-то непонятно, лучше спросить у заказчика заранее и описать возможные проблемы, возможно, вы найдете другое решение.

    В конце концов у тебя получится 2 оценки - оптимистичная и пессимистичная. Можно ещё добавить какой-нибудь коэффициент, на который надо умножить, если твои оценки обычно слишком оптимистичны ("да тут работы на 2 дня", а сидишь неделю) или наоборот, излишне пессимистичны ("мне надо месяц, а делаю за неделю").

    Далее ты понимаешь работа займет, к примеру 250-300 чч, умножай её на свою часовую ставку. вот ты и получил примерную стоимость работ. Не забудь прибавить стоимость всех материальных затрат, специфичных для (хостинги, доменное имя, спец. оборудование, доступ к платному АПИ).

    Также не забудь учесть, сколько ты сможешь работать, а то он может подумать, что это 250чч - это 1 месяц работы, а в реальности у тебя основная работа/семья/кошка и ты можешь дать только 100чч/месяц.

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

    @FernandoErrNando
    Как вариант, можно попытаться переписать компонент миграции и пользоваться своим
    Ответ написан
    Комментировать
  • Как сделать подключение сразу к нескольким базам данных?

    @FernandoErrNando
    В конфиге пропишите:

    <?php
    return [
        'components' => [
           'db' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'mysql:host=localhost;dbname=name',
                'username' => 'login',
                'password' => 'password',
                'charset' => 'utf8',
            ],
            'db2' => [
                'class' => 'yii\db\Connection',
                'dsn' => 'pgsql:host=localhost;dbname=db2',
                'username' => 'user',
                'password' => 'pass',
                'charset' => 'utf8',
            ],
           
    ];

    Затем в моделях, которые используют 2-ю бд, просто укажите её:
    public static function getDb()
        {
            return Yii::$app->db2;
        }
    Ответ написан
    3 комментария
  • Правильно я планирую развернуть сеть из серверов?

    @FernandoErrNando
    Не совсем понятно, почему именно для вас 4,1 секунды - это долго, какие вообще требования закладываются? Как вариант предлагаю рассмотреть след. конфигурацию:

    Разбить скрипт на 2: Первый будет делать запрос на ваши сайты, получать ответ и сохранять в спец. таблицу. Второй будет брать новые данные из этой таблицы, запускать нужный обработчик, разбирать сохраненный ответ и обновлять нужные вам данные в бд. В общем классические очереди (гуглить по словам php queue, php jobs)

    Преимущества:
    1. Разделены получение и обработка данных
    2. Каждую часть скрипта можно отдельно модифицировать (например, получение через параллельные запросы)
    3. Обработчиков очереди можно делать столько сколько вам нужно
    4. При увеличении кол-ва сайтов время выполнения одного запроса не изменится.
    Ответ написан
  • Как объединять сервера?

    @FernandoErrNando
    Ваша задача звучит очень абстрактно, поэтому вы получите максимально абстрактный и, скорее всего, непонятный ответ. Давайте подумаем, как можно решить вашу задачу:
    1. "программа которая ставится на сервер но 1 сервер её не тянет и надо подсоединить ещё пару" - из этого выражения непонятно, она в принципе "не тянет" или "не тянет на вашем сервере". Может ли условно "крутой сервер" запустить её, чтобы она работала корректно? Если так, то проще всего будет купить/арендовать сервер с необходимым железом.
    2. Ваша "программа" может успешно обработать одну задачу, но задач слишком много, она не справляется с потоком данных.
    Это другой случай. Для такого случая можно написать некий балансировщик, который раскидывать задачи на экземпляры вашего приложения. Например: у вас есть много видеофайлов, которые через ffmpeg перекодируются в нужные форматы. Тогда одно ваше приложение принимает файлы, сохраняет их и дальше добавляет в очередь, а второе ваше приложение-перекодировщик, которое берет их из очереди в работу запущено на n-серверах.
    3. Ваша программа не может выполнить 1 задачу на 1 сервере любой конфигурации и мощности. Тогда есть вариант переписать её, добавив распараллеливание, но не факт, что это повысит её эффективность или выполнимость. Не все алгоритмы хорошо параллелятся.
    Опишите проблему получше, может, не всё так страшно
    Ответ написан
    1 комментарий
  • Какой способ подсчета строк быстрее и тратит меньше ресурсов SQL или PHP?

    @FernandoErrNando
    В таких случаях всегда такие вычисления перекладывают на БД, за 1 запрос ты получаешь ответ и возвращаешь его в качестве результата.
    В случае, если ты попытаешься получить записи для подсчета в PHP, то на больших выборках велика вероятность получить слишком большой массив данных, который не поместится в память, отведенную под PHP, не говоря уже о времени перебора данных.
    Ответ написан
    Комментировать
  • Как установить Voyager admin (Laravel)?

    @FernandoErrNando
    Если кратко, то почти все немного неправильно:
    1. В доке по инсталяции вы указано: After creating your new Laravel application you can include the Voyager package with the following command:
    composer require tcg/voyager
    Эту команду нужно запускать в папке вашего проекта ларавел, в вашем случае blog
    2. В той же папке blog нужен настроенный .env - файл, если его нет - нужно просто скопировать .env.example и сохранить под именем .env, отредактировать подключение к базе и другие параметры, нужные вам в нем и все пойдет норм.
    3.
    composer global require laravel/installer
    а это-то зачем вам? Вы же и так его установили, это просто другой способ создания проекта.
    4. Ну и да, необходимо настроить конфиг сервера, о чем и указано в документации по установке ларавеля (https://laravel.com/docs/5.8/installation):
    After installing Laravel, you should configure your web server's document / web root to be the public directory. The index.php in this directory serves as the front controller for all HTTP requests entering your application.
    Ответ написан
  • Laravel 5.7 DB::Select аргумент в виде массива?

    @FernandoErrNando
    в цикле идет запись в переменную, а не в массив, почему он должен показывать не последний элемент?

    Пишите это в массив, а потом уже в whereIn подставляйте.
    Ответ написан
    Комментировать
  • Почему не работает await в данном случае?

    @FernandoErrNando Автор вопроса
    Правильный ответ, который подсказали на другом ресурсе: await должен применяться к Promise, Поэтому array.map нужно обернуть в промис (например передать его, например, в Promise.all) и уже к результату применить await.
    async function go3() {
      try {
        console.time('1st');
        const MAX_SIMULTANEOUS_DOWNLOADS = 2;
    
        const urls = [
            {
                'url': 'https://stats.nba.com/stats/teamyearbyyearstats?LeagueID=00&SeasonType=Playoffs&TeamID=1610612759&PerMode=PerGame', 
                'method':'get'
            },
            {
                'url': 'https://api.github.com/users/wesbos', 
                'method':'get'
            },
            {
                'url': 'https://randomuser.me/api', 
                'method':'get'
            },
            {
                'url': 'https://uinames.com/api', 
                'method':'get'
            }
        ];
        let subarray = []; //массив в который будет выведен результат.
        // Разбиваем массив на чанки, чтобы сразу все ссылки не грузить за один заход
        for (let i = 0; i <Math.ceil(urls.length/MAX_SIMULTANEOUS_DOWNLOADS); i++){
            subarray[i] = urls.slice((i*MAX_SIMULTANEOUS_DOWNLOADS), (i*MAX_SIMULTANEOUS_DOWNLOADS) + MAX_SIMULTANEOUS_DOWNLOADS);
        }
        var dataFromRequest = await Promise.all(subarray.map(async function (currentValue, index, array) {
            var promises = currentValue.map(async function (currentValue1, index1, array) {
                return axios(currentValue1);
            });
    
            // await all three promises to come back and destructure the result into their own variables
            var responses = await Promise.all(promises).catch(function (err) {
                console.log(err.message); // some coding error in handling happened
            });
    
            const results = responses.map(function (currentValue1, index1, array) {
                console.log(index1, currentValue1.data); // some coding error in handling happened
                return currentValue1.status;
            });
            return results;
            })
        );
        console.log(dataFromRequest);
        console.timeEnd('1st');
        return dataFromRequest;
      } catch (e) {
        console.error(e); // 
      }
    }
    
    go3()
    Ответ написан
    Комментировать
  • Netbeans 8.1 + PHP, почему не работает автокомплит/подсказки и ctrl+click по имени метода?

    @FernandoErrNando Автор вопроса
    Итак, вот что помогло в моем случае:
    Я использовал версию из репозитория (т.е. устанавливал через apt-get install netbeans) и php устанавливал как плагин. После того как я скачал специальную версию netbeans для php и проект проиндексировался, то и автодополнение, и переход стали нормально работать. Вот ссылки на них:
    download.netbeans.org/netbeans/8.2/final/bundles/n...
    download.netbeans.org/netbeans/8.2/final/bundles/n...
    Остается вопрос, как настраивать универсальную версию netbeans
    Ответ написан
    Комментировать