Курс 2016 года “Разработка на UMI.CMS от 0 до готового сайта”

0 Пользователей и 2 Гостей просматривают эту тему.

*

volchov

  • *
  • 7
  • +0/-0
    • Просмотр профиля
задача - мне нужно добавлять товары из каталога без перезагрузки.
Вопрос как это сделать?
Метод описанный в wiki.umisoft не работает. Файла по адресу site/_common.js

не существует. папки такой вообще нет.
Я сделал собственную реализацию на ajax, сейчас у меня товары добавляются без перезагрузки, но вот как обновить товары в корзине??
 по идее мне нужен скрипт который выводит товары, то есть который отвечает за вывод %total-amount% и %total-price%
« Последнее редактирование: 09 Октября 2012, 16:51:57 от volchov »

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
В заголовке темы сказано, что нужно выводить товары корзины отдельным скриптом. Для этого нужно выполнить макрос emarket/cart, далее отпарсить его - можно получить json, можно XML, как будет удобно.

Далее вопрос - как добавить товары без перезагрузки. Посмотрите демо-магазин, там это уже реализовано. Реализовано заморочено, но разобраться можно.

Если Вы добавляете товары в корзину своим методом, а в корзине они у Вас не появляются - то не понятно куда они добавляются в таком случае.

Макрос, который выводит товары и отвечает за общее количество и стоимость находится в emarket/__purchasing.php , поиском по коду можно найти функции getAmount() и т.п., собственно они это и формируют.

Не понятно, что именно не получается.

*

volchov

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Я примерно понял, буду пробовать, спасибо за ответ!Я реализовал так

$.ajax({
         type: "GET",
         url: "/emarket/basket/put/element/%id%/",
         data: {"vp": vp},
         cache: false,
         success: function(response){
            
                
              }})

просто отправил аяксом по ссылке с айди

в корзину все прекрасно добавлятся, но естественно появляется в корзине при перезагрузке страницы. я имею в виду ту корзину которая висит на каждой странице магазина.

теперь думаю как обновить саму корзину. на демо магазине добаление товаров реализовано на xlst, а мне нужно на tpl.

Можете подсказать где взять функцию которая будет обновлять содержимое корзины?

если нет, то мне очень помог бы следующий скрипт

отдельный php файл в котором выведены 1- количество товаров в корзине и 2- общая сумма. я бы его содержимое подгрузил бы аяксом в нужный див.


но как собрать такой файл из файлов юми я представляю


« Последнее редактирование: 10 Октября 2012, 01:42:00 от volchov »

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Можно посмотреть как это сделано в стандартном магазине - там это сделано на мой взгляд заморочено, понять трудновато. Я до конца не понимаю, тем не менее какие-то изменения вношу. :)

Получается, что нужно отпарсить общее количество товаров и общую сумму.

Для этого нужно отпарсить udata/emarket/cart как xml или json, достать оттуда summary.ammount и summary.price.actual (ну и может ещё валюта нужна будет и т.п.).
localhost/udata/emarket/cart.json

Получается, что после добавления товара в корзину, при обработке ответа, нужно сделать ещё один запрос к корзине и получить описанные выше значения.

