Перейти к содержимому


Фото
- - - - -

Ajax: сохранение цены и количества из админки


  • Чтобы отвечать, сперва войдите на форум
34 ответов в теме

#1 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 04.02.2019 - 11:05

Я понятия не имею, что такое аях, но работает прикольно - без перезагрузки страницы получает/сохраняет данные в БД. Поставил задачу сохранять в админке количество товара на складе через аякс.

Смотрю как это делается в шаблоне, затем смотрю, что передаётся в update_object.php и как далее отправляется запрос.

Как я понял, в этот php-скрипт передаются методом post значения id (номер товара), object(product) и values (тут как раз и надо передать значение количества)

В моём понимании как-то так (дополнительные кнопки не делаю, использую существующую)

    // Сохранить значение
    $("a.enable").click(function() {
        var icon        = $(this);
        var line        = icon.closest("div.row");
        var id          = line.find('input[type="checkbox"][name*="check"]').val();
        var state       = line.hasClass('invisible')?1:0;
        icon.addClass('loading_icon');
        $.ajax({
            type: 'POST',
            url: 'ajax/update_object.php',
            data: {'object': 'product', 'id': id, 'values': {'stock': 999}, 'session_id': '{/literal}{$smarty.session.id}{literal}'},
            success: function(data){
                icon.removeClass('loading_icon');
                if(state)
                    line.removeClass('invisible');
                else
                    line.addClass('invisible');                
            },
            dataType: 'json'
        });    
        return false;    
    });
 

где 999 - количество на складе. Буду пробовать, если такой вариант получится реализовать, значит, я на верном пути.

 

Теперь вопрос. Подскажите, как получить значение из

<input class="stock" type="text" name="stock[6128]" value="999"> 

чтобы подставить его вместо числа 999.



#2 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 04.02.2019 - 11:12

Однако же передача             

 

data: {'object': 'product', 'id': id, 'values': {'stock': 999}, 'session_id': '{/literal}{$smarty.session.id}{literal}'}

Ни к чему не приводит. Где собака порылась???



#3 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 04.02.2019 - 11:48

Как я понял, проблема в том, что simpla->products->update_product() обновляет лишь таблицу s_products, то есть, можно передать значения id, url, visible, hit, featured и т.д., но не варианты (то есть, цену, кол-во)



То есть, нужно использовать simpla->variants->update_variant()



#4 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 04.02.2019 - 12:55

Всё понял. Мне нужно в js из строчки

 

<input class="stock" type="text" name="stock[6128]" value="∞">
 

 

Вытащить то, что в квадратных скобках (id) и значение value

 

 

        var stock       = line.find('input[class*="stock"]').val(); 

Записываетв stock введённое значение. А вот как получить то, что в квадратных скобках?

 


Изменено: question, 04.02.2019 - 12:55


#5 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 7 166 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 04.02.2019 - 13:28

Как вариант:
<input class="stock" type="text" name="stock[6128]" value="∞" data-vid="{$v->id}">
var stock       = line.find('input[class*="stock"]').data('vid');

Изменено: Noxter, 04.02.2019 - 13:28


#6 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 04.02.2019 - 13:29

