Перейти к содержанию

belkin-labs

Пользователи
  • Постов

    12
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Сообщения, опубликованные belkin-labs

  1. Здравствуйте!

    В аддоне есть следующая функция (это реализация хука):

    function fn_ab__seo_filters_ab__as_other_objects(&$objects) {
        $seo_pages_fixed = Registry::ifGet('addons.ab__seo_filters.add_to_sitemap', 'none');
        $seo_filters = ABSF::_get_names_for_sitemap($seo_pages_fixed);
        if($seo_pages_fixed == 'none') {
            return false;
        }
        if(fn_allowed_for('ULTIMATE') && !Registry::get('runtime.simple_ultimate') && fn_get_runtime_company_id() == 0) {
            return false;
        }
        switch($seo_pages_fixed) {
            case 'fixed': $cond = db_quote('AND n.fixed=?s', ABSFConfigs::PAGE_STATE_FIXED);
                break;
            case 'unfixed': $cond = db_quote('AND n.fixed=?s', ABSFConfigs::PAGE_STATE_UNFIXED);
                break;
            default: $cond = db_quote('AND n.fixed != ?s', ABSFConfigs::PAGE_STATE_HIDDEN);
        }
        if(fn_allowed_for('ULTIMATE')) {
            $cond .= fn_get_company_condition('c.company_id');
        }
        $seo_filters = db_get_hash_array('SELECT DISTINCT n.sf_id,n.category_id,n.features_hash,n.fixed
    FROM ?:ab__sf_names n
    INNER JOIN ?:ab__sf_name_descriptions nd ON (n.sf_id=nd.sf_id)
    INNER JOIN ?:categories c ON (c.category_id=n.category_id)
    WHERE 1 AND c.status=\'A\' ?p ?p
    ORDER BY n.category_id asc', 'sf_id', $cond, fn_get_company_condition('n.company_id'));
        if(!empty($seo_filters)) {
            $seo_filters = fn_ab__sf_filter_seo_pages_without_prods($seo_filters);
            $objects['ab__seo_filter'] = $seo_filters;
        }
    }

     

    У меня крайне серьезное подозрение, что вот этот вызов не нужен:

    $seo_filters = ABSF::_get_names_for_sitemap($seo_pages_fixed);

    После этого вызова переменная $seo_filters нигде не используется. Ей только присваивается новое значение.

    И класс ABSF тоже нигде не используется.

    --------------------------------
    Этот вопрос для меня крайне важен, ибо вот эта строчка отжирает 10 секунд времени, а у моего клиента 78 витрин и каждая секунда при обновлении карты сайта на счету.

     

    Спасибо

  2. Спойлер

    Вот вижу следующий код для прохождения таблицы порциями:

     

            if($settings['include_products'] == 'Y') {
                $step_limit = 1000;
                $products_loaded = 0;
                $join = ' INNER JOIN ?:products_categories ON ?:products_categories.product_id = ?:products.product_id INNER JOIN ?:categories ON ?:categories.category_id = ?:products_categories.category_id AND ?:categories.status IN ("A", "H") ';
                $condition = '?:products.status = "A" ';
                $condition .= fn_allowed_for('MULTIVENDOR') ? fn_get_company_condition('?:products.company_id') : fn_get_company_condition('?:categories.company_id');
                if($settings['exclude_products'] == 'without_amount') {
                    $condition .= ' AND ?:products.amount > 0';
                } elseif($settings['exclude_products'] == 'without_price') {
                    $join .= ' INNER JOIN ?:product_prices AS pp ON pp.product_id = ?:products.product_id AND pp.lower_limit = 1 AND pp.usergroup_id = 0';
                    $condition .= ' AND pp.price > 0';
                } elseif($settings['exclude_products'] == 'without_amount_and_price') {
                    $join .= ' INNER JOIN ?:product_prices AS pp ON pp.product_id = ?:products.product_id AND pp.lower_limit = 1 AND pp.usergroup_id = 0';
                    $condition .= ' AND (?:products.amount > 0 OR pp.price > 0)';
                }
                fn_set_hook('ab__as_get_products', $settings, $join, $condition);
                $products_count = db_get_field('SELECT COUNT(DISTINCT ?:products.product_id) FROM ?:products ?p WHERE ?p', $join, $condition);
                while($products_count > $products_loaded) {
                    $limit = min($products_count, $step_limit);
                    $products = db_get_fields('SELECT ?:products.product_id FROM ?:products ?p WHERE ?p GROUP BY ?:products.product_id LIMIT ?i, ?i', $join, $condition, $products_loaded, $limit);
                    $products_loaded += $limit;
                    while(!empty($products)) {
                        $product = array_shift($products);
                        $links = fn_ab__as_generate_links('product', $product, $languages);
                        $item = fn_ab__as_print_sitemap_item($links);
                        fn_ab__as_check_counter($file, $filename, $sitemap_links_counter, $sitemap_file_counter, $links, $file_header, $file_footer);
                        fwrite($file, $item);
                    }
                }
            }

     

     

    Хочу предложить вам очень простой и отлично зарекомендовавший себя алгоритм по прохождению таблицы порциями.

    В нем не нужно подсчитывать количество записей в таблице:

     

    $step = 1;  // для того, чтобы можно было начинать не сначала
    $count = 500; // размер порции в записях
    $limit = ($step-1)*$count;  // Начальный лимит
    $i = $step; // $i можно использовать в качестве отсылки к конкретному номеру шага.
       while (1) {
           $codes = db_get_array("SELECT product_code FROM ?:products ORDER BY product_code LIMIT $limit,$count");
           do_smth_with_codes($codes);
    
           if (count($codes) < $count) {
                 break;  // Заканчиваем цикл
           }
           $i++;           // Это информационная переменная
           $limit+=$count; // Вот то, что меняется в цикле
       }

     

  3. @belkin-labs Ну мой клиент остался недоволен тем, что я сделал и мне пришлось выяснить, откуда берется эта переменная  $show_amount_label

     

    Никакой настройки для нее нет!

    Задумана она для того, чтобы не показывать промпт "В наличии" там, где для него нет места, а именно в скроллах, в категориях и в некоторых других местах. Для этого переменной дается значение false в кодах шаблона.

     

    На шаблоне карточки товара default_template по идее этот промпт должен быть в ключен. Но он выключается в шаблоне /design/themes/abt__unitheme2/templates/views/products/view.tpl, что неправильно.

    И я думаю, это уже исправлено в новых версиях темы.

     

  4. Никто не знает, как и где это включается/отключается.

    Но в шаблоне есть системная переменная $show_amount_label

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

    Если есть переменная - значит скорее всего есть настройка.
    Я к сожалению не могу искать (пока) откуда эта переменная появляется и где она приобретает значение. У меня в моменте нет времени. Да и вообще нет. Этот поиск может затянуться на часы. Я думаю вы сами это знаете. Программировать cs-cart то еще удовольствие для фрилансера.
    Клиент мне эти поиски точно не оплатит.

    Так или иначе я поставил указанный if  в шаблоне и все, вроде бы работает как надо. И слава Богу. Хреново будет, если после обновления темы мне придется опять этот if вставлять. Но будем надеяться на лучшее!!! А что еще остается?

  5. Лейблом я называю не тег, а предложение "В наличии"
    Возможно правильный термин Промпт. 

     

    Не знаю, причем здесь стикер.
    Ключевым является то, что я написал в поправке, а именно, 


    Мы отключаем показ промпта  "В наличии:" и он везде отключается, а в этом конкретном месте он не отключается.

    Вот вам скрин, который мне прислал клиент, когда задачу ставил.

     

    Снимок экрана от 2023-05-24 18-07-13.png

  6. @belkin-labs Поправка!

    Должен быть выключен режим показа лейбла "В наличии:"
    то есть на тех товарах, у которых наличие есть, надо чтобы показывалось не 
    В Наличии 2 шт, а просто 2 шт.

    Это и есть значение переменной $show_amount_label

     

    То есть баг заключается только в том, что мы отключаем показ лейбла "В наличии:" и он везде отключается, а в этом конкретном месте он не отключается.

     

  7. 1. Нужно любому товару поставить наличие 0

    2. В секции "Наличие", в поле "Действие при отсутствии товара в наличии" выбрать Предзаказ

    3. Должен быть включен режим показа лейбла В наличии: 10 штук (не знаю, где это включается)


    3. Зайти в карточку этого товара на фронте.

    4. Увидеть под ценой зеленую надпись "В наличии: Предзаказ" 

     

    Но вообще там в шаблоне везде, где встречается 

    <span class="ty-qty-in-stock ty-control-group__item">{__("availability")}:</span>

    Этот спан стоит в указанном if. И только в одном месте этого if нет. Вот поэтому и приходит на ум, что везде поставили, а тут просто забыли.

  8. Описание проблемы:

     

    Заголовок лейбла "Доступность" не реагирует на параметр шаблона show_amount_label

    Это же выражается в эффекте типа "В наличии: предзаказ"

     

    Код:

    product_data.tpl

     

    -------------------------------------------

    <div class="product-list-field">

        <span class="ty-qty-in-stock ty-control-group__item">{__("availability")}:</span>

        <span id="qty_in_stock_{$obj_prefix}{$obj_id}" class="ty-qty-in-stock ty-control-group__item">

    ------------------------------------------------

     

    Исправленный код:

     

    ------------------------------------------

    <div class="product-list-field">

                  {if $show_amount_label}

                          <span class="ty-qty-in-stock ty-control-group__item">{__("availability")}:</span>

                  {/if}

    ----------------------------------------

    Видимо забыли if поставить.

  9. Привет, коллеги!

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

     

    Файл:
    /design/themes/abt__unitheme2/templates/blocks/list_templates/grid_list.tpl

     

    Код:
    {if $show_features || $show_descr}

                                        {if empty($block.properties)  && $settings.abt__ut2.product_list.$tmpl.show_content_on_hover[$settings.abt__device] == "YesNo::NO"|enum && !$native_scroller}

    Суть бага:
    Условие  empty($block.properties) не выполняется, ибо в массиве присутствует пустой элемент с ключом  abt__ut2_demo_block_id

    Исправленный код:

    {if $show_features || $show_descr}

                                        {if empty($block.properties.abt__ut2_demo_block_id)  && $settings.abt__ut2.product_list.$tmpl.show_content_on_hover[$settings.abt__device] == "YesNo::NO"|enum && !$native_scroller}

                                            <div class="ut2-gl__bottom">

    • Like 1
×
×
  • Создать...