• Почему Yii2 HttpClient не отправляет заголовки с именами в snake_case?

    vabka
    @vabka
    Токсичный шарпист
    Должен отправлять, тк это не запрещено стандартом (https://www.ietf.org/rfc/rfc7230.html#appendix-B)

    Символы ASCII с кодом от 33 до 126 — в этом списке нижнего подчеркивания нет. snake_case не поддерживается.

    Поддерживается. В этом списке есть подчёркивание (код 95 - "_ символ подчеркивания")

    Скорее всего заголовок пропадает где-то на подходе к серверу (мб веб-сервер фильтрует или тот фреймворк, который используется на сервере)

    Рекомендую:
    1. Включить полные логи на сервере, чтобы посмотреть, какой запрос приходит целиком
    2. Посмотреть при помощи Charles или другого подобного перехватчика, какой запрос отправляется клиентом.

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

    delphinpro
    @delphinpro Куратор тега PHP
    frontend developer
    В коде вообще не должно быть подобного содержимого
    В ларавел это решается выносом строковых литералов в файлы перевода

    throw new Exception(__('messages.order_failed'));

    // messages.php:
    return [
        'order_failed' => 'любое количество текста',
    ]


    Наверняка в Yii тоже есть подобный механизм.

    UPD
    Упс, не дочитал. А всё из-за ваших скриншотов, отвлекли


    Используется фреймворк: Yii2. В нём есть средства интернационализации, и используя их можно вставлять идентификатор текста, вместо самого текста: Yii:t('PROVIDER_CANCEL_ERROR'), но всё же он не для таких целей предназначен.


    Именно для этого данные средства и предназначены.
    Ответ написан
    1 комментарий
  • Как заставить миграцию, в которой произошла ошибка, откатывать сделанные изменения в Yii2?

    @PiloTeZ
    ...
    Транзакциями тут не поможешь, поэтому только проверять наличие FK вручную перед его добавлением. Можно доработать базовый класс, что бы не делать это вручную.
    А вообще такое не часто встречается, просто надо хорошо тестировать миграции перед накатыванием на прод
    Ответ написан
    1 комментарий
  • Как заставить миграцию, в которой произошла ошибка, откатывать сделанные изменения в Yii2?

    Maksclub
    @Maksclub
    maksfedorov.ru
    Особенности некоторых БД в том, что откатить транзакцией можно не все (например создание таблицы)

    Делайте такие миграции, которые корректные и руками дорабатывайте нюансы :)
    Ну или разделите миграции, где создаются таблицы и где добавляются/удаляются/изменяются колонки и ограничения
    Ответ написан
    1 комментарий
  • Что делать, если перестала работать комбинация CTRL + E?

    delphinpro
    @delphinpro Куратор тега PhpStorm
    frontend developer
    Зайти в настройки Settings | Keymap
    Найти нужное действие и назначить ему нужную комбинацию.

    Или там же восстановить значения по умолчанию

    62bda7fa6b38f165034482.png
    Ответ написан
    2 комментария
  • Как получить только те записи, у которых есть связанная запись в другой таблице?

    rozhnev
    @rozhnev Куратор тега SQL
    Fullstack programmer, DBA, медленно, дорого
    SELECT `payment`.* 
    FROM `payment` 
    WHERE EXISTS (
        SELECT 1 FROM  `payment_deposit` WHERE  `payment`.`id` = `payment_deposit`.`payment_id` 
    )
    ORDER BY `id` DESC 
    LIMIT 20
    Ответ написан
    Комментировать
  • Как отклонить вход пользователю с определённой ролью на Yii2?

    myks92
    @myks92 Куратор тега Yii
    Нашёл решение — пометь вопрос ответом!
    Не очень понятно почему в методе actionLogin() Вы используете такую сложную конструкцию, которая, в данном случае, не имеет особого смысла. На вашем примере можно попользоваться функцией:
    Yii::$app->getAuthManager()->checkAccess(32, 'admin')

    Данная функция позволит проверять доступ для остальных пользователей. Хорошая практика — использоовать ошибки в виде исключений с ошибкой 403 и сообщением:
    public function actionLogin()
    {
        $model = new LoginForm();
        $model->password = ''; // перенести в метод rules формы, как default
    
        if($model->load(Yii::$app->request->post()) && $model->login()){
            $user = User::findOne(['username' => $this->username]);
            if(Yii::$app->getAuthManager()->checkAccess($user->getId(), 'admin')){
                throw new ForbiddenHttpException('Ошибка доступа');
            }
    
            return $this->goHome();
        }
    
        return $this->render('login', [
            'model' => $model
        ]);
    }

    Если же вам нужно использовать проверку для текущего пользователя - это вполне можно вынести в поведения:
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'actions' => ['create', 'update'],
                        'allow' => true,
                        'matchCallback' => function ($rule, $action) {
                            /** @var User $identity */
                            $identity = Yii::$app->user->getIdentity();
                            return $identity->isAdmin(); // или другая проверка
                        }
                    ],
                ],
            ],
        ];
    }

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'actions' => ['create', 'update'],
                        'allow' => true,
                        'roles' => ['admin']
                    ],
                ],
            ],
        ];
    }

    Значение опции allow выбранного правила указывает, авторизовывать пользователя или нет. Если ни одно из правил не совпало, то пользователь считается НЕавторизованным, и фильтр ACF останавливает дальнейшее выполнение действия. По умолчанию, когда у пользователя отсутствует доступ к текущему действию, ACF делает следующее:
    • Если пользователь гость, вызывается yii\web\User::loginRequired(), который перенаправляет браузер на страницу входа.
    • Если пользователь авторизован, генерируется исключение yii\web\ForbiddenHttpException.

    Более сложные правила можно выносить в свои фильтры AccessControl

    Ссылки на документацию по теме:
    1. yii\web\User
    2. yii\rbac\ManagerInterface
    3. yii\rbac\CheckAccessInterface
    Ответ написан
    9 комментариев
  • Какие есть альтернативы получения оплаты из США?

    RitaPayoneer
    @RitaPayoneer
    Добрый день, если ваши клиенты - американские компании, возможно вам подойдет US Payment Service - реквизиты американского счета, на которые можно принимать платежи по ACH. Средства, полученные таким образом, можно тратить с помощью дебетовой карты и переводить на счет в местном банке. Если у вас будут вопросы, пожалуйста, обращайтесь.
    Ответ написан
    3 комментария
  • Как правильно настроить связку PhpStorm + OpenServer + Composer?

    iiifx
    @iiifx
    PHP, OOP, SOLID, Yii2, Composer, PHPStorm
    Как-то уже показывал тут, но напишу еще раз.

    Настраиваем path OpenServer
    eded6-clip-61kb.png?nocache=1

    Добавляем закладку на PhpStorm
    67a2d-clip-33kb.png?nocache=1

    Запускаем PhpStorm через OpenServer
    26de1-clip-23kb.png?nocache=1

    Используем встроенную в PhpStorm консоль и получаем удовольствие от работы
    d4094-clip-30kb.png?nocache=1
    Ответ написан
    16 комментариев
  • Как получить записи из связанной таблицы, если необходимо найти записи, в столбцах которых разные значения?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Вариант 1. Работает, если в `goods_property` каждая комбинация (`goods_id`, `type`, `value`) встречается не более одного раза.
    SELECT `g`.*
      FROM (
        SELECT `goods_id`
          FROM `goods_property`
          WHERE (`type` = 'caffeine_capacity' AND `value` = 'small')
            OR (`type` = 'color_type' AND `value` = 'green')
          GROUP BY `goods_id`
          HAVING COUNT(*) = 2
      ) AS `p`
      JOIN `goods` AS `g` ON `g`.`id` = `p`.`goods_id`

    Вариант 2. Если таблица кривая и комбинация может встретиться более одного раза, то
    SELECT `g`.*
      FROM `goods` AS `g`
      JOIN `goods_property` AS `p1` ON `p1`.`goods_id` = `g`.`id`
        AND `p1`.`type` = 'caffeine_capacity' AND `p1`.`value` = 'small'
      JOIN `goods_property` AS `p2` ON `p2`.`goods_id` = `g`.`id`
        AND `p2`.`type` = 'color_type'  AND `p2`.`value` = 'green'

    Вариант 3. Тоже для кривой таблицы.
    SELECT `g`.*
      FROM `goods`
      WHERE `id` IN (
        SELECT `goods_id`
          FROM `goods_property`
          WHERE `type` = 'caffeine_capacity' AND `value` = 'small'
      ) AND `id` IN (
        SELECT `goods_id`
          FROM `goods_property`
          WHERE `type` = 'color_type' AND `value` = 'green'
      )

    В качестве песочницы попробуйте https://www.db-fiddle.com/
    Ответ написан
    3 комментария
  • О чем может говорить то что в компании не могут прижиться нанятые сеньеры/лиды?

    @AndromedaStar
    .Net - monkey
    Все очень просто. Люди со стороны могут объективно оценить работу компании, так как у них есть другой опыт.
    А люди, выращенные у вас, другой жизни и не знают, поэтому им может казаться, что все отлично.
    Ответ написан
    7 комментариев
  • Почему дочерний компонент React игнорирует новый проп?

    alexey-m-ukolov
    @alexey-m-ukolov Куратор тега React
    Конечно, Set игнорирует изменения пропса:
    class Set extends React.Component {
        constructor(props) {
            super(props);
    
            this.state = {
                id: props.id,
                weight: null,
                reps: null,
                enableMaxReps: false,
                number: props.number || 0,
                isFilled: false,
            };
        }
    }

    Уберите number из state, зачем он там?
    Ответ написан
    4 комментария
  • Как разделять отвественность в React и как решить проблему с оповещением состояния о измении Модели?

    @Yury093
    Для управлением состоянием нужно использовать одну из библиотек для управления состоянием.
    Одна из самых популярных сейчас - Redux. Есть еще Mobx, например. Есть и другие новые модные - почитайте сравнение по запросу "alternatives to Redux" ну или вот статья: https://habr.com/ru/company/ruvds/blog/566102/
    Ответ написан
    2 комментария
  • Как проблема вызывает ошибку, как её решить в CentOS7 при использовании PHP функции get_headers(): SSL operation failed with code 1(OpenSSL Error)?

    @galaxy
    Судя по размеру, у вас база CA вообще пустая.
    yum update ca-certificates или yum reinstall ca-certificates
    (или более подробно https://access.redhat.com/solutions/1549003)

    Странно, конечно, что curl работает... Сделайте curl --cacert dummy_xxx https://www.google.com - должен показать используемую папку с CA сертификатами.
    Ответ написан
    3 комментария
  • Спрашивать ли бюджет у клиента или сразу называть свою цену?

    VasyaPertrov
    @VasyaPertrov
    Изготовление и безопастность сайтов. WP и др.
    :) Зри мой профиль.

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

    Да, есть стандартные задачи, для которых существует вилка. Тут особых проблем нет (от 300 до 1000$ :) )
    Но большинство из разряда "сколько будет стоить сделать мне хорошо?" И тут сразу две крайности - "ТЗ" либо из одного предложения либо на 15-25 страниц. Ни то ни другое оценить нельзя, тк для этого требуется РАБОТАТЬ - изучать текущее состояние, выяснять что надо и писать ТЗ с заказчиком или изучать его писанину и уточнять детали. При этом даже не зная на что можно рассчитывать.

    И... вишенка на торте после того как будет сделана эта бесплатная работа: " да ты дафига хочешь! Я думал будет меньше".
    И тут внимание, коллеги! Так он думал или нет? Если думал - значит определился с бюджетом. Так почему его не выяснить и не решить насколько он интересен и что можно предложить? А если не думал - зашел прицениться к перламутровым пуговицам?

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

    dom1n1k
    @dom1n1k
    Спрашивать бюджет нужно, хотя бы очень ориентировочный.
    Дело в том, что если клиент не специалист в IT, то очень часто он не знает даже приблизительного порядка цен, и его ожидания могут кардинально отличаться от реальности.
    Вы можете сидеть 2 часа обсуждать гипотетический функционал и гору хотелок, потом объявить 300к, а клиент сделает так o_O и скажет "нифига себе, я думал ну тысяч 50 хватит, мне вот друг племянника рассказывал..."
    Поэтому хоть какие-то рамки нужны.
    Ответ написан
  • Спрашивать ли бюджет у клиента или сразу называть свою цену?

    begemot_sun
    @begemot_sun
    Программист в душе.
    Умные книги учат продажников не говорить цены/бюджеты первыми, т.к. это приведет к тому что оппонент будет иметь эту информацию, а вы нет. Т.о. он будет строить свой диалог, чтобы снизить\повысить уже названную цену
    Всегда цена - это предмет переговоров и компромиссов.

    Если стороны отказываются от переговоров (по причине низкой\высокой цены), то это фейл обеих сторон.
    Конечно если бюджет озвучен неадекватный - то с таким заказчиком\исполнителем можно попрощаться, либо объяснить что мы не можем работать за такие деньги, возможно он поймет и изменит свои цифры.

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

    . Вася Пупкин сделает сайт за 1000$, а Тёма Лебедев за 10000$. В обоих случая качество может быть одинаковым, или даже Вася выиграет по клиенто-ориентированности. Но если Вася может с клиента взять 2000$ -- то я пожму руку такому Васе. Но это не значит что Вася должен дожимать клиента, это должны быть переговоры равных. Т.о. нет ничего плохого в том, что если клиент согласен платить повышенную стоимость, то пусть платит. В конце концов, никто в этой жизни не спонсор чужому делу.

    Когда договор заключен то это всё win-win. Значит заказчик готов работать по данному бюджету, и исполнитель готов работать также. Т.о. все в выигрыше.
    Ответ написан
    Комментировать
  • Как работать на Upwork в Украине в белую?

    @Kat_IT
    Работаю с HTML, CSS, PHP, MySQL, Bootstrap
    Может кому пригодится насчет продажи валюты: уже продавать не надо.
    Влітку 2019 року НБУ відмінив обов’язковий продаж інвалюти (детальніше див. «Податки & бухоблік», 2019, № 50, с. 2). Тому банк автоматом продавати її не буде, а вам поспішати продавати валюту, що надійшла, зовсім не обов’язково. Її можна потримати на рахунку і використати, коли знадобиться.
    Ответ написан
    Комментировать
  • Как можно сократить запись создания одинаковых элементов?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Убираем деструктуризацию параметра (ну или можете оставить, тогда кавычки у элементов массива надо будет убрать ('id' -> id, 'sum' -> sum, ...), а вместо paymentData[n] будет просто n), вместо десяти строк пишем три:

    payment.innerHTML = [ 'id', 'sum', 'system', 'date' ]
      .map(n => `<td>${paymentData[n]}</td>`)
      .join('');
    Ответ написан
    Комментировать