Всё получилось, только каждый раз нужно жать на кнопку "сохранить", которая передаёт значения скрипту. А что надо написать вместо

 

    $("a.enable").click(function() {
 

чтобы не на кнопку enable жать, а передача была каждый раз при изменении значения в input?

Событие change, то есть

 

    $(".stock").change(function() {
alert();
    });
 

 

не предлагать, т.к. оно происходит ПОСЛЕ того, как изменил значение и сместил фокус с поля input


Изменено: question, 04.02.2019 - 13:40


#7 Kosjak76

Kosjak76
  • Модератор
  • 3 829 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Харьков, Украина

Опубликовано 04.02.2019 - 13:36

Ну так правильно, по change  оно и должно работать, иначе виснуть будет после каждого нажатия, если использовать mousedown или mouseup



#8 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 05.02.2019 - 09:43

Ну так правильно, по change  оно и должно работать, иначе виснуть будет после каждого нажатия, если использовать mousedown или mouseup

Спасибо за наводку. По mousedown делать не стоит, может быть конфликт с браузерами и в базу неизвестно какое значение отправится, а вот попробовал с mouseup - за секунду/полсекунды (при условии, что интернет - не диалап) сохраняет значение. Только при вводе, например, числа 15, отправятся два UPDATE запроса: первый SET 1..., второй SET 15. Надеюсь, понятно объяснил.

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

 

По хорошему бы ещё при продаже дату изменения и имя пользователя в отдельную таблицу вносить. Однако, с моей логикой это не получится, т.к. при изменении с 17 на 16 пользователь может нажать кнопку DEL - отправляется запрос, нажать 1 - снова запрос, потом 6 - ещё два запроса. Использовать событие change можно, но это в итоге приведёт к несохранению некоторых данных: пользователь зашёл, изменил 4 на 3, закрыл браузер - sql запрос не отправился.

 

Есть ли какой алгоритм игнорирования записи в БД при изменении в течение, например, 2 минут?


Изменено: question, 05.02.2019 - 09:46


#9 phukortsin

phukortsin
  • Фрилансер
  • 879 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 05.02.2019 - 09:55

Спасибо за наводку. По mousedown делать не стоит, может быть конфликт с браузерами и в базу неизвестно какое значение отправится, а вот попробовал с mouseup - за секунду/полсекунды (при условии, что интернет - не диалап) сохраняет значение. Только при вводе, например, числа 15, отправятся два UPDATE запроса: первый SET 1..., второй SET 15. Надеюсь, понятно объяснил.
В принципе всё работает и очень шустро, гораздо быстрее, чем при вводе и нажатии кнопки "сохранить", по крайней мере, пока вы нажмёте на эту кнопку, уже секунда пройдёт, пока загрузится страница - ещё одна. Вот только думаю, как бы ещё функционал расширить...

По хорошему бы ещё при продаже дату изменения и имя пользователя в отдельную таблицу вносить. Однако, с моей логикой это не получится, т.к. при изменении с 17 на 16 пользователь может нажать кнопку DEL - отправляется запрос, нажать 1 - снова запрос, потом 6 - ещё два запроса. Использовать событие change можно, но это в итоге приведёт к несохранению некоторых данных: пользователь зашёл, изменил 4 на 3, закрыл браузер - sql запрос не отправился.

 

Изначально все это плохо и несерьезно. Потому как  форму можно заполнить и отправить и без действий мыши, а одной клавиатурой...

 

Есть ли какой алгоритм игнорирования записи в БД при изменении в течение, например, 2 минут?

 

Конечно есть, в таблице заводите новое поле, в которое пишете дату изменения записи. И потом контроль при изменении.
Но сколько сложностей прибавится, и не всегда будет хорошо.

Зря Вы кривой велосипед изобретаете...

 



#10 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 05.02.2019 - 10:12

Изначально все это плохо и несерьезно. Потому как  форму можно заполнить и отправить и без действий мыши, а одной клавиатурой...

 

 

Но отправится запрос на изменение всех полей, а не только тех, в которые я цифру ввёл



А мне же нужно отправлять в БД также дату изменения, получается, что все те товары, что я вижу на экране будут иметь текущую дату.



#11 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 05.02.2019 - 10:27

Конечно есть, в таблице заводите новое поле, в которое пишете дату изменения записи. И потом контроль при изменении.
Но сколько сложностей прибавится, и не всегда будет хорошо.

 

Спасибо. Это хорошая идея. Дополнительное поле типа Дата

 

ALTER TABLE `s_variants` ADD `stockchanged` DATE NULL DEFAULTCURRENT_TIMESTAMP AFTER `stock`;

При обновлении количества достаточно записать дату без времени и ничего уже не проверять. А  если писать время до секунды, то как сделать SQL запрос с условием? Например, обновлять количество, а дату трогать, если прошло более часа?


Изменено: question, 05.02.2019 - 11:03


#12 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 05.02.2019 - 11:02

И ещё вопрос. Функции update_variants передаются параметры, которые она подставляет в sql запрос.

Сама функция

 

    public function update_variant($id, $variant)
    {
        $query = $this->db->placehold("UPDATE __variants SET ?% WHERE id=? LIMIT 1", $variant, intval($id));
        $this->db->query($query);
        return $id;
    }
 

Svariant, как я понял, массив. Как эту функцию переписать, чтобы при нахождении в $variant только stock добавлять в SQL фразу

 

, `stockchanged` = NOW()
 

?


Изменено: question, 05.02.2019 - 11:04


#13 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 05.02.2019 - 11:07

Зачем мучаться? Просто написал другую функцию

 

    public function update_stock($id, $variant)
    {
        $query = $this->db->placehold("UPDATE __variants SET ?% , `stockchanged` = NOW() WHERE id=? LIMIT 1", $variant, intval($id));
        $this->db->query($query);
        return $id;
    }
 

 



#14 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 05.02.2019 - 11:34

Работает, дату изменения при изменении количества через новую админку записывает



#15 phukortsin

phukortsin
  • Фрилансер
  • 879 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 05.02.2019 - 11:40

Зачем мучаться? Просто написал другую функцию

 

    public function update_stock($id, $variant)
    {
        $query = $this->db->placehold("UPDATE __variants SET ?% , `stockchanged` = NOW() WHERE id=? LIMIT 1", $variant, intval($id));
        $this->db->query($query);
        return $id;
    }
 

 

 

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

И сама постановка вопроса "при нахождении в $variant только stock" тоже, скорее всего, породит проблемы...



#16 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 05.02.2019 - 12:42

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

И сама постановка вопроса "при нахождении в $variant только stock" тоже, скорее всего, породит проблемы...

Вы не поняли. Старая функция update_variant осталась для старой админки, новая update_stock -  для новой и место для вставки этой функции всего одно.

Я теперь думаю, как записывать в БД количество продаж в месяц и как формировать заказы в админке (корзина для админки с последующей печатью накладной)



#17 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 06.02.2019 - 19:05

Переделал. Теперь сохраняет только при нажатии на enter (код 13).

У меня ещё вопрос. Подскажите, как при увеличении количества товара отправлять один запрос, а при уменьшении - второй.

Надо сравнивать введённое в input число в админке с variant->stock или же вставить SELECT в UPDATE и написать условие типа

 

UPDATE s_variants 
SET stock=99, datechanged=NOW() 
WHERE id=123 AND 
(SELECT stock FROM s_variants WHERE id=12345 LIMIT 1) < 99 
LIMIT 1

?



Суть такая: надо записывать в одно поле дату при уменьшении товара на складе и во второе поле при увеличении кол-ва товаров на складе.



#18 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 06.02.2019 - 19:35

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


Изменено: question, 06.02.2019 - 19:35


#19 question

question
  • Пользователь
  • 275 сообщений
  • Заказчик, Пользователь
  • Версия CMS:2.x
  • Откуда:Россия

Опубликовано 06.02.2019 - 21:01

Уснуть не могу. Товарищи, подскажите, каким путём пойти.



#20 phukortsin

phukortsin
  • Фрилансер
  • 879 сообщений
  • Программирование, Пользователь
  • Версия CMS:2.x
  • Откуда:Львов

Опубликовано 07.02.2019 - 08:47

Лучший путь для Вас - найти (нанять) специалиста-консультанта. В 90% случаев он Вам будет объяснять, что Ваша идея совсем плохая, и подскажет стандартные проверенные пути. Сэкономите много своего рабочего времени и приобретете массу полезных знаний...






0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых