Добавьте товар в корзину на странице, отличной от магазина

Мы используем программное обеспечение Odoo 12 для предприятий.

Мы хотим воспроизвести поведение кнопки «добавить в корзину» на страницах товаров. Итак, мы хотим добавить кнопку на другую страницу, и когда вы нажимаете кнопку, вы добавляете продукт в корзину и перенаправляетесь в корзину. Продукт жестко привязан к этой кнопке.

Это форма, используемая в шаблоне страницы продукта:

       <form t-if="product._is_add_to_cart_possible()" action="/shop/cart/update" method="POST">
          <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
          <div class="js_product js_main_product">
            <t t-placeholder="select">
              <input type="hidden" class="product_id" name="product_id" t-att-value="product_variant.id"/>
              <input type="hidden" class="product_template_id" name="product_template_id" t-att-value="product.id"/>
              <t t-if="first_possible_combination" t-call="sale.variants">
                <t t-set="ul_class" t-value="'flex-column'"/>
                <t t-set="parent_combination" t-value="None"/>
              </t>
              <t t-else="">
                <ul class="d-none js_add_cart_variants" t-att-data-attribute_exclusions="{'exclusions: []'}"/>
              </t>
            </t>
            <t t-call="website_sale.product_price"/>
            <p t-if="True" class="css_not_available_msg alert alert-warning">This combination does not exist.</p>
            <a role="button" id="add_to_cart" class="btn btn-primary btn-lg mt8 js_check_product a-submit" href="#">Add to Cart</a>
          </div>
        </form>

Информация о нашем продукте: product.id = 135 и product_template.id = 83.

Я обнаружил, что javascript, отвечающий за добавление в корзину, вызывается с использованием: /web/content/.../.../web.assets_frontend.js. Это очень большой файл, но вы можете проверить пример здесь: file.

Какой qweb / form / js / ... я должен добавить на свою пользовательскую страницу, чтобы добавить продукт в корзину?

Спасибо за любую помощь, я давно на этом застрял!

Изменить: как заметил @Philippe Pageau, я уже могу использовать некоторый код, чтобы получить правильный продукт. Я пробовал реализовать его с помощью формы, используя этот код (самая простая версия формы, которую я могу придумать):

      <t t-set="products" t-value="request.env['product.product'].search([['id', '=', 135]])"/>
        <t t-foreach="products" t-as="product">
          <form action="/shop/cart/update" method="POST">
             <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
             <input type="hidden" class="product_id" name="product_id" value="135"/>
             <input type="hidden" class="product_template_id" name="product_template_id" value="83"/>
             <a role="button" id="add_to_cart" class="btn btn-primary btn-lg mt8 js_check_product a-submit" href="#">Add to Cart</a>
          </form>
      </t>

Но это ничего не делает, что мне не хватает?

Edit2:

Благодаря @Adan Cortes мы продвинулись дальше, но осталась еще одна проблема.

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

Теперь это мой код:

<t t-set="products" t-value="request.env['product.product'].search([['id', '=', 135]])"/>
      <t t-foreach="products" t-as="product">
        <div id="product_detail" class="oe_website_sale">
          <form action="/shop/cart/update" method="POST">
              <h4 t-esc="product.name"/>
              <h6 t-esc="product.price"/>
              <input class="form-control" data-min="1" name="add_qty" value="1"/>
              <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
              <input type="hidden" class="product_id" name="product_id" value="135"/>
              <a role="button" id="add_to_cart" class="btn btn-primary btn-lg mt8 js_check_product a-submit" href="#">Add to Cart</a>
          </form>
        </div>
      </t> 

Но это мои последние проблемы:

  • Этот код не показывает цену товара. <h6 t-esc="product.price"/> отображает 0.00. Итак, как я могу отобразить цену?

  • Наконец, можно ли добавить сразу несколько продуктов, используя только 1 кнопку и форму?


person Daan Seuntjens    schedule 29.07.2019    source источник


Ответы (2)


Следующий код работает:

<div id="product_detail" class="oe_website_sale">
    <form action="/shop/cart/update" method="POST">
        <input type="hidden" name="csrf_token" t-att-value="request.csrf_token()"/>
        <input type="hidden" class="product_id" name="product_id" value="135"/>
        <a role="button" id="add_to_cart" class="btn btn-primary btn-lg mt8 js_check_product a-submit" href="#">Add to Cart</a>
    </form>
</div>

Но помните, что использование идентификатора базы данных делает ваш модуль непригодным для использования где-либо еще. Вам лучше использовать xmlids.

Соответствующий код JavaScript, которого вам не хватало, находится по адресу:

<path_to_v12>/addons/website_sale/static/src/js/website_sale.js

