Задать вопрос
  • Как выявить изменение цены в столбце mysql таблицы и отобразить это на сайте при ajax запросе один раз?

    Demisang
    @Demisang
    Backend PHP-developer
    Не верной дорогой идёте товарищ :)
    После ajax-запрса у вас будет доступ к двум значениям: цена на странице сайта и возможно новая цена, которая пришла из ajax ответа, сравниваете два значения и делаете через javascript нужный визуальный эффект
    Ответ написан
    4 комментария
  • Почему не работает метод save()?

    Demisang
    @Demisang
    Backend PHP-developer
    1. Нельзя писать
    $this->password = Yii::$app->getSecurity()->generatePasswordHash($this->password);


    В методе after/beforeSave(), потому что первый раз предположим $password будет нормальным, а потом вытащив юзера из базы его password уже будет хешем, и сохранив юзера повторно - уже сгенерируется новый хеш пароля из старого хеша пароля, и так далее, короче после второго сохранения пароль пользователя будет совершенно непригодным.

    2. Нельзя использовать $user->update() в конструкции if, потому что $user->update() возвращает не true/false, а количество изменённых строк в БД, но в Yii если модель не изменилась - ничего и не будет обновлено в базе(зачем лишний запрос), просто пишите $user->save()
    Ответ написан
    Комментировать
  • В селекте отсутствует значение по умолчанию. Как исправить?

    Demisang
    @Demisang
    Backend PHP-developer
    Никто не ответил, потому что решение находится в последней строке вопроса, где весь код в одну строчку написан...
    Нужно добавить в него строку в методе **createDropdown**:
    jQuery("select#qty").append("<option value=''>Выберите кол-во товаров...</option>")

    Чтобы получилось так:
    <script> require(['jquery', 'Magento_Catalog/js/price-utils'], function ($, priceUtils) {
        'use strict';
        var tierPrices = <?php echo json_encode($allTiers) ?>;
        var createDropdown = function () {
            jQuery("select#qty").append("<option value=''>Выберите кол-во товаров...</option>")
            for (var i = 0; i < tierPrices.length; i++) {
                var obj = tierPrices[i];
                jQuery("select#qty").append("<option value='" + Number(obj.price_qty) + "'>Buy " + Number(obj.price_qty) + " For " + priceUtils.formatPrice(obj.price) + " each</option>")
            }
        };
        var getPrice = function (qty) {
            qty = Number(qty);
            var i = tierPrices.length;
            while (i--) {
                if (qty >= tierPrices[i]['price_qty']) {
                    return tierPrices[i]['price'];
                }
            }
            return null;
        };
        var updatePrice = function (price) {
            var newPrice = priceUtils.formatPrice(price);
            jQuery('.price-final_price .price').html(newPrice);
        };
        var updatePriceHtml = function (amount) {
            var price = getPrice(amount);
            if (price !== null) {
                updatePrice(price);
            }
        };
        jQuery('select#qty').change(function () {
            if (tierPrices.length > 0) {
                updatePriceHtml(this.value);
            }
        });
        setTimeout(function () {
            if (tierPrices.length > 0) {
                createDropdown();
                updatePriceHtml(jQuery('select#qty').val());
            }
        }, 700);
    });
    </script>
    Ответ написан
    Комментировать
  • Как авторизоваться, если есть csrf-token?

    Demisang
    @Demisang
    Backend PHP-developer
    Сайт вашего партнёра написан на Yii2 framework.
    Вот точное место кода(строка 1810), где производится валидация CSRF-токена: https://github.com/yiisoft/yii2/blob/master/framew...

    Что там происходит:
    1. Проверяется, если метод запроса GET HEAD или OPTIONS, то ничего не делать и токен не нужен.
    2. Проверяется, совпадает ли CSRF-токен, который хранится в $_SESSION с тем, что пришёл вместе с запросом.

    Чтобы не расписывать весь процесс дам простой ответ:
    CSRF-токен обновляется после КАЖДОГО запроса(даже GET), поэтому просто: перед тем, как вы отправляете POST/PUT/DELETE запросы, запросите любую страницу сайта через GET, сохраните токен и используйте его для следующего запроса.

    Эта защита сделана, чтобы нельзя было отправлять вредоносные запросы, например сделайте картинку <img src="http://example.com/logout"> и любой пользователь, который её увидит, будет разлогинен на сайте example.com
    Ответ написан