Вопросы по разработке и модификации CS-Cart


#801

Попробуйте так

@media (min-width: 768px) {
    .ty-menu__item .ty-menu__item-link {
        max-width: 150px;
    }
}

#802

Вроде бы всю документацию перерыл и папку /app/functions/

Задача получить в своем модуле информацию о товаре, название, цену, ссылку на него по идентификатору. Но кроме цены пока не получается получить ничего.

Пробовал:

1) ModelCatalogProduct::getProduct(11477); #Ошибка
2) $product_info = db_get_array("SELECT * FROM ?:products WHERE product_id = 11477"); #недостаточно данных для решения задачи
3) $auth = & Tygh::$app['session']['auth'];
$product_info = fn_get_product_data(11477, $auth); #нет названия товара
4) $product_info = db_get_array("SELECT * FROM `cscart_description` where product_id = 11477"); #ошибка Error while sending QUERY packet

#803

Подскажите где искать код, обрабатывающий пересчет цены товара при выборе опции? В карточке например.
Поясню ситуацию. У меня цены на товар рассчитываются в сторонней самописной программе, которая генерит CSV файл для импорта в карт. Импортируются две цены price и list_price соответственно. Они могут быть разными т.к. программа рассчитывает и акции сразу. Акциями карта для каталога пользоваться не планирую т.к. они не работают так как должны, плюс если использовать акции самого движка, то фильтрация не будет вестись по цене со скидкой, да и отсортировать по цене со скидкой невозможно.

Соответственно в импортируемом файле есть две цены (старая и новая) и опция с модификатором цены. Проблема в том что, стандартно карт при выборе опции с модификатором когда для товара определены две цены (старая и новая) прибавляет этот модификатор просто тупо к обеим ценам. В итоге получается некрасивая картина. Если до применения опции скидка между ценами допустим была 20%,
то с применением опции скидка уменьшается и это показывается клиенту.
Пример цена на товар старая 100 000 цена новая 80 000, карт показывает скидку 20% все верно.
Теперь берем и применяем опцию с модификатором цены +3000. Карт рисует нам теперь такие цены:
старая 103 000 , новая 83 000, скидка 19%. По хорошему скидка должна сохраняться.
Так как у меня это модификатор цены импортируется уже с учетом действующей акции (т.е. он уже уменьшен на 20% от исходного 3750 ) то для корректного отображения скидки мне надо цену после увеличить на 3000 (как есть),
а цену до увеличить на 3000*1,25 (при скидке 20% = 3750) тогда все будет верно.
Хочу найти где в коде этот алгоритм расчета цен зашит при применении опции. Там по идее нужно просто посмотреть до модификации какая была скидка между ценами и просто скорректировать модификатор, прибавляемый к цене до.


#804

Смотрите функцию fn_get_data_of_changed_product (app/functions/fn.order_management.php)


#805

А может это функция fn_gather_additional_products_data() из файла fn.catalog.php ?
Там есть секция изменения цен. Только пока не разобрался как тут все работает

// Change price
if (isset($product[‘price’]) && empty($product[‘modifiers_price’])) {
$product[‘base_modifier’] = fn_apply_options_modifiers($selected_options, $product[‘base_price’], ‘P’, array(), array(‘product_data’ => $product));
$old_price = $product[‘price’];
$product[‘price’] = fn_apply_options_modifiers($selected_options, $product[‘price’], ‘P’, array(), array(‘product_data’ => $product));

            if (empty($product['original_price'])) {
                $product['original_price'] = $old_price;
            }

            $product['original_price'] = fn_apply_options_modifiers($selected_options, $product['original_price'], 'P', array(), array('product_data' => $product));
            $product['modifiers_price'] = $product['price'] - $old_price;
        }

        if (!empty($product['list_price'])) {
            $product['list_price'] = fn_apply_options_modifiers($selected_options, $product['list_price'], 'P', array(), array('product_data' => $product));
        }

        if (!empty($product['prices']) && is_array($product['prices'])) {
            foreach ($product['prices'] as $pr_k => $pr_v) {
                $product['prices'][$pr_k]['price'] = fn_apply_options_modifiers($selected_options, $pr_v['price'], 'P', array(), array('product_data' => $product));
            }
        }
    } else {
        $product['has_options'] = (!empty($has_product_options[$product_id]) || !empty($has_product_options_links[$product_id]))? true : false;
        $product['product_options'] = empty($product['product_options']) ? array() : $product['product_options'];
    }

#806

Да, эта функция вызывается внутри указанной мной при определенных условиях. Изначально все изменения опций проходят через fn_get_data_of_changed_product


#807

Добрый день! Помогите решить проблему с сохранением настроек модуля (addon.xml).

<settings>
<item id="user"><type>selectbox
<item id="user_variants"><type>hidden

