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

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

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Доброго времени суток.

По дизайну сделано, что список товаров из каталога, являются частью корзины.

Есть список товаров каталога в виде checkbox, которые выбираются и "добавляются" в корзину, так же выбирается кол-во.
А ниже сразу же заполняются данные: ФИО, Телефон, E-mail и Способ оплаты...

Как можно реализовать это в обход привычных шагов? Какие запросы и как использовать?
Просто такой не стандартный вид  :(

Приложу скриншот дизайна...

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Доброго времени суток.

Попыталась сделать вот такое

Сперва я для примера вывела форму по типу данных, которые относятся к Абонементам, у меня это 185.
<xsl:apply-templates select="document('udata://data/getCreateForm/185/notemplate/(cenovye_svojstva)')/udata" mode="to-pay-form"/>
Я так поняла, могу создать форму с соответствующими полями и просто сюда вызвать так?

А вот дальше пошел на мой взгляд бред, но я просто не смогла придумать ничего другого
(это всего второй раз когда я делаю интернет магазин, и то он не стандартный)

Обращаюсь к методу getCreateForm
Пока оставляю group/field, вызов полей у меня получился, но пока они мне не нужны (надо понять нужна сюда отдельная форма или нет)
И добавила вызов корзины.

<xsl:template match="udata[@method='getCreateForm']" mode="to-pay-form">
<form class="to-pay-form" enctype="multipart/form-data" method="post" action="/{udata/group/@lang}/emarket/getOneClickOrder/">

<xsl:apply-templates select="document('udata://emarket/cart')/udata" mode="to-pay-cart" /> <!-- вызвала корзину -->


<xsl:apply-templates select="group/field" mode="to-pay-field"/> <!-- пока просто висит, не использовала -->

</form>
</xsl:template>

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

В итоге в корзине, когда ничего выбрано изначально я сделала вызов каталога >_<
	<xsl:template match="udata[@method = 'cart']" mode="to-pay-cart" >
<div class="delivery_address_c">
<div class="basket">
<xsl:apply-templates select="document(concat('udata://catalog/getSmartCatalog/notemplate/',(639),'///10/'))/udata" mode="season-tickets-cart" />
</div>
</div>
</xsl:template>

<!-- КАТАЛОГ ДЛЯ РАЗДЕЛА ОПЛАТИТЬ -->
<xsl:template match="udata[@method='getSmartCatalog']" mode="season-tickets-cart" >
<p>Выберите услуги:</p>
<xsl:apply-templates select="lines/item" mode="getSmartCatalog-cart" />
</xsl:template>

<xsl:template match="item" mode="getSmartCatalog-cart">
<xsl:if test="not(document(concat('upage://', @id, '.coming_soon'))//value)">
<label>
<input class="checkbox" type="checkbox" name="checkbox" />
<input type="button" class="choose-btn" value="выбрать" required="required" />
<div class="form-group month-section">
<input type="text" value="{amount}" class="amount" />
<input type="hidden" value="{amount}" />
<span class="change-amount">
<img class="top" src="/templates/zvezdydetyam/images/amount-top.png"/>
<img class="bottom" src="/templates/zvezdydetyam/images/amount-bottom.png"/>
</span>
</div>
<span class="label">
Абонемент
<xsl:value-of select="document(concat('upage://', @id, '.h1'))//value" />
<xsl:text> </xsl:text>
<xsl:text>(1 месяц - </xsl:text>
<xsl:value-of select="document(concat('upage://', @id, '.price'))//value" />
<xsl:text> </xsl:text>
<xsl:value-of select="$currency-prefix" />
<xsl:value-of select="$currency-suffix" />
<xsl:text>.)</xsl:text>
</span>
</label>
</xsl:if>
<xsl:if test="document(concat('upage://', @id, '.coming_soon'))//value">
<label class="disable">
<span class="label">
Абонемент
<xsl:text> </xsl:text>
<xsl:value-of select="document(concat('upage://', @id, '.h1'))//value" />
</span>
</label>
</xsl:if>
</xsl:template>
<!-- ///КАТАЛОГ ДЛЯ РАЗДЕЛА ОПЛАТИТЬ -->


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

   
<xsl:template match="udata[@method = 'cart'][count(items/item) &gt; 0]" mode="to-pay-cart" >
<div class="basket">
<p>Выберите услуги:</p>

<xsl:apply-templates select="items/item" mode="to-pay-cart-item" />

<div class="cart-buttons">
<a href="{$lang-prefix}{$purchase-method}" class="basket_purchase size2 more btn btn-default confirmation-btn">
<xsl:text>подтвердить</xsl:text>
</a>
</div>
</div>
</xsl:template>

<xsl:template match="udata[@method = 'cart']//item" mode="to-pay-cart-item" >
<label class="cart_item_{@id}">
<input class="checkbox" type="checkbox" name="checkbox" />
<input type="button" class="choose-btn" value="выбрать" required="required" />

<div class="form-group month-section">
<input type="text" value="{amount}" class="amount" />
<input type="hidden" value="{amount}" />
<span class="change-amount">
<img class="top" src="/templates/zvezdydetyam/images/amount-top.png"/>
<img class="bottom" src="/templates/zvezdydetyam/images/amount-bottom.png"/>
</span>
</div>

<span class="label">
<xsl:value-of select="@name" />
<xsl:text> </xsl:text>
<xsl:text>(1 месяц - </xsl:text>
<xsl:value-of select="price/actual | price/original" />
<xsl:text> </xsl:text>
<xsl:value-of select="$currency-prefix" />
<xsl:value-of select="$currency-suffix" />
<xsl:text>.)</xsl:text>
</span>
</label>
</xsl:template>

<xsl:template match="udata[@method = 'cart']/summary">

<xsl:apply-templates select="price/delivery[.!='']" mode="cart" />

<div class="size2 tfoot">
<xsl:text></xsl:text>
<xsl:value-of select="$currency-prefix" />
<xsl:text> </xsl:text>
<span class="cart_summary size3">
<xsl:apply-templates select="price/actual" />
</span>
<span>
<xsl:text> </xsl:text>
<xsl:value-of select="$currency-suffix" />
<xsl:text>.</xsl:text>
</span>
</div>
</xsl:template>

<xsl:template match="delivery[.!='']" mode="cart">
<div class="info">
<xsl:text></xsl:text>
<xsl:value-of select="$currency-prefix" />
<xsl:text> </xsl:text>
<xsl:value-of select="." />
<xsl:text> </xsl:text>
<xsl:value-of select="$currency-suffix" />
</div>
</xsl:template>

Сумма работает, кол-во тоже работает, подтверждение даже проходит при заполненной корзине.

НО как совместить это!? Т___Т
Как сделать, чтобы при 0 выбранных абонементов, список каталога не пропадал, а при нажатие на кнопку "Выбрать" товар добавлялся/удалялся?
Или что именно надо доработать в php чтобы такое было?

*

admin

  • *****
  • 2443
  • +172/-1
    • Просмотр профиля
Sumrakrnd, я бы предложил немного другой подход.

По сути у вас 2 задачи:
- положить товары в корзину в указанном кол-ве
- заполнить информацию необходимую для оформления заказа и оформить его.

Я бы предложил сделать это так:
- список товаров, которые можно купить и поля типа кол-ва вывести макросом для вывода товаров catalog getSmartCatalog()
- поля для ввода персональной информации и прочей информации важной для заказа (способ оплаты на вашем скриншоте) через макрос emarket purchasing_one_step()

Это позволит вам получить именно ту картинку, как вы и приложили в вашем вопросе.

Далее, осталось решить вопрос, как соединить функционал добавление\изменение кол-ва товара в корзине и сохранение данных для заказа на одной странице.
Тут есть несколько похожих вариантов, но я бы остановился на таком:
- все манипуляции с товарами типа отметка товара (фактически добавление товара в корзину), изменение его кол-ва или отмена выбора товара (фактически удаление товара из корзины) делать через js механизм работы с корзиной. То есть, отметил товар - через js положил его в корзину, изменил кол-во - через js изменил кол-во в корзине и т.д.
- оформление корзины происходит при нажатии на кнопку "подтвердить". При этом в корзине уже что-то лежит, а поля с информацией о заказе оформлены.

P.S. чтобы макрос emarket purchasing_one_step() не выводил вам поля для доставки, в настройках модуля "Интернет-магазин" отключите этот шаг.

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Sumrakrnd, я бы предложил немного другой подход.

По сути у вас 2 задачи:
- положить товары в корзину в указанном кол-ве
- заполнить информацию необходимую для оформления заказа и оформить его.

Я бы предложил сделать это так:
- список товаров, которые можно купить и поля типа кол-ва вывести макросом для вывода товаров catalog getSmartCatalog()
- поля для ввода персональной информации и прочей информации важной для заказа (способ оплаты на вашем скриншоте) через макрос emarket purchasing_one_step()

Это позволит вам получить именно ту картинку, как вы и приложили в вашем вопросе.
Т.е. просто сделать вывод каталога через getSmartCatalog, как я сделала (но не там немного), а в <xsl:template match="udata[@method = 'cart'][count(items/item) &gt; 0]"/> и там же сделать запрос на вывод purchasing_one_step() ?

Тогда метод getCreateForm не нужен, так?


Далее, осталось решить вопрос, как соединить функционал добавление\изменение кол-ва товара в корзине и сохранение данных для заказа на одной странице.
Тут есть несколько похожих вариантов, но я бы остановился на таком:
- все манипуляции с товарами типа отметка товара (фактически добавление товара в корзину), изменение его кол-ва или отмена выбора товара (фактически удаление товара из корзины) делать через js механизм работы с корзиной. То есть, отметил товар - через js положил его в корзину, изменил кол-во - через js изменил кол-во в корзине и т.д.
- оформление корзины происходит при нажатии на кнопку "подтвердить". При этом в корзине уже что-то лежит, а поля с информацией о заказе оформлены.
А какой js относится к корзине получается?
Можно тогда будет выбирать/убирать товар и менять его кол-во сразу находясь в корзине, так?



P.S. чтобы макрос emarket purchasing_one_step() не выводил вам поля для доставки, в настройках модуля "Интернет-магазин" отключите этот шаг.
Это я отключила =)

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
О еще!

