Просчет цены опций на странице категорий

Тема в разделе "Общие вопросы", создана пользователем dofus, 24 дек 2022.

  1. dofus

    dofus Пользователь

    Сообщения:
    85
    Симпатии:
    1
    Друзья, всем привет!
    Появилась интересная задача, с которой я мучаюсь и не могу справиться

    В карточке товара считается цена этого товара. Основная цена равна 0, и все остальное складывается из опций. До меня уже это все реализовали через js и все работает в карточке

    Шаблон product.tpl и калькулятор в JS прикладываю


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

    Помогите пожалуйста
     

    Вложения:

    • product.tpl
      Размер файла:
      88,1 КБ
      Просмотров:
      1
    • calc_for.zip
      Размер файла:
      2,7 КБ
      Просмотров:
      1
  2. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
  3. Иван Николаев

    Иван Николаев Пользователь

    Сообщения:
    108
    Симпатии:
    7
    Здравствуйте. Вам необходимо найти в контроллере товара функцию, которая отвечает за расчёт стоимости товара и добавить её в контроллер категории. Затем вывести опции товара в категории.
     
  4. dofus

    dofus Пользователь

    Сообщения:
    85
    Симпатии:
    1
    Здравствуйте, делал так.
    Добавлял в контролер код отвечающий за опции, добавлял в тпл файл кусок кода отвечающий за опции, но у ничего не сработало. Может есть какая то инструкция хотя бы для дефолтных решений
     
  5. dofus

    dofus Пользователь

    Сообщения:
    85
    Симпатии:
    1
    Спасибо видел, но первоначально хотелось бы без платных решений т.к. сайт не мой и платить не очень хотелось бы
     
  6. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Тогда нужно делать как написали. Открывать исходный код и добавлять расчёты в контроллер и вьюху.
     
  7. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Ну и как бы там товары за полляма и больше продаются, неужели 750 рублей такая большая цена? Плюс ещё немножко автору за переделку под вёрстку.
     
  8. dofus

    dofus Пользователь

    Сообщения:
    85
    Симпатии:
    1
    Я думаю владелец исходит из принципа копейка рубль бережет
    Я исхожу из принципа "не помешает для общего развития", да и не я продаю за полляма))
     
  9. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Учитывая маржу, скорее всего, первая продажа отобъёт весь сайт (если приобретать модули) и ещё прибыль останется. И все последующие это уже прибыль. В такой ситуации как бы...

    Ну или делайте и присылайте конкретные примеры кода и что у вас получилось, а что нет. Бесплатно переносить весь функционал никто не будет.
     
  10. dofus

    dofus Пользователь

    Сообщения:
    85
    Симпатии:
    1
    Да я прекрасно понимаю, что это бред, жалеть такие деньги, но увы и ах) В своем проекте я слава богу не жалею денег на дополнения)

    Что сделал:
    В controller/category.php

    Перед
    Код:
    $data['products'][] = array(
    Добавил
    Код:
    $options= array();
    
                    foreach ($this->model_catalog_product->getProductOptions($result['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']) {
                                    $oprice = $this->currency->format($this->tax->calculate($option_value['price'], $result['tax_class_id'], $this->config->get('config_tax') ? 'P' : false));
                                } else {
                                    $oprice = 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'                   => $this->model_tool_image->resize($option_value['image'], 50, 50),
                                    'price'                   => $oprice,
                                    'price_prefix'            => $option_value['price_prefix']
                                );
                            }
                        }
    
                        $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'      => $options,

    Далее...
     
  11. Иван Николаев

    Иван Николаев Пользователь

    Сообщения:
    108
    Симпатии:
    7
    Инструкции нет. Видимо что-то не добавили.
     
  12. dofus

    dofus Пользователь

    Сообщения:
    85
    Симпатии:
    1
    Далее....
    Были непонятки с файлами шаблонов, т.к. в папке было несколько фалов category.tpl, я так думаю это фишка шаблона Lightshop
    В папке были:
    category.tpl
    category_list.tpl
    category_main.tpl
    category_popup.tpl
    category_table.tpl

    Начал по очереди менять в файлах $price на тест "Поле цены" и нашел, что используется category_main.tpl
    В этот файл после
    Код:
    <?php if ($product['special']) { ?>
                                                <span class="catalogue__price-old catalogue__price-old--sm">TEST</span>
                                                <span class="catalogue__price catalogue__price--sm">TEST</span>
                                            <?php } else { ?>  
                                                <span class="catalogue__price catalogue__price--sm">Поле цены</span>
                                            <?php } ?>
    Вставил
    Код:
    <?php if ($options) { ?>
                                <?php $t = 1;// $mode = 1; ?>
                                <?php foreach ($options as $i=> $option) { ?>
                                    <?php if (!$option['required']) { continue; } ?>
                                    <?php if ($t%2 != 0 || $optMode) { ?>
                                   
                                <div class="product-page__actions">
                                    <?php } ?>
                                    <!--  <?php if ($option['type'] == 'radio') { ?>
                                    <div class="product-page__input-box">
                                        <span class="product-page__input-box-title"><?php echo ($option['required'] ? '<span style="color: red;">* </span>' : ''); ?><?php echo $option['name']; ?></span>
                                        <div id="input-option<?php echo $option['product_option_id']; ?>">
                                        <?php foreach ($option['product_option_value'] as $option_value) { ?>
                                            <?php if ($option_value['image']) { ?>
                                            <div class="radiobox-colors__list-item option-value-id-<?php echo $option_value['option_value_id']; ?>">
                                                <input type="radio" name="option[<?php echo $option['product_option_id']; ?>]" value="<?php echo $option_value['product_option_value_id']; ?>" id="close-type-<?php echo $option_value['product_option_value_id']; ?>">
                                                <label title="<?php echo $option_value['name']; ?>" for="close-type-<?php echo $option_value['product_option_value_id']; ?>" class="label label--img-<?php echo $option_value['product_option_value_id']; ?>"></label>
                                            </div>
                                            <?php } else { ?>
                                            <div class="product-page__radio-box option-value-id-<?php echo $option_value['option_value_id']; ?>">
                                                <input type="radio" name="option[<?php echo $option['product_option_id']; ?>]" value="<?php echo $option_value['product_option_value_id']; ?>" id="close-type-<?php echo $option_value['product_option_value_id']; ?>">
                                                <label for="close-type-<?php echo $option_value['product_option_value_id']; ?>">
                                                <?php echo $option_value['name']; ?>
                                                <?php if ($option_value['price']) { ?>
                                                \ <?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>
                                                <?php } ?>              
                                                </label>
                                            </div>
                                            <?php } ?>
                                         <?php } ?>
                                        </div>
                                    </div>
                                    <?php } ?> -->
                                    <?php if ($option['type'] == 'checkbox') { ?>
                                    <div class="product-page__input-box">
                                        <!-- <span class="product-page__input-box-title"><?php echo ($option['required'] ? '<span style="color: red;">* </span>' : ''); ?><?php echo $option['name']; ?></span> -->
                                        <div id="input-option<?php echo $option['product_option_id']; ?>">
                                        <?php foreach ($option['product_option_value'] as $option_value) { ?>
                                            <?php if ($option_value['image']) { ?>
                                            <div class="radiobox-colors__list-item option-value-id-<?php echo $option_value['option_value_id']; ?>">
                                                <input type="checkbox" name="option[<?php echo $option['product_option_id']; ?>][]" value="<?php echo $option_value['product_option_value_id']; ?>" id="close-type-<?php echo $option_value['product_option_value_id']; ?>">
                                                <label title="<?php echo $option_value['name']; ?>" for="close-type-<?php echo $option_value['product_option_value_id']; ?>" class="label label--img-<?php echo $option_value['product_option_value_id']; ?>"></label>
                                            </div>
                                            <?php } else { ?>
                                            <!-- <div class="product-page__radio-box option-value-id-<?php echo $option_value['option_value_id']; ?>">
                                                <input type="checkbox" name="option[<?php echo $option['product_option_id']; ?>][]" value="<?php echo $option_value['product_option_value_id']; ?>" id="close-type-<?php echo $option_value['product_option_value_id']; ?>">
                                                <label for="close-type-<?php echo $option_value['product_option_value_id']; ?>">
                                                <?php echo $option_value['name']; ?>
                                                <?php if ($option_value['price']) { ?>
                                                \ <?php echo $option_value['price_prefix']; ?><?php echo $option_value['price']; ?>
                                                <?php } ?>              
                                                </label>
                                            </div> -->
                                            <?php } ?>
                                         <?php } ?>
                                        </div>
                                    </div>
                                    <?php } ?>                          
                                <?php } ?>
                            <?php } ?>
    И в конце файла cayegory.tpl подключил тот же калькулятор js что и на странице product.tpl
    Код:
    <script src="catalog/view/javascript/theme_lightshop/calc_for.js?v1.9.132"></script>
    Вместо "Поле цены" в category_main.tpl поставил
    Код:
    <span id="summary_price"></span>
    Как и в product.tpl

    ИТОГ: не произошло ничего вообще!) Опций не видно, цена стоит только у первой карточки
     
    Последнее редактирование: 24 дек 2022
  13. Blast

    Blast Продвинутый пользователь

    Сообщения:
    209
    Симпатии:
    72
    вряд ли кто-то будет разбираться в этой простыне, тут не мелочь какая-то.
    из того, что явно - это использование одного идентификатора summary_price
    даже если все правильно считается, то js запишет в первый. переписывать на классы нужно
     
  14. dofus

    dofus Пользователь

    Сообщения:
    85
    Симпатии:
    1
    А если в админке, у каждого товара для каждой опции есть чекбокс, которым мы указываем какая опция у нас по умолчанию, и за счет этих опций по умолчанию мы и считаем первоначальную цену в калькуляторе.
    Можем ли мы в админке проссумировать эти опции по умолчанию и отдельным столбцом записать в базу для товаров?
    Что бы дальше это вывести для каждого товара на страницу категорий?
     
  15. Blast

    Blast Продвинутый пользователь

    Сообщения:
    209
    Симпатии:
    72
    ну вполне возможный вариант
     
    dofus нравится это.
  16. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Ещё как вариант в контроллере, где добавляете $options, просто считайте суммы, там же у вас в основном добавление (без всяких вычитаний и процентов). И записывайте в поле price товара перед выводом в шаблоне, всё равно у вас в странице каталога нет быстрого добавления в корзину. Тогда и скрипт расчёта не нужен будет.
     
    dofus нравится это.
  17. dofus

    dofus Пользователь

    Сообщения:
    85
    Симпатии:
    1
    Идея хорошая, но есть такое что у одной опции несколько вариантов, и каждый вариант имеет свою стоимость. То есть правильней будет все таки отфильтровать варианты по умолчанию.
    Но я если честно даже не знаю как это все начать делать и откуда подойти.
    Если кто-то подскажет хотя бы кратко что и где искать и делать, буду очень сильно благодарен)
     
  18. dofus

    dofus Пользователь

    Сообщения:
    85
    Симпатии:
    1
    Пришли к немного костыльному, но все же решению)
    В БД делаем SQL запрос
    Код:
    CREATE TABLE 'oc_product_option_value_sum' AS SELECT
        product_id,
        SUM(price)
    FROM
        `oc_product_option_value_test` AS option_select_sum
    WHERE
        option_select = 1
    GROUP BY
        product_id
    И далее планировалось переменной вывести на страницу категорий

    в model/category.php
    Сразу после
    Код:
    class ModelCatalogCategory extends Model {
        public function getCategory($category_id) {
            $query = $this->db->query("SELECT DISTINCT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.category_id = '" . (int)$category_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1'");
    
            return $query->row;
        }
    Добавил
    Код:
    public function getSelectPrice() {
        $select_price = array();
            $query = $this->db->query("SELECT * FROM oc_product_option_value_sum");
    
            foreach ($query->rows as $result) {
                    $query->rows = $result;
        }
      
        return $query->rows;
        }

    В controller/category.php
    После
    Код:
    $data['products'] = array();
    
                $filter_data = array(
                    'filter_name'         => $search,
                    'filter_tag'          => $tag,
                    'filter_description'  => $description,
                    'filter_sub_category' => $sub_category,
                    'filter_category_id' => $category_id,
                    'filter_filter'      => $filter,
                    'min_price'             => $min_price,
                    'max_price'             => $max_price,
                    'sort'               => $sort,
                    'order'              => $order,
                    'start'              => ($page - 1) * $limit,
                    'limit'              => $limit
                );
    
                $product_total = $this->model_catalog_product->getTotalProducts($filter_data);
                
    
                $results = $this->model_catalog_product->getProducts($filter_data);
                
    
                $data['product_total'] = $product_total;
    Добавил
    Код:
    $data['select_price'] = $this->model_catalog_product->getSelectPrice();
    Ну и в category.tpl
    Код:
    <?php echo $product['select_price']; ?> р.</span>
    В БД все просчиталось, все ок, а вот на странице ничего не отражается

    Кто подскажет где я повернул не туда?
     
  19. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Создайте поле decimal (15,4) с дефолтным значением 0.0000 (чтобы добавление товара не отваливалось и прочие моменты) не в отдельной таблице, а в таблице oc_product. И когда выводите товары в категории используйте это поле. Ну и переодически перерасчитывайте значения. А так у вас какая-то отдельная таблица, при этом вы подтягиваете все данные, а не текущей страницы пейджинга, и в выводе как-то странно. Поля select_price нет в таблице product, это про строку:

     
  20. devimirochnik

    devimirochnik Продвинутый пользователь

    Сообщения:
    730
    Симпатии:
    100
    Ну или переписывайте getProducts, чтобы там join был с текущей таблицей и подтягивалось поле select_price