question Опубликовано 4 февраля, 2019 Жалоба Поделиться Опубликовано 4 февраля, 2019 Я понятия не имею, что такое аях, но работает прикольно - без перезагрузки страницы получает/сохраняет данные в БД. Поставил задачу сохранять в админке количество товара на складе через аякс.Смотрю как это делается в шаблоне, затем смотрю, что передаётся в 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. Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 4 февраля, 2019 Автор Жалоба Поделиться Опубликовано 4 февраля, 2019 Однако же передача data: {'object': 'product', 'id': id, 'values': {'stock': 999}, 'session_id': '{/literal}{$smarty.session.id}{literal}'} Ни к чему не приводит. Где собака порылась??? Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 4 февраля, 2019 Автор Жалоба Поделиться Опубликовано 4 февраля, 2019 Как я понял, проблема в том, что simpla->products->update_product() обновляет лишь таблицу s_products, то есть, можно передать значения id, url, visible, hit, featured и т.д., но не варианты (то есть, цену, кол-во)То есть, нужно использовать simpla->variants->update_variant() Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 4 февраля, 2019 Автор Жалоба Поделиться Опубликовано 4 февраля, 2019 (изменено) Всё понял. Мне нужно в js из строчки <input class="stock" type="text" name="stock[6128]" value="∞"> Вытащить то, что в квадратных скобках (id) и значение value var stock = line.find('input[class*="stock"]').val(); Записываетв stock введённое значение. А вот как получить то, что в квадратных скобках? Изменено 4 февраля, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 4 февраля, 2019 Жалоба Поделиться Опубликовано 4 февраля, 2019 (изменено) Как вариант:<input class="stock" type="text" name="stock[6128]" value="∞" data-vid="{$v->id}"> var stock = line.find('input[class*="stock"]').data('vid'); Изменено 4 февраля, 2019 пользователем Noxter Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 4 февраля, 2019 Автор Жалоба Поделиться Опубликовано 4 февраля, 2019 (изменено) Всё получилось, только каждый раз нужно жать на кнопку "сохранить", которая передаёт значения скрипту. А что надо написать вместо $("a.enable").click(function() { чтобы не на кнопку enable жать, а передача была каждый раз при изменении значения в input?Событие change, то есть $(".stock").change(function() { alert(); }); не предлагать, т.к. оно происходит ПОСЛЕ того, как изменил значение и сместил фокус с поля input Изменено 4 февраля, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
Kosjak76 Опубликовано 4 февраля, 2019 Жалоба Поделиться Опубликовано 4 февраля, 2019 Ну так правильно, по change оно и должно работать, иначе виснуть будет после каждого нажатия, если использовать mousedown или mouseup Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 5 февраля, 2019 Автор Жалоба Поделиться Опубликовано 5 февраля, 2019 (изменено) Ну так правильно, по change оно и должно работать, иначе виснуть будет после каждого нажатия, если использовать mousedown или mouseupСпасибо за наводку. По mousedown делать не стоит, может быть конфликт с браузерами и в базу неизвестно какое значение отправится, а вот попробовал с mouseup - за секунду/полсекунды (при условии, что интернет - не диалап) сохраняет значение. Только при вводе, например, числа 15, отправятся два UPDATE запроса: первый SET 1..., второй SET 15. Надеюсь, понятно объяснил.В принципе всё работает и очень шустро, гораздо быстрее, чем при вводе и нажатии кнопки "сохранить", по крайней мере, пока вы нажмёте на эту кнопку, уже секунда пройдёт, пока загрузится страница - ещё одна. Вот только думаю, как бы ещё функционал расширить... По хорошему бы ещё при продаже дату изменения и имя пользователя в отдельную таблицу вносить. Однако, с моей логикой это не получится, т.к. при изменении с 17 на 16 пользователь может нажать кнопку DEL - отправляется запрос, нажать 1 - снова запрос, потом 6 - ещё два запроса. Использовать событие change можно, но это в итоге приведёт к несохранению некоторых данных: пользователь зашёл, изменил 4 на 3, закрыл браузер - sql запрос не отправился. Есть ли какой алгоритм игнорирования записи в БД при изменении в течение, например, 2 минут? Изменено 5 февраля, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 5 февраля, 2019 Жалоба Поделиться Опубликовано 5 февраля, 2019 Спасибо за наводку. По mousedown делать не стоит, может быть конфликт с браузерами и в базу неизвестно какое значение отправится, а вот попробовал с mouseup - за секунду/полсекунды (при условии, что интернет - не диалап) сохраняет значение. Только при вводе, например, числа 15, отправятся два UPDATE запроса: первый SET 1..., второй SET 15. Надеюсь, понятно объяснил.В принципе всё работает и очень шустро, гораздо быстрее, чем при вводе и нажатии кнопки "сохранить", по крайней мере, пока вы нажмёте на эту кнопку, уже секунда пройдёт, пока загрузится страница - ещё одна. Вот только думаю, как бы ещё функционал расширить... По хорошему бы ещё при продаже дату изменения и имя пользователя в отдельную таблицу вносить. Однако, с моей логикой это не получится, т.к. при изменении с 17 на 16 пользователь может нажать кнопку DEL - отправляется запрос, нажать 1 - снова запрос, потом 6 - ещё два запроса. Использовать событие change можно, но это в итоге приведёт к несохранению некоторых данных: пользователь зашёл, изменил 4 на 3, закрыл браузер - sql запрос не отправился. Изначально все это плохо и несерьезно. Потому как форму можно заполнить и отправить и без действий мыши, а одной клавиатурой... Есть ли какой алгоритм игнорирования записи в БД при изменении в течение, например, 2 минут? Конечно есть, в таблице заводите новое поле, в которое пишете дату изменения записи. И потом контроль при изменении.Но сколько сложностей прибавится, и не всегда будет хорошо. Зря Вы кривой велосипед изобретаете... Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 5 февраля, 2019 Автор Жалоба Поделиться Опубликовано 5 февраля, 2019 Изначально все это плохо и несерьезно. Потому как форму можно заполнить и отправить и без действий мыши, а одной клавиатурой... Но отправится запрос на изменение всех полей, а не только тех, в которые я цифру ввёл А мне же нужно отправлять в БД также дату изменения, получается, что все те товары, что я вижу на экране будут иметь текущую дату. Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 5 февраля, 2019 Автор Жалоба Поделиться Опубликовано 5 февраля, 2019 (изменено) Конечно есть, в таблице заводите новое поле, в которое пишете дату изменения записи. И потом контроль при изменении.Но сколько сложностей прибавится, и не всегда будет хорошо. Спасибо. Это хорошая идея. Дополнительное поле типа Дата ALTER TABLE `s_variants` ADD `stockchanged` DATE NULL DEFAULTCURRENT_TIMESTAMP AFTER `stock`; При обновлении количества достаточно записать дату без времени и ничего уже не проверять. А если писать время до секунды, то как сделать SQL запрос с условием? Например, обновлять количество, а дату трогать, если прошло более часа? Изменено 5 февраля, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 5 февраля, 2019 Автор Жалоба Поделиться Опубликовано 5 февраля, 2019 (изменено) И ещё вопрос. Функции 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() ? Изменено 5 февраля, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 5 февраля, 2019 Автор Жалоба Поделиться Опубликовано 5 февраля, 2019 Зачем мучаться? Просто написал другую функцию 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; } Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 5 февраля, 2019 Автор Жалоба Поделиться Опубликовано 5 февраля, 2019 Работает, дату изменения при изменении количества через новую админку записывает Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 5 февраля, 2019 Жалоба Поделиться Опубликовано 5 февраля, 2019 Зачем мучаться? Просто написал другую функцию 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" тоже, скорее всего, породит проблемы... Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 5 февраля, 2019 Автор Жалоба Поделиться Опубликовано 5 февраля, 2019 Ну и зря. Теперь придется мучиться, чтобы вставлять в разных местах новую функцию вместо старой. Мест таких, скорее всего, намного больше, чем Вы думаете...И сама постановка вопроса "при нахождении в $variant только stock" тоже, скорее всего, породит проблемы...Вы не поняли. Старая функция update_variant осталась для старой админки, новая update_stock - для новой и место для вставки этой функции всего одно.Я теперь думаю, как записывать в БД количество продаж в месяц и как формировать заказы в админке (корзина для админки с последующей печатью накладной) Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 6 февраля, 2019 Автор Жалоба Поделиться Опубликовано 6 февраля, 2019 Переделал. Теперь сохраняет только при нажатии на 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 ?Суть такая: надо записывать в одно поле дату при уменьшении товара на складе и во второе поле при увеличении кол-ва товаров на складе. Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 6 февраля, 2019 Автор Жалоба Поделиться Опубликовано 6 февраля, 2019 (изменено) Мысль была в tpl-файле яваскриптом сделать, но т.к. перезагрузки страницы не происходит, при увеличении-уменьшении без перезагрузки, может произойти конфликт, мне так кажется. Изменено 6 февраля, 2019 пользователем question Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 6 февраля, 2019 Автор Жалоба Поделиться Опубликовано 6 февраля, 2019 Уснуть не могу. Товарищи, подскажите, каким путём пойти. Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 7 февраля, 2019 Жалоба Поделиться Опубликовано 7 февраля, 2019 Лучший путь для Вас - найти (нанять) специалиста-консультанта. В 90% случаев он Вам будет объяснять, что Ваша идея совсем плохая, и подскажет стандартные проверенные пути. Сэкономите много своего рабочего времени и приобретете массу полезных знаний... Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 7 февраля, 2019 Автор Жалоба Поделиться Опубликовано 7 февраля, 2019 Лучший путь для Вас - найти (нанять) специалиста-консультанта. В 90% случаев он Вам будет объяснять, что Ваша идея совсем плохая, и подскажет стандартные проверенные пути. Сэкономите много своего рабочего времени и приобретете массу полезных знаний...Ну чем плоха идея хранить склад не в отдельной программе с синхронизацией туда-сюда, а в базе данных моего сайта и управлять облегчённой админкой?В первом случае - это занесение всех товаров в базу с разбивкой по категориям, во втором - база уже есть.Возможно, эта тема заинтересует других участников и они пойдут по моему же пути. Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 7 февраля, 2019 Автор Жалоба Поделиться Опубликовано 7 февраля, 2019 Добавлю. Наиболее правильное, с моей точки зрения, решение - отправлять запрос в БД.Однако, функция placeholder не позволит отправить в БД запрос вида UPDATE s_variants SET stock=КОЛИЧЕСТВО, datechanged=NOW() WHERE id=КАТЕГОРИЯ AND (SELECT stock FROM s_variants WHERE id=КАТЕГОРИЯ LIMIT 1) < КОЛИЧЕСТВО LIMIT 1 Конкретно 4 строчка. Не позволит подставить КОЛИЧЕСТВО Цитата Ссылка на сообщение Поделиться на другие сайты
phukortsin Опубликовано 7 февраля, 2019 Жалоба Поделиться Опубликовано 7 февраля, 2019 Ну чем плоха идея хранить склад не в отдельной программе с синхронизацией туда-сюда, а в базе данных моего сайта и управлять облегчённой админкой? В первом случае - это занесение всех товаров в базу с разбивкой по категориям, во втором - база уже есть. Возможно, эта тема заинтересует других участников и они пойдут по моему же пути. Идея хорошая - если ее написать на плакате, повесить на стенку и любоваться. Таких хороших идей напридумать можно много. Надо отличать идею от реализации. Первое - каждый легко может придумать. А второе - тут надо и знания, и умения, и опыт, и время (или деньги)... Подобных идей на форуме было много. А результатов - почти никаких... Добавлю. Наиболее правильное, с моей точки зрения, решение - отправлять запрос в БД. Однако, функция placeholder не позволит отправить в БД запрос видаОтправляйте, как считаете нужным. Если функция не позволяет, переработайте функцию, чтоб позволяла. Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 7 февраля, 2019 Автор Жалоба Поделиться Опубликовано 7 февраля, 2019 $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)); Вот только передать количество не получается. Цитата Ссылка на сообщение Поделиться на другие сайты
question Опубликовано 7 февраля, 2019 Автор Жалоба Поделиться Опубликовано 7 февраля, 2019 Идея хорошая - если ее написать на плакате, повесить на стенку и любоваться. Таких хороших идей напридумать можно много. Надо отличать идею от реализации. Первое - каждый легко может придумать. А второе - тут надо и знания, и умения, и опыт, и время (или деньги)... Подобных идей на форуме было много. А результатов - почти никаких...Вы хотите сказать, идея нормальная, реализация плохая? Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.