Можно сделать, чтобы в полном описании товара, нажимая на кнопку приобрести не менялась надпись "добавлено в корзину <кол-во>", а чтобы перекидывало в корзину?

А то я нашла такой способ под tpl, попробовала перековырять его на xslt, но что-то пошло не так ><

*

admin

  • *****
  • 2443
  • +172/-1
    • Просмотр профиля
Цитировать
Т.е. просто сделать вывод каталога через getSmartCatalog, как я сделала (но не там немного), а в <xsl:template match="udata[@method = 'cart'][count(items/item) &gt; 0]"/> и там же сделать запрос на вывод purchasing_one_step() ?

Тогда метод getCreateForm не нужен, так?

Метод getCreateForm не нужен
Я представлял, что верхний список товаров (на вашем скрине) это и есть список всех возможных товаров к покупке. То есть, это выглядит как корзина, но по сути просто вывод каталога через шаблон, который к каждому товару дорисовывает поля для ввода кол-ва и через js реализуется механизм покупки.

Цитировать
А какой js относится к корзине получается?
Можно тогда будет выбирать/убирать товар и менять его кол-во сразу находясь в корзине, так?
Механизм работы с корзиной через js сделанный umi'вцами лежит в файле /templates/demodizzy/js/basket.js

Цитировать
Можно сделать, чтобы в полном описании товара, нажимая на кнопку приобрести не менялась надпись "добавлено в корзину <кол-во>", а чтобы перекидывало в корзину?
этот механизм также лежит в функции replace в фале /templates/demodizzy/js/basket.js



*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Сейчас попробую переделать xslt.

И отпишусь чего получится =)

Спасибо *^_^*

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
Я бы предложил сделать это так:
- список товаров, которые можно купить и поля типа кол-ва вывести макросом для вывода товаров catalog getSmartCatalog()
- поля для ввода персональной информации и прочей информации важной для заказа (способ оплаты на вашем скриншоте) через макрос emarket purchasing_one_step()

Вывод каталога сделала в корзине, но вот что-то у меня пошло не так с emarket purchasing_one_step()....

Вот делаю запрос на корзину и на покупку в один шаг:

<xsl:apply-templates select="document('udata://emarket/cart')/udata" mode="to-pay-cart" />
<xsl:apply-templates select="document('udata://emarket/purchasing_one_step')" mode="one-step-cart" />
Я так поняла его внутри корзины делать нельзя... >< (пробовала вообще ничего тогда не выводит по этому запросу)


Это вывод каталога, если товары не выбраны:
	<xsl:template match="udata[@method = 'cart']" mode="to-pay-cart" >
<form class="to-pay-form" enctype="multipart/form-data" method="post" action="/{udata/group/@lang}/emarket/getOneClickOrder/">
<div class="delivery_address_c">
<div class="basket">
<!--<h4 class="empty-content"></h4><p></p>-->

<!-- КАТАЛОГ ДЛЯ РАЗДЕЛА ОПЛАТИТЬ без выбранного в корзину -->
<div class="form-group">
<p>Выберите услуги:</p>
<xsl:apply-templates select="document(concat('udata://catalog/getSmartCatalog/notemplate/',(639),'///10/'))/udata" mode="season-tickets-cart" />
</div>
<!-- //КАТАЛОГ ДЛЯ РАЗДЕЛА ОПЛАТИТЬ без выбранного в корзину -->

</div>
</div>
</form>
</xsl:template>

<xsl:template match="udata[@method='getSmartCatalog']" mode="season-tickets-cart" >
<xsl:apply-templates select="lines/item" mode="getSmartCatalog-cart" />
</xsl:template>

<xsl:template match="item" mode="getSmartCatalog-cart">
<xsl:if test="not(document(concat('upage://', @id, '.coming_soon'))//value)">
<label>
<input class="checkbox" type="checkbox" name="checkbox" />
<input type="button" class="choose-btn" value="выбрать" required="required" />
<div class="form-group month-section">
<input type="text" value="{amount}" class="amount" />
<input type="hidden" value="{amount}" />
<span class="change-amount">
<img class="top" src="/templates/zvezdydetyam/images/amount-top.png"/>
<img class="bottom" src="/templates/zvezdydetyam/images/amount-bottom.png"/>
</span>
</div>
<span class="label">
Абонемент
<xsl:value-of select="document(concat('upage://', @id, '.h1'))//value" />
<xsl:text> </xsl:text>
<xsl:text>(1 месяц - </xsl:text>
<xsl:value-of select="document(concat('upage://', @id, '.price'))//value" />
<xsl:text> </xsl:text>
<xsl:value-of select="$currency-prefix" />
<xsl:value-of select="$currency-suffix" />
<xsl:text>.)</xsl:text>
</span>
</label>
</xsl:if>
<xsl:if test="document(concat('upage://', @id, '.coming_soon'))//value">
<label class="disable">
<span class="label">
Абонемент
<xsl:text> </xsl:text>
<xsl:value-of select="document(concat('upage://', @id, '.h1'))//value" />
</span>
</label>
</xsl:if>
</xsl:template>
<!-- ///КАТАЛОГ ДЛЯ РАЗДЕЛА ОПЛАТИТЬ -->

Это вывод каталога если выбран товар:
Цитировать
   <xsl:template match="udata[@method = 'cart'][count(items/item) &gt; 0]" mode="to-pay-cart" >
      <form class="to-pay-form" enctype="multipart/form-data" method="post" action="/{udata/group/@lang}/emarket/getOneClickOrder/">
         <div class="basket">
            <div class="form-group">
               <p>Выберите услуги:</p>
               
               <!-- каталог -->
               <xsl:apply-templates select="document(concat('udata://catalog/getSmartCatalog/notemplate/',(639),'///10/'))/udata" mode="season-tickets-cart" />
               
               <!-- корзина -->
               <xsl:apply-templates select="items/item" mode="to-pay-cart-item" />
            </div>
            
            <div class="summary">
               <xsl:apply-templates select="summary" />
            </div>
            <div class="cart-buttons">
               <a href="{$lang-prefix}{$purchase-method}" class="basket_purchase size2 more btn btn-default confirmation-btn">
                  <xsl:text>подтвердить</xsl:text>
               </a>
            </div>
         </div>
      </form>
   </xsl:template>

   <xsl:template match="udata[@method = 'cart']//item" mode="to-pay-cart-item" >
      <label class="cart_item_{@id}">
         <input class="checkbox" type="checkbox" name="checkbox" />
         <input type="button" class="choose-btn" value="выбрать" required="required" />
         
         <div class="form-group month-section">
            <input type="text" value="{amount}" class="amount" />
            <input type="hidden" value="{amount}" />
            <span class="change-amount">
               <img class="top" src="/templates/zvezdydetyam/images/amount-top.png"/>
               <img class="bottom" src="/templates/zvezdydetyam/images/amount-bottom.png"/>
            </span>
         </div>
         
         <span class="label">
            <xsl:value-of select="@name" />
            <xsl:text> </xsl:text>
            <xsl:text>(1 месяц - </xsl:text>
            <xsl:value-of select="price/actual | price/original" />
            <xsl:text> </xsl:text>
            <xsl:value-of select="$currency-prefix" />
            <xsl:value-of select="$currency-suffix" />
            <xsl:text>.)</xsl:text>
         </span>
      </label>
   </xsl:template>


А вот я вывела onestep:
Цитировать
   <xsl:template match="result[@module = 'emarket' and @method = 'purchasing_one_step'][udata/onestep]" mode="one-step-cart" >
      <form class="without-steps" action="/emarket/saveInfo" method="POST">
         <xsl:apply-templates select="udata/onestep/customer" />
         <xsl:apply-templates select="udata/onestep/payment" />
         <input type="submit" value="подтвердить" class="button big" />
      </form>
   </xsl:template>
   
   <xsl:template match="result[@module = 'emarket' and @method = 'purchasing_one_step']/udata/onestep/customer">
      <div class="customer onestep">
         <xsl:apply-templates select="document(concat('udata://data/getEditForm/', @id))" />
      </div>
   </xsl:template>
   
   <xsl:template match="result[@module = 'emarket' and @method = 'purchasing_one_step']/udata/onestep/payment" />
   <xsl:template match="result[@module = 'emarket' and @method = 'purchasing_one_step']/udata/onestep/payment[items/item]">
      <div class="payment onestep">
         <h4>Способ оплаты:</h4>
         <xsl:apply-templates select="items/item" mode="payment_one_step" />
      </div>
   </xsl:template>
   

Выводить только: 0 1


Что не так? Т_Т

*

Sumrakrnd

  • ****
  • 311
  • +1/-0
  • Учусь «на примерах»
    • Просмотр профиля
А скажите, где описывается функция
basket.putElement(id, options, this.replace(id));

В basket.js она вызывается только. Надо просто убрать замену на слово добавить

*

e.ioffe

  • ****
  • 369
  • +81/-2
  • Профессиональная разработка на UMI.CMS.
    • Просмотр профиля
    • Fullspace - Лучший хостинг для UMI.CMS
/js/client/basket.js
Ускорение сайта на UMI.CMS - http://speed.umispec.ru/