Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

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

Смотрю как это делается в шаблоне, затем смотрю, что передаётся в 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.

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

Ссылка на сообщение
Поделиться на другие сайты

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



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

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

 

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

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

 

Изменено пользователем question
Ссылка на сообщение
Поделиться на другие сайты

Как вариант:

<input class="stock" type="text" name="stock[6128]" value="∞" data-vid="{$v->id}">

var stock = line.find('input[class*="stock"]').data('vid');
Изменено пользователем Noxter
Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

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

 

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

 

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

Изменено пользователем question
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

 

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

Изменено пользователем question
Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

 

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

 

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

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

 

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

 

 

Ссылка на сообщение
Поделиться на другие сайты

 

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

 

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

 

 

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

 

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

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

Изменено пользователем question
Ссылка на сообщение
Поделиться на другие сайты

И ещё вопрос. Функции 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
Ссылка на сообщение
Поделиться на другие сайты

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

 

    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;
    }
 

 

Ссылка на сообщение
Поделиться на другие сайты

 

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

 

    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" тоже, скорее всего, породит проблемы...

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

Переделал. Теперь сохраняет только при нажатии на 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

?



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

Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем question
Ссылка на сообщение
Поделиться на другие сайты

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

Ссылка на сообщение
Поделиться на другие сайты

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

Ну чем плоха идея хранить склад не в отдельной программе с синхронизацией туда-сюда, а в базе данных моего сайта и управлять облегчённой админкой?

В первом случае - это занесение всех товаров в базу с разбивкой по категориям, во втором - база уже есть.

Возможно, эта тема заинтересует других участников и они пойдут по моему же пути.

Ссылка на сообщение
Поделиться на другие сайты

Добавлю. Наиболее правильное, с моей точки зрения, решение - отправлять запрос в БД.

Однако, функция placeholder не позволит отправить в БД запрос вида

 

UPDATE s_variants
SET stock=КОЛИЧЕСТВО, datechanged=NOW()
WHERE id=КАТЕГОРИЯ AND 
(SELECT stock FROM s_variants WHERE id=КАТЕГОРИЯ LIMIT 1) < КОЛИЧЕСТВО
LIMIT 1
 

Конкретно 4 строчка. Не позволит подставить КОЛИЧЕСТВО

Ссылка на сообщение
Поделиться на другие сайты

Ну чем плоха идея хранить склад не в отдельной программе с синхронизацией туда-сюда, а в базе данных моего сайта и управлять облегчённой админкой?

В первом случае - это занесение всех товаров в базу с разбивкой по категориям, во втором - база уже есть.

Возможно, эта тема заинтересует других участников и они пойдут по моему же пути.

 

Идея хорошая - если ее написать на плакате,  повесить на стенку и любоваться. Таких хороших идей напридумать можно много.

 

Надо отличать идею от реализации. Первое - каждый легко может придумать. А второе - тут надо и знания, и умения, и опыт, и время (или деньги)...

 

Подобных идей на форуме было много. А результатов - почти никаких...

 

 

Добавлю. Наиболее правильное, с моей точки зрения, решение - отправлять запрос в БД.

Однако, функция placeholder не позволит отправить в БД запрос вида

Отправляйте, как считаете нужным.

Если функция не позволяет, переработайте функцию, чтоб позволяла.

Ссылка на сообщение
Поделиться на другие сайты
$query = $this->db->placehold("UPDATE s_variants SET ?%, datechanged=NOW() WHERE id=? AND (SELECT stock FROM s_variants WHERE id=? LIMIT 1) < КОЛИЧЕСТВО LIMIT 1", $variant, intval($id));
 

Вот только передать количество не получается.

Ссылка на сообщение
Поделиться на другие сайты

 

Идея хорошая - если ее написать на плакате,  повесить на стенку и любоваться. Таких хороших идей напридумать можно много.

 

Надо отличать идею от реализации. Первое - каждый легко может придумать. А второе - тут надо и знания, и умения, и опыт, и время (или деньги)...

 

Подобных идей на форуме было много. А результатов - почти никаких...

Вы хотите сказать, идея нормальная, реализация плохая? 

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...