[Помогите] изменить стиль Нет в наличии

Тема в разделе "OpenCart", создана пользователем maetus, 1 апр 2021.

  1. maetus

    maetus

    Регистрация:
    24 фев 2013
    Сообщения:
    241
    Симпатии:
    60
    такой вопрос

    как можно сделать стилизацию сообщения когда того

    нет в наличии - что бы цвет текста был красным

    предзаказ - цвет текста был оранжевый



    catalog/view/theme/oct_feelmart/template/product/product.twig

    вот код который отвечает за вывод этих сообщений

    PHP:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock{% if out_of_stock %} fm-out-of-stock{% endif %}">{{ text_stock }} <span class="fm-product-left-top-info-is">{{ stock }}</span></li>
    но в текстовых файлах не нашел

    подскажите как можно стилизовать и добавить перед текстом иконку

    [​IMG]

    если пред заказ то вот так вот выводить

    [​IMG]
     
  2. Deniurg

    Deniurg

    Регистрация:
    1 апр 2021
    Сообщения:
    6
    Симпатии:
    1
  3. maetus

    maetus

    Регистрация:
    24 фев 2013
    Сообщения:
    241
    Симпатии:
    60
    получается эта строка кода - тянет названия из админки из Список состояния на складе.
    как можно это изменить?
     
    Последнее редактирование: 2 апр 2021
  4. Deniurg

    Deniurg

    Регистрация:
    1 апр 2021
    Сообщения:
    6
    Симпатии:
    1
    Как можно изменить что? Если текст надписи - то лучше найти откуда она берется (языковые файлы или таблица в базе данных и там подправить). Конечно возможно поменять текст и в шаблоне используя функцию replace https://twig.symfony.com/doc/3.x/filters/replace.html. Но мне кажется это неправильный подход.
    Если оформление - то используйте возможности CSS. Если товара нет в наличии то у элемента будет стиль fm-out-of-stock.
     
    Последнее редактирование: 2 апр 2021
  5. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    посмотрите, выводится ли в контроллере переменная:
    Код:
    $data['stock_status_id'] = $product_info['stock_status_id'];
    если нет, то выведите где то в контексте
    PHP:
    if ($product_info) {
    потом подсмотрите в "Настрйки --> Локализация --> Состояние на складе" номер stock_status_id состояния "Нет в наличии" (обычно это 5)
    теперь в самом твиг файле, сделайте небольшое сравнение:
    HTML:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock{% if stock_status_id == 5 %} fm-out-of-stock{% endif %}">
    ну и стили соотв. добавьте для класса:
    Код:
    fm-out-of-stock
     
  6. Deniurg

    Deniurg

    Регистрация:
    1 апр 2021
    Сообщения:
    6
    Симпатии:
    1
    Полагаю, что в контроллере уже есть проверки на наличие товара на складе и даже вывод локализованной строки для соответствующего состояния наличия:
    Код:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock{% if out_of_stock %} fm-out-of-stock{% endif %}">{{ text_stock }} <span class="fm-product-left-top-info-is">{{ stock }}</span></li>
    Если на на странице выводятся разные строки товаров, которые есть на складе и отсутствуют, то остается только подправить CSS для вывода соответствующей иконки и цвета надписи. А вот для статуса предзаказ вероятно потребуется модификация контроллера как предложил Васо.
     
    Baco нравится это.
  7. maetus

    maetus

    Регистрация:
    24 фев 2013
    Сообщения:
    241
    Симпатии:
    60

    в контроллере
    вот такой вот код есть

    Код:
    if ($product_info['quantity'] <= 0) {
                    $data['stock'] = $product_info['stock_status'];
                } elseif ($this->config->get('config_stock_display')) {
                    $data['stock'] = $product_info['quantity'];
                } else {
                    $data['stock'] = $this->language->get('text_instock');
                }
    но если я делаю так как вы написали то вообще ничего не происходит просто остается пустое поле
     
  8. Deniurg

    Deniurg

    Регистрация:
    1 апр 2021
    Сообщения:
    6
    Симпатии:
    1
    Этот фрагмент заполняет значение поля stock, которое в шаблоне тоже выводится:
    <span class="fm-product-left-top-info-is">{{ stock }}</span>
    В начале темы вы написали, что требуется стилизовать надписи и добавить иконки. Я правильно понимаю, что надписи "Нет в наличии" и "Предзаказ" на сайте у вас сейчас выводятся?
     
  9. maetus

    maetus

    Регистрация:
    24 фев 2013
    Сообщения:
    241
    Симпатии:
    60
    Выводятся и стилизуются надписи без вмешательства (в контроллер, текстовый файл и сам файл вывода) это "Нет в наличии" и "В наличии"
    --- Добавлено, 2 апр 2021 ---
    нашел вот такое вот решение

    вот такое вот в контроллере прописывать
    PHP:
    if ($product_info['quantity'] <= 0) {
                        
    $data['stock'] = $this->language->get('text_outstock');
                } elseif (
    $this->config->get('config_stock_display')) {
                        
    $data['stock'] = $product_info['quantity'];
                } elseif (
    $product_info['quantity'] >= AND $product_info['quantity'] <= 3) {
                        
    $data['stock'] = $this->language->get('text_minstock');
                } else {
                        
    $data['stock'] = $this->language->get('text_instock');
                }
    ниже в массиве:
    $data['products'][] = array(
    'stock' => $data['stock'],

    еще такой вопрос можно ли прописать вот в этой строке
    что бы когда в поле колличество было число с минусом как пример ( -10 до -1000 )
    то автоматически проставлялось "Предзаказ"

    но никак не могу разобраться с выводом
    HTML:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock{% if out_of_stock %} fm-out-of-stock{% endif %}">{{ text_stock }} <span class="fm-product-left-top-info-is">{{ stock }}</span></li>
    что и как здесь прописать
     
    Последнее редактирование: 2 апр 2021
  10. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    алгоритм очень простой, просто следуй по всем шагам и получиш результат:
    0. найдите метод в модели товара (catalog\model\catalog\product.php):
    PHP:
    public function getProduct($product_id) {
    1. там находим фрагмент в коде:
    PHP:
    'stock_status'     => $query->row['stock_status'],
    2. после него добавляем:
    PHP:
    'stock_status_id'  => $query->row['stock_status_id'],
    3. сохраняем, закрываем.
    4. в контроллере товара, находим участок кода (catalog\controller\product\product.php):
    PHP:
    if ($product_info['quantity'] <= 0) {
    5. ПЕРЕД ним добавляем:
    PHP:
    $data['stock_status_id'] = $product_info['stock_status_id'];
    6. сохраняем, закрываем.
    7. открываем представление (въюшку) твиг-файла (catalog\view\theme\ВАША_ТЕМА\template\product\product.twig):
    8. меняем этот код:
    HTML:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock{% if out_of_stock %} fm-out-of-stock{% endif %}">{{ text_stock }} <span class="fm-product-left-top-info-is">{{ stock }}</span></li>
    на вот этот:
    HTML:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock{% if stock_status_id == 5 %} fm-out-of-stock{% endif %}">{{ text_stock }} <span class="fm-product-left-top-info-is">{{ stock }}</span></li>
    9. сохраняем, закрываем, наслаждаемся.
     
    Zulus и $iD нравится это.
  11. maetus

    maetus

    Регистрация:
    24 фев 2013
    Сообщения:
    241
    Симпатии:
    60
    Спасибо за подробное описание. есть нюанс - сделал все как вы написали.

    но статус "В наличии" и "Нет в наличии" по стилям абсолютно одинаковы

    [​IMG]
    [​IMG]


    можете есть возможность прописать разные условия с добавление класса
    к примеру это - "Нет в наличии"
    {% if stock_status_id == 5 %} fm-out-of-stock

    есть "в наличии"
    {% if stock_status_id == 7 %} fm-in-stock

    если "предзаказ"
    {% if stock_status_id == 8 %} fm-pre-order-stock
     
  12. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    есть, вы разве не экспериментировали ? на данный момент
    PHP:
    {% if out_of_stock %}
    зависит непосредственно от кол-ва товара, а нет от статуса товара. который вы к админке прикрутили, если вам нужно конкретно под кол-во сделать логическую операцию, тогда нужно в контроллере товара реализовать новый блок (или отредактировать со статусом):
    PHP:
                if ($product_info['quantity'] <= 0) {
                    
    $data['stock_style'] = 'fm-out-of-stock';
                } elseif (
    $product_info['stock_status_id'] == 8) {
                    
    $data['stock_style'] = 'fm-pre-order-stock';
                } else {
                    
    $data['stock_style'] = 'fm-in-stock';
                }
    а в твиг-файле вывести вместо:
    HTML:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock{% if out_of_stock %} fm-out-of-stock{% endif %}">{{ text_stock }} <span class="fm-product-left-top-info-is">{{ stock }}</span></li>
    
    вот такую вот разметку с переменной:
    HTML:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock {{ stock_style }}">{{ text_stock }} <span class="fm-product-left-top-info-is">{{ stock }}</span></li>
     
    Zulus и $iD нравится это.
  13. maetus

    maetus

    Регистрация:
    24 фев 2013
    Сообщения:
    241
    Симпатии:
    60
    получилось реализовать данную задумку следующим образом (благодаря советам Baco )

    получилась вот так
    catalog/controller/product/product.php

    вместо этого кода
    PHP:
    if ($product_info['quantity'] <= 0) {
                    
    $data['stock'] = $product_info['stock_status'];
                } elseif (
    $this->config->get('config_stock_display')) {
                    
    $data['stock'] = $product_info['quantity'];
                } else {
                    
    $data['stock'] = $this->language->get('text_instock');
                }
    вот этот

    PHP:
    if ($product_info['quantity'] == 0) {
                   
    $data['stock'] = $this->language->get('text_outstock');
                   
    $data['stock_style'] = 'fm-outstock';

             } elseif (
    $product_info['quantity'] == -100 AND $product_info['stock_status_id'] == 8) {
                
    $data['stock'] = $this->language->get('text_preorderstock');
                
    $data['stock_style'] = 'fm-preorderstock';   
           
             } elseif (
    $this->config->get('config_stock_display')) {
                
    $data['stock'] = $product_info['quantity'];

             } else {
                
    $data['stock'] = $this->language->get('text_instock');
                
    $data['stock_style'] = 'fm-instock';
    }
    catalog/language/ru-ru/product/product.php
    HTML:
    $_['text_instock']             = '<i class="far fa-check-circle"></i>В наличии';
    $_['text_outstock']        = '<i class="far fa-times-circle"></i>Нет в наличии';
    $_['text_preorderstock']     = '<i class="fas fa-truck-loading"></i>Предзаказ';
    catalog/view/theme/*/template/product/product.twig
    заменил
    PHP:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock{% if out_of_stock %} fm-out-of-stock{% endif %}">{{ text_stock }} <span class="fm-product-left-top-info-is">{{ stock }}</span></li>
    на
    PHP:
    <li class="fm-product-left-top-info-item fm-product-left-info-item-stock {{ stock_style }}">{{ text_stock }} <span class="fm-product-left-top-info-is">{{ stock }}</span></li>
     
    Baco нравится это.