135 sAnimations.registry.WebsiteSale = sAnimations.Class.extend(ProductConfiguratorMixin, {
136     selector: '.oe_website_sale',
137     read_events: {
138         'change form .js_product:first input[name="add_qty"]': '_onChangeAddQuantity',
139         'mouseup .js_publish': '_onMouseupPublish',
140         'touchend .js_publish': '_onMouseupPublish',
141         'change .oe_cart input.js_quantity[data-product-id]': '_onChangeCartQuantity',
142         'click .oe_cart a.js_add_suggested_products': '_onClickSuggestedProduct',
143         'click a.js_add_cart_json': '_onClickAddCartJSON',
144         'click .a-submit': '_onClickSubmit',
145         'change form.js_attributes input, form.js_attributes select': '_onChangeAttribute',
146         'mouseup form.js_add_cart_json label': '_onMouseupAddCartLabel',
147         'touchend form.js_add_cart_json label': '_onMouseupAddCartLabel',
148         'click .show_coupon': '_onClickShowCoupon',
149         'submit .o_website_sale_search': '_onSubmitSaleSearch',
150         'change select[name="country_id"]': '_onChangeCountry',
151         'change #shipping_use_same': '_onChangeShippingUseSame',
152         'click .toggle_summary': '_onToggleSummary',
153         'click input.js_product_change': 'onChangeVariant',
154         'change .js_main_product [data-attribute_exclusions]': 'onChangeVariant',
155     },

и <path_to_v12>/addons/website_sale/static/src/js/website_sale_tracking.js

  5 sAnimations.registry.websiteSaleTracking = sAnimations.Class.extend({
  6     selector: '.oe_website_sale',
  7     read_events: {
  8         'click form[action="/shop/cart/update"] a.a-submit': '_onAddProductIntoCart',
  9         'click a[href="/shop/checkout"]': '_onCheckoutStart',
 10         'click div.oe_cart a[href^="/web?redirect"][href$="/shop/checkout"]': '_onCustomerSignin',
 11         'click form[action="/shop/confirm_order"] a.a-submit': '_onOrder',
 12         'click form[target="_self"] button[type=submit]': '_onOrderPayment',
 13     },

Отредактировано для добавления

Данные формы обрабатываются и отправляются следующим контроллером:

<path_to_v12>/addons/website_sale/controllers/main.py

414     @http.route(['/shop/cart/update'], type='http', auth="public", methods=['POST'], website=True, csrf=False)
415     def cart_update(self, product_id, add_qty=1, set_qty=0, **kw):
416         """This route is called when adding a product to cart (no options)."""
418         sale_order = request.website.sale_get_order(force_create=True)
419         if sale_order.state != 'draft':
420             request.session['sale_order_id'] = None
421             sale_order = request.website.sale_get_order(force_create=True)
422 
423         product_custom_attribute_values = None
424         if kw.get('product_custom_attribute_values'):
425             product_custom_attribute_values = json.loads(kw.get('product_custom_attribute_values'))
426 
427         no_variant_attribute_values = None
428         if kw.get('no_variant_attribute_values'):
429             no_variant_attribute_values = json.loads(kw.get('no_variant_attribute_values'))
430 
431         sale_order._cart_update(
432             product_id=int(product_id),
433             add_qty=add_qty,
434             set_qty=set_qty,
435             product_custom_attribute_values=product_custom_attribute_values,
436             no_variant_attribute_values=no_variant_attribute_values
437         )
438         return request.redirect("/shop/cart")
person Adan Cortes    schedule 05.09.2019
comment
Это уже отлично работает! Но у меня есть несколько дополнительных переменных, которые я хотел бы добавить: 1. Могу ли я добавить определенное количество? 2. Могу ли я добавить сразу несколько игр, используя одну и ту же форму? 3. Могу ли я добавить в корзину, но не перенаправлять на страницу корзины? Я обязательно проведу исследование сам, но если вы знаете эти ответы на макушке, я был бы очень признателен :) - person Daan Seuntjens; 06.09.2019
comment
1. Да, можно; 2 и 3. Вы должны заблокировать контроллер. - person Adan Cortes; 09.09.2019

Насколько я понимаю, вам нужно запросить продукт, поскольку он запрашивает не только продукт, но и шаблон.

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

<t t-set="products" t-value="request.env['product.product'].search([])/>
<t t-foreach="products" t-as="product">
<!-- your code here -->
</t>

Для поиска определенного продукта

.search(['id', '=', yourId])

Обратите внимание, что он вернет вам массив даже с указанным идентификатором

person Philippe Pageau    schedule 12.08.2019
comment
Я помогаю впервые, поэтому не стесняйтесь спрашивать больше или рассказывать мне, что я не понял в вопросе. - person Philippe Pageau; 12.08.2019