Задать вопрос
Контакты
Местоположение
Россия, Чувашия, Чебоксары

Наибольший вклад в теги

Все теги (10)

Лучшие ответы пользователя

Все ответы (10)
  • Микрофон на компе включён постоянно, как это пресечь?

    dv1zhok
    @dv1zhok
    Freelancer
    У меня использовал микрофон этот процесс: хост-процесс для служб windows
    Помогло это видео: https://www.youtube.com/watch?v=xjqh_Tt-3mI
    Ответ написан
    1 комментарий
  • Как вывести опции товара в корзине?

    dv1zhok
    @dv1zhok Автор вопроса
    Freelancer
    Антон Р. Pashok Doom Спасибо за советы!
    Получилось реализовать сделав следующее:
    1. Вносим изменения в контроллер /checkout/cart.php:
    Перед строкой:
    if ($this->cart->hasProducts() || !empty($this->session->data['vouchers'])) {

    Добавляем:
    $this->load->model('catalog/product');

    Далее после строки:
    $option_data = array();
    Добавляем код:
    $product_options = array();
                    $product_info = $this->model_catalog_product->getProduct($product['product_id']);
    
                    foreach ($this->model_catalog_product->getProductOptions($product['product_id']) as $option) {
                        $product_option_value_data = array();
    
                        foreach ($option['product_option_value'] as $option_value) {
                            if (!$option_value['subtract'] || ($option_value['quantity'] > 0)) {
                                if ((($this->config->get('config_customer_price') && $this->customer->isLogged()) || !$this->config->get('config_customer_price')) && (float)$option_value['price']) {
                                    $price = $this->currency->format($this->tax->calculate($option_value['price'], $product_info['tax_class_id'], $this->config->get('config_tax') ? 'P' : false), $this->session->data['currency']);
                                } else {
                                    $price = false;
                                }
    
                                $product_option_value_data[] = array(
                                    'product_option_value_id' => $option_value['product_option_value_id'],
                                    'option_value_id' => $option_value['option_value_id'],
                                    'name' => $option_value['name'],
                                    'image' => $option_value['image'] ? $this->model_tool_image->resize($option_value['image'], 16, 16) : '',
                                    'price' => $price,
                                    'price_raw' => round($option_value['price']),
                                    'price_prefix' => $option_value['price_prefix']
                                );
                            }
                        }
    
                        $product_options[] = array(
                            'product_option_id' => $option['product_option_id'],
                            'product_option_value' => $product_option_value_data,
                            'option_id' => $option['option_id'],
                            'name' => $option['name'],
                            'type' => $option['type'],
                            'value' => $option['value'],
                            'required' => $option['required']
                        );
                    }


    В массив:
    $data['products'][] = array(

    Добавляем:
    'options' => $product_options,

    Находим строки:
    foreach ($this->request->post['quantity'] as $key => $value) {
      $this->cart->update($key, $value);
    }


    Заменяем на:
    $this->cart->update($this->request->post['key'], $this->request->post['quantity'], $this->request->post['option']);


    Во вьюхе /checkout/cart.tpl выводим опции так же, как они выводятся на странице товара.

    Далее нужно отредактировать JS файл, отвечающий за обновление данных корзины, а конкретно функцию update, что бы выглядела следующим образом:
    'update': function(key, quantity, option) {
            $.ajax({
                url: 'index.php?route=checkout/cart/edit',
                type: 'post',
                data: 'key=' + key + '&quantity=' + (typeof(quantity) != 'undefined' ? quantity : 1) + '&option=' + option,
                dataType: 'json',
                beforeSend: function() {
                    $('#cart > button').button('loading');
                },
                complete: function() {
                    $('#cart > button').button('reset');
                },
                success: function(json) {
                    // Need to set timeout otherwise it wont update the total
                    setTimeout(function () {
                        $('#cart > button').html('<span id="cart-total"><i class="fa fa-shopping-cart"></i> ' + json['total'] + '</span>');
                    }, 100);
    
                    if (getURLVar('route') == 'checkout/cart' || getURLVar('route') == 'checkout/checkout') {
                        location = 'index.php?route=checkout/cart';
                    } else {
                        $('#cart > ul').load('index.php?route=common/cart/info ul li');
                    }
                },
                error: function(xhr, ajaxOptions, thrownError) {
                    alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText);
                }
            });
        },

    Отредактировать JS код, передающий параметры функции cart.update, что бы так же передавались опции.

    И отредактировать запрос в базу, (файл system/library/cart/cart.php) отвечающий за обновление данных в корзине. Изначально он выглядит так:
    public function update($cart_id, $quantity) {
    		$this->db->query("UPDATE " . DB_PREFIX . "cart SET quantity = '" . (int)$quantity . "' WHERE cart_id = '" . (int)$cart_id . "' AND api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'");
    	}

    Меняем на:
    public function update($cart_id, $quantity, $option) {
    		$this->db->query("UPDATE " . DB_PREFIX . "cart SET quantity = '" . (int)$quantity . "', `option` = '" . $this->db->escape(json_encode($option)) . "' WHERE cart_id = '" . (int)$cart_id . "' AND api_id = '" . (isset($this->session->data['api_id']) ? (int)$this->session->data['api_id'] : 0) . "' AND customer_id = '" . (int)$this->customer->getId() . "' AND session_id = '" . $this->db->escape($this->session->getId()) . "'");
    	}


    Этого достаточно для вывода и обновлений опций товара в таблице корзины вашей базы данных.

    Для обновления корзины нужно писать еще код, но т.к. у меня все кастомное, то он не подойдет к стандартным файлам opencart/ocstore.
    Ответ написан
    Комментировать
  • Как сделать поэкранный скролл с переходом в обычный?

    dv1zhok
    @dv1zhok Автор вопроса
    Freelancer
    Решил с помощью методов и коллбэков fullpage.js.:

    Отлавливаем событие onLeave, как одну из опций, в нем условие:
    onLeave: function(origin, destination, direction){
    	if (origin.index == 2 && direction =='down') {
    		fullpage_api.setAutoScrolling(false);
    	} else {
    		fullpage_api.setAutoScrolling(true);
    	}
    }

    Получается следующее: Если долистали до 3 слайда и идвижение скролла вниз, методом setAutoScrolling(false) отключаем поэкранный скролл и ставим пролистывание страницы как обычно. Иначе - наоборот.

    UPD: Т.к. многие пишут в ЛС по поводу решения, добавляю еще 1 вариант, который в итоге я использовал:
    new fullpage('#fullpage', {
      licenseKey: 'OPEN-SOURCE-GPLV3-LICENSE',
      scrollBar: true,
      fitToSection: true,
      fitToSectionDelay: 300,
      verticalCentered: true,
      normalScrollElements: '.main-container' //Контейнер с обычным скроллом
    });
    Ответ написан
    1 комментарий
  • Как в flex / grid блоке привязать последний блок к нижней части основного?

    dv1zhok
    @dv1zhok
    Freelancer
    Можно сделать на flex: https://codepen.io/dv1zhok/pen/yLNgmXr
    Ответ написан
    Комментировать

Лучшие вопросы пользователя

Все вопросы (9)