belkin-labs
-
Постов
12 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Сообщения, опубликованные belkin-labs
-
-
Спойлер
Вот вижу следующий код для прохождения таблицы порциями:
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; // Вот то, что меняется в цикле }
-
@belkin-labs Ну мой клиент остался недоволен тем, что я сделал и мне пришлось выяснить, откуда берется эта переменная $show_amount_label
Никакой настройки для нее нет!
Задумана она для того, чтобы не показывать промпт "В наличии" там, где для него нет места, а именно в скроллах, в категориях и в некоторых других местах. Для этого переменной дается значение false в кодах шаблона.
На шаблоне карточки товара default_template по идее этот промпт должен быть в ключен. Но он выключается в шаблоне /design/themes/abt__unitheme2/templates/views/products/view.tpl, что неправильно.
И я думаю, это уже исправлено в новых версиях темы. -
Никто не знает, как и где это включается/отключается.
Но в шаблоне есть системная переменная $show_amount_labelПо названию совершенно очевидно, что она должна либо включать промпт, либо выключать его (кстати, возможно поэтому я и писал про лейбл).
Если есть переменная - значит скорее всего есть настройка.
Я к сожалению не могу искать (пока) откуда эта переменная появляется и где она приобретает значение. У меня в моменте нет времени. Да и вообще нет. Этот поиск может затянуться на часы. Я думаю вы сами это знаете. Программировать cs-cart то еще удовольствие для фрилансера.
Клиент мне эти поиски точно не оплатит.
Так или иначе я поставил указанный if в шаблоне и все, вроде бы работает как надо. И слава Богу. Хреново будет, если после обновления темы мне придется опять этот if вставлять. Но будем надеяться на лучшее!!! А что еще остается? -
@belkin-labs А если вы не можете это повторить, то возможно этот баг уже исправлен. У меня нет последней версии темы. Обновит клиент - я посмотрю. Если исправили, то и отлично!
-
Лейблом я называю не тег, а предложение "В наличии"
Возможно правильный термин Промпт.Не знаю, причем здесь стикер.
Ключевым является то, что я написал в поправке, а именно,
Мы отключаем показ промпта "В наличии:" и он везде отключается, а в этом конкретном месте он не отключается.Вот вам скрин, который мне прислал клиент, когда задачу ставил.
-
@belkin-labs Поправка!
Должен быть выключен режим показа лейбла "В наличии:"
то есть на тех товарах, у которых наличие есть, надо чтобы показывалось не
В Наличии 2 шт, а просто 2 шт.Это и есть значение переменной $show_amount_label
То есть баг заключается только в том, что мы отключаем показ лейбла "В наличии:" и он везде отключается, а в этом конкретном месте он не отключается.
-
1. Нужно любому товару поставить наличие 0
2. В секции "Наличие", в поле "Действие при отсутствии товара в наличии" выбрать Предзаказ
3. Должен быть включен режим показа лейбла В наличии: 10 штук (не знаю, где это включается)
3. Зайти в карточку этого товара на фронте.4. Увидеть под ценой зеленую надпись "В наличии: Предзаказ"
Но вообще там в шаблоне везде, где встречается
<span class="ty-qty-in-stock ty-control-group__item">{__("availability")}:</span>
Этот спан стоит в указанном if. И только в одном месте этого if нет. Вот поэтому и приходит на ум, что везде поставили, а тут просто забыли.
-
Описание проблемы:
Заголовок лейбла "Доступность" не реагирует на параметр шаблона 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 поставить.
-
Привет, коллеги!
У меня есть клиент, который часто обновляется и вот каждый раз мне приходится заходить в шаблон и править баг.
Буду рад, если вы его исправите и мне не придется в этот шаблон так часто лазить.Файл:
/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">
- 1
Прошу ответить на крайне важный для меня вопрос. Возможно я нашел баг
в SEO страницы для фильтров
Опубликовано
Здравствуйте!
В аддоне есть следующая функция (это реализация хука):
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 витрин и каждая секунда при обновлении карты сайта на счету.
Спасибо