Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.11.2013, 17:55
Интересующийся
Отправить личное сообщение для frenzy Посмотреть профиль Найти все сообщения от frenzy
 
Регистрация: 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"?
Ответить с цитированием
  #2 (permalink)  
Старый 16.11.2013, 18:27
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 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.
Ответить с цитированием
  #3 (permalink)  
Старый 16.11.2013, 18:34
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 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.
Ответить с цитированием
  #4 (permalink)  
Старый 16.11.2013, 18:52
Интересующийся
Отправить личное сообщение для frenzy Посмотреть профиль Найти все сообщения от frenzy
 
Регистрация: 07.03.2013
Сообщений: 25

Ну зачем же так придираться к контексту и ставить задачу с ног на голову? Окей, e-mail один, а как насчет параметра price? Цена на товар может изменится, клиент может купить его со скидкой и уж он-то точно должен быть в каждом конкретном товаре.

А просто if (GETArr.customer_email) { yaParams.customer_email = customer_email; } для проверки не сработает?
Ответить с цитированием
  #5 (permalink)  
Старый 16.11.2013, 19:15
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 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; }
Ответить с цитированием
  #6 (permalink)  
Старый 16.11.2013, 19:41
Интересующийся
Отправить личное сообщение для frenzy Посмотреть профиль Найти все сообщения от frenzy
 
Регистрация: 07.03.2013
Сообщений: 25

У нас сервис оплаты glopart.ru. После покупки человека перекидывает с глопарта на нужную страницу нашего сайта. Там стоит счетчик яндекса и редирект через секунду (чтобы он дважды туда не попадал). Глопарт передает параметры методом get, я полагаю, ибо написано "Когда заказ оплачен - сервис Глопарт перенаправит покупателя на указанную вами страницу и добавит следующие параметры к запросу:...".
Цена товара может менятся:
1) Если её сменили в глопарте.
2) Если человек вводит промо-код и покупает тот же товар со скидкой.
Может меняться еще и название (мне бы хотелось сделать универсальную страицу обработчик и не допиливать её для каждого нового товара.)
И еще, да, в мануале к глопарту не написано, что он передает цену, но написано, что если нужны еще параметры - пишите в саппорт, что я уже и сделал. И даже если нам не удастся получить дополнительные параметры, то всё равно скоро будем переезжать на e-autopay и встанет всё тот же вопрос о связке метрики с платежкой.
Ответить с цитированием
  #7 (permalink)  
Старый 16.11.2013, 23:50
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Хм. А как задается страница, на которую перенаправляет глопарт? Нужно же откуда-то получать данные о товарах из корзины.
Ответить с цитированием
  #8 (permalink)  
Старый 17.11.2013, 01:01
Интересующийся
Отправить личное сообщение для frenzy Посмотреть профиль Найти все сообщения от frenzy
 
Регистрация: 07.03.2013
Сообщений: 25

ixth, пожалуйста, давай будем проще. Мне просто нужно знать, как обратиться извне к переменной (чтоб собственно присвоить ей значение) в конкретном объекте (ключём к которому является name), который находится в ассоциативном массиве goods, который принадлежит объекту yaParams (я ничего не перепутал?). Я программировал на с++ и мне просто нужно узнать тонкости синтаксиса в JS по этому вопросу.
Ответить с цитированием
  #9 (permalink)  
Старый 17.11.2013, 13:47
Аватар для ixth
Профессор
Отправить личное сообщение для ixth Посмотреть профиль Найти все сообщения от ixth
 
Регистрация: 19.01.2010
Сообщений: 354

Ок. Короче, смотри: то, что написано в документации Метрики про ключи, видимо, имеет отношение к интерфейсу Метрики. Т.е. она выводит товары, сортируя их по name, id или что там еще… Ты никак не заставишь массив объектов отдавать тебе элемент по какому-либо ключу, кроме индекса. Так что тебе придется либо обращаться по порядковому номеру, как к обычному массиву, либо, опять же, проходить по всему массиву и искать в нем объект со значением name, которое совпадает с тем, что тебе нужно.
Ответить с цитированием
  #10 (permalink)  
Старый 17.11.2013, 14:24
Интересующийся
Отправить личное сообщение для frenzy Посмотреть профиль Найти все сообщения от frenzy
 
Регистрация: 07.03.2013
Сообщений: 25

Тоесть конструкция должна быть, типа такой:
if (yaParams.goods[0].name == 'Мой товар - test') { yaParams.goods[0].price = GETArr.order_price; }

Ну еще цикл прохода по массиву, если бы это был не еденичный товар, а корзина, так?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Управление скроллом "а-ля тач" HonesT Элементы интерфейса 2 27.08.2013 14:25
вызов ф-ции обработчика как метода объекта FanAizu Общие вопросы Javascript 5 23.08.2013 15:52
dynatree.jquery - как получть доступ к родительскому узлу. ast-ross jQuery 0 23.03.2009 18:39
как узнать тип значения объекта? VHS Общие вопросы Javascript 1 07.01.2009 23:57
как выполнить движение объекта scuter Элементы интерфейса 5 08.06.2008 23:57