eugenex Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Есть модуль, работающий при установленном vqmod. Требуется выполнить ajax-запрос к контроллеру модуля. Post-запрос до контроллера не доходит, потому что не проходит валидацию в vqmode/vqcache/vq2-admin_controller_catalog_product.php. Там ожидается параметр product_description содержащий ассоциативный массив. Если выполнять get-запрос, то в контроллере условие if (isset($this->request->get['option_req'])) где я его должен обработать не выполняется. В ответе сервера возвращается страница целиком, вместе с верхним меню. Что нужно сделать, чтобы при установленном vqmod ajax-запросы выполнялись как обычно? Надіслати Поділитися на інших сайтах More sharing options...
freelancer Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 вы пишите Требуется выполнить ajax-запрос к контроллеру модуля. но запросы зачем-то шлете контроллеру товара vq2-admin_controller_catalog_product.php логично предположить, что модуль есть новый функционал в контроллере товара. у вас написан обработчик ajax запросов ? Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Я уже понял свою основную ошибку. Раньше я работал с модулем такой структуры, которая не требовала указания url в функции $.ajax. Сейчас скрипт, выполняющий ajax-запросы находится в файле vqmod\xml\имя_модуля.xml и url нужно указать явно. То есть, вопрос на самом деле в том, как определить url контроллера. Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 логично предположить, что модуль есть новый функционал в контроллере товара. у вас написан обработчик ajax запросов ? Нет, модуль имеет свой контроллер в папке admin/controller/module. Обработчик ajax запросов я в нем написал. Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Урл контроллера я указал, но проблемы остались. JS выглядит сейчас так: $("#mastop").live("change", function() { alert('change'); $.ajax({ url: "/admin/index.php?route=module/related_options&token=2e2687166c3a2ae113844508b9a447c3", type: 'get', data: { option_req: 'option_req' }, success: function(content) { alert(content); }, error: function() { alert('error'); } }); }); А обработчик в контроллере так: if (isset($this->request->get['option_req'])) { $this->template = 'module/related_options_item.tpl'; echo $this->render(); die; } url сейчас подставляется такой: /admin/index.php?route=module/related_options&token=2e2687166c3a2ae113844508b9a447c3 Если я его вставляю в адресную строку браузера, то обработчик запроса выполняется, а вот из ajax по-прежнему нет. При этом коллбэк success вызывается, но в параметре content что-то совершенно не то, возможно 404 страница Денвера. Факт попадания в блок if (isset($this->request->get['option_req'])) проверяю логированием. Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Все-таки неправильно формировал url, А правильно так: $this->url->link('module/related_options', 'token='.$this->session->data['token']); Только потом еще пришлось вырезать "amp;" который зачем-то вставляется, причем не вместо "&", а после него) Теперь работает. Надіслати Поділитися на інших сайтах More sharing options... halfhope Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Все-таки неправильно формировал url, А правильно так: $this->url->link('module/related_options', 'token='.$this->session->data['token']); Только потом еще пришлось вырезать "amp;" который зачем-то вставляется, причем не вместо "&", а после него) Теперь работает. Если это предназначено только для администратора, то будет работать нормально. Выйдите из админки и код перестанет работать. Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Если это предназначено только для администратора, то будет работать нормально. Выйдите из админки и код перестанет работать. А если не только для администратора, тогда как? Надіслати Поділитися на інших сайтах More sharing options... halfhope Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 А если не только для администратора, тогда как? Уже проверили? могу ошибаться. Вынесите контроллер админки module/related_options в каталог и шлите запросы к нему. Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Уже проверили? могу ошибаться. Вынесите контроллер админки module/related_options в каталог и шлите запросы к нему. Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. Надіслати Поділитися на інших сайтах More sharing options... halfhope Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. Это я чего-то перемудрил. Я просто подумал, что Вы используете $this->session->data['token'] в витрине магазина, а не в админке. Все гуд. Надіслати Поділитися на інших сайтах More sharing options... AlexDW Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Да, нашел там $('#option-' + option_row).trigger('click'); Его и ловлю. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Допомога програмістам та розробникам Выполнение ajax-запросов в модуле при vqmod Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich × Уже зареєстровані? Ввійти Реєстрація Ваші замовлення Назад Придбані модулі та шаблони Ваші рахунки Лист очікувань Альтернативні контакти Форум Новини ocStore Назад Офіційний сайт Демо ocStore 3.0.3.2 Демо ocStore 2.3.0.2.4 Завантажити ocStore Документація Історія версій ocStore Блоги Модулі Шаблони Назад Безкоштовні шаблони Платні шаблони Де купувати модулі? Послуги FAQ OpenCart.Pro Назад Демо Купити Порівняння × Створити... Important Information На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність. Я даю згоду
eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Я уже понял свою основную ошибку. Раньше я работал с модулем такой структуры, которая не требовала указания url в функции $.ajax. Сейчас скрипт, выполняющий ajax-запросы находится в файле vqmod\xml\имя_модуля.xml и url нужно указать явно. То есть, вопрос на самом деле в том, как определить url контроллера. Надіслати Поділитися на інших сайтах More sharing options...
eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 логично предположить, что модуль есть новый функционал в контроллере товара. у вас написан обработчик ajax запросов ? Нет, модуль имеет свой контроллер в папке admin/controller/module. Обработчик ajax запросов я в нем написал. Надіслати Поділитися на інших сайтах More sharing options...
eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Урл контроллера я указал, но проблемы остались. JS выглядит сейчас так: $("#mastop").live("change", function() { alert('change'); $.ajax({ url: "/admin/index.php?route=module/related_options&token=2e2687166c3a2ae113844508b9a447c3", type: 'get', data: { option_req: 'option_req' }, success: function(content) { alert(content); }, error: function() { alert('error'); } }); }); А обработчик в контроллере так: if (isset($this->request->get['option_req'])) { $this->template = 'module/related_options_item.tpl'; echo $this->render(); die; } url сейчас подставляется такой: /admin/index.php?route=module/related_options&token=2e2687166c3a2ae113844508b9a447c3 Если я его вставляю в адресную строку браузера, то обработчик запроса выполняется, а вот из ajax по-прежнему нет. При этом коллбэк success вызывается, но в параметре content что-то совершенно не то, возможно 404 страница Денвера. Факт попадания в блок if (isset($this->request->get['option_req'])) проверяю логированием. Надіслати Поділитися на інших сайтах More sharing options...
eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Все-таки неправильно формировал url, А правильно так: $this->url->link('module/related_options', 'token='.$this->session->data['token']); Только потом еще пришлось вырезать "amp;" который зачем-то вставляется, причем не вместо "&", а после него) Теперь работает. Надіслати Поділитися на інших сайтах More sharing options...
halfhope Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Все-таки неправильно формировал url, А правильно так: $this->url->link('module/related_options', 'token='.$this->session->data['token']); Только потом еще пришлось вырезать "amp;" который зачем-то вставляется, причем не вместо "&", а после него) Теперь работает. Если это предназначено только для администратора, то будет работать нормально. Выйдите из админки и код перестанет работать. Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Если это предназначено только для администратора, то будет работать нормально. Выйдите из админки и код перестанет работать. А если не только для администратора, тогда как? Надіслати Поділитися на інших сайтах More sharing options... halfhope Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 А если не только для администратора, тогда как? Уже проверили? могу ошибаться. Вынесите контроллер админки module/related_options в каталог и шлите запросы к нему. Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Уже проверили? могу ошибаться. Вынесите контроллер админки module/related_options в каталог и шлите запросы к нему. Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. Надіслати Поділитися на інших сайтах More sharing options... halfhope Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. Это я чего-то перемудрил. Я просто подумал, что Вы используете $this->session->data['token'] в витрине магазина, а не в админке. Все гуд. Надіслати Поділитися на інших сайтах More sharing options... AlexDW Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Да, нашел там $('#option-' + option_row).trigger('click'); Его и ловлю. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Допомога програмістам та розробникам Выполнение ajax-запросов в модуле при vqmod Покупцям Оплата розширень фізичними особами Оплата розширень юридичними особами Політика повернень Розробникам Регламент розміщення розширень Регламент продажу та підтримки розширень Віртуальний обліковий запис автора Політика просування оголошень API каталогу розширень Вирішення спорів щодо авторських прав Корисна інформація Публічна оферта Політика повернень Політика конфіденційності Платіжна політика Політика передачі особистих даних Політика прозорості Останні розширення Повний пакет SEO Автор: GeekoDev SameSite Session Fix Opencart 3 Автор: web_bond SP Telegram повідомлення FREE Автор: spectre Відключити порожні категорії Автор: spectre SEO Автор тексту категорії / фільтра / блогу з датою оновлення контенту + мікророзмітка Автор: radaevich
eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Если это предназначено только для администратора, то будет работать нормально. Выйдите из админки и код перестанет работать. А если не только для администратора, тогда как? Надіслати Поділитися на інших сайтах More sharing options...
halfhope Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 А если не только для администратора, тогда как? Уже проверили? могу ошибаться. Вынесите контроллер админки module/related_options в каталог и шлите запросы к нему. Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Уже проверили? могу ошибаться. Вынесите контроллер админки module/related_options в каталог и шлите запросы к нему. Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. Надіслати Поділитися на інших сайтах More sharing options... halfhope Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. Это я чего-то перемудрил. Я просто подумал, что Вы используете $this->session->data['token'] в витрине магазина, а не в админке. Все гуд. Надіслати Поділитися на інших сайтах More sharing options... AlexDW Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Да, нашел там $('#option-' + option_row).trigger('click'); Его и ловлю. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку Последние темы Последние дополнения Последние новости Вся активність Головна Підтримка та відповіді на запитання. Допомога програмістам та розробникам Выполнение ajax-запросов в модуле при vqmod
eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 Уже проверили? могу ошибаться. Вынесите контроллер админки module/related_options в каталог и шлите запросы к нему. Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. Надіслати Поділитися на інших сайтах More sharing options...
halfhope Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. Это я чего-то перемудрил. Я просто подумал, что Вы используете $this->session->data['token'] в витрине магазина, а не в админке. Все гуд. Надіслати Поділитися на інших сайтах More sharing options... AlexDW Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Да, нашел там $('#option-' + option_row).trigger('click'); Его и ловлю. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0 Перейти до списку тем Зараз на сторінці 0 користувачів Ні користувачів, які переглядиють цю сторінку
AlexDW Опубліковано: 13 квітня 2015 Share Опубліковано: 13 квітня 2015 Нет, не проверял. Интересно с точки зрения общего развития. У меня как раз функционал только для админки. А вот что действительно важно: нужно тот ajax -запрос выполнять при выборе опции в автокомплитере при редактировании товара. То есть, запрос должен выполняться, когда новая опция, которую выбрали в автокомплитере появляется в списке над автокомплитером. Не найду, что за событие и на каком элементе там отлавливать. в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Надіслати Поділитися на інших сайтах More sharing options... eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Да, нашел там $('#option-' + option_row).trigger('click'); Его и ловлю. Надіслати Поділитися на інших сайтах More sharing options... Створіть аккаунт або увійдіть для коментування Ви повинні бути користувачем, щоб залишити коментар Створити обліковий запис Зареєструйтеся для отримання облікового запису. Це просто! Зареєструвати аккаунт Вхід Уже зареєстровані? Увійдіть тут. Вхід зараз Share More sharing options... Передплатники 0
eugenex Опубліковано: 13 квітня 2015 Автор Share Опубліковано: 13 квітня 2015 в admin\view\template\catalog\product_form.tpl смотрите секцию $('input[name=\'option\']').catcomplete({ контроллер admin\controller\catalog\option.php, autocomplete() Да, нашел там $('#option-' + option_row).trigger('click'); Его и ловлю. Надіслати Поділитися на інших сайтах More sharing options...
Recommended Posts