16.11.2013, 17:55
|
Интересующийся
|
|
Регистрация: 07.03.2013
Сообщений: 25
|
|
Как получи доступ к данным объекта Я.Метрики
Здравствуйте! Я в JS не очень разбираюсь, но вот понадобилось связать Я.Метрику с системой оплаты. Вот, что у меня получилось:
// этот код считывает все GET параметры
function parseGetParams() {
var $_GET = {};
var __GET = window.location.search.substring(1).split("&");
for(var i=0; i<__GET.length; i++) {
var getVar = __GET[i].split("=");
$_GET[getVar[0]] = typeof(getVar[1])=="undefined" ? "" : getVar[1];
}
return $_GET;
}
var GETArr = parseGetParams();
//Объект метрики для магазина
var yaParams = {
order_id: " 0000",
order_price: 980.0,
currency: "RUR",
exchange_rate: 1,
goods:
[
{
name: "Мой товар - test",
price: 980,
customer_email: "n/a"
quantity: 1
}
]
};
yaParams.order_id = GETArr.order_id; // тут вроде всё правильно.
А вот как добраться до "customer_email"? В мануале яндекса написано: "В расчете параметров магазина order_id и name или id в объектах массива goods используются в качестве ключа, несмотря на то, что находятся на одном уровне с другими свойствами."
Получается, чтобы задать его я должен написать
yaParams.goods.name['Мой товар - test'].customer_email = GETArr.customer_email;
Правильно, или нет? И есть не будет передано параметра customer_email, то в объекте он так и останется "n/a", или сменится на "undefined"?
|
|
16.11.2013, 18:27
|
|
Профессор
|
|
Регистрация: 19.01.2010
Сообщений: 354
|
|
А зачем записывать email в список товаров, когда для заказа он только один? Я не очень разобрался в мануале, но стоит попробовать так:
var yaParams = {
order_id: GETArr.order_id,
order_price: 980.0,
currency: "RUR",
exchange_rate: 1,
customer_email: GETArr.customer_email
goods: [
{
name: "Мой товар - test",
price: 980,
quantity: 1
}
]
};
Думаю, весь yaParams нужно формировать динамически.
Последний раз редактировалось ixth, 16.11.2013 в 18:39.
|
|
16.11.2013, 18:34
|
|
Профессор
|
|
Регистрация: 19.01.2010
Сообщений: 354
|
|
Сообщение от frenzy
|
Получается, чтобы задать его я должен написать
yaParams.goods.name['Мой товар - test'].customer_email = GETArr.customer_email;
Правильно, или нет? И есть не будет передано параметра customer_email, то в объекте он так и останется "n/a", или сменится на "undefined"?
|
Нет. Зачем засовывать email в параметры товара, когда это свойство всего заказа? В мануале написано
Цитата:
|
Вы можете передавать и любые другие значения в параметрах. Они будут рассчитываться по тому же принципу, что и параметры в отчете Параметры визитов.
|
Т.е. по аналогии с твоим примером нужно сделать как-то так:
yaParams.customer_email = GETArr.customer_email;
Если в query-параметрах не будет customer_email, то запишется undefined. Чтобы этого не было можно сделать так:
yaParams.customer_email = GETArr.customer_email || "n/a";
или так
var customer_email = GETArr.customer_email;
if (customer_email) { yaParams.customer_email = customer_email; }
Последний раз редактировалось ixth, 16.11.2013 в 19:04.
|
|
16.11.2013, 18:52
|
Интересующийся
|
|
Регистрация: 07.03.2013
Сообщений: 25
|
|
Ну зачем же так придираться к контексту и ставить задачу с ног на голову? Окей, e-mail один, а как насчет параметра price? Цена на товар может изменится, клиент может купить его со скидкой и уж он-то точно должен быть в каждом конкретном товаре.
А просто if (GETArr.customer_email) { yaParams.customer_email = customer_email; } для проверки не сработает?
|
|
16.11.2013, 19:15
|
|
Профессор
|
|
Регистрация: 19.01.2010
Сообщений: 354
|
|
Сообщение от frenzy
|
Ну зачем же так придираться к контексту и ставить задачу с ног на голову?
|
Пфф… Понимаешь, я не до конца понимаю что ты делаешь на странице и откуда берется исходный yaParams. Формируется ли он на сервере, или ты просто прописал все значения по умолчанию? Я не вижу страницу полностью, а только догадываюсь. У тебя параметры, например, могут передаваться не GET, а POST запросом и тогда все сломается.
В обоих случаях я считаю, что правильнее всего создать объект где-то на сервере, а потом вывести его через json_encode (если это PHP). Это железный способ. Такие дела.
Сообщение от frenzy
|
Окей, e-mail один, а как насчет параметра price? Цена на товар может изменится, клиент может купить его со скидкой и уж он-то точно должен быть в каждом конкретном товаре.
|
Расскажи поподробнее как она может меняться. Опиши, так сказать, кейсы.
Цитата:
|
А просто if (GETArr.customer_email) { yaParams.customer_email = customer_email; } для проверки не сработает?
|
Вот так — да:
if (GETArr.customer_email) { yaParams.customer_email = GETArr.customer_email; }
|
|
16.11.2013, 19:41
|
Интересующийся
|
|
Регистрация: 07.03.2013
Сообщений: 25
|
|
У нас сервис оплаты glopart.ru. После покупки человека перекидывает с глопарта на нужную страницу нашего сайта. Там стоит счетчик яндекса и редирект через секунду (чтобы он дважды туда не попадал). Глопарт передает параметры методом get, я полагаю, ибо написано "Когда заказ оплачен - сервис Глопарт перенаправит покупателя на указанную вами страницу и добавит следующие параметры к запросу:...".
Цена товара может менятся:
1) Если её сменили в глопарте.
2) Если человек вводит промо-код и покупает тот же товар со скидкой.
Может меняться еще и название (мне бы хотелось сделать универсальную страицу обработчик и не допиливать её для каждого нового товара.)
И еще, да, в мануале к глопарту не написано, что он передает цену, но написано, что если нужны еще параметры - пишите в саппорт, что я уже и сделал. И даже если нам не удастся получить дополнительные параметры, то всё равно скоро будем переезжать на e-autopay и встанет всё тот же вопрос о связке метрики с платежкой.
|
|
16.11.2013, 23:50
|
|
Профессор
|
|
Регистрация: 19.01.2010
Сообщений: 354
|
|
Хм. А как задается страница, на которую перенаправляет глопарт? Нужно же откуда-то получать данные о товарах из корзины.
|
|
17.11.2013, 01:01
|
Интересующийся
|
|
Регистрация: 07.03.2013
Сообщений: 25
|
|
ixth, пожалуйста, давай будем проще. Мне просто нужно знать, как обратиться извне к переменной (чтоб собственно присвоить ей значение) в конкретном объекте (ключём к которому является name), который находится в ассоциативном массиве goods, который принадлежит объекту yaParams (я ничего не перепутал?). Я программировал на с++ и мне просто нужно узнать тонкости синтаксиса в JS по этому вопросу.
|
|
17.11.2013, 13:47
|
|
Профессор
|
|
Регистрация: 19.01.2010
Сообщений: 354
|
|
Ок. Короче, смотри: то, что написано в документации Метрики про ключи, видимо, имеет отношение к интерфейсу Метрики. Т.е. она выводит товары, сортируя их по name, id или что там еще… Ты никак не заставишь массив объектов отдавать тебе элемент по какому-либо ключу, кроме индекса. Так что тебе придется либо обращаться по порядковому номеру, как к обычному массиву, либо, опять же, проходить по всему массиву и искать в нем объект со значением name, которое совпадает с тем, что тебе нужно.
|
|
17.11.2013, 14:24
|
Интересующийся
|
|
Регистрация: 07.03.2013
Сообщений: 25
|
|
Тоесть конструкция должна быть, типа такой:
if (yaParams.goods[0].name == 'Мой товар - test') { yaParams.goods[0].price = GETArr.order_price; }
Ну еще цикл прохода по массиву, если бы это был не еденичный товар, а корзина, так?
|
|
|
|