Далее пойдёт конкретная отсебятина, возможно это можно сделать иначе:

   xhttp=new XMLHttpRequest();
   xhttp.open('GET','http://localhost.ru/udata/emarket/cart.json',true);
   xhttp.send();
   xhttp.onreadystatechange=function(){
      if (xhttp.readyState==4){
         
         var json=eval( '('+xhttp.responseText+')' );


Далее нужно смотреть отладчиком как возвращается json и соответственно обрабатывать. К примеру json.summary.amount можно получить прямо так, а внутри price возможно придётся погулять - я что-то забыл как правильно получить доступ к элементам в таком случае..
Для вывода property протокола upage я запускал дважды цикл. первый цикл у меня бегал по group, а второй уже собственно по property. путь к конечному элементы выглядел где-то так: test.page.properties.group[key].property[key1].value.item.name , где test этот json

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Мои изыски на mootools вам вряд ли помогут, но общую идею предложу.
Скорее всего, речь идет о кратком представлении корзины с указанием общего количества товаров и общей суммы которое отображается на каждой странице сайта. Так?
Скорее всего, это небольшой див. Так?
тогда, может быть, не стоит забивать себе голову поиском чего-то там в xml и json, а по-простому вызывать аяксом макрос emarket cart и обновлять весь div целиком?
Нужно написать свой макрос-обертку, который принимает имя шаблона, передает его штатному макросу корзины, полученный результат отдает через def_module::flush($result);

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Можно ещё вынести эти значения в отдельный макрос, ну и соотствтенно парсить будет явно проще. :)

*

volchov

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Ок, это то мне и нужно. Мне нужно создать отдельную страницу, на которой будет вызываться содержимое корзины. Вопрос в том, как создать эту страницу

по сути мне нужно

<?php

//как сюда вставить все обработчики которые обрабатывают макрос??

%emarket_cart%


?>


а уже к этому файлу обратится по аякс не проблема

*

Rodogor

  • ***
  • 189
  • +24/-0
    • Просмотр профиля
Если пытаться вставить ajax-ом отдельную страницу с корзиной - это реально решение задачи, но это не рационально.
Уже есть макрос и соответственно страница udata/emarket/cart. Можно получить в формате json.

*

Vladimir

  • ****
  • 279
  • +48/-0
    • Просмотр профиля
Нет) Вам не нужна отдельная страница. Вам нужен кастомный макрос. И совсем не нужен json, абсолютно не нужен.
Рассуждаем еще раз. Вы работаете в tpl. Шаблон корзины у вас уже есть. Этот шаблон отрабатывает при перезагрузке страницы и встроен в шаблон страницы.
Логично, что обновить содержимое корзины аяксом можно вызвав тот же самый шаблон корзины, получить от него готовый html (НЕ json), и этот html вставит в div-обертку.

Как это сделать.
Возможно, вы знаете, но повторюсь. В ЮМИ можно обращаться к макросам как к url. Например, %emarket cart()%  равен /emarket/cart/
Т.о., необходимо всего лишь аяксом отправить запрос на определенный url и получить ответ. url вам известен - это макрос.
К сожалению, штатный макрос корзины принимает имя шаблона только как параметр функции, по http его передать нельзя. Более того, результат будет отдан в оформлении основного шаблона дизайна.  Нам это не подходит.
Поэтому напишем совй кастомный макрос-обертку. Он будет делать:
- принять имя шаблона как GET-параметр
- вызвать штатный макрос
- вернуть результат в чистом виде, без внешнего дизайна.

Выглядеть такой макрос может так:
public function simpleCart(){
$template = htmlspecialchars(getRequest('template'));
if(!$template) $template = 'default';
$mMarket = cmsController::getInstance()->getModule('emarket');
$cart = $mMarket->cart($template);
def_module::flush($cart);
}
Далее добавить для него разрешения в файл permissions.php (или permissions.custom.php, смотря по тому используете ли вы старый или новый шаблонизатор) в ветку purchasing.
Обращаетесь /emarket/simpleCart/?template=top_cart
Задача решена.

Как отправить запрос на квери я не знаю, но раз вы ее используете, проблем у вас быть не должно
Демо http://autonomno.ru/emarket/simpleCart/?template=top_cart

З.Ы.
Что мне здесь не нравится, что при указании неверного имени шаблона раскрывается полный путь на сервере. Было бы интересно узнать как по имени шаблона в юми  версии 2.8.5 узнать полный путь к нему и проверить на существование.

*

admin

  • *****
  • 2444
  • +172/-1
    • Просмотр профиля
Vladimir, по поводу узнать полный путь к шаблону по его имени

$resourcesDir = cmsController::getInstance()->getResourcesDirectory()

в $resourcesDir будет путь к /templates/название_шаблона/ если у текущей страницы назначен именной шаблон иначе данная переменная будет пуста

volchov, по поводу вашей проблемы, на самом деле для tpl абсолютно точно также можно применить механизм /js/site/__common.js. Ну чтобы самому не придумывать. загляните сюда, там выложены материалы с моего курса по езд http://education.umi-cms.ru/information/tpl_advanced/. Скачайте презентацию с курса , там первая же тема описывает как это сделать или может даже на видео видно, что я там рассказывал по поводу подключения данного скрипта к сайту

*

volchov

  • *
  • 7
  • +0/-0
    • Просмотр профиля
Все супер работает Владимир! Спасибо!