Адаптация существующих модулей и тем под CS-Cart 4.12.1¶
Общие изменения¶
- Библиотека HTMLPurifier library обновлена до версии 4.13.0.
Механизм привязки языков и валют к витринам¶
В CS-Cart для привязки языков и валют к витринам больше не используется механизм общего доступа (sharing).
Механизм привязки настроек к витринам¶
В Multi-Vendor Ultimate добавлена возможность задавать разные значения настроек для витрин — по аналогии с тем, как это было возможно в CS-Cart. Если вы хотите использовать новую функциональность, вам потребуется адаптировать свои модули:
- edition_typeнастроек и секций настроек нужно будет заменить с- ROOT,VENDORили- ROOT,ULT:VENDORна- ROOT,STOREFRONT.
- Везде, где вы получаете и обновляете значения настроек программно, нужно явно указывать - storefront_id. Лучше всего указывать его при получении экземпляра сервиса работы с настройками:- $settings_manager = Settings::instance(['storefront_id' => 1]); 
Изменения настроек безопасности¶
Создание хеша пароля при помощи md5 было заменено на хеширование на основе функции password_hash. Теперь для верификации пароля используется функция fn_user_password_verify.
Изменения в структуре¶
Файл с функциями app/functions/fn.catalog.php был  разбит на несколько, в зависимости от назначения функций:
- fn.categories.php
- fn.features.php
- fn.filters.php
- fn.options.php
- fn.product_files.php
- fn.products.php
Изменения в уведомлениях¶
Добавлена возможность настраивать получателей уведомлений по группам пользователей, отдельным пользователям и отдельным email-адресам.
Если ранее вы разработали собственный транспорт сообщений или расширяли схемы событий, вам потребуется их адаптировать:
- Изменить метод - \Tygh\Notifications\Transports\ITransport::process()в классе транспорта. Теперь в него передаются условия поиска получателей для события.
- Реализовать поиск получателей сообщения о событии. В стандартных классах данный механизм реализован с помощью специализированных классов-поисковиков: - (Tygh\Notifications\Transports\Internal\ReceiverFinders\* Tygh\Notifications\Transports\Mail\ReceiverFinders\*) - и фабрик поисковиков, которые эти классы создают: - (\Tygh\Notifications\Transports\Internal\ReceiverFinderFactory \Tygh\Notifications\Transports\Mail\ReceiverFinderFactory) 
- Настроить отображение редактора получателей через схему - notifications/groups, если вы добавляли группу событий уведомлений.
Во избежание путаницы, продавца-получателя внутренних уведомлений стоит указывать через новое добавленное свойство to_company_id. Свойство company_id отвечает за продавца-отправителя в рамках почтовых уведомлений.
Изменения в тарифных планах для продавцов¶
Теперь commision_amount не отображает прибыль маркетплейса; commision_amount может включать в себя комиссию и налог (если включена настройка Собирать налоги с продавцов). Прибыль маркетплейса отображает marketplace_profit.
Изменения в меню панели администратора¶
Теперь сторонние модули не могут создавать корневые элементы в меню панели администратора. В рамках текущего релиза для поддержания обратной совместимости добавлена настройка validate_menu, которая позволит отключить подобную фильтрацию.
Изменения в схеме модуля¶
В описании схемы модуля добавлен новый тэг supplier_page, в котором можно указывать путь к странице разработчика. Страница разработчика должна быть записана в формате controller.mode.
Изменения в ядре¶
Удалённые классы¶
- \Tygh\Api\Entities\Combinations
Изменённые классы¶
Изменения в уведомлениях¶
- // Было: \Tygh\Enum\RecipientSearchMethods // Стало: \Tygh\Enum\ReceiverSearchMethods. 
- Удалено публичное свойство - \Tygh\Notifications\Transports\Internal\InternalMessageSchema::$recipient_search_method.
- Удалено публичное свойство - \Tygh\Notifications\Transports\Internal\InternalMessageSchema::$recipient_search_criteria.
- Добавлено публичное свойство - \Tygh\Notifications\Transports\Internal\InternalMessageSchema::$to_company_id.
Новые классы¶
- Получает сообщение об ошибке, если проверка на то, является ли пользователь ботом, оказывается неудачной: - \Tygh\Web\Antibot\IErrorableAntibotDriver
- Содержит все возможные типы объектов настроек: - \Tygh\Enum\SettingTypes
Изменения в уведомлениях¶
- Представляет собой условие поиска получателя сообщения: - \Tygh\Notifications\Receivers\SearchCondition
- Предоставляет классы, которые находят получателей внутренних уведомлений: - \Tygh\Notifications\Transports\Internal\ReceiverFinderFactory
- Описывает класс, используемый для того, чтобы найти получателей внутренних уведомлений: - \Tygh\Notifications\Transports\Internal\ReceiverFinders\ReceiverFinderInterface
- Находит получателей внутренних уведомлений по адресам электронной почты: - \Tygh\Notifications\Transports\Internal\ReceiverFinders\EmailFinder
- Находит менеджеров заказов, которые получают внутренние уведомления: - \Tygh\Notifications\Transports\Internal\ReceiverFinders\OrderManagerFinder
- Находит получателей внутренних уведомлений в указанной группе пользователей: - \Tygh\Notifications\Transports\Internal\ReceiverFinders\UsergroupIdFinder
- Находит получателей внутренних уведомлений по идентификаторам пользователей: - \Tygh\Notifications\Transports\Internal\ReceiverFinders\UserIdFinder
- Находит главных администраторов продавцов, которые получают внутренние уведомления: - \Tygh\Notifications\Transports\Internal\ReceiverFinders\VendorOwnerFinder
- Описывает класс, используемый, чтобы найти получателей email-уведомлений: - \Tygh\Notifications\Transports\Mail\ReceiverFinders\ReceiverFinderInterface
- Находит получателей email-уведомлений по адресам электронной почты: - \Tygh\Notifications\Transports\Mail\ReceiverFinders\EmailFinder
- Находит менеджеров заказов, которые получают email-уведомления: - \Tygh\Notifications\Transports\Mail\ReceiverFinders\OrderManagerFinder
- Находит получателей email-уведомлений в указанной группе пользователей: - \Tygh\Notifications\Transports\Mail\ReceiverFinders\UsergroupIdFinder
- Находит получателей email-уведомлений по идентификаторам пользователей: - \Tygh\Notifications\Transports\Mail\ReceiverFinders\UserIdFinder
- Находит главных администраторов продавцов, которые получают email-уведомления: - \Tygh\Notifications\Transports\Mail\ReceiverFinders\VendorOwnerFinder
Изменённые функции¶
- // Было: \Tygh\Backend\Storage\ABackend.php::getUrl($file = '', $protocol = ''); // Стало: \Tygh\Backend\Storage\ABackend.php::getUrl($file = '', $protocol = '', $url = ''); 
- // Было: \Tygh\Backend\Storage\Amazon.php::getUrl($file = '', $protocol = ''); // Стало: \Tygh\Backend\Storage\Amazon.php::getUrl($file = '', $protocol = '', $url = ''); 
- // Было: \Tygh\Backend\Storage\File.php::getUrl($file = '', $protocol = ''); // Стало: \Tygh\Backend\Storage\File.php::getUrl($file = '', $protocol = '', $url = ''); 
- // Было: fn_get_user_name($user_id) // Стало: fn_get_user_name($user_id, array $user_info = null) 
- // Было: fn_exim_get_field_label($value) // Стало: fn_exim_get_field_label($value, $action = '') 
- // Было: fn_generate_thumbnail($image_path, $width, $height = 0, $lazy = false, $return_rel_path = false, array $image = []) // Стало: fn_generate_thumbnail($image_path, $width, $height = 0, $lazy = false, $return_rel_path = false, array $image = [], $url = '') 
- // Было: fn_image_to_display($images, $image_width = 0, $image_height = 0) // Стало: fn_image_to_display(array $images, $image_width = 0, $image_height = 0, $url = '') 
- // Было: fn_hybrid_auth_get_provider_data($provider) // Стало: fn_hybrid_auth_get_provider_data($provider_id) 
- // Было: fn_hybrid_auth_get_unlink_provider($user_id, $provider) // Стало: fn_hybrid_auth_get_unlink_provider($user_id, $provider_id) 
- // Было: fn_hybrid_auth_get_provider_data($provider) // Стало: fn_hybrid_auth_get_provider_data($provider_id) 
- // Было: fn_hybrid_auth_delete_provider($provider) // Стало: fn_hybrid_auth_delete_provider($provider_id) 
- // Было: fn_hybrid_auth_link_provider($user_id, $identifier, $provider) // Стало: fn_hybrid_auth_link_provider($user_id, $identifier, $provider_id) 
- // Было: fn_hybrid_auth_login($user_data, $auth_data, $provider) // Стало: fn_hybrid_auth_login($user_data, $auth_data, $provider_id) 
- // Было: fn_hybrid_auth_link($user_data, $auth_data, $provider) // Стало: fn_hybrid_auth_link($user_data, $auth_data, $provider_id) 
- // Было: fn_hybrid_auth_link_profile($auth_data, $provider) // Стало: fn_hybrid_auth_link_profile($auth_data, $provider_id) 
- // Было: fn_hybrid_auth_fix_old_user($auth_data, $provider) // Стало: fn_hybrid_auth_fix_old_user($auth_data, $provider_id) 
- // Было: fn_get_schema($schema_dir, $name, $type = 'php', $force_addon_init = false) // Стало: fn_get_schema($schema_dir, $name, $type = 'php', $force_addon_init = false, array $addons_to_load_schemas_from = null) 
- // Было: fn_delete_discussion($object_id, $object_type) // Стало: fn_delete_discussion($object_id, $object_type, $company_id = null) 
Изменения в уведомлениях¶
- // Было: \Tygh\Notifications\Transports\ITransport::process(BaseMessageSchema $schema); // Стало: \Tygh\Notifications\Transports\ITransport::process(BaseMessageSchema $schema, array $receiver_search_conditions); 
Изменения в настройках¶
- // Было: \Tygh\Settings::instance($company_id = null) // Стало: \Tygh\Settings::instance($params = []) 
- // Было: \Tygh\Settings::getList($section_id = 0, $section_tab_id = 0, $plain_list = false, $company_id = null, $lang_code = CART_LANGUAGE) // Стало: \Tygh\Settings::getList($section_id = 0, $section_tab_id = 0, $plain_list = false, $company_id = null, $lang_code = CART_LANGUAGE, $storefront_id = null) 
- // Было: \Tygh\Settings::getSettingDataByName($setting_name, $company_id = null, $lang_code = CART_LANGUAGE) // Стало: \Tygh\Settings::getSettingDataByName($setting_name, $company_id = null, $lang_code = CART_LANGUAGE, $storefront_id = null) 
- // Было: \Tygh\Settings::getValues($section_name = '', $section_type = Settings::CORE_SECTION, $hierarchy = true, $company_id = null) // Стало: \Tygh\Settings::getValues($section_name = '', $section_type = Settings::CORE_SECTION, $hierarchy = true, $company_id = null, $storefront_id = null) 
- // Было: \Tygh\Settings::getValue($setting_name, $section_name, $company_id = null) // Стало: \Tygh\Settings::getValue($setting_name, $section_name, $company_id = null, $storefront_id = null) 
- // Было: \Tygh\Settings::getData($object_id, $company_id = null, $lang_code = CART_LANGUAGE) // Стало: \Tygh\Settings::getData($object_id, $company_id = null, $lang_code = CART_LANGUAGE, $storefront_id = null) 
- // Было: \Tygh\Settings::updateValue($setting_name, $setting_value, $section_name = '', $force_cache_cleanup = false, $company_id = null, $execute_functions = true) // Стало: \Tygh\Settings::updateValue($setting_name, $setting_value, $section_name = '', $force_cache_cleanup = false, $company_id = null, $execute_functions = true, $storefront_id = null) 
- // Было: \Tygh\Settings::updateValueById($object_id, $value, $company_id = null, $execute_functions = true) // Стало: \Tygh\Settings::updateValueById($object_id, $value, $company_id = null, $execute_functions = true, $storefront_id = null) 
- // Было: fn_update_addon($settings) // Стало: fn_update_addon($settings, $storefront_id = null) 
- // Было: fn_update_customization_mode(array $modes) // Стало: fn_update_customization_mode(array $modes, $storefront_id = null) 
- // Было: fn_get_storefront_protocol($company_id = null) // Стало: fn_get_storefront_protocol($company_id = null, $storefront_id = null) 
Удалённые функции¶
- fn_hybrid_auth_get_provider_id($provider)
- fn_prepare_xml_product_options
- fn_get_product_options_inventory_ebay
- \Tygh\Commerceml\RusEximCommerceml::addNewCombination
- \Tygh\Commerceml\RusEximCommerceml::addProductOptionException
- fn_rus_exim_1c_look_through_variants_update_combination
- fn_delete_product_combination
- fn_delete_product_option_combinations
- fn_look_through_variants
- fn_delete_outdated_combinations
- fn_rebuild_product_options_inventory
- fn_update_exceptions
- fn_clone_options_inventory
- fn_get_product_options_inventory
- fn_get_product_options_combination_data
- fn_update_option_combination
- fn_delete_option_combination
Новые функции¶
- Получает список статусов с указанными параметрами: - fn_get_status_by_type_and_param($type, $params) 
- Отправляет уведомление о текущем статусе запроса на возврат: - fn_rma_send_notification($return_info, $order_info, $force_notification = []) 
- Получает схему групп событий: - \Tygh\Providers\EventDispatcherProvider::getEventGroupsSchema() 
- Получает настройки уведомлений: - \Tygh\Providers\EventDispatcherProvider::getNotificationSettings($with_receivers = false) 
- Получает схему событий: - \Tygh\Providers\EventDispatcherProvider::getEventsSchema() 
- Получает адрес электронной почты пользователя: - fn_get_user_email($user_id, array $user_info = null) 
- Обновляет изображение для промо-акции на указанном языке. Если загружается новое изображение, то оно будет загружено для всех языков: - fn_promotions_update_image($promotion_id, $lang_code = DESCR_SL) 
- Удаляет изображение для промо-акции: - fn_promotions_delete_image($promotion_id, $lang_code = null) 
- Копирует ссылки на изображения для промо-акций для указанных языков: - fn_promotions_copy_image_link_to_langs($promotion_id, $original_lang = CART_LANGUAGE, array $cloned_langs = []) 
- Копирует ссылки на изображения для промо-акций для добавленного языка: - fn_promotions_update_language_post($language_data) 
- Удаляет изображения для промо-акций для удаленных языков: - fn_promotions_delete_languages_post($deleted_lang_codes) 
- Удаляет данные об изображении, указанные для промо-акций: - fn_promotions_delete_image_pre($pair_id) 
- Получает информацию о валюте: - fn_get_currency($currency_id, $lang_code = DESCR_SL) 
- Удаляет прикреплённый файл по идентификатору объекта: - fn_attachments_delete_by_object_id($object_type, $object_id) 
- Получает массив путей до директории с импортируемыми прикреплёнными файлами: - fn_attachments_get_import_attachments_directory($company_id, $path = '') 
- Проверяет, может ли администратор продавца использовать - order_management:- fn_vendor_privileges_check_permission_order_management() 
- Сохраняет данные о пользовательских полях профиля: - fn_store_user_profile_fields(array $profile_data, $object_id, $object_type, $ship_to_another = false) 
- Получает данные о текущей витрине: - \Tygh\Providers\StorefrontProvider::getStorefront() 
- Получает данные о репозитории витрины: - \Tygh\Providers\StorefrontProvider::getRepository() 
- Стирает все значения настроек для витрины: - \Tygh\Settings::removeStorefrontSettings($storefront_id) 
- Стирает все значения настроек, привязанные к компании или витрине: - \Tygh\Settings::resetAllOverrides($object_id) 
- Проверяет, может ли настройка быть переопределена для каждой витрины или для каждой компании: - \Tygh\Settings::areOverriddenValuesSupportedByEdition($edition_type) 
- Определяет, будет ли показана панель администратора: - fn_is_bottom_panel_available($auth) 
- Определяет, может ли авторизованный пользователь активировать редактор тем: - fn_is_theme_editor_available_for_user($auth) 
- Подготавливает данные для нижней панели: - fn_prepare_bottom_panel_data() 
Устаревшие функции¶
- // Устаревшая функция: \Tygh\Addons\ProductVariations\Service::onChangedProductQuantityInZero() // Что использовать вместо неё: \Tygh\Addons\ProductVariations\Service::onChangedProductQuantity 
- // Устаревшая функция: fn_get_avail_product_features // Что использовать вместо неё: fn_get_product_features 
- fn_filter_product_data
- fn_filters_not_found_notification
- // Устаревшая функция: fn_send_return_mail // Что использовать вместо неё: fn_rma_send_notification 
- // Устаревшая функция: \Tygh\Settings::resetAllVendorsSettings // Что использовать вместо неё: \Tygh\Settings::resetAllOverrides 
- // Устаревшая функция: fn_array_column // Что использовать вместо неё: array_column 
Изменения в хуках¶
Новые хуки¶
- Выполняется перед отправкой уведомления о создании новой отгрузки. Позволяет менять данные об отгрузке в уведомлении: - fn_set_hook('update_shipment_before_send_notification', $shipment_data, $shipment_id, $group_key, $all_products, $force_notification, $order_info, $shipment); 
- Выполняется перед выбором существующего варианта характеристики по имени: - fn_set_hook('update_product_feature_variant_before_select', $feature_id, $feature_type, $variant, $lang_code, $fields, $joins, $conditions, $limit); 
- Выполняется после того, как определены параметры - display_languageи- description_language, непосредственно перед их установкой. Позволяет изменять используемые языки и список доступных языков:- fn_set_hook('init_language_post', $params, $area, $default_language, $session_display_language, $avail_languages, $display_language, $description_language, $browser_language); 
- Меняет параметры выборки компаний: - fn_set_hook('get_companies_pre', $params, $items_per_page, $lang_code); 
- Позволяет расширять данные в нижней панели: - fn_set_hook('prepare_bottom_panel_data', $bottom_panel_data); 
- Добавляет дополнительные данные об активности продавцов на панель инструментов: - fn_set_hook('dashboard_get_vendor_activities_post', $timestamp_from, $timestamp_to, $dashboard_vendors_activity); 
- Выполняется, когда рассчитана стоимость содержимого корзины, после расчета стоимости доставки. Позволяет менять корзину и список способов доставки: - fn_set_hook('calculate_cart_content_after_shipping_calculation', $cart, $auth, $calculate_shipping, $calculate_taxes, $options_style, $apply_cart_promotions, $lang_code, $area, $cart_products, $product_groups); 
- POST-хук для обновления фильтра товаров: - fn_set_hook('update_product_filter_post', $filter_data, $filter_id, $lang_code, $create); 
- Изменяет сообщение перед его конвертированием: - fn_set_hook('message_style_formatter_convert_pre', $message, $inline_css); 
- Изменяет сообщение после его конвертирования: - fn_set_hook('message_style_formatter_convert_post', $message); 
Устаревшие хуки¶
- // Устаревший хук: get_avail_product_features_pre // Что использовать вместо него: get_product_features_pre 
- // Устаревший хук: get_avail_product_features_post // Что использовать вместо него: get_product_features_post 
- get_avail_product_features_before_select
- filter_product_data
- update_product_filter
Изменённые хуки¶
- // Было: fn_set_hook('get_orders_totals', $paid_statuses, $join, $condition, $group); // Стало: fn_set_hook('get_orders_totals', $paid_statuses, $join, $condition, $group, $totals); 
- // Было: fn_set_hook('settings_update_value_by_id_pre', $this, $object_id, $value, $company_id, $execute_functions, $data, $old_data, $table); // Стало: fn_set_hook('settings_update_value_by_id_pre', $this, $object_id, $value, $company_id, $execute_functions, $data, $old_data, $table, $storefront_id); 
- // Было: fn_set_hook('settings_update_value_by_id_post', $this, $object_id, $value, $company_id, $execute_functions, $data, $old_data, $table); // Стало: fn_set_hook('settings_update_value_by_id_post', $this, $object_id, $value, $company_id, $execute_functions, $data, $old_data, $table, $storefront_id); 
- // Было: fn_set_hook('get_product_data_pre', $product_id, $auth, $lang_code, $field_list, $get_add_pairs, $get_main_pair, $get_taxes, $get_qty_discounts, $preview, $features, $skip_company_condition); // Стало: fn_set_hook('get_product_data_pre', $product_id, $auth, $lang_code, $field_list, $get_add_pairs, $get_main_pair, $get_taxes, $get_qty_discounts, $preview, $features, $skip_company_condition, $params); 
- // Было: fn_set_hook('pre_get_cart_product_data', $hash, $product, $skip_promotion, $cart, $auth, $promotion_amount, $fields, $join); // Стало: fn_set_hook('pre_get_cart_product_data', $hash, $product, $skip_promotion, $cart, $auth, $promotion_amount, $fields, $join, $params); 
- // Было: fn_set_hook('delete_discussion_pre', $object_id, $object_type); // Стало: fn_set_hook('delete_discussion_pre', $object_id, $object_type, $company_id); 
- // Было: fn_set_hook('delete_discussion_post', $object_id, $object_type, $is_deleted); // Стало: fn_set_hook('delete_discussion_post', $object_id, $object_type, $is_deleted, $company_id); 
Удалённые хуки¶
- fn_set_hook('delete_product_option_combinations', $product_id);
- fn_set_hook('look_through_variants_pre', $product_id, $amount, $options, $variants);
- fn_set_hook('look_through_variants_update_combination', $combination, $_data, $product_id, $amount, $options, $variants);
- fn_set_hook('look_through_variants_post', $combinations, $product_id, $amount, $options, $variants);
- fn_set_hook('rebuild_product_options_inventory_pre', $product_id, $amount);
- fn_set_hook('rebuild_product_options_inventory_post', $product_id);
- fn_set_hook('clone_options_inventory_pre', $from_product_id, $to_product_id, $options, $variants);
- fn_set_hook('clone_options_inventory_post', $from_product_id, $to_product_id, $options, $variants);
- fn_set_hook('get_product_options_inventory_pre', $params, $items_per_page, $lang_code);
- fn_set_hook('get_product_options_inventory_post', $params, $items_per_page, $lang_code, $inventory);
- fn_set_hook('get_product_options_combination_data_post', $combination_hash, $combination);
- fn_set_hook('update_option_combination_pre', $combination_data, $combination_hash);
- fn_set_hook('update_option_combination_post', $combination_data, $combination_hash, $inventory_amount);
- fn_set_hook('delete_option_combination_pre', $combination_hash);
 
                         
        