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

Что то засбоил YML экспорт, подскажите куда копать.

В логах куча

[SKIP PRODUCT] 16405 (Весло новинка ...) - Категория скрыта

/app/addons/yml_export/Tygh/Ym/Yml2.php
protected function getProductCategory($product)
{
    $export_category_ids = array_intersect($product['category_ids'], $this->available_category_ids);
    $exclude_category_ids = array_intersect($export_category_ids, $this->exclude_category_ids);
    $export_category_ids = array_diff($export_category_ids, $this->exclude_category_ids);
    sort($export_category_ids);

    $category_id = !empty($product['main_category']) ? $product['main_category'] : reset($export_category_ids);
    if (in_array($category_id, $exclude_category_ids)) {
        $this->log->write(Logs::SKIP_PRODUCT, $product, __('yml2_log_category_excluded'));
        $category_id = false;

    } elseif (empty($export_category_ids)) {
        $this->log->write(Logs::SKIP_PRODUCT, $product, __('yml2_log_category_not_visible'));
        $category_id = false;

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

Судя по коду у меня получается пустой массив $export_category_ids , но почему он пуст? Переменная $product['main_category'] имеет значение 19

Подскажите пожалуйста, в мультивендоре необходимо дать разрешение продавцам на создание и редактирование заказов. http://docs.cs-cart.com/4.3.x/user_guide/users/vendors/extend_vendor_permissions.html
В данной инструкции написано, что необходимо заменить один файл либо для редактирования заказов, либо для создания, а что нужно сделать, что бы вендоры могли и создавать и редактировать заказы от покупателей?

Сравните файлы со стандартным файлом. Думаю, из них несложно будет один собрать для вашего случая

Что то засбоил YML экспорт, подскажите куда копать.

В логах куча

[SKIP PRODUCT] 16405 (Весло новинка ...) - Категория скрыта

/app/addons/yml_export/Tygh/Ym/Yml2.php
protected function getProductCategory($product)
{
    $export_category_ids = array_intersect($product['category_ids'], $this->available_category_ids);
    $exclude_category_ids = array_intersect($export_category_ids, $this->exclude_category_ids);
    $export_category_ids = array_diff($export_category_ids, $this->exclude_category_ids);
    sort($export_category_ids);

    $category_id = !empty($product['main_category']) ? $product['main_category'] : reset($export_category_ids);
    if (in_array($category_id, $exclude_category_ids)) {
        $this->log->write(Logs::SKIP_PRODUCT, $product, __('yml2_log_category_excluded'));
        $category_id = false;

    } elseif (empty($export_category_ids)) {
        $this->log->write(Logs::SKIP_PRODUCT, $product, __('yml2_log_category_not_visible'));
        $category_id = false;

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

Судя по коду у меня получается пустой массив $export_category_ids , но почему он пуст? Переменная $product['main_category'] имеет значение 19

Какая версия? Был баг при кол-ве товаров больше 5000

http://forum.cs-cart.com/tracker/issue-6951-yml-export-issue/

например, вы можете добавить в секцию CSS в редакторе тем

.no-touch .ty-menu__item:hover .ty-menu__item-link {
    background: yellow;
    border: 1px solid green;
}

http://i.prntscr.com/TQuDQstYTxWtpeqaDJSyeg.png

Большое спасибо за помощь.

А не подскажите как сдеалет меню как "two line" меню? У меня имена категорий длинные и поетому я должен сделать их "two line".

Большое спасибо за помощь.

А не подскажите как сдеалет меню как "two line" меню? У меня имена категорий длинные и поетому я должен сделать их "two line".

Дайте ссылку на сайт

Дайте ссылку на сайт

happymall.org

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

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

Вроде бы всю документацию перерыл и папку /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

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

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

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

А может это функция 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'];
    }

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

Добрый день! Помогите решить проблему с сохранением настроек модуля (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; 
}

Как понял, Вам требуется записать значение в настройки модуля. Класс 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;

2 лайка

Спасибо, помогло.
Можно еще вопрос. Модуль поставщики. Есть 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 нет прав чтобы извлечь вторую запись. Подскажите пожалуйста как лечить. Спасибо.

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

Имеется ввиду до выполнения запроса задать 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.

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

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

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

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

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

1 лайк