Варианты для настройки user (selectbox) храню в скрытой настройке user_variants (hidden). С помощью функции извлекаю варианты из скрытой настройки в user:

fn_settings_variants_myaddon_user() {
     return Registry::get('addons.myaddon.user_variants');
}

Но при сохранении настроек модуля (из админ панели), user_variants затирается, становится пустым. Если в функции fn_settings_variants_myaddon_user не обращаться к скрытой настройке user_variants, то работает корректно. Т.е. если написать вот так, то user_variants не затрется:

fn_settings_variants_myaddon_user() {
     $my_static_array = array (1, 2, 3, 4, 5);
     return $my_static_array; 
}

#808

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

Чтобы взять значение из определенного поля:
$var = Settings::instance()->getValue(‘идентификатор_поля’, ‘идентификатор_модуля’);

$var = Settings::instance()->getValue('input_text', 'my_changes');

Чтобы записать настройку в модуль необходимо сделать так:

$new_var = 5;

Settings::instance()->updateValue(‘идентификатор_поля’, $new_var, ‘идентификатор_модуля’);

Settings::instance()->updateValue('input_text', $new_var, 'my_changes');

И не забудьте прописать в начале класс
use Tygh\Settings;


#809

Спасибо, помогло.
Можно еще вопрос. Модуль поставщики. Есть 2 поставщика. Один создан вручную (через админ панель), второй создан программно:

fn_update_supplier(0, $supplier_data);

Если runtime.company_id = 1, то к первому поставщику такой запрос отработает. А к тому, что создан программно - нет.

db_get_field("SELECT ?:suppliers.name FROM ?:suppliers WHERE ?:suppliers.supplier_id = ?i", $supplier_id);

Чтобы запрос отработал, нужно установить runtime.company_id = 0, а такой возможности нет.

  • записи в базе выглядят идентично
  • создать поставщика, предварительно установив runtime.company_id = 1 пробовал. не помогает.

Видимо у company_id = 1 нет прав чтобы извлечь вторую запись. Подскажите пожалуйста как лечить. Спасибо.


#810

В Вашем примере запроса вроде нет условия company_id.
Как вариант, создать свой запрос и взять из БД те данные, которые требуются.


#811

Имеется ввиду до выполнения запроса задать runtime.company_id
Вот так запрос работает

Registry::set('runtime.company_id', 0);
db_get_field("SELECT ?:suppliers.name FROM ?:suppliers WHERE ?:suppliers.supplier_id = ?i", $supplier_id);

Даже лучше пример есть - к созданной в phpMyAdmin записи тоже не получается достучаться, пока перед запросом company_id не установлю в 0.


#812

А если запросить через функцию.
fn_get_supplier_data($supplier_id);

И уже из полученных данных взять name.

Странно, что при запросе у бд влияет company_id :slight_smile: не сталкивались с таким


#813

оказалось в таблице ult_objects_sharing нет моих записей


#814

Не подскажите, как привести главное меню к нормальному виду? Этот вопрос уже поднимался на форуме, может быть есть и ответ? Пока меню состоит из двух уровней список второго уровня выпадает в виде вертикального столбца, но стоит добавить третий уровень сразу все портится, список выпадает в виде строки, под которой образуется еще одна строка третьего уровня, а под этой строкой снова строка второго уровня, если в одну строку все не поместилось.


#815

Тоже очень жду ответа на свой вопрос, присоединяюсь


#816

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

Сам шаблон меню можете найти тут

design/themes/ТЕМА/templates/blocks/topmenu_dropdown.tpl


#817

Всем доброго вечера!
Такой вопрос. Пишу небольшое дополнение расширяющее импорт товаров. В настройки импорта добавляю checkbox:

$schema['options']['some_id'] = array(
        'title' => 'some_text',
        'description' => 'some_text',
        'type' => 'checkbox',
        'import_only' => true,
        'position' => 800,
    );

Поле появляется в настройках импорта во вкладке Файл->Дополнительные настройки. А мне нужно чтобы эта настройка была во вкладке Настройки->Общие настройки

В общем как поместить сюда новую опцию?

Заранее Огромное Спасибо! )


#818

попробуйте добавить

'section' => 'general',


#819

Неа, не помогло ).
В файле app/schemas/exim/products.php

Есть опция:
‘reset_inventory’ => array(
‘title’ => ‘reset_quantity_to_zero’,
‘description’ => ‘reset_quantity_to_zero_tooltip’,
‘type’ => ‘checkbox’,
‘import_only’ => true,
‘position’ => 800,
),

И она стоит как раз в нужном мне месте ). В шаблонах нигде не может быть это прописано?


#820

В шаблоне идет разделение по ключу section. Надо разбираться, откуда он берется