From e4a24def6b736887ea8b2fab02f2cdcb230acf44 Mon Sep 17 00:00:00 2001 From: Meylis Gazakow Date: Tue, 3 Aug 2021 17:13:01 +0300 Subject: [PATCH] delete lovato --- plugins/lovata.zip | Bin 0 -> 853913 bytes plugins/lovata/shopaholic/.codeclimate.yml | 28 - plugins/lovata/shopaholic/.editorconfig | 27 - plugins/lovata/shopaholic/.github/FUNDING.yml | 3 - plugins/lovata/shopaholic/.gitignore | 92 -- plugins/lovata/shopaholic/CONTRIBUTING.md | 60 -- plugins/lovata/shopaholic/LICENSE.md | 674 -------------- plugins/lovata/shopaholic/PHPMD_custom.xml | 91 -- plugins/lovata/shopaholic/Plugin.php | 207 ----- plugins/lovata/shopaholic/README.md | 128 --- .../lovata/shopaholic/assets/images/icon.svg | 11 - .../lovata/shopaholic/assets/images/logo.png | Bin 3417 -> 0 bytes .../assets/images/shopaholic-banner.png | Bin 248905 -> 0 bytes .../classes/collection/BrandCollection.php | 88 -- .../classes/collection/CategoryCollection.php | 41 - .../classes/collection/CurrencyCollection.php | 39 - .../classes/collection/OfferCollection.php | 67 -- .../classes/collection/ProductCollection.php | 258 ------ .../collection/PromoBlockCollection.php | 62 -- .../classes/collection/TaxCollection.php | 39 - .../classes/console/CheckTableIntegrity.php | 56 -- .../classes/console/ImportFromXML.php | 83 -- .../PreconfigureImportSettingsFromXML.php | 58 -- .../classes/event/ExtendMenuHandler.php | 71 -- .../classes/event/brand/BrandModelHandler.php | 98 --- .../event/category/CategoryModelHandler.php | 98 --- .../event/currency/CurrencyModelHandler.php | 89 -- .../event/measure/MeasureModelHandler.php | 35 - .../event/offer/ExtendOfferFieldsHandler.php | 138 --- .../classes/event/offer/OfferModelHandler.php | 226 ----- .../classes/event/price/PriceModelHandler.php | 97 -- .../event/product/ProductModelHandler.php | 259 ------ .../event/product/ProductRelationHandler.php | 95 -- .../promoblock/PromoBlockModelHandler.php | 119 --- .../promoblock/PromoBlockRelationHandler.php | 64 -- .../event/tax/ExtendTaxFieldsHandler.php | 47 - .../classes/event/tax/TaxModelHandler.php | 100 --- .../classes/event/tax/TaxRelationHandler.php | 55 -- .../classes/helper/AllCategoriesMenuType.php | 57 -- .../classes/helper/CatalogMenuType.php | 60 -- .../classes/helper/CategoryMenuType.php | 59 -- .../classes/helper/CommonMenuType.php | 200 ----- .../classes/helper/CurrencyHelper.php | 221 ----- .../classes/helper/MeasureHelper.php | 40 - .../classes/helper/PriceTypeHelper.php | 105 --- .../shopaholic/classes/helper/TaxHelper.php | 184 ---- .../import/ImportBrandModelFromCSV.php | 49 -- .../import/ImportBrandModelFromXML.php | 114 --- .../import/ImportCategoryModelFromCSV.php | 81 -- .../import/ImportCategoryModelFromXML.php | 194 ---- .../import/ImportOfferModelFromCSV.php | 152 ---- .../import/ImportOfferModelFromXML.php | 212 ----- .../import/ImportOfferPriceFromXML.php | 127 --- .../import/ImportProductModelFromCSV.php | 148 ---- .../import/ImportProductModelFromXML.php | 224 ----- .../classes/import/ParseCategoryXMLNode.php | 34 - .../shopaholic/classes/item/BrandItem.php | 84 -- .../shopaholic/classes/item/CategoryItem.php | 259 ------ .../shopaholic/classes/item/CurrencyItem.php | 37 - .../shopaholic/classes/item/MeasureItem.php | 24 - .../shopaholic/classes/item/OfferItem.php | 506 ----------- .../shopaholic/classes/item/ProductItem.php | 208 ----- .../classes/item/PromoBlockItem.php | 93 -- .../shopaholic/classes/item/TaxItem.php | 116 --- .../classes/store/BrandListStore.php | 30 - .../classes/store/CategoryListStore.php | 28 - .../classes/store/CurrencyListStore.php | 27 - .../classes/store/OfferListStore.php | 33 - .../classes/store/ProductListStore.php | 45 - .../classes/store/PromoBlockListStore.php | 39 - .../shopaholic/classes/store/TaxListStore.php | 27 - .../classes/store/brand/ActiveListStore.php | 26 - .../store/brand/ListByCategoryStore.php | 67 -- .../classes/store/brand/SortingListStore.php | 26 - .../store/category/ActiveListStore.php | 26 - .../store/category/TopLevelListStore.php | 29 - .../store/currency/ActiveListStore.php | 26 - .../store/currency/SortingListStore.php | 26 - .../classes/store/offer/ActiveListStore.php | 26 - .../classes/store/offer/SortingListStore.php | 181 ---- .../classes/store/product/ActiveListStore.php | 43 - .../store/product/ListByBrandStore.php | 26 - .../store/product/ListByCategoryStore.php | 44 - .../store/product/ListByPromoBlockStore.php | 25 - .../store/product/SortingListStore.php | 201 ----- .../store/promoblock/ActiveListStore.php | 36 - .../store/promoblock/HiddenListStore.php | 35 - .../store/promoblock/NotHiddenListStore.php | 35 - .../store/promoblock/SortingListStore.php | 161 ---- .../classes/store/tax/ActiveListStore.php | 26 - .../classes/store/tax/SortingListStore.php | 26 - .../shopaholic/components/BrandData.php | 34 - .../shopaholic/components/BrandList.php | 44 - .../shopaholic/components/BrandPage.php | 71 -- .../shopaholic/components/Breadcrumbs.php | 135 --- .../shopaholic/components/CategoryData.php | 34 - .../shopaholic/components/CategoryList.php | 44 - .../shopaholic/components/CategoryPage.php | 150 ---- .../shopaholic/components/CurrencyList.php | 65 -- .../shopaholic/components/ProductData.php | 47 - .../shopaholic/components/ProductList.php | 99 --- .../shopaholic/components/ProductPage.php | 85 -- .../shopaholic/components/PromoBlockData.php | 34 - .../shopaholic/components/PromoBlockList.php | 73 -- .../shopaholic/components/PromoBlockPage.php | 72 -- plugins/lovata/shopaholic/composer.json | 8 - .../lovata/shopaholic/controllers/Brands.php | 79 -- .../shopaholic/controllers/Categories.php | 81 -- .../shopaholic/controllers/Currencies.php | 47 - .../shopaholic/controllers/Measures.php | 31 - .../lovata/shopaholic/controllers/Offers.php | 42 - .../shopaholic/controllers/PriceTypes.php | 47 - .../shopaholic/controllers/Products.php | 110 --- .../shopaholic/controllers/PromoBlocks.php | 47 - .../lovata/shopaholic/controllers/Taxes.php | 49 -- .../controllers/brands/_config_filter.yaml | 11 - .../controllers/brands/_list_toolbar.htm | 38 - .../controllers/brands/config_form.yaml | 16 - .../brands/config_import_export.yaml | 28 - .../controllers/brands/config_list.yaml | 17 - .../controllers/brands/config_reorder.yaml | 3 - .../shopaholic/controllers/brands/create.htm | 46 - .../shopaholic/controllers/brands/import.htm | 36 - .../shopaholic/controllers/brands/index.htm | 1 - .../shopaholic/controllers/brands/preview.htm | 22 - .../shopaholic/controllers/brands/reorder.htm | 8 - .../shopaholic/controllers/brands/update.htm | 54 -- .../categories/_config_filter.yaml | 11 - .../controllers/categories/_list_toolbar.htm | 38 - .../controllers/categories/config_form.yaml | 16 - .../categories/config_import_export.yaml | 30 - .../controllers/categories/config_list.yaml | 14 - .../categories/config_relation.yaml | 0 .../categories/config_reorder.yaml | 3 - .../controllers/categories/create.htm | 46 - .../controllers/categories/import.htm | 36 - .../controllers/categories/index.htm | 1 - .../controllers/categories/preview.htm | 22 - .../controllers/categories/reorder.htm | 8 - .../controllers/categories/update.htm | 54 -- .../currencies/_config_filter.yaml | 11 - .../controllers/currencies/_list_toolbar.htm | 24 - .../controllers/currencies/config_form.yaml | 16 - .../controllers/currencies/config_list.yaml | 17 - .../currencies/config_reorder.yaml | 3 - .../controllers/currencies/create.htm | 46 - .../controllers/currencies/index.htm | 1 - .../controllers/currencies/preview.htm | 22 - .../controllers/currencies/reorder.htm | 8 - .../controllers/currencies/update.htm | 53 -- .../controllers/measures/_list_toolbar.htm | 21 - .../controllers/measures/config_form.yaml | 15 - .../controllers/measures/config_list.yaml | 13 - .../controllers/measures/create.htm | 46 - .../shopaholic/controllers/measures/index.htm | 1 - .../controllers/measures/preview.htm | 22 - .../controllers/measures/update.htm | 54 -- .../controllers/offers/config_form.yaml | 16 - .../offers/config_import_export.yaml | 50 -- .../controllers/offers/config_relation.yaml | 0 .../shopaholic/controllers/offers/create.htm | 46 - .../shopaholic/controllers/offers/import.htm | 39 - .../shopaholic/controllers/offers/preview.htm | 22 - .../shopaholic/controllers/offers/update.htm | 60 -- .../pricetypes/_config_filter.yaml | 11 - .../controllers/pricetypes/_list_toolbar.htm | 24 - .../controllers/pricetypes/config_form.yaml | 16 - .../controllers/pricetypes/config_list.yaml | 17 - .../pricetypes/config_reorder.yaml | 3 - .../controllers/pricetypes/create.htm | 46 - .../controllers/pricetypes/index.htm | 1 - .../controllers/pricetypes/preview.htm | 22 - .../controllers/pricetypes/reorder.htm | 8 - .../controllers/pricetypes/update.htm | 53 -- .../controllers/products/_config_filter.yaml | 21 - .../controllers/products/_list_toolbar.htm | 58 -- .../controllers/products/_offer.htm | 1 - .../controllers/products/config_form.yaml | 16 - .../products/config_import_export.yaml | 34 - .../controllers/products/config_list.yaml | 14 - .../controllers/products/config_relation.yaml | 15 - .../controllers/products/create.htm | 46 - .../controllers/products/import.htm | 40 - .../shopaholic/controllers/products/index.htm | 1 - .../controllers/products/preview.htm | 22 - .../controllers/products/reorder.htm | 8 - .../controllers/products/update.htm | 54 -- .../promoblocks/_config_filter.yaml | 19 - .../controllers/promoblocks/_list_toolbar.htm | 24 - .../controllers/promoblocks/_product.htm | 1 - .../controllers/promoblocks/config_form.yaml | 16 - .../controllers/promoblocks/config_list.yaml | 17 - .../promoblocks/config_relation.yaml | 14 - .../promoblocks/config_reorder.yaml | 3 - .../controllers/promoblocks/create.htm | 46 - .../controllers/promoblocks/index.htm | 1 - .../controllers/promoblocks/preview.htm | 22 - .../controllers/promoblocks/reorder.htm | 8 - .../controllers/promoblocks/update.htm | 54 -- .../controllers/taxes/_category.htm | 1 - .../controllers/taxes/_config_filter.yaml | 11 - .../shopaholic/controllers/taxes/_country.htm | 1 - .../controllers/taxes/_list_toolbar.htm | 24 - .../shopaholic/controllers/taxes/_product.htm | 1 - .../shopaholic/controllers/taxes/_state.htm | 1 - .../controllers/taxes/config_form.yaml | 16 - .../controllers/taxes/config_list.yaml | 17 - .../controllers/taxes/config_relation.yaml | 54 -- .../controllers/taxes/config_reorder.yaml | 3 - .../shopaholic/controllers/taxes/create.htm | 46 - .../shopaholic/controllers/taxes/index.htm | 1 - .../shopaholic/controllers/taxes/preview.htm | 22 - .../shopaholic/controllers/taxes/reorder.htm | 8 - .../shopaholic/controllers/taxes/update.htm | 53 -- plugins/lovata/shopaholic/crowdin.yml | 3 - plugins/lovata/shopaholic/lang/ar/lang.php | 178 ---- plugins/lovata/shopaholic/lang/be/lang.php | 178 ---- plugins/lovata/shopaholic/lang/bg/lang.php | 178 ---- plugins/lovata/shopaholic/lang/ca/lang.php | 178 ---- plugins/lovata/shopaholic/lang/cs/lang.php | 178 ---- plugins/lovata/shopaholic/lang/da/lang.php | 178 ---- plugins/lovata/shopaholic/lang/de/lang.php | 178 ---- plugins/lovata/shopaholic/lang/el/lang.php | 178 ---- plugins/lovata/shopaholic/lang/en/lang.php | 226 ----- plugins/lovata/shopaholic/lang/es/lang.php | 178 ---- plugins/lovata/shopaholic/lang/et/lang.php | 178 ---- plugins/lovata/shopaholic/lang/fa/lang.php | 178 ---- plugins/lovata/shopaholic/lang/fi/lang.php | 178 ---- plugins/lovata/shopaholic/lang/fr/lang.php | 93 -- plugins/lovata/shopaholic/lang/hu/lang.php | 178 ---- plugins/lovata/shopaholic/lang/id/lang.php | 178 ---- plugins/lovata/shopaholic/lang/it/lang.php | 178 ---- plugins/lovata/shopaholic/lang/ja/lang.php | 129 --- plugins/lovata/shopaholic/lang/kk/lang.php | 178 ---- plugins/lovata/shopaholic/lang/ko/lang.php | 178 ---- plugins/lovata/shopaholic/lang/ky/lang.php | 178 ---- plugins/lovata/shopaholic/lang/lt/lang.php | 178 ---- plugins/lovata/shopaholic/lang/lv/lang.php | 178 ---- plugins/lovata/shopaholic/lang/nb/lang.php | 178 ---- plugins/lovata/shopaholic/lang/nl/lang.php | 179 ---- plugins/lovata/shopaholic/lang/pl/lang.php | 178 ---- plugins/lovata/shopaholic/lang/pt/lang.php | 178 ---- plugins/lovata/shopaholic/lang/ro/lang.php | 178 ---- plugins/lovata/shopaholic/lang/ru/lang.php | 221 ----- plugins/lovata/shopaholic/lang/sk/lang.php | 178 ---- plugins/lovata/shopaholic/lang/sv/lang.php | 178 ---- plugins/lovata/shopaholic/lang/tr/lang.php | 178 ---- plugins/lovata/shopaholic/lang/uk/lang.php | 178 ---- plugins/lovata/shopaholic/lang/vi/lang.php | 178 ---- plugins/lovata/shopaholic/lang/zh/lang.php | 178 ---- plugins/lovata/shopaholic/models/Brand.php | 173 ---- plugins/lovata/shopaholic/models/Category.php | 217 ----- plugins/lovata/shopaholic/models/Currency.php | 162 ---- plugins/lovata/shopaholic/models/Measure.php | 59 -- plugins/lovata/shopaholic/models/Offer.php | 598 ------------- plugins/lovata/shopaholic/models/Price.php | 146 --- .../lovata/shopaholic/models/PriceType.php | 91 -- plugins/lovata/shopaholic/models/Product.php | 296 ------- .../lovata/shopaholic/models/PromoBlock.php | 192 ---- plugins/lovata/shopaholic/models/Settings.php | 62 -- plugins/lovata/shopaholic/models/Tax.php | 128 --- .../shopaholic/models/XmlImportSettings.php | 97 -- .../shopaholic/models/brand/columns.yaml | 48 - .../shopaholic/models/brand/fields.yaml | 76 -- .../shopaholic/models/category/columns.yaml | 42 - .../shopaholic/models/category/fields.yaml | 83 -- .../shopaholic/models/currency/columns.yaml | 53 -- .../shopaholic/models/currency/fields.yaml | 32 - .../shopaholic/models/measure/columns.yaml | 22 - .../shopaholic/models/measure/fields.yaml | 10 - .../shopaholic/models/offer/columns.yaml | 52 -- .../shopaholic/models/offer/fields.yaml | 66 -- .../models/offer/relation_columns.yaml | 43 - .../shopaholic/models/pricetype/columns.yaml | 43 - .../shopaholic/models/pricetype/fields.yaml | 21 - .../shopaholic/models/product/columns.yaml | 55 -- .../shopaholic/models/product/fields.yaml | 106 --- .../models/product/relation_columns.yaml | 40 - .../shopaholic/models/promoblock/columns.yaml | 53 -- .../shopaholic/models/promoblock/fields.yaml | 94 -- .../shopaholic/models/settings/fields.yaml | 117 --- .../lovata/shopaholic/models/tax/columns.yaml | 43 - .../lovata/shopaholic/models/tax/fields.yaml | 75 -- .../models/xmlimportsettings/fields.yaml | 228 ----- plugins/lovata/shopaholic/phpunit.xml | 29 - plugins/lovata/shopaholic/plugin.yaml | 80 -- .../unit/collection/BrandCollectionTest.php | 214 ----- .../collection/CategoryCollectionTest.php | 148 ---- .../unit/collection/OfferCollectionTest.php | 147 ---- .../unit/collection/ProductCollectionTest.php | 552 ------------ .../tests/unit/item/BrandItemTest.php | 106 --- .../tests/unit/item/CategoryItemTest.php | 237 ----- .../tests/unit/item/MeasureItemTest.php | 101 --- .../tests/unit/item/OfferItemTest.php | 142 --- .../tests/unit/item/ProductItemTest.php | 186 ---- .../tests/unit/models/BrandTest.php | 53 -- .../tests/unit/models/CategoryTest.php | 53 -- .../tests/unit/models/MeasureTest.php | 31 - .../tests/unit/models/OfferTest.php | 51 -- .../tests/unit/models/ProductTest.php | 82 -- .../create_table_additional_categories.php | 38 - .../updates/create_table_brands.php | 48 - .../updates/create_table_categories.php | 52 -- .../updates/create_table_currency.php | 49 -- .../updates/create_table_measure.php | 58 -- .../updates/create_table_offers.php | 56 -- .../updates/create_table_price_types.php | 48 - .../updates/create_table_prices.php | 50 -- .../updates/create_table_products.php | 53 -- .../updates/create_table_promo_block.php | 52 -- .../create_table_promo_block_relation.php | 39 - .../create_table_tax_category_relation.php | 39 - .../create_table_tax_country_relation.php | 39 - .../create_table_tax_product_relation.php | 39 - .../create_table_tax_state_relation.php | 39 - .../shopaholic/updates/create_table_taxes.php | 45 - .../seeder_create_default_currency.php | 47 - .../updates/seeder_price_format.php | 21 - .../updates/seeder_transfer_offer_prices.php | 33 - ...date_table_offers_add_dimensions_field.php | 97 -- .../update_table_offers_add_measure_field.php | 42 - ...ate_table_offers_change_quantity_field.php | 42 - ...update_table_offers_remove_price_field.php | 46 - .../update_table_users_add_currency_field.php | 50 -- .../lovata/shopaholic/updates/version.yaml | 136 --- .../shopaholic/views/import_from_xml_info.htm | 8 - .../shopaholic/views/offer_price_list.htm | 24 - .../shopaholic/widgets/ImportFromCSV.php | 21 - .../shopaholic/widgets/ImportFromXML.php | 75 -- .../importfromcsv/partials/_widget.htm | 57 -- .../importfromxml/partials/_widget.htm | 62 -- plugins/lovata/toolbox/.codeclimate.yml | 31 - plugins/lovata/toolbox/.editorconfig | 36 - plugins/lovata/toolbox/.gitignore | 93 -- plugins/lovata/toolbox/CONTRIBUTING.md | 60 -- plugins/lovata/toolbox/LICENSE.md | 674 -------------- plugins/lovata/toolbox/PHPMD_custom.xml | 91 -- plugins/lovata/toolbox/Plugin.php | 135 --- plugins/lovata/toolbox/README.md | 38 - plugins/lovata/toolbox/assets/images/logo.svg | 12 - .../toolbox/assets/images/toolbox-banner.png | Bin 20054 -> 0 bytes .../classes/collection/CollectionStore.php | 59 -- .../classes/collection/ElementCollection.php | 833 ------------------ .../classes/collection/TestCollection.php | 13 - .../classes/component/ComponentSubmitForm.php | 212 ----- .../toolbox/classes/component/ElementData.php | 65 -- .../toolbox/classes/component/ElementPage.php | 165 ---- .../classes/component/SortingElementList.php | 44 - .../classes/console/CommonCreateFile.php | 546 ------------ .../toolbox/classes/console/CreateAll.php | 92 -- .../classes/console/CreateCollection.php | 29 - .../classes/console/CreateComponentData.php | 38 - .../classes/console/CreateComponentList.php | 39 - .../classes/console/CreateComponentPage.php | 39 - .../classes/console/CreateController.php | 110 --- .../classes/console/CreateEventModel.php | 31 - .../CreateExtendBackendMenuHandler.php | 26 - .../CreateExtendModelColumnsHandler.php | 30 - .../CreateExtendModelFieldsHandler.php | 30 - .../toolbox/classes/console/CreateItem.php | 29 - .../classes/console/CreateMigration.php | 44 - .../toolbox/classes/console/CreateModel.php | 58 -- .../classes/console/CreateModelColumn.php | 29 - .../classes/console/CreateModelField.php | 28 - .../toolbox/classes/console/CreatePlugin.php | 106 --- .../toolbox/classes/console/CreateStore.php | 46 - .../toolbox/classes/console/ToolBoxHelper.php | 110 --- .../event/AbstractBackendColumnHandler.php | 53 -- .../event/AbstractBackendFieldHandler.php | 53 -- .../event/AbstractBackendMenuHandler.php | 28 - .../AbstractExtendRelationConfigHandler.php | 58 -- .../event/AbstractModelRelationHandler.php | 95 -- .../toolbox/classes/event/ModelHandler.php | 236 ----- .../classes/helper/AbstractImportModel.php | 358 -------- .../helper/AbstractImportModelFromCSV.php | 270 ------ .../helper/AbstractImportModelFromXML.php | 379 -------- .../toolbox/classes/helper/ImportXMLNode.php | 74 -- .../toolbox/classes/helper/PageHelper.php | 259 ------ .../toolbox/classes/helper/ParseXMLNode.php | 97 -- .../toolbox/classes/helper/PriceHelper.php | 91 -- .../toolbox/classes/helper/SendMailHelper.php | 133 --- .../toolbox/classes/helper/UserHelper.php | 147 ---- .../helper/users/AbstractUserHelper.php | 34 - .../helper/users/BuddiesUserHelper.php | 51 -- .../helper/users/RainLabUserHelper.php | 51 -- .../toolbox/classes/item/ElementItem.php | 577 ------------ .../toolbox/classes/item/ItemStorage.php | 70 -- .../lovata/toolbox/classes/item/MainItem.php | 263 ------ .../lovata/toolbox/classes/item/TestItem.php | 87 -- .../create/ActiveListStoreCreateFile.php | 16 - .../parser/create/CollectionCreateFile.php | 16 - .../parser/create/CommonCreateFile.php | 100 --- .../parser/create/ComponentDataCreateFile.php | 16 - .../parser/create/ComponentListCreateFile.php | 16 - .../parser/create/ComponentPageCreateFile.php | 16 - ...ControllerConfigImportExportCreateFile.php | 16 - .../ControllerConfigReorderCreateFile.php | 16 - .../ControllerConfirmFilterCreateFile.php | 16 - .../ControllerConfirmFormCreateFile.php | 16 - .../ControllerConfirmListCreateFile.php | 16 - .../create/ControllerCreateCreateFile.php | 16 - .../parser/create/ControllerCreateFile.php | 16 - .../create/ControllerExportCreateFile.php | 16 - .../create/ControllerImportCreateFile.php | 16 - .../create/ControllerIndexCreateFile.php | 16 - .../ControllerListToolbarCreateFile.php | 16 - .../create/ControllerPreviewCreateFile.php | 16 - .../create/ControllerReorderCreateFile.php | 16 - .../create/ControllerUpdateCreateFile.php | 16 - .../parser/create/EventModelCreateFile.php | 16 - .../ExtendBackendMenuHandlerCreateFile.php | 16 - .../ExtendModelColumnsHandlerCreateFile.php | 16 - .../ExtendModelFieldsHandlerCreateFile.php | 16 - .../classes/parser/create/ItemCreateFile.php | 16 - .../parser/create/ListStoreCreateFile.php | 16 - .../parser/create/MigrationCreateFile.php | 16 - .../parser/create/ModelColumnCreateFile.php | 16 - .../classes/parser/create/ModelCreateFile.php | 16 - .../parser/create/ModelFieldCreateFile.php | 16 - .../parser/create/PluginLangCreateFile.php | 16 - .../parser/create/PluginPHPCreateFile.php | 16 - .../parser/create/PluginVersionCreateFile.php | 16 - .../parser/create/PluginYAMLCreateFile.php | 16 - .../create/SortingListStoreCreateFile.php | 16 - .../create/TopLevelListStoreCreateFile.php | 16 - .../parser/templates/active_list_store.stub | 25 - .../classes/parser/templates/collection.stub | 83 -- .../classes/parser/templates/columns.stub | 47 - .../parser/templates/component_data.stub | 34 - .../parser/templates/component_list.stub | 43 - .../parser/templates/component_page.stub | 57 -- .../classes/parser/templates/controller.stub | 50 -- .../templates/controller_config_filter.stub | 15 - .../templates/controller_config_form.stub | 41 - .../controller_config_import_export.stub | 18 - .../templates/controller_config_list.stub | 46 - .../templates/controller_config_reorder.stub | 3 - .../parser/templates/controller_create.stub | 51 -- .../parser/templates/controller_export.stub | 25 - .../parser/templates/controller_import.stub | 25 - .../parser/templates/controller_index.stub | 1 - .../templates/controller_list_toolbar.stub | 27 - .../parser/templates/controller_preview.stub | 22 - .../parser/templates/controller_reorder.stub | 7 - .../parser/templates/controller_update.stub | 59 -- .../classes/parser/templates/event_model.stub | 130 --- .../extend_backend_menu_handler.stub | 40 - .../extend_model_columns_handler.stub | 59 -- .../extend_model_fields_handler.stub | 59 -- .../classes/parser/templates/fields.stub | 75 -- .../classes/parser/templates/item.stub | 109 --- .../classes/parser/templates/lang.stub | 28 - .../classes/parser/templates/list_store.stub | 37 - .../classes/parser/templates/migration.stub | 53 -- .../classes/parser/templates/model.stub | 205 ----- .../classes/parser/templates/plugin_php.stub | 12 - .../classes/parser/templates/plugin_yaml.stub | 8 - .../parser/templates/sorting_list_store.stub | 108 --- .../sorting_top_level_list_store.stub | 27 - .../classes/parser/templates/version.stub | 2 - .../parser/update/CommonUpdateFile.php | 62 -- .../parser/update/PluginLangUpdateFile.php | 86 -- .../update/PluginVersionYAMLUpdateFile.php | 158 ---- .../parser/update/PluginYAMLUpdateFile.php | 174 ---- .../toolbox/classes/queue/ImportItemQueue.php | 49 -- .../classes/storage/AbstractUserStorage.php | 96 -- .../classes/storage/CookieUserStorage.php | 70 -- .../classes/storage/SessionUserStorage.php | 56 -- .../toolbox/classes/storage/UserStorage.php | 198 ----- .../classes/store/AbstractListStore.php | 43 - .../toolbox/classes/store/AbstractStore.php | 92 -- .../classes/store/AbstractStoreWithParam.php | 82 -- .../store/AbstractStoreWithTwoParam.php | 92 -- .../store/AbstractStoreWithoutParam.php | 57 -- .../lovata/toolbox/components/Pagination.php | 168 ---- plugins/lovata/toolbox/composer.json | 24 - plugins/lovata/toolbox/crowdin.yml | 3 - plugins/lovata/toolbox/lang/ar/lang.php | 191 ---- plugins/lovata/toolbox/lang/be/lang.php | 191 ---- plugins/lovata/toolbox/lang/bg/lang.php | 191 ---- plugins/lovata/toolbox/lang/ca/lang.php | 191 ---- plugins/lovata/toolbox/lang/cs/lang.php | 191 ---- plugins/lovata/toolbox/lang/da/lang.php | 191 ---- plugins/lovata/toolbox/lang/de/lang.php | 193 ---- plugins/lovata/toolbox/lang/el/lang.php | 191 ---- plugins/lovata/toolbox/lang/en/lang.php | 227 ----- plugins/lovata/toolbox/lang/es/lang.php | 191 ---- plugins/lovata/toolbox/lang/et/lang.php | 191 ---- plugins/lovata/toolbox/lang/fa/lang.php | 191 ---- plugins/lovata/toolbox/lang/fi/lang.php | 191 ---- plugins/lovata/toolbox/lang/fr/lang.php | 193 ---- plugins/lovata/toolbox/lang/hu/lang.php | 191 ---- plugins/lovata/toolbox/lang/id/lang.php | 191 ---- plugins/lovata/toolbox/lang/it/lang.php | 191 ---- plugins/lovata/toolbox/lang/ja/lang.php | 191 ---- plugins/lovata/toolbox/lang/kk/lang.php | 191 ---- plugins/lovata/toolbox/lang/ko/lang.php | 191 ---- plugins/lovata/toolbox/lang/ky/lang.php | 191 ---- plugins/lovata/toolbox/lang/lt/lang.php | 191 ---- plugins/lovata/toolbox/lang/lv/lang.php | 191 ---- plugins/lovata/toolbox/lang/nb/lang.php | 191 ---- plugins/lovata/toolbox/lang/nl/lang.php | 191 ---- plugins/lovata/toolbox/lang/pl/lang.php | 191 ---- plugins/lovata/toolbox/lang/pt/lang.php | 191 ---- plugins/lovata/toolbox/lang/ro/lang.php | 191 ---- plugins/lovata/toolbox/lang/ru/lang.php | 214 ----- plugins/lovata/toolbox/lang/sk/lang.php | 191 ---- plugins/lovata/toolbox/lang/sv/lang.php | 191 ---- plugins/lovata/toolbox/lang/tr/lang.php | 191 ---- plugins/lovata/toolbox/lang/uk/lang.php | 191 ---- plugins/lovata/toolbox/lang/vi/lang.php | 191 ---- plugins/lovata/toolbox/lang/zh/lang.php | 191 ---- .../lovata/toolbox/models/CommonProperty.php | 497 ----------- .../lovata/toolbox/models/CommonSettings.php | 61 -- plugins/lovata/toolbox/models/Settings.php | 15 - .../toolbox/models/settings/fields.yaml | 80 -- plugins/lovata/toolbox/phpunit.xml | 31 - plugins/lovata/toolbox/plugin.yaml | 11 - plugins/lovata/toolbox/tests/CommonTest.php | 49 -- .../tests/unit/CollectionStoreTest.php | 42 - .../toolbox/tests/unit/CollectionTest.php | 734 --------------- .../lovata/toolbox/tests/unit/ItemTest.php | 82 -- .../toolbox/traits/console/LogoTrait.php | 38 - .../toolbox/traits/console/UpdateLangFile.php | 55 -- .../traits/helpers/PriceHelperTrait.php | 168 ---- .../toolbox/traits/helpers/TraitCached.php | 46 - .../TraitComponentNotFoundResponse.php | 59 -- .../traits/helpers/TraitInitActiveLang.php | 102 --- .../traits/helpers/TraitValidationHelper.php | 24 - .../models/SetPropertyAttributeTrait.php | 36 - .../traits/parse/ParseByPatternTrait.php | 123 --- .../traits/tests/TestModelHasImages.php | 25 - .../traits/tests/TestModelHasPreviewImage.php | 25 - .../tests/TestModelValidationNameField.php | 32 - .../tests/TestModelValidationSlugField.php | 33 - plugins/lovata/toolbox/updates/version.yaml | 110 --- 536 files changed, 46362 deletions(-) create mode 100644 plugins/lovata.zip delete mode 100644 plugins/lovata/shopaholic/.codeclimate.yml delete mode 100644 plugins/lovata/shopaholic/.editorconfig delete mode 100644 plugins/lovata/shopaholic/.github/FUNDING.yml delete mode 100644 plugins/lovata/shopaholic/.gitignore delete mode 100644 plugins/lovata/shopaholic/CONTRIBUTING.md delete mode 100644 plugins/lovata/shopaholic/LICENSE.md delete mode 100644 plugins/lovata/shopaholic/PHPMD_custom.xml delete mode 100644 plugins/lovata/shopaholic/Plugin.php delete mode 100644 plugins/lovata/shopaholic/README.md delete mode 100644 plugins/lovata/shopaholic/assets/images/icon.svg delete mode 100644 plugins/lovata/shopaholic/assets/images/logo.png delete mode 100644 plugins/lovata/shopaholic/assets/images/shopaholic-banner.png delete mode 100644 plugins/lovata/shopaholic/classes/collection/BrandCollection.php delete mode 100644 plugins/lovata/shopaholic/classes/collection/CategoryCollection.php delete mode 100644 plugins/lovata/shopaholic/classes/collection/CurrencyCollection.php delete mode 100644 plugins/lovata/shopaholic/classes/collection/OfferCollection.php delete mode 100644 plugins/lovata/shopaholic/classes/collection/ProductCollection.php delete mode 100644 plugins/lovata/shopaholic/classes/collection/PromoBlockCollection.php delete mode 100644 plugins/lovata/shopaholic/classes/collection/TaxCollection.php delete mode 100644 plugins/lovata/shopaholic/classes/console/CheckTableIntegrity.php delete mode 100644 plugins/lovata/shopaholic/classes/console/ImportFromXML.php delete mode 100644 plugins/lovata/shopaholic/classes/console/PreconfigureImportSettingsFromXML.php delete mode 100644 plugins/lovata/shopaholic/classes/event/ExtendMenuHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/brand/BrandModelHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/category/CategoryModelHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/currency/CurrencyModelHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/measure/MeasureModelHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/offer/ExtendOfferFieldsHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/offer/OfferModelHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/price/PriceModelHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/product/ProductModelHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/product/ProductRelationHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/promoblock/PromoBlockModelHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/promoblock/PromoBlockRelationHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/tax/ExtendTaxFieldsHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/tax/TaxModelHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/event/tax/TaxRelationHandler.php delete mode 100644 plugins/lovata/shopaholic/classes/helper/AllCategoriesMenuType.php delete mode 100644 plugins/lovata/shopaholic/classes/helper/CatalogMenuType.php delete mode 100644 plugins/lovata/shopaholic/classes/helper/CategoryMenuType.php delete mode 100644 plugins/lovata/shopaholic/classes/helper/CommonMenuType.php delete mode 100644 plugins/lovata/shopaholic/classes/helper/CurrencyHelper.php delete mode 100644 plugins/lovata/shopaholic/classes/helper/MeasureHelper.php delete mode 100644 plugins/lovata/shopaholic/classes/helper/PriceTypeHelper.php delete mode 100644 plugins/lovata/shopaholic/classes/helper/TaxHelper.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ImportBrandModelFromCSV.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ImportBrandModelFromXML.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ImportCategoryModelFromCSV.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ImportCategoryModelFromXML.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ImportOfferModelFromCSV.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ImportOfferModelFromXML.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ImportOfferPriceFromXML.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ImportProductModelFromCSV.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ImportProductModelFromXML.php delete mode 100644 plugins/lovata/shopaholic/classes/import/ParseCategoryXMLNode.php delete mode 100644 plugins/lovata/shopaholic/classes/item/BrandItem.php delete mode 100644 plugins/lovata/shopaholic/classes/item/CategoryItem.php delete mode 100644 plugins/lovata/shopaholic/classes/item/CurrencyItem.php delete mode 100644 plugins/lovata/shopaholic/classes/item/MeasureItem.php delete mode 100644 plugins/lovata/shopaholic/classes/item/OfferItem.php delete mode 100644 plugins/lovata/shopaholic/classes/item/ProductItem.php delete mode 100644 plugins/lovata/shopaholic/classes/item/PromoBlockItem.php delete mode 100644 plugins/lovata/shopaholic/classes/item/TaxItem.php delete mode 100644 plugins/lovata/shopaholic/classes/store/BrandListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/CategoryListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/CurrencyListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/OfferListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/ProductListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/PromoBlockListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/TaxListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/brand/ActiveListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/brand/ListByCategoryStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/brand/SortingListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/category/ActiveListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/category/TopLevelListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/currency/ActiveListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/currency/SortingListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/offer/ActiveListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/offer/SortingListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/product/ActiveListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/product/ListByBrandStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/product/ListByCategoryStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/product/ListByPromoBlockStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/product/SortingListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/promoblock/ActiveListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/promoblock/HiddenListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/promoblock/NotHiddenListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/promoblock/SortingListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/tax/ActiveListStore.php delete mode 100644 plugins/lovata/shopaholic/classes/store/tax/SortingListStore.php delete mode 100644 plugins/lovata/shopaholic/components/BrandData.php delete mode 100644 plugins/lovata/shopaholic/components/BrandList.php delete mode 100644 plugins/lovata/shopaholic/components/BrandPage.php delete mode 100644 plugins/lovata/shopaholic/components/Breadcrumbs.php delete mode 100644 plugins/lovata/shopaholic/components/CategoryData.php delete mode 100644 plugins/lovata/shopaholic/components/CategoryList.php delete mode 100644 plugins/lovata/shopaholic/components/CategoryPage.php delete mode 100644 plugins/lovata/shopaholic/components/CurrencyList.php delete mode 100644 plugins/lovata/shopaholic/components/ProductData.php delete mode 100644 plugins/lovata/shopaholic/components/ProductList.php delete mode 100644 plugins/lovata/shopaholic/components/ProductPage.php delete mode 100644 plugins/lovata/shopaholic/components/PromoBlockData.php delete mode 100644 plugins/lovata/shopaholic/components/PromoBlockList.php delete mode 100644 plugins/lovata/shopaholic/components/PromoBlockPage.php delete mode 100644 plugins/lovata/shopaholic/composer.json delete mode 100644 plugins/lovata/shopaholic/controllers/Brands.php delete mode 100644 plugins/lovata/shopaholic/controllers/Categories.php delete mode 100644 plugins/lovata/shopaholic/controllers/Currencies.php delete mode 100644 plugins/lovata/shopaholic/controllers/Measures.php delete mode 100644 plugins/lovata/shopaholic/controllers/Offers.php delete mode 100644 plugins/lovata/shopaholic/controllers/PriceTypes.php delete mode 100644 plugins/lovata/shopaholic/controllers/Products.php delete mode 100644 plugins/lovata/shopaholic/controllers/PromoBlocks.php delete mode 100644 plugins/lovata/shopaholic/controllers/Taxes.php delete mode 100644 plugins/lovata/shopaholic/controllers/brands/_config_filter.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/brands/_list_toolbar.htm delete mode 100644 plugins/lovata/shopaholic/controllers/brands/config_form.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/brands/config_import_export.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/brands/config_list.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/brands/config_reorder.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/brands/create.htm delete mode 100644 plugins/lovata/shopaholic/controllers/brands/import.htm delete mode 100644 plugins/lovata/shopaholic/controllers/brands/index.htm delete mode 100644 plugins/lovata/shopaholic/controllers/brands/preview.htm delete mode 100644 plugins/lovata/shopaholic/controllers/brands/reorder.htm delete mode 100644 plugins/lovata/shopaholic/controllers/brands/update.htm delete mode 100644 plugins/lovata/shopaholic/controllers/categories/_config_filter.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/categories/_list_toolbar.htm delete mode 100644 plugins/lovata/shopaholic/controllers/categories/config_form.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/categories/config_import_export.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/categories/config_list.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/categories/config_relation.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/categories/config_reorder.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/categories/create.htm delete mode 100644 plugins/lovata/shopaholic/controllers/categories/import.htm delete mode 100644 plugins/lovata/shopaholic/controllers/categories/index.htm delete mode 100644 plugins/lovata/shopaholic/controllers/categories/preview.htm delete mode 100644 plugins/lovata/shopaholic/controllers/categories/reorder.htm delete mode 100644 plugins/lovata/shopaholic/controllers/categories/update.htm delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/_config_filter.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/_list_toolbar.htm delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/config_form.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/config_list.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/config_reorder.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/create.htm delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/index.htm delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/preview.htm delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/reorder.htm delete mode 100644 plugins/lovata/shopaholic/controllers/currencies/update.htm delete mode 100644 plugins/lovata/shopaholic/controllers/measures/_list_toolbar.htm delete mode 100644 plugins/lovata/shopaholic/controllers/measures/config_form.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/measures/config_list.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/measures/create.htm delete mode 100644 plugins/lovata/shopaholic/controllers/measures/index.htm delete mode 100644 plugins/lovata/shopaholic/controllers/measures/preview.htm delete mode 100644 plugins/lovata/shopaholic/controllers/measures/update.htm delete mode 100644 plugins/lovata/shopaholic/controllers/offers/config_form.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/offers/config_import_export.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/offers/config_relation.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/offers/create.htm delete mode 100644 plugins/lovata/shopaholic/controllers/offers/import.htm delete mode 100644 plugins/lovata/shopaholic/controllers/offers/preview.htm delete mode 100644 plugins/lovata/shopaholic/controllers/offers/update.htm delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/_config_filter.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/_list_toolbar.htm delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/config_form.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/config_list.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/config_reorder.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/create.htm delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/index.htm delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/preview.htm delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/reorder.htm delete mode 100644 plugins/lovata/shopaholic/controllers/pricetypes/update.htm delete mode 100644 plugins/lovata/shopaholic/controllers/products/_config_filter.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/products/_list_toolbar.htm delete mode 100644 plugins/lovata/shopaholic/controllers/products/_offer.htm delete mode 100644 plugins/lovata/shopaholic/controllers/products/config_form.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/products/config_import_export.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/products/config_list.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/products/config_relation.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/products/create.htm delete mode 100644 plugins/lovata/shopaholic/controllers/products/import.htm delete mode 100644 plugins/lovata/shopaholic/controllers/products/index.htm delete mode 100644 plugins/lovata/shopaholic/controllers/products/preview.htm delete mode 100644 plugins/lovata/shopaholic/controllers/products/reorder.htm delete mode 100644 plugins/lovata/shopaholic/controllers/products/update.htm delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/_config_filter.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/_list_toolbar.htm delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/_product.htm delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/config_form.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/config_list.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/config_relation.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/config_reorder.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/create.htm delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/index.htm delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/preview.htm delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/reorder.htm delete mode 100644 plugins/lovata/shopaholic/controllers/promoblocks/update.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/_category.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/_config_filter.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/_country.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/_list_toolbar.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/_product.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/_state.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/config_form.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/config_list.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/config_relation.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/config_reorder.yaml delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/create.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/index.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/preview.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/reorder.htm delete mode 100644 plugins/lovata/shopaholic/controllers/taxes/update.htm delete mode 100644 plugins/lovata/shopaholic/crowdin.yml delete mode 100644 plugins/lovata/shopaholic/lang/ar/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/be/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/bg/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/ca/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/cs/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/da/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/de/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/el/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/en/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/es/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/et/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/fa/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/fi/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/fr/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/hu/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/id/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/it/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/ja/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/kk/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/ko/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/ky/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/lt/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/lv/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/nb/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/nl/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/pl/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/pt/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/ro/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/ru/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/sk/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/sv/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/tr/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/uk/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/vi/lang.php delete mode 100644 plugins/lovata/shopaholic/lang/zh/lang.php delete mode 100644 plugins/lovata/shopaholic/models/Brand.php delete mode 100644 plugins/lovata/shopaholic/models/Category.php delete mode 100644 plugins/lovata/shopaholic/models/Currency.php delete mode 100644 plugins/lovata/shopaholic/models/Measure.php delete mode 100644 plugins/lovata/shopaholic/models/Offer.php delete mode 100644 plugins/lovata/shopaholic/models/Price.php delete mode 100644 plugins/lovata/shopaholic/models/PriceType.php delete mode 100644 plugins/lovata/shopaholic/models/Product.php delete mode 100644 plugins/lovata/shopaholic/models/PromoBlock.php delete mode 100644 plugins/lovata/shopaholic/models/Settings.php delete mode 100644 plugins/lovata/shopaholic/models/Tax.php delete mode 100644 plugins/lovata/shopaholic/models/XmlImportSettings.php delete mode 100644 plugins/lovata/shopaholic/models/brand/columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/brand/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/category/columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/category/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/currency/columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/currency/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/measure/columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/measure/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/offer/columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/offer/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/offer/relation_columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/pricetype/columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/pricetype/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/product/columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/product/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/product/relation_columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/promoblock/columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/promoblock/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/settings/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/tax/columns.yaml delete mode 100644 plugins/lovata/shopaholic/models/tax/fields.yaml delete mode 100644 plugins/lovata/shopaholic/models/xmlimportsettings/fields.yaml delete mode 100644 plugins/lovata/shopaholic/phpunit.xml delete mode 100644 plugins/lovata/shopaholic/plugin.yaml delete mode 100644 plugins/lovata/shopaholic/tests/unit/collection/BrandCollectionTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/collection/CategoryCollectionTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/collection/OfferCollectionTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/collection/ProductCollectionTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/item/BrandItemTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/item/CategoryItemTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/item/MeasureItemTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/item/OfferItemTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/item/ProductItemTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/models/BrandTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/models/CategoryTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/models/MeasureTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/models/OfferTest.php delete mode 100644 plugins/lovata/shopaholic/tests/unit/models/ProductTest.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_additional_categories.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_brands.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_categories.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_currency.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_measure.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_offers.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_price_types.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_prices.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_products.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_promo_block.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_promo_block_relation.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_tax_category_relation.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_tax_country_relation.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_tax_product_relation.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_tax_state_relation.php delete mode 100644 plugins/lovata/shopaholic/updates/create_table_taxes.php delete mode 100644 plugins/lovata/shopaholic/updates/seeder_create_default_currency.php delete mode 100644 plugins/lovata/shopaholic/updates/seeder_price_format.php delete mode 100644 plugins/lovata/shopaholic/updates/seeder_transfer_offer_prices.php delete mode 100644 plugins/lovata/shopaholic/updates/update_table_offers_add_dimensions_field.php delete mode 100644 plugins/lovata/shopaholic/updates/update_table_offers_add_measure_field.php delete mode 100644 plugins/lovata/shopaholic/updates/update_table_offers_change_quantity_field.php delete mode 100644 plugins/lovata/shopaholic/updates/update_table_offers_remove_price_field.php delete mode 100644 plugins/lovata/shopaholic/updates/update_table_users_add_currency_field.php delete mode 100644 plugins/lovata/shopaholic/updates/version.yaml delete mode 100644 plugins/lovata/shopaholic/views/import_from_xml_info.htm delete mode 100644 plugins/lovata/shopaholic/views/offer_price_list.htm delete mode 100644 plugins/lovata/shopaholic/widgets/ImportFromCSV.php delete mode 100644 plugins/lovata/shopaholic/widgets/ImportFromXML.php delete mode 100644 plugins/lovata/shopaholic/widgets/importfromcsv/partials/_widget.htm delete mode 100644 plugins/lovata/shopaholic/widgets/importfromxml/partials/_widget.htm delete mode 100644 plugins/lovata/toolbox/.codeclimate.yml delete mode 100644 plugins/lovata/toolbox/.editorconfig delete mode 100644 plugins/lovata/toolbox/.gitignore delete mode 100644 plugins/lovata/toolbox/CONTRIBUTING.md delete mode 100644 plugins/lovata/toolbox/LICENSE.md delete mode 100644 plugins/lovata/toolbox/PHPMD_custom.xml delete mode 100644 plugins/lovata/toolbox/Plugin.php delete mode 100644 plugins/lovata/toolbox/README.md delete mode 100644 plugins/lovata/toolbox/assets/images/logo.svg delete mode 100644 plugins/lovata/toolbox/assets/images/toolbox-banner.png delete mode 100644 plugins/lovata/toolbox/classes/collection/CollectionStore.php delete mode 100644 plugins/lovata/toolbox/classes/collection/ElementCollection.php delete mode 100644 plugins/lovata/toolbox/classes/collection/TestCollection.php delete mode 100644 plugins/lovata/toolbox/classes/component/ComponentSubmitForm.php delete mode 100644 plugins/lovata/toolbox/classes/component/ElementData.php delete mode 100644 plugins/lovata/toolbox/classes/component/ElementPage.php delete mode 100644 plugins/lovata/toolbox/classes/component/SortingElementList.php delete mode 100644 plugins/lovata/toolbox/classes/console/CommonCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateAll.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateCollection.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateComponentData.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateComponentList.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateComponentPage.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateController.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateEventModel.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateExtendBackendMenuHandler.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateExtendModelColumnsHandler.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateExtendModelFieldsHandler.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateItem.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateMigration.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateModel.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateModelColumn.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateModelField.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreatePlugin.php delete mode 100644 plugins/lovata/toolbox/classes/console/CreateStore.php delete mode 100644 plugins/lovata/toolbox/classes/console/ToolBoxHelper.php delete mode 100644 plugins/lovata/toolbox/classes/event/AbstractBackendColumnHandler.php delete mode 100644 plugins/lovata/toolbox/classes/event/AbstractBackendFieldHandler.php delete mode 100644 plugins/lovata/toolbox/classes/event/AbstractBackendMenuHandler.php delete mode 100644 plugins/lovata/toolbox/classes/event/AbstractExtendRelationConfigHandler.php delete mode 100644 plugins/lovata/toolbox/classes/event/AbstractModelRelationHandler.php delete mode 100644 plugins/lovata/toolbox/classes/event/ModelHandler.php delete mode 100644 plugins/lovata/toolbox/classes/helper/AbstractImportModel.php delete mode 100644 plugins/lovata/toolbox/classes/helper/AbstractImportModelFromCSV.php delete mode 100644 plugins/lovata/toolbox/classes/helper/AbstractImportModelFromXML.php delete mode 100644 plugins/lovata/toolbox/classes/helper/ImportXMLNode.php delete mode 100644 plugins/lovata/toolbox/classes/helper/PageHelper.php delete mode 100644 plugins/lovata/toolbox/classes/helper/ParseXMLNode.php delete mode 100644 plugins/lovata/toolbox/classes/helper/PriceHelper.php delete mode 100644 plugins/lovata/toolbox/classes/helper/SendMailHelper.php delete mode 100644 plugins/lovata/toolbox/classes/helper/UserHelper.php delete mode 100644 plugins/lovata/toolbox/classes/helper/users/AbstractUserHelper.php delete mode 100644 plugins/lovata/toolbox/classes/helper/users/BuddiesUserHelper.php delete mode 100644 plugins/lovata/toolbox/classes/helper/users/RainLabUserHelper.php delete mode 100644 plugins/lovata/toolbox/classes/item/ElementItem.php delete mode 100644 plugins/lovata/toolbox/classes/item/ItemStorage.php delete mode 100644 plugins/lovata/toolbox/classes/item/MainItem.php delete mode 100644 plugins/lovata/toolbox/classes/item/TestItem.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ActiveListStoreCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/CollectionCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/CommonCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ComponentDataCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ComponentListCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ComponentPageCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerConfigImportExportCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerConfigReorderCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerConfirmFilterCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerConfirmFormCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerConfirmListCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerCreateCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerExportCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerImportCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerIndexCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerListToolbarCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerPreviewCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerReorderCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ControllerUpdateCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/EventModelCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ExtendBackendMenuHandlerCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ExtendModelColumnsHandlerCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ExtendModelFieldsHandlerCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ItemCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ListStoreCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/MigrationCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ModelColumnCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ModelCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/ModelFieldCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/PluginLangCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/PluginPHPCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/PluginVersionCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/PluginYAMLCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/SortingListStoreCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/create/TopLevelListStoreCreateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/active_list_store.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/collection.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/columns.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/component_data.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/component_list.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/component_page.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_config_filter.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_config_form.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_config_import_export.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_config_list.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_config_reorder.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_create.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_export.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_import.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_index.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_list_toolbar.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_preview.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_reorder.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/controller_update.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/event_model.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/extend_backend_menu_handler.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/extend_model_columns_handler.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/extend_model_fields_handler.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/fields.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/item.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/lang.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/list_store.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/migration.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/model.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/plugin_php.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/plugin_yaml.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/sorting_list_store.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/sorting_top_level_list_store.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/templates/version.stub delete mode 100644 plugins/lovata/toolbox/classes/parser/update/CommonUpdateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/update/PluginLangUpdateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/update/PluginVersionYAMLUpdateFile.php delete mode 100644 plugins/lovata/toolbox/classes/parser/update/PluginYAMLUpdateFile.php delete mode 100644 plugins/lovata/toolbox/classes/queue/ImportItemQueue.php delete mode 100644 plugins/lovata/toolbox/classes/storage/AbstractUserStorage.php delete mode 100644 plugins/lovata/toolbox/classes/storage/CookieUserStorage.php delete mode 100644 plugins/lovata/toolbox/classes/storage/SessionUserStorage.php delete mode 100644 plugins/lovata/toolbox/classes/storage/UserStorage.php delete mode 100644 plugins/lovata/toolbox/classes/store/AbstractListStore.php delete mode 100644 plugins/lovata/toolbox/classes/store/AbstractStore.php delete mode 100644 plugins/lovata/toolbox/classes/store/AbstractStoreWithParam.php delete mode 100644 plugins/lovata/toolbox/classes/store/AbstractStoreWithTwoParam.php delete mode 100644 plugins/lovata/toolbox/classes/store/AbstractStoreWithoutParam.php delete mode 100644 plugins/lovata/toolbox/components/Pagination.php delete mode 100644 plugins/lovata/toolbox/composer.json delete mode 100644 plugins/lovata/toolbox/crowdin.yml delete mode 100644 plugins/lovata/toolbox/lang/ar/lang.php delete mode 100644 plugins/lovata/toolbox/lang/be/lang.php delete mode 100644 plugins/lovata/toolbox/lang/bg/lang.php delete mode 100644 plugins/lovata/toolbox/lang/ca/lang.php delete mode 100644 plugins/lovata/toolbox/lang/cs/lang.php delete mode 100644 plugins/lovata/toolbox/lang/da/lang.php delete mode 100644 plugins/lovata/toolbox/lang/de/lang.php delete mode 100644 plugins/lovata/toolbox/lang/el/lang.php delete mode 100644 plugins/lovata/toolbox/lang/en/lang.php delete mode 100644 plugins/lovata/toolbox/lang/es/lang.php delete mode 100644 plugins/lovata/toolbox/lang/et/lang.php delete mode 100644 plugins/lovata/toolbox/lang/fa/lang.php delete mode 100644 plugins/lovata/toolbox/lang/fi/lang.php delete mode 100644 plugins/lovata/toolbox/lang/fr/lang.php delete mode 100644 plugins/lovata/toolbox/lang/hu/lang.php delete mode 100644 plugins/lovata/toolbox/lang/id/lang.php delete mode 100644 plugins/lovata/toolbox/lang/it/lang.php delete mode 100644 plugins/lovata/toolbox/lang/ja/lang.php delete mode 100644 plugins/lovata/toolbox/lang/kk/lang.php delete mode 100644 plugins/lovata/toolbox/lang/ko/lang.php delete mode 100644 plugins/lovata/toolbox/lang/ky/lang.php delete mode 100644 plugins/lovata/toolbox/lang/lt/lang.php delete mode 100644 plugins/lovata/toolbox/lang/lv/lang.php delete mode 100644 plugins/lovata/toolbox/lang/nb/lang.php delete mode 100644 plugins/lovata/toolbox/lang/nl/lang.php delete mode 100644 plugins/lovata/toolbox/lang/pl/lang.php delete mode 100644 plugins/lovata/toolbox/lang/pt/lang.php delete mode 100644 plugins/lovata/toolbox/lang/ro/lang.php delete mode 100644 plugins/lovata/toolbox/lang/ru/lang.php delete mode 100644 plugins/lovata/toolbox/lang/sk/lang.php delete mode 100644 plugins/lovata/toolbox/lang/sv/lang.php delete mode 100644 plugins/lovata/toolbox/lang/tr/lang.php delete mode 100644 plugins/lovata/toolbox/lang/uk/lang.php delete mode 100644 plugins/lovata/toolbox/lang/vi/lang.php delete mode 100644 plugins/lovata/toolbox/lang/zh/lang.php delete mode 100644 plugins/lovata/toolbox/models/CommonProperty.php delete mode 100644 plugins/lovata/toolbox/models/CommonSettings.php delete mode 100644 plugins/lovata/toolbox/models/Settings.php delete mode 100644 plugins/lovata/toolbox/models/settings/fields.yaml delete mode 100644 plugins/lovata/toolbox/phpunit.xml delete mode 100644 plugins/lovata/toolbox/plugin.yaml delete mode 100644 plugins/lovata/toolbox/tests/CommonTest.php delete mode 100644 plugins/lovata/toolbox/tests/unit/CollectionStoreTest.php delete mode 100644 plugins/lovata/toolbox/tests/unit/CollectionTest.php delete mode 100644 plugins/lovata/toolbox/tests/unit/ItemTest.php delete mode 100644 plugins/lovata/toolbox/traits/console/LogoTrait.php delete mode 100644 plugins/lovata/toolbox/traits/console/UpdateLangFile.php delete mode 100644 plugins/lovata/toolbox/traits/helpers/PriceHelperTrait.php delete mode 100644 plugins/lovata/toolbox/traits/helpers/TraitCached.php delete mode 100644 plugins/lovata/toolbox/traits/helpers/TraitComponentNotFoundResponse.php delete mode 100644 plugins/lovata/toolbox/traits/helpers/TraitInitActiveLang.php delete mode 100644 plugins/lovata/toolbox/traits/helpers/TraitValidationHelper.php delete mode 100644 plugins/lovata/toolbox/traits/models/SetPropertyAttributeTrait.php delete mode 100644 plugins/lovata/toolbox/traits/parse/ParseByPatternTrait.php delete mode 100644 plugins/lovata/toolbox/traits/tests/TestModelHasImages.php delete mode 100644 plugins/lovata/toolbox/traits/tests/TestModelHasPreviewImage.php delete mode 100644 plugins/lovata/toolbox/traits/tests/TestModelValidationNameField.php delete mode 100644 plugins/lovata/toolbox/traits/tests/TestModelValidationSlugField.php delete mode 100644 plugins/lovata/toolbox/updates/version.yaml diff --git a/plugins/lovata.zip b/plugins/lovata.zip new file mode 100644 index 0000000000000000000000000000000000000000..759d87d43f1f8ebc5efd15de2bd34e4c4568d1fe GIT binary patch literal 853913 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%0ApP4{jLDP~L`E{?&akOS9EJnz-`zYYJ#oQ4!)xB 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/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

tib`>WLi0RgcYf%ZyOG;&caRn21!rm15y4 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 {INUYa*wgrW{>o;-Kl^| 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 z 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 z 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

  • nKrw=^e_siSF`7 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
    LGywdQ4&ekS?T? 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 E9~n11Z2$lO literal 0 HcmV?d00001 diff --git a/plugins/lovata/shopaholic/.codeclimate.yml b/plugins/lovata/shopaholic/.codeclimate.yml deleted file mode 100644 index 79ce32be1..000000000 --- a/plugins/lovata/shopaholic/.codeclimate.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -plugins: - duplication: - enabled: true - config: - languages: - php: - mass_threshold: 45 - fixme: - enabled: true - phpmd: - enabled: true - config: - file_extensions: "php" - rulesets: "controversial,design,unusedcode,PHPMD_custom.xml" - phpcodesniffer: - enabled: true - config: - standard: "Symfony2" - sonar-php: - enabled: true -ratings: - paths: - - "**.php" -exclude_patterns: - - 'tests/' - - 'lang/' - - 'updates/' \ No newline at end of file diff --git a/plugins/lovata/shopaholic/.editorconfig b/plugins/lovata/shopaholic/.editorconfig deleted file mode 100644 index 483d42dff..000000000 --- a/plugins/lovata/shopaholic/.editorconfig +++ /dev/null @@ -1,27 +0,0 @@ -# Defining consistent coding styles between different editors and IDEs -# Support info @ http://editorconfig.org/#download -# editorconfig.org - -# Top-most EditorConfig file -root = true - -# General settings -[*] -charset = utf-8 -end_of_line = lf -trim_trailing_whitespace = true -insert_final_newline = true -indent_style = space -indent_size = 4 - -# CSS settings -[*.css] -indent_size = 2 - -# YAML settings -[*.yml] -indent_size = 2 - -# Markdown settings -[*.md] -trim_trailing_whitespace = false diff --git a/plugins/lovata/shopaholic/.github/FUNDING.yml b/plugins/lovata/shopaholic/.github/FUNDING.yml deleted file mode 100644 index 671cba79c..000000000 --- a/plugins/lovata/shopaholic/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -# These are supported funding model platforms - -open_collective: oc-shopaholic diff --git a/plugins/lovata/shopaholic/.gitignore b/plugins/lovata/shopaholic/.gitignore deleted file mode 100644 index 52a19c297..000000000 --- a/plugins/lovata/shopaholic/.gitignore +++ /dev/null @@ -1,92 +0,0 @@ -/node_modules -Homestead.yaml -/_ide_helper.php -build.sh - -#site -pdf/ -_backup/ -cgi-bin/ - -*.log -*.bin -*.komodoproject -/.komodotools/ - -# PhpStorm -.idea - -# Eclipse -*.pydevproject -.project -.metadata -bin/** -tmp/** -tmp/**/* -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath -.externalToolBuilders/ -*.launch -.cproject -.buildpath - -# SublimeText -/*.sublime-project -*.sublime-workspace - -# NetBeans -nbproject/ -build/ -nbbuild/ -dist/ -nbdist/ -nbactions.xml -nb-configuration.xml - -# Windows system files -$RECYCLE.BIN/ -Thumbs.db -ehthumbs.db -Desktop.ini - -# OSX system files -.DS_store -.AppleDouble -.LSOverride -Icon -._* -.Spotlight-V100 -.Trashes - -# SVN/CVS -.svn -/CVS/* -*/CVS/* -.cvsignore -*/.cvsignore - -# temporary files/folders - -tmp* -~* -*.~* -*.bak -*.swp - -build/ -png/ -psd/ -doc/ -svg/ -vendors/ -pixelPerfect/ -node_modules/ -docs/ - -_ide_helper.php diff --git a/plugins/lovata/shopaholic/CONTRIBUTING.md b/plugins/lovata/shopaholic/CONTRIBUTING.md deleted file mode 100644 index 73fcc8f70..000000000 --- a/plugins/lovata/shopaholic/CONTRIBUTING.md +++ /dev/null @@ -1,60 +0,0 @@ -# Contributing - -When contributing to this repository, please first discuss the change you wish to make via issue with the owners of this repository before making a change. - -Please note we have a code of conduct, please follow it in all your interactions with the project. - -## Pull Request Process - -1. Ensure any install or build dependencies are removed before the end of the layer when doing a build. -2. Cover your code contribution with unit tests and ensure your Pull Request passes all the tests. -3. Open a Pull Request to a `develop` branch. -4. Add to the Pull Request details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters. -5. You may merge the Pull Request in once you have the sign-off of two other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you. - -## Code of Conduct - -### Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -### Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language. -* Being respectful of differing viewpoints and experiences. -* Gracefully accepting constructive criticism. -* Focusing on what is best for the community. -* Showing empathy towards other community members. - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances. -* Trolling, insulting/derogatory comments, and personal or political attacks. -* Public or private harassment. -* Publishing others' private information, such as a physical or electronic address, without explicit permission. -* Other conduct which could reasonably be considered inappropriate in a professional setting. - -### Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -### Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -### Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [support@lovata.com](mailto:support@lovata.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -### Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/plugins/lovata/shopaholic/LICENSE.md b/plugins/lovata/shopaholic/LICENSE.md deleted file mode 100644 index 9cecc1d46..000000000 --- a/plugins/lovata/shopaholic/LICENSE.md +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/plugins/lovata/shopaholic/PHPMD_custom.xml b/plugins/lovata/shopaholic/PHPMD_custom.xml deleted file mode 100644 index a24b60992..000000000 --- a/plugins/lovata/shopaholic/PHPMD_custom.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - Custom rules for checking project LOVATA Group - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/Plugin.php b/plugins/lovata/shopaholic/Plugin.php deleted file mode 100644 index 43826ec99..000000000 --- a/plugins/lovata/shopaholic/Plugin.php +++ /dev/null @@ -1,207 +0,0 @@ -registerConsoleCommand('shopaholic:check.table.integrity', CheckTableIntegrity::class); - $this->registerConsoleCommand('shopaholic:import_from_xml', ImportFromXML::class); - $this->registerConsoleCommand('shopaholic:preconfigure_import_from_xml', PreconfigureImportSettingsFromXML::class); - } - - /** - * @return array - */ - public function registerComponents() - { - return [ - 'Lovata\Shopaholic\Components\CategoryList' => 'CategoryList', - 'Lovata\Shopaholic\Components\CategoryPage' => 'CategoryPage', - 'Lovata\Shopaholic\Components\CategoryData' => 'CategoryData', - 'Lovata\Shopaholic\Components\Breadcrumbs' => 'CatalogBreadcrumbs', - 'Lovata\Shopaholic\Components\CurrencyList' => 'CurrencyList', - 'Lovata\Shopaholic\Components\ProductData' => 'ProductData', - 'Lovata\Shopaholic\Components\ProductPage' => 'ProductPage', - 'Lovata\Shopaholic\Components\ProductList' => 'ProductList', - 'Lovata\Shopaholic\Components\BrandData' => 'BrandData', - 'Lovata\Shopaholic\Components\BrandPage' => 'BrandPage', - 'Lovata\Shopaholic\Components\BrandList' => 'BrandList', - 'Lovata\Shopaholic\Components\PromoBlockData' => 'PromoBlockData', - 'Lovata\Shopaholic\Components\PromoBlockPage' => 'PromoBlockPage', - 'Lovata\Shopaholic\Components\PromoBlockList' => 'PromoBlockList', - ]; - } - - /** - * @return array - */ - public function registerSettings() - { - return [ - 'shopaholic-menu-main-settings' => [ - 'label' => 'lovata.shopaholic::lang.menu.main_settings', - 'description' => 'lovata.shopaholic::lang.menu.main_settings_description', - 'category' => 'lovata.shopaholic::lang.tab.settings', - 'icon' => 'oc-icon-book', - 'class' => 'Lovata\Shopaholic\Models\Settings', - 'order' => 100, - 'permissions' => [ - 'shopaholic-settings', - ], - ], - 'shopaholic-menu-currency' => [ - 'label' => 'lovata.shopaholic::lang.menu.currency', - 'description' => 'lovata.shopaholic::lang.menu.currency_description', - 'category' => 'lovata.shopaholic::lang.tab.settings', - 'icon' => 'oc-icon-usd', - 'url' => Backend::url('lovata/shopaholic/currencies'), - 'order' => 1800, - 'permissions' => [ - 'shopaholic-menu-currency', - ], - ], - 'shopaholic-menu-tax' => [ - 'label' => 'lovata.shopaholic::lang.menu.tax', - 'description' => 'lovata.shopaholic::lang.menu.tax_description', - 'category' => 'lovata.shopaholic::lang.tab.settings', - 'icon' => 'oc-icon-percent', - 'url' => Backend::url('lovata/shopaholic/taxes'), - 'order' => 1900, - 'permissions' => [ - 'shopaholic-menu-tax', - ], - ], - 'shopaholic-menu-price-types' => [ - 'label' => 'lovata.shopaholic::lang.menu.price_type', - 'description' => 'lovata.shopaholic::lang.menu.price_type_description', - 'category' => 'lovata.shopaholic::lang.tab.settings', - 'icon' => 'oc-icon-money', - 'url' => Backend::url('lovata/shopaholic/pricetypes'), - 'order' => 2000, - 'permissions' => [ - 'shopaholic-menu-price-type', - ], - ], - 'shopaholic-menu-import-xml-file' => [ - 'label' => 'lovata.shopaholic::lang.menu.import_xml_file', - 'description' => 'lovata.shopaholic::lang.menu.import_xml_file_description', - 'category' => 'lovata.shopaholic::lang.tab.settings', - 'icon' => 'oc-icon-download', - 'class' => 'Lovata\Shopaholic\Models\XmlImportSettings', - 'order' => 8000, - 'permissions' => [ - 'shopaholic-menu-import-xml-file', - ], - ], - 'shopaholic-menu-measure' => [ - 'label' => 'lovata.shopaholic::lang.menu.measure', - 'description' => 'lovata.shopaholic::lang.menu.measure_description', - 'category' => 'lovata.shopaholic::lang.tab.settings', - 'url' => Backend::url('lovata/shopaholic/measures'), - 'icon' => 'icon-balance-scale', - 'permissions' => ['shopaholic-menu-measure'], - 'order' => 1650, - ], - ]; - } - - /** - * Plugin boot method - */ - public function boot() - { - $this->addEventListener(); - } - - /** - * Add event listeners - */ - protected function addEventListener() - { - Event::subscribe(ExtendMenuHandler::class); - //Brand events - Event::subscribe(BrandModelHandler::class); - //Category events - Event::subscribe(CategoryModelHandler::class); - //Currency events - Event::subscribe(CurrencyModelHandler::class); - //Measure events - Event::subscribe(MeasureModelHandler::class); - //Offer events - Event::subscribe(OfferModelHandler::class); - Event::subscribe(ExtendOfferFieldsHandler::class); - //Price events - Event::subscribe(PriceModelHandler::class); - //Product events - Event::subscribe(ProductModelHandler::class); - Event::subscribe(ProductRelationHandler::class); - //Promo block events - Event::subscribe(PromoBlockModelHandler::class); - Event::subscribe(PromoBlockRelationHandler::class); - //Tax events - Event::subscribe(TaxModelHandler::class); - Event::subscribe(TaxRelationHandler::class); - Event::subscribe(ExtendTaxFieldsHandler::class); - } - - /** - * @return array - */ - public function registerReportWidgets() - { - return [ - 'Lovata\Shopaholic\Widgets\ImportFromXML' => [ - 'label' => 'lovata.shopaholic::lang.widget.import_from_xml_files', - ], - 'Lovata\Shopaholic\Widgets\ImportFromCSV' => [ - 'label' => 'lovata.shopaholic::lang.widget.import_from_csv_files', - ] - ]; - } -} diff --git a/plugins/lovata/shopaholic/README.md b/plugins/lovata/shopaholic/README.md deleted file mode 100644 index 77b52a513..000000000 --- a/plugins/lovata/shopaholic/README.md +++ /dev/null @@ -1,128 +0,0 @@ -# Shopaholic - -[![Build Status](https://travis-ci.org/oc-shopaholic/oc-shopaholic-plugin.svg?branch=master)](https://travis-ci.org/oc-shopaholic/oc-shopaholic-plugin) -[![Coverage Status](https://coveralls.io/repos/github/oc-shopaholic/oc-shopaholic-plugin/badge.svg?branch=master)](https://coveralls.io/github/oc-shopaholic/oc-shopaholic-plugin?branch=master) -[![Maintainability](https://api.codeclimate.com/v1/badges/3d1cb11b6df3e444422f/maintainability)](https://codeclimate.com/github/oc-shopaholic/oc-shopaholic-plugin/maintainability) -[![Crowdin](https://d322cqt584bo4o.cloudfront.net/shopaholic-plugin-for-october/localized.svg)](https://crowdin.com/project/shopaholic-plugin-for-october) -[![Financial contributors](https://opencollective.com/oc-shopaholic/tiers/badge.svg)](https://opencollective.com/oc-shopaholic) -[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) - -E-Commerce plugin by [LOVATA](https://lovata.com) for October CMS. - -![Shopaholic Banner](assets/images/shopaholic-banner.png) - -## Overview - -Shopaholic is a scalable and highly flexible e-commerce ecosystem for [October CMS](https://octobercms.com). The core plugin is provided free of charge and includes the following set of features: - -* Products and trade offers management. -* Product image gallery management. -* Products grouping by categories and brands. -* Multi-currency, taxes and price types management. -* Data import (product, offers, categories, brands) from a CSV file. -* Basic products filtering (by category, brand etc.) and sorting (by price, new additions etc.) - -With the help of Shopaholic’s standard functions, combining them together it’s also possible to solve many other non-trivial tasks, such as displaying blocks of random products, displaying the cheapest and most expensive products, etc. - -In order to cater to the growing scalability demands of a project, the ecosystem provides [extra plugins](https://octobercms.com/plugin/lovata-shopaholic#extensions) to extend the basic functionality. With these plugins sellers can: - -* Manage multi-language content (via [RainLab.Translate](https://octobercms.com/plugin/rainlab-translate)). -* Sell online (via [Lovata.PayPalShopaholic](https://octobercms.com/plugin/lovata-paypalshopaholic)). -* Extend online payment options by adding additional payment providers (via [Lovata.OmnipayShopaholic](https://octobercms.com/plugin/lovata-omnipayshopaholic)). -* Create custom products filters by any essence (e.g. by _New additions_, _Discounts_, _In stock_ etc.) (via [Lovata.FilterShopaholic](https://octobercms.com/plugin/lovata-filtershopaholic)). -* Add custom properties to a product (via [Lovata.PropertiesShopaholic](https://octobercms.com/plugin/lovata-propertiesshopaholic)). -* Bind similar products to a certain one (via [Lovata.RelatedProductsShopaholic](https://octobercms.com/plugin/lovata-relatedproductsshopaholic)). -* Manage promo activities (via [Lovata.CouponsShopaholic](https://octobercms.com/plugin/lovata-couponsshopaholic), [Lovata.DiscountsShopaholic](https://octobercms.com/plugin/lovata-discountsshopaholic) and [Lovata.CampaignsShopaholic](https://octobercms.com/plugin/lovata-campaignsshopaholic)). -* Group products for SEO reasons (via [Lovata.TagsShopaholic](https://octobercms.com/plugin/lovata-tagsshopaholic)). -* Manage complex SEO issues (via [Lovata.MightySeo](https://octobercms.com/plugin/lovata-mightyseo)). -* Increase the revenue by assigning accessories to the products (via [Lovata.AccessoriesShopaholic](https://octobercms.com/plugin/lovata-accessoriesshopaholic)). -* Manage customers (via [Lovata.Buddies](https://octobercms.com/plugin/lovata-buddies) or [RainLab.User](https://octobercms.com/plugin/rainlab-user)). - -Besides you can provide a better UX for the customer with the ability to: -* See the popular products ( via [Lovata.PopularityShopaholic](https://octobercms.com/plugin/lovata-popularityshopaholic)). -* Search for the products (via [Lovata.SearchShopaholic](https://octobercms.com/plugin/lovata-searchshopaholic) or [Lovata.SphinxShopaholic](https://octobercms.com/plugin/lovata-sphinxshopaholic)). -* Compare the products (via [Lovata.CompareShopaholic](https://octobercms.com/plugin/lovata-compareshopaholic)). -* Find the products they viewed before (via [Lovata.ViewedProductsShopaholic](https://octobercms.com/plugin/lovata-viewedproductsshopaholic)). -* Leave and read the reviews for the products (via [Lovata.ReviewsShopaholic](https://octobercms.com/plugin/lovata-reviewsshopaholic)). -* Postpone the products for the future purchases (via [Lovata.WishListShopaholic](https://octobercms.com/plugin/lovata-wishlistshopaholic)). - -> Please note, the architecture of the plugins allows [extending](https://octobercms.com/docs/plugin/extending) the existing methods, fields and other data without interfering with original source code! - -The development of Shopaholic’s ecosystem is guided by the similar philosophies of October CMS and Unix like operating systems, where the main focus is to create simple microarchitecture solutions that communicate with each other through smart APIs. - -One one hand, this approach allows keeping performance, security, and functionality of the code to a high standard. On the other hand, it provides a clean and smooth back-end UI/UX that isn't over-bloated with the features. - -## Live demo - -Visit our [demo](http://demo.shopaholic.one/) website. Sign in to [backend](http://demo.shopaholic.one/backend) using the following credentials: -* user: manager -* password: manager - -You can run the demo site locally. To do so, you need to clone the [oc-shopaholic-demo-theme](https://github.com/lovata/oc-shopaholic-demo-theme) repository and follow the steps from the _Installation guide_ in the Readme file. As a result, you will receive a copy of the demo site with a full database. Having a ready-made demo site example, you can easily learn how to operate the plugins. - -## Installation - -Regardless of the installation type you choose, you must install [Toolbox plugin](https://octobercms.com/plugin/lovata-toolbox), which is a required dependency for Shopaholic. - -### Artisan - -Using the Laravel’s CLI is the fastest way to get started. Just run the following commands in a project’s root directory: - -```bash -php artisan plugin:install lovata.toolbox -php artisan plugin:install lovata.shopaholic -``` - -### Composer - -If you prefer Composer run following commands in a project’s root directory: - -``` -composer require lovata/oc-toolbox-plugin -composer require lovata/oc-shopaholic-plugin -php artisan october:up -``` - -> It's not recommended way because of possible collisions with the updating of the plugins. - -Once the plugins are installed take a look at the official documentation for the possible next steps. - -## Documentation - -The complete official documentation of the ecosystem can be found [here](https://github.com/lovata/oc-shopaholic-plugin/wiki). - -## Performance - -As an environment for a testing measurements was used simple Digital Ocean droplet with this configuration: -* Dual Core CPU -* 4 Gb RAM -* Ubuntu 18.04 -* PHP 7.2.0 -* Apache 2.4 -* MySQL 5.7 - -| Products number | Catalog page load time | Product list filtering time | -| ------------------: | ---------------------: | --------------------------: | -| 210 | 100-150 ms | 80-100 ms | -| 21 000 | 900-1100 ms | 500-600 ms | - -If you would like to know how our plugins perform with large catalogs of products, you can visit our [Large Catalog Demo](http://big-demo.shopaholic.one) website that has 21 000 products, 68 000 offers and 210 000 variations of property values. - -## Quality standards - -We ensure the high quality of our plugins and provide you with full support. All of our plugins have extensive documentation. The quality of our plugins goes through rigorous testing, we have launched automated testing for all of our plugins. Our code conforms with the best writing and structuring practices. All this guarantees the stable work of our plugins after they are updated with new functionality and ensures their smooth integration. - -## Get involved - -If you're interested in the improvement of this project you can help in the following ways: -* bug reporting and new feature requesting by creating issues on plugin [GitHub page](https://github.com/lovata/oc-shopaholic-plugin/issues); -* contribution to a project following these [instructions](https://github.com/lovata/oc-shopaholic-plugin/blob/master/CONTRIBUTING.md); -* localization to your language using [Crowdin](https://crowdin.com/project/shopaholic-plugin-for-october) service. - -Let us know if you have any other questions, ideas or suggestions! Just drop a line at shopaholic@lovata.com. - -## License - -© 2019, [LOVATA Group, LLC](https://github.com/lovata) under [GNU GPL v3](https://opensource.org/licenses/GPL-3.0). - -Developed by [Andrey Kharanenka](https://github.com/kharanenka). diff --git a/plugins/lovata/shopaholic/assets/images/icon.svg b/plugins/lovata/shopaholic/assets/images/icon.svg deleted file mode 100644 index 36b41fbeb..000000000 --- a/plugins/lovata/shopaholic/assets/images/icon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/plugins/lovata/shopaholic/assets/images/logo.png b/plugins/lovata/shopaholic/assets/images/logo.png deleted file mode 100644 index 88c2ad8a5b4ae2e7078a8da61419fbbcf8a2a3b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3417 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 Nz|Pvqs?LHO_kZ<34=?}# diff --git a/plugins/lovata/shopaholic/assets/images/shopaholic-banner.png b/plugins/lovata/shopaholic/assets/images/shopaholic-banner.png deleted file mode 100644 index 710834578d62f01982844bf5995426aaf252c14e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248905 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Ƴi^%+}O~8`5UKbz?@>zF27~TQ#S`>O+GYB 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

    kRFL5^2Pf6ca?K1yAdw8Jvm} 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 diff --git a/plugins/lovata/shopaholic/classes/collection/BrandCollection.php b/plugins/lovata/shopaholic/classes/collection/BrandCollection.php deleted file mode 100644 index 6cbe3da95..000000000 --- a/plugins/lovata/shopaholic/classes/collection/BrandCollection.php +++ /dev/null @@ -1,88 +0,0 @@ -sorting->get(); - - return $this->applySorting($arResultIDList); - } - - /** - * Apply filter by active brand list - * @return $this - */ - public function active() - { - $arResultIDList = BrandListStore::instance()->active->get(); - - return $this->intersect($arResultIDList); - } - - /** - * Filter brand list by category ID - * @param int|array $arCategoryIDList - * @param bool $bWithChildren - * @return $this - */ - public function category($arCategoryIDList, $bWithChildren = false) - { - if (!is_array($arCategoryIDList)) { - $arCategoryIDList = [$arCategoryIDList]; - } - - $arResultIDList = []; - foreach ($arCategoryIDList as $iCategoryID) { - $arResultIDList = array_merge($arResultIDList, (array) BrandListStore::instance()->category->get($iCategoryID)); - if ($bWithChildren) { - $arResultIDList = array_merge($arResultIDList, (array) $this->getIDListChildrenCategory($iCategoryID)); - } - } - - return $this->intersect($arResultIDList); - } - - /** - * Get brand ID list for children categories - * @param int $iCategoryID - * @return array - */ - protected function getIDListChildrenCategory($iCategoryID) : array - { - //Get category item - $obCategoryItem = CategoryItem::make($iCategoryID); - if ($obCategoryItem->isEmpty() || $obCategoryItem->children->isEmpty()) { - return []; - } - - $arResultIDList = []; - foreach ($obCategoryItem->children as $obChildCategoryItem) { - $arResultIDList = array_merge($arResultIDList, (array) BrandListStore::instance()->category->get($obChildCategoryItem->id)); - $arResultIDList = array_merge($arResultIDList, $this->getIDListChildrenCategory($obChildCategoryItem->id)); - } - - return $arResultIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/collection/CategoryCollection.php b/plugins/lovata/shopaholic/classes/collection/CategoryCollection.php deleted file mode 100644 index b0273b77d..000000000 --- a/plugins/lovata/shopaholic/classes/collection/CategoryCollection.php +++ /dev/null @@ -1,41 +0,0 @@ -top_level->get(); - - return $this->applySorting($arResultIDList); - } - - /** - * Apply filter by active field - * @return $this - */ - public function active() - { - $arResultIDList = CategoryListStore::instance()->active->get(); - - return $this->intersect($arResultIDList); - } -} diff --git a/plugins/lovata/shopaholic/classes/collection/CurrencyCollection.php b/plugins/lovata/shopaholic/classes/collection/CurrencyCollection.php deleted file mode 100644 index 8162d89f6..000000000 --- a/plugins/lovata/shopaholic/classes/collection/CurrencyCollection.php +++ /dev/null @@ -1,39 +0,0 @@ -sorting->get(); - - return $this->applySorting($arResultIDList); - } - - /** - * Apply filter by active currency list - * @return $this - */ - public function active() - { - $arResultIDList = CurrencyListStore::instance()->active->get(); - - return $this->intersect($arResultIDList); - } -} diff --git a/plugins/lovata/shopaholic/classes/collection/OfferCollection.php b/plugins/lovata/shopaholic/classes/collection/OfferCollection.php deleted file mode 100644 index 8bf337871..000000000 --- a/plugins/lovata/shopaholic/classes/collection/OfferCollection.php +++ /dev/null @@ -1,67 +0,0 @@ -sorting->get($sSorting); - - return $this->applySorting($arResultIDList); - } - - /** - * Apply filter by active field - * @see \Lovata\Shopaholic\Tests\Unit\Collection\OfferCollectionTest::testActiveList() - * @return $this - */ - public function active() - { - $arResultIDList = OfferListStore::instance()->active->get(); - - return $this->intersect($arResultIDList); - } - - /** - * Get the total count of all order positions - * @return int - */ - public function getTotalQuantity() - { - $iQuantityCount = 0; - - $arOfferList = $this->all(); - - /** @var \Lovata\Shopaholic\Classes\Item\OfferItem $arOfferItem */ - foreach ($arOfferList as $arOfferItem) { - $iQuantityCount += $arOfferItem->quantity; - } - - return $iQuantityCount; - } -} diff --git a/plugins/lovata/shopaholic/classes/collection/ProductCollection.php b/plugins/lovata/shopaholic/classes/collection/ProductCollection.php deleted file mode 100644 index 1f54075dd..000000000 --- a/plugins/lovata/shopaholic/classes/collection/ProductCollection.php +++ /dev/null @@ -1,258 +0,0 @@ -sorting->get($sSorting); - - return $this->applySorting($arResultIDList); - } - - /** - * Apply filter by active field - * @return $this - */ - public function active() - { - $arResultIDList = ProductListStore::instance()->active->get(); - - return $this->intersect($arResultIDList); - } - - /** - * Filter product list by category ID - * @param int|array $arCategoryIDList - * @param bool $bWithChildren - * @return $this - */ - public function category($arCategoryIDList, $bWithChildren = false) - { - if (!is_array($arCategoryIDList)) { - $arCategoryIDList = [$arCategoryIDList]; - } - - $arResultIDList = []; - foreach ($arCategoryIDList as $iCategoryID) { - $arResultIDList = array_merge($arResultIDList, (array) ProductListStore::instance()->category->get($iCategoryID)); - if ($bWithChildren) { - $arResultIDList = array_merge($arResultIDList, (array) $this->getIDListChildrenCategory($iCategoryID)); - } - } - - return $this->intersect($arResultIDList); - } - - /** - * Filter product list by brand ID - * @param int $iBrandID - * @return $this - */ - public function brand($iBrandID) - { - $arResultIDList = ProductListStore::instance()->brand->get($iBrandID); - - return $this->intersect($arResultIDList); - } - - /** - * Filter product list by promo block ID + different extensions - * @param int $iPromoBlockID - * @return $this - */ - public function promo($iPromoBlockID) - { - $arResultIDList = ProductListStore::instance()->promo_block->get($iPromoBlockID); - - //Fire event, get additional product ID list - $arEventDataList = Event::fire(PromoBlock::EVENT_GET_PRODUCT_LIST, $iPromoBlockID); - if (empty($arEventDataList)) { - return $this->intersect($arResultIDList); - } - - //Process event data - foreach ($arEventDataList as $arProductIDList) { - if (empty($arProductIDList) || !is_array($arProductIDList)) { - continue; - } - - $arResultIDList = array_merge($arResultIDList, $arProductIDList); - } - - $arResultIDList = array_unique($arResultIDList); - - return $this->intersect($arResultIDList); - } - - /** - * Filter product list by promo block ID - * @param int $iPromoBlockID - * @return $this - */ - public function promoBlock($iPromoBlockID) - { - $arResultIDList = ProductListStore::instance()->promo_block->get($iPromoBlockID); - - return $this->intersect($arResultIDList); - } - - /** - * Get offer with min price - * @param string $sPriceTypeCode - * @return OfferItem - */ - public function getOfferMinPrice($sPriceTypeCode = null) - { - $obProductList = clone $this; - - $sSorting = ProductListStore::SORT_PRICE_ASC; - if (!empty($sPriceTypeCode)) { - $sSorting .= '|'.$sPriceTypeCode; - } - - $obProductList->sort($sSorting); - - //Get product with min price - /** @var \Lovata\Shopaholic\Classes\Item\ProductItem $obProductItem */ - $obProductItem = $obProductList->first(); - - if ($obProductItem->isEmpty()) { - return OfferItem::make(null); - } - - //Get offer with min price - $obOfferCollection = $obProductItem->offer; - if ($obOfferCollection->isEmpty()) { - return OfferItem::make(null); - } - - $sSorting = OfferListStore::SORT_PRICE_ASC; - if (!empty($sPriceTypeCode)) { - $sSorting .= '|'.$sPriceTypeCode; - } - - /** @var OfferItem $obOfferItem */ - $obOfferItem = $obOfferCollection->sort($sSorting)->first(); - - return $obOfferItem; - } - - /** - * Get offer with max price - * @param string $sPriceTypeCode - * @return OfferItem - */ - public function getOfferMaxPrice($sPriceTypeCode = null) - { - $obProductList = clone $this; - - $sSorting = ProductListStore::SORT_PRICE_ASC; - if (!empty($sPriceTypeCode)) { - $sSorting .= '|'.$sPriceTypeCode; - } - - $obProductList->sort($sSorting); - - //Get product with min price - /** @var \Lovata\Shopaholic\Classes\Item\ProductItem $obProductItem */ - $obProductItem = $obProductList->last(); - - if ($obProductItem->isEmpty()) { - return OfferItem::make(null); - } - - //Get offer with min price - $obOfferCollection = $obProductItem->offer; - if ($obOfferCollection->isEmpty()) { - return OfferItem::make(null); - } - - $sSorting = OfferListStore::SORT_PRICE_ASC; - if (!empty($sPriceTypeCode)) { - $sSorting .= '|'.$sPriceTypeCode; - } - - /** @var OfferItem $obOfferItem */ - $obOfferItem = $obOfferCollection->sort($sSorting)->last(); - - return $obOfferItem; - } - - /** - * Get product ID list for children categories - * @param int $iCategoryID - * @return array - */ - protected function getIDListChildrenCategory($iCategoryID) : array - { - //Get category item - $obCategoryItem = CategoryItem::make($iCategoryID); - if ($obCategoryItem->isEmpty() || $obCategoryItem->children->isEmpty()) { - return []; - } - - $arResultIDList = []; - foreach ($obCategoryItem->children as $obChildCategoryItem) { - $arResultIDList = array_merge($arResultIDList, (array) ProductListStore::instance()->category->get($obChildCategoryItem->id)); - $arResultIDList = array_merge($arResultIDList, $this->getIDListChildrenCategory($obChildCategoryItem->id)); - } - - return $arResultIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/collection/PromoBlockCollection.php b/plugins/lovata/shopaholic/classes/collection/PromoBlockCollection.php deleted file mode 100644 index 795c64c6f..000000000 --- a/plugins/lovata/shopaholic/classes/collection/PromoBlockCollection.php +++ /dev/null @@ -1,62 +0,0 @@ -sorting->get($sSorting); - - return $this->applySorting($arResultIDList); - } - - /** - * Apply filter by active field - * @return $this - */ - public function active() - { - $arResultIDList = PromoBlockListStore::instance()->active->get(); - - return $this->intersect($arResultIDList); - } - - /** - * Apply filter by hidden field - * @return $this - */ - public function hidden() - { - $arResultIDList = PromoBlockListStore::instance()->hidden->get(); - - return $this->intersect($arResultIDList); - } - - /** - * Apply filter by hidden field - * @return $this - */ - public function notHidden() - { - $arResultIDList = PromoBlockListStore::instance()->not_hidden->get(); - - return $this->intersect($arResultIDList); - } -} diff --git a/plugins/lovata/shopaholic/classes/collection/TaxCollection.php b/plugins/lovata/shopaholic/classes/collection/TaxCollection.php deleted file mode 100644 index e89ec54dc..000000000 --- a/plugins/lovata/shopaholic/classes/collection/TaxCollection.php +++ /dev/null @@ -1,39 +0,0 @@ -sorting->get(); - - return $this->applySorting($arResultIDList); - } - - /** - * Apply filter by active tax list - * @return $this - */ - public function active() - { - $arResultIDList = TaxListStore::instance()->active->get(); - - return $this->intersect($arResultIDList); - } -} diff --git a/plugins/lovata/shopaholic/classes/console/CheckTableIntegrity.php b/plugins/lovata/shopaholic/classes/console/CheckTableIntegrity.php deleted file mode 100644 index 4047debfe..000000000 --- a/plugins/lovata/shopaholic/classes/console/CheckTableIntegrity.php +++ /dev/null @@ -1,56 +0,0 @@ - 'plugins/lovata/shopaholic/updates/update_table_users_add_currency_field.php', 'class' => '\Lovata\Shopaholic\Updates\UpdateTableUsersAddCurrencyField'], - ['path' => 'plugins/lovata/compareshopaholic/updates/update_table_users.php', 'class' => '\Lovata\CompareShopaholic\Updates\UpdateTableUsers'], - ['path' => 'plugins/lovata/ordersshopaholic/updates/table_update_taxes_add_applied_to_shipping_price.php', 'class' => '\Lovata\OrdersShopaholic\Updates\TableUpdateTaxesAddAppliedToShippingPrice'], - ['path' => 'plugins/lovata/searchshopaholic/updates/update_table_tag.php', 'class' => '\Lovata\SearchShopaholic\Updates\UpdateTableTag'], - ['path' => 'plugins/lovata/sphinxshopaholic/updates/update_table_tag.php', 'class' => '\Lovata\SphinxShopaholic\Updates\UpdateTableTag'], - ['path' => 'plugins/lovata/viewedproductsshopaholic/updates/update_table_users.php', 'class' => '\Lovata\ViewedProductsShopaholic\Updates\UpdateTableUsers'], - ['path' => 'plugins/lovata/wishlistshopaholic/updates/update_table_users.php', 'class' => '\Lovata\WishListShopaholic\Updates\UpdateTableUsers'], - ]; - - /** - * Execute the console command. - * @throws \Throwable - */ - public function handle() - { - foreach ($this->arMigrationList as $arMigrationData) { - $sClassName = $arMigrationData['class']; - $sFilePath = base_path($arMigrationData['path']); - if (!file_exists($sFilePath)) { - continue; - } - - include_once $sFilePath; - - if (!class_exists($sClassName)) { - continue; - } - - /** @var \October\Rain\Database\Updates\Migration $obMigration */ - $obMigration = new $sClassName(); - $obMigration->up(); - } - } -} diff --git a/plugins/lovata/shopaholic/classes/console/ImportFromXML.php b/plugins/lovata/shopaholic/classes/console/ImportFromXML.php deleted file mode 100644 index ebbb8bfe3..000000000 --- a/plugins/lovata/shopaholic/classes/console/ImportFromXML.php +++ /dev/null @@ -1,83 +0,0 @@ - ImportBrandModelFromXML::class, - 'category' => ImportCategoryModelFromXML::class, - 'property' => 'Lovata\PropertiesShopaholic\Classes\Import\ImportPropertyModelFromXML', - 'product' => ImportProductModelFromXML::class, - 'offer' => ImportOfferModelFromXML::class, - 'price' => ImportOfferPriceFromXML::class, - ]; - - /** - * Get the console command options. - * @return array - */ - protected function getOptions() - { - return [ - ['import', null, InputOption::VALUE_OPTIONAL, 'Available values: brand,category,property,product,offer.', null], - ]; - } - - /** - * Execute the console command. - * @throws \Throwable - */ - public function handle() - { - $arImportList = explode(',', $this->option('import')); - $arImportList = array_filter($arImportList); - - foreach ($this->arClassList as $sKey => $sImportClass) { - if (!class_exists($sImportClass) || (!empty($arImportList) && !in_array($sKey, $arImportList))) { - continue; - } - - /** @var \Lovata\Toolbox\Classes\Helper\AbstractImportModelFromXML $obImport */ - $obImport = new $sImportClass(); - $obImport->openMainFile(); - if (empty($obImport->getTotalCount())) { - continue; - } - - $this->info("Start import for \"$sKey\""); - - $obProgressBar = $this->output->createProgressBar($obImport->getTotalCount()); - $obImport->import($obProgressBar); - $obProgressBar->finish(); - - $this->info("\nFinish import for \"$sKey\"\n"); - $this->info("Created - {$obImport->getCreatedCount()}"); - $this->info("Updated - {$obImport->getUpdatedCount()}"); - $this->warn("Skipped - {$obImport->getSkippedCount()}"); - $this->info("Processed - {$obImport->getProcessedCount()}\n"); - } - } -} diff --git a/plugins/lovata/shopaholic/classes/console/PreconfigureImportSettingsFromXML.php b/plugins/lovata/shopaholic/classes/console/PreconfigureImportSettingsFromXML.php deleted file mode 100644 index 46ba68b1c..000000000 --- a/plugins/lovata/shopaholic/classes/console/PreconfigureImportSettingsFromXML.php +++ /dev/null @@ -1,58 +0,0 @@ - '1C:Enterprise', - 'config' => '{"file_list":[{"path":"temp\/import\/import.xml"},{"path":"temp\/import\/offers.xml"}],"image_folder":"temp\/import","product":[{"field":"external_id","path_to_field":"\u0418\u0434"},{"field":"name","path_to_field":"\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435"},{"field":"code","path_to_field":"\u0428\u0442\u0440\u0438\u0445\u043a\u043e\u0434"},{"field":"category_id","path_to_field":"\u0413\u0440\u0443\u043f\u043f\u044b"},{"field":"additional_category","path_to_field":"\u0413\u0440\u0443\u043f\u043f\u044b"},{"field":"preview_image","path_to_field":"\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430"},{"field":"images","path_to_field":"\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430"}],"product_file_path":"0","product_path_to_list":"\u041a\u0430\u0442\u0430\u043b\u043e\u0433\/\u0422\u043e\u0432\u0430\u0440\u044b\/\u0422\u043e\u0432\u0430\u0440","brand_file_path":"","brand_path_to_list":"","brand":[],"brand_deactivate":"0","category_file_path":"0","category_path_to_list":"\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\/\u0413\u0440\u0443\u043f\u043f\u044b\/\u0413\u0440\u0443\u043f\u043f\u0430","category_deactivate":"0","category":[{"field":"external_id","path_to_field":"\u0418\u0434"},{"field":"name","path_to_field":"\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435"},{"field":"active","path_to_field":"\u0411\u0438\u0442\u0440\u0438\u043a\u0441\u0410\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c"},{"field":"children","path_to_field":"\u0413\u0440\u0443\u043f\u043f\u044b\/\u0413\u0440\u0443\u043f\u043f\u0430"}],"property_file_path":"0","property_path_to_list":"\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\/\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430\/\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u043e","property_deactivate":"0","property":[{"field":"external_id","path_to_field":"\u0418\u0434"},{"field":"name","path_to_field":"\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435"}],"property_import_enable":"1","brand_import_enable":"0","category_import_enable":"1","product_import_enable":"1","offer_import_enable":"1","offer_file_path":"1","offer_path_to_list":"\u041f\u0430\u043a\u0435\u0442\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439\/\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f\/\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435","offer":[{"field":"external_id","path_to_field":"\u0418\u0434"},{"field":"product_id","path_to_field":"\u0418\u0434"},{"field":"code","path_to_field":"\u0428\u0442\u0440\u0438\u0445\u043a\u043e\u0434"},{"field":"name","path_to_field":"\u041d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435"},{"field":"preview_image","path_to_field":"\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430"},{"field":"images","path_to_field":"\u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430"},{"field":"quantity","path_to_field":"\u041e\u0441\u0442\u0430\u0442\u043a\u0438\/\u041e\u0441\u0442\u0430\u0442\u043e\u043a\/\u0421\u043a\u043b\u0430\u0434\/\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e"},{"field":"price","path_to_field":"\u0426\u0435\u043d\u044b\/\u0426\u0435\u043d\u0430\/\u0426\u0435\u043d\u0430\u0417\u0430\u0415\u0434\u0438\u043d\u0438\u0446\u0443"}],"price_import_enable":"1","price_file_path":"1","price_path_to_list":"\u041f\u0430\u043a\u0435\u0442\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439\/\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f\/\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435","price":[{"field":"external_id","path_to_field":"\u0418\u0434"},{"field":"quantity","path_to_field":"\u041e\u0441\u0442\u0430\u0442\u043a\u0438\/\u041e\u0441\u0442\u0430\u0442\u043e\u043a\/\u0421\u043a\u043b\u0430\u0434\/\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e"},{"field":"price","path_to_field":"\u0426\u0435\u043d\u044b\/\u0426\u0435\u043d\u0430\/\u0426\u0435\u043d\u0430\u0417\u0430\u0415\u0434\u0438\u043d\u0438\u0446\u0443"}],"product_property_list_path":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0421\u0432\u043e\u0439\u0441\u0442\u0432\/\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430","product_property_id_path":"\u0418\u0434","product_property_value_path":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435","offer_property_list_path":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0421\u0432\u043e\u0439\u0441\u0442\u0432\/\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430","offer_property_id_path":"\u0418\u0434","offer_property_value_path":"\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435"}', - ], - ]; - - /** - * Execute the console command. - * @throws \Throwable - */ - public function handle() - { - $arSettings = []; - $sPresetName = $this->choice('Select preset with import settings', array_pluck($this->arPresetList, 'label'), 0); - foreach ($this->arPresetList as $arPresetData) { - if ($arPresetData['label'] != $sPresetName) { - continue; - } - - $arSettings = $arPresetData['config']; - } - - if (empty($arSettings)) { - return; - } - - DB::table('system_settings')->where('item', 'lovata_shopaholic_xml_import_settings')->delete(); - DB::table('system_settings')->insert([ - 'value' => $arSettings, - 'item' => 'lovata_shopaholic_xml_import_settings', - ]); - - $this->call('cache:clear'); - } -} diff --git a/plugins/lovata/shopaholic/classes/event/ExtendMenuHandler.php b/plugins/lovata/shopaholic/classes/event/ExtendMenuHandler.php deleted file mode 100644 index 9bc181af8..000000000 --- a/plugins/lovata/shopaholic/classes/event/ExtendMenuHandler.php +++ /dev/null @@ -1,71 +0,0 @@ -listen('pages.menuitem.listTypes', function () { - - $arResult = [ - CatalogMenuType::MENU_TYPE => 'lovata.shopaholic::lang.menu.shop_catalog', - CategoryMenuType::MENU_TYPE => 'lovata.shopaholic::lang.menu.shop_category', - AllCategoriesMenuType::MENU_TYPE => 'lovata.shopaholic::lang.menu.all_shop_categories', - ]; - - return $arResult; - }); - - $obEvent->listen('pages.menuitem.getTypeInfo', function ($sType) { - - $obMenuType = $this->getMenuTypeObject($sType); - if (!empty($obMenuType)) { - return $obMenuType->getMenuTypeInfo(); - } - }); - - $obEvent->listen('pages.menuitem.resolveItem', function ($sType, $obItem, $sURL) { - - $obMenuType = $this->getMenuTypeObject($sType); - if (!empty($obMenuType)) { - return $obMenuType->resolveMenuItem($obItem, $sURL); - } - }); - } - - /** - * Get new menu object by type value - * @param string $sType - * @return \Lovata\Shopaholic\Classes\Helper\CommonMenuType - */ - protected function getMenuTypeObject($sType) - { - switch ($sType) { - case CategoryMenuType::MENU_TYPE: - return new CategoryMenuType(); - case CatalogMenuType::MENU_TYPE: - return new CatalogMenuType(); - case AllCategoriesMenuType::MENU_TYPE: - return new AllCategoriesMenuType(); - default: - return null; - } - } -} diff --git a/plugins/lovata/shopaholic/classes/event/brand/BrandModelHandler.php b/plugins/lovata/shopaholic/classes/event/brand/BrandModelHandler.php deleted file mode 100644 index 8e8895447..000000000 --- a/plugins/lovata/shopaholic/classes/event/brand/BrandModelHandler.php +++ /dev/null @@ -1,98 +0,0 @@ -translatable[] = ['slug', 'index' => true]; - } - }); - - $obEvent->listen('shopaholic.brand.update.sorting', function () { - $this->clearSortingList(); - }); - } - - /** - * After create event handler - */ - protected function afterCreate() - { - parent::afterCreate(); - $this->clearSortingList(); - } - - /** - * After save event handler - */ - protected function afterSave() - { - parent::afterSave(); - - $this->checkFieldChanges('active', BrandListStore::instance()->active); - } - - /** - * After delete event handler - */ - protected function afterDelete() - { - parent::afterDelete(); - $this->clearSortingList(); - - if ($this->obElement->active) { - BrandListStore::instance()->active->clear(); - } - } - - /** - * Clear sorting list - */ - protected function clearSortingList() - { - BrandListStore::instance()->sorting->clear(); - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() - { - return Brand::class; - } - - /** - * Get item class name - * @return string - */ - protected function getItemClass() - { - return BrandItem::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/category/CategoryModelHandler.php b/plugins/lovata/shopaholic/classes/event/category/CategoryModelHandler.php deleted file mode 100644 index 982ab8756..000000000 --- a/plugins/lovata/shopaholic/classes/event/category/CategoryModelHandler.php +++ /dev/null @@ -1,98 +0,0 @@ -translatable[] = ['slug', 'index' => true]; - } - }); - - $obEvent->listen('shopaholic.category.update.sorting', function () { - CategoryListStore::instance()->top_level->clear(); - - //Get category ID list - $arCategoryIDList = Category::lists('id'); - if (empty($arCategoryIDList)) { - return; - } - - //Clear cache for all categories - foreach ($arCategoryIDList as $iCategoryID) { - CategoryItem::clearCache($iCategoryID); - } - }); - } - - /** - * After save event handler - */ - protected function afterSave() - { - parent::afterSave(); - CategoryListStore::instance()->top_level->clear(); - - $this->checkFieldChanges('active', CategoryListStore::instance()->active); - } - - /** - * After delete event handler - */ - protected function afterDelete() - { - parent::afterDelete(); - CategoryListStore::instance()->top_level->clear(); - - //Clear parent item cache - if (!empty($this->obElement->parent_id)) { - CategoryItem::clearCache($this->obElement->parent_id); - } - - if ($this->obElement->active) { - CategoryListStore::instance()->active->clear(); - } - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() - { - return Category::class; - } - - /** - * Get item class name - * @return string - */ - protected function getItemClass() - { - return CategoryItem::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/currency/CurrencyModelHandler.php b/plugins/lovata/shopaholic/classes/event/currency/CurrencyModelHandler.php deleted file mode 100644 index 5c567cfdf..000000000 --- a/plugins/lovata/shopaholic/classes/event/currency/CurrencyModelHandler.php +++ /dev/null @@ -1,89 +0,0 @@ -listen('shopaholic.currency.update.sorting', function () { - $this->clearSortingList(); - }); - } - - /** - * After create event handler - */ - protected function afterCreate() - { - parent::afterCreate(); - $this->clearSortingList(); - } - - /** - * After save event handler - */ - protected function afterSave() - { - parent::afterSave(); - - $this->checkFieldChanges('active', CurrencyListStore::instance()->active); - } - - /** - * After delete event handler - */ - protected function afterDelete() - { - parent::afterDelete(); - $this->clearSortingList(); - - if ($this->obElement->active) { - CurrencyListStore::instance()->active->clear(); - } - } - - /** - * Clear sorting list - */ - protected function clearSortingList() - { - CurrencyListStore::instance()->sorting->clear(); - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() - { - return Currency::class; - } - - /** - * Get item class name - * @return string - */ - protected function getItemClass() - { - return CurrencyItem::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/measure/MeasureModelHandler.php b/plugins/lovata/shopaholic/classes/event/measure/MeasureModelHandler.php deleted file mode 100644 index ca31aec9b..000000000 --- a/plugins/lovata/shopaholic/classes/event/measure/MeasureModelHandler.php +++ /dev/null @@ -1,35 +0,0 @@ - [ - 'label' => 'lovata.shopaholic::lang.field.measure', - 'type' => 'relation', - 'span' => 'left', - 'emptyOption' => 'lovata.toolbox::lang.field.empty', - 'tab' => 'lovata.shopaholic::lang.tab.dimensions', - ], - 'weight' => [ - 'label' => $this->getWeightFieldLabel(), - 'type' => 'number', - 'span' => 'left', - 'tab' => 'lovata.shopaholic::lang.tab.dimensions', - ], - 'height' => [ - 'label' => $this->getDimensionsFieldLabel('lovata.toolbox::lang.field.height'), - 'type' => 'number', - 'span' => 'left', - 'tab' => 'lovata.shopaholic::lang.tab.dimensions', - ], - 'length' => [ - 'label' => $this->getDimensionsFieldLabel('lovata.toolbox::lang.field.length'), - 'type' => 'number', - 'span' => 'left', - 'tab' => 'lovata.shopaholic::lang.tab.dimensions', - ], - 'width' => [ - 'label' => $this->getDimensionsFieldLabel('lovata.toolbox::lang.field.width'), - 'type' => 'number', - 'span' => 'left', - 'tab' => 'lovata.shopaholic::lang.tab.dimensions', - ], - 'quantity_in_unit' => [ - 'label' => 'lovata.shopaholic::lang.field.quantity_in_unit', - 'type' => 'number', - 'span' => 'left', - 'tab' => 'lovata.shopaholic::lang.tab.dimensions', - ], - 'measure_of_unit' => [ - 'label' => 'lovata.shopaholic::lang.field.measure_of_unit', - 'type' => 'relation', - 'span' => 'left', - 'emptyOption' => 'lovata.toolbox::lang.field.empty', - 'tab' => 'lovata.shopaholic::lang.tab.dimensions', - ], - ]; - - $obWidget->addTabFields($arAdditionFields); - } - - /** - * Get weight field label - * @return string - */ - protected function getWeightFieldLabel() - { - $sLabel = Lang::get('lovata.toolbox::lang.field.weight'); - $iMeasureID = Settings::getValue('weight_measure'); - if (empty($iMeasureID)) { - return $sLabel; - } - - $obMeasure = Measure::find($iMeasureID); - if (empty($obMeasure)) { - return $sLabel; - } - - $sLabel .= " ({$obMeasure->name})"; - - return $sLabel; - } - - /** - * Get dimensions field label - * @param string $sLangPath - * @return string - */ - protected function getDimensionsFieldLabel($sLangPath) - { - $sLabel = Lang::get($sLangPath); - $iMeasureID = Settings::getValue('dimensions_measure'); - if (empty($iMeasureID)) { - return $sLabel; - } - - $obMeasure = Measure::find($iMeasureID); - if (empty($obMeasure)) { - return $sLabel; - } - - $sLabel .= " ({$obMeasure->name})"; - - return $sLabel; - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() : string - { - return Offer::class; - } - - /** - * Get controller class name - * @return string - */ - protected function getControllerClass() : string - { - return Offers::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/offer/OfferModelHandler.php b/plugins/lovata/shopaholic/classes/event/offer/OfferModelHandler.php deleted file mode 100644 index 342a0ab2a..000000000 --- a/plugins/lovata/shopaholic/classes/event/offer/OfferModelHandler.php +++ /dev/null @@ -1,226 +0,0 @@ -sorting->clear(OfferListStore::SORT_NO); - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_NEW); - } - - /** - * After save event handler - */ - protected function afterSave() - { - parent::afterSave(); - - $this->checkProductIDField(); - - $this->checkActiveField(); - } - - /** - * After delete event handler - */ - protected function afterDelete() - { - parent::afterDelete(); - - if ($this->obElement->active) { - $this->clearProductActiveList(); - $this->clearProductItemCache($this->obElement->product_id); - OfferListStore::instance()->active->clear(); - - $this->clearOfferSortingByPrice(); - - //Clear sorting product list by offer price - $this->clearProductSortingByPrice(); - } - - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_NO); - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_NEW); - } - - /** - * After restore event handler - */ - protected function afterRestore() - { - parent::afterRestore(); - - if ($this->obElement->active) { - $this->clearProductActiveList(); - $this->clearProductItemCache($this->obElement->product_id); - OfferListStore::instance()->active->clear(); - - $this->clearOfferSortingByPrice(); - - //Clear sorting product list by offer price - $this->clearProductSortingByPrice(); - } - - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_NO); - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_NEW); - } - - /** - * Clear product item cache - * @param int $iProductID - */ - protected function clearProductItemCache($iProductID) - { - ProductItem::clearCache($iProductID); - } - - /** - * Clear cache, if product ID field changed - */ - protected function checkProductIDField() - { - //Clear product cache - /** @var int $iOriginalProductID */ - $iOriginalProductID = $this->obElement->getOriginal('product_id'); - - /** @var int $iProductID */ - $iProductID = $this->obElement->getAttribute('product_id'); - - if ($iOriginalProductID == $iProductID) { - return; - } - - if (!empty($iOriginalProductID)) { - $this->clearProductItemCache($iOriginalProductID); - } - - if (!empty($iProductID)) { - $this->clearProductItemCache($iProductID); - } - } - - /** - * Check offer "active" field, if it was changed, then clear cache - */ - protected function checkActiveField() - { - //check offer "active" field - if ($this->obElement->getOriginal('active') == $this->obElement->active) { - return; - } - - $this->clearProductActiveList(); - OfferListStore::instance()->active->clear(); - - $this->clearProductSortingByPrice(); - - $obProduct = $this->obElement->product; - if (empty($obProduct)) { - return; - } - - $this->clearProductItemCache($this->obElement->product_id); - - $obCategoryItem = CategoryItem::make($obProduct->category_id); - if ($obCategoryItem->isEmpty()) { - return; - } - - $obCategoryItem->clearProductCount(); - } - - /** - * Clear cached active product ID list - */ - protected function clearProductActiveList() - { - if (!Settings::getValue('check_offer_active')) { - return; - } - - ProductListStore::instance()->active->clear(); - } - - /** - * Clear offer sorting cache by price - */ - protected function clearOfferSortingByPrice() - { - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_PRICE_ASC); - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_PRICE_DESC); - - //Get price types - $obPriceTypeList = PriceType::active()->get(); - if ($obPriceTypeList->isEmpty()) { - return; - } - - foreach ($obPriceTypeList as $obPriceType) { - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_PRICE_ASC.'|'.$obPriceType->code); - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_PRICE_DESC.'|'.$obPriceType->code); - } - } - - /** - * Clear offer sorting cache by price - */ - protected function clearProductSortingByPrice() - { - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_ASC); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_DESC); - - //Get price types - $obPriceTypeList = PriceType::active()->get(); - if ($obPriceTypeList->isEmpty()) { - return; - } - - foreach ($obPriceTypeList as $obPriceType) { - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_ASC.'|'.$obPriceType->code); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_DESC.'|'.$obPriceType->code); - } - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() - { - return Offer::class; - } - - /** - * Get item class name - * @return string - */ - protected function getItemClass() - { - return OfferItem::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/price/PriceModelHandler.php b/plugins/lovata/shopaholic/classes/event/price/PriceModelHandler.php deleted file mode 100644 index 27120e1ca..000000000 --- a/plugins/lovata/shopaholic/classes/event/price/PriceModelHandler.php +++ /dev/null @@ -1,97 +0,0 @@ -getModelClass(); - $sModelClass::extend(function ($obElement) { - - /** @var \Model $obElement */ - $obElement->bindEvent('model.afterSave', function () use ($obElement) { - $this->obElement = $obElement; - $this->afterSave(); - }, $this->iPriority); - - /** @var \Model $obElement */ - $obElement->bindEvent('model.afterDelete', function () use ($obElement) { - $this->obElement = $obElement; - $this->afterDelete(); - }, $this->iPriority); - }); - } - - /** - * After save event handler - */ - protected function afterSave() - { - if ($this->obElement->getOriginal('price') != $this->obElement->price_value) { - $this->clearPriceCache(); - } - } - - /** - * After delete event handler - */ - protected function afterDelete() - { - $this->clearPriceCache(); - } - - /** - * Clear product/offer price cache - */ - protected function clearPriceCache() - { - $obItem = $this->obElement->item; - if (empty($obItem)) { - return; - } - - if ($obItem instanceof Offer) { - - $sSorting = !empty($this->obElement->price_type) ? '|'.$this->obElement->price_type->code : ''; - - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_PRICE_ASC.$sSorting); - OfferListStore::instance()->sorting->clear(OfferListStore::SORT_PRICE_DESC.$sSorting); - - if ($obItem->active) { - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_ASC.$sSorting); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_DESC.$sSorting); - } - } - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() - { - return Price::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/product/ProductModelHandler.php b/plugins/lovata/shopaholic/classes/event/product/ProductModelHandler.php deleted file mode 100644 index deb552dcf..000000000 --- a/plugins/lovata/shopaholic/classes/event/product/ProductModelHandler.php +++ /dev/null @@ -1,259 +0,0 @@ -translatable[] = ['slug', 'index' => true]; - } - }); - } - - /** - * After create event handler - */ - protected function afterCreate() - { - parent::afterCreate(); - - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_NEW); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_NO); - } - - /** - * After save event handler - */ - protected function afterSave() - { - parent::afterSave(); - - //Check "category_id" field - $this->checkCategoryIDField(); - - //Check "brand_id" field - $this->checkBrandIDField(); - - $this->checkActiveField(); - } - - /** - * After delete event handler - */ - protected function afterDelete() - { - $this->processOfferAfterDelete(); - parent::afterDelete(); - - ProductListStore::instance()->category->clear($this->obElement->category_id); - BrandListStore::instance()->category->clear($this->obElement->category_id); - $this->clearCategoryProductCount($this->obElement->category_id); - - ProductListStore::instance()->brand->clear($this->obElement->brand_id); - - $this->clearProductSortingByPrice(); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_NEW); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_NO); - - if ($this->obElement->active) { - ProductListStore::instance()->active->clear(); - } - - $arAdditionalCategoryIDList = $this->obElement->additional_category->lists('id'); - if (empty($arAdditionalCategoryIDList)) { - return; - } - - foreach ($arAdditionalCategoryIDList as $iCategoryID) { - $this->clearCategoryProductCount($iCategoryID); - ProductListStore::instance()->category->clear($iCategoryID); - } - } - - /** - * After restore event handler - */ - protected function afterRestore() - { - parent::afterRestore(); - - ProductListStore::instance()->category->clear($this->obElement->category_id); - BrandListStore::instance()->category->clear($this->obElement->category_id); - $this->clearCategoryProductCount($this->obElement->category_id); - - ProductListStore::instance()->brand->clear($this->obElement->brand_id); - - $this->clearProductSortingByPrice(); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_NEW); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_NO); - - if ($this->obElement->active) { - ProductListStore::instance()->active->clear(); - } - - $arAdditionalCategoryIDList = $this->obElement->additional_category->lists('id'); - if (empty($arAdditionalCategoryIDList)) { - return; - } - - foreach ($arAdditionalCategoryIDList as $iCategoryID) { - $this->clearCategoryProductCount($iCategoryID); - ProductListStore::instance()->category->clear($iCategoryID); - } - } - - /** - * Set active = false in offer list, after product was removed - */ - protected function processOfferAfterDelete() - { - $obOfferList = $this->obElement->offer; - if ($obOfferList->isEmpty()) { - return; - } - - foreach ($obOfferList as $obOffer) { - $obOffer->active = false; - $obOffer->save(); - } - } - - /** - * Check offer "active" field, if it was changed, then clear cache - */ - protected function checkActiveField() - { - //check product "active" field - if (!$this->isFieldChanged('active')) { - return; - } - - ProductListStore::instance()->active->clear(); - - $this->clearCategoryProductCount($this->obElement->category_id); - - //Get additional category ID list - $arAdditionalCategoryIDList = $this->obElement->additional_category->lists('id'); - if (empty($arAdditionalCategoryIDList)) { - return; - } - - foreach ($arAdditionalCategoryIDList as $iCategoryID) { - $this->clearCategoryProductCount($iCategoryID); - } - } - - /** - * Check product "category_id" field, if it was changed, then clear cache - */ - protected function checkCategoryIDField() - { - //Check "category_id" field - if (!$this->isFieldChanged('category_id')) { - return; - } - - //Update product ID cache list for category - ProductListStore::instance()->category->clear($this->obElement->category_id); - ProductListStore::instance()->category->clear((int) $this->obElement->getOriginal('category_id')); - - BrandListStore::instance()->category->clear($this->obElement->category_id); - BrandListStore::instance()->category->clear((int) $this->obElement->getOriginal('category_id')); - - $this->clearCategoryProductCount($this->obElement->category_id); - $this->clearCategoryProductCount((int) $this->obElement->getOriginal('category_id')); - } - - /** - * Check product "brand_id" field, if it was changed, then clear cache - */ - protected function checkBrandIDField() - { - //Check "brand_id" field - if ($this->obElement->getOriginal('brand_id') == $this->obElement->brand_id) { - return; - } - - //Update product ID cache list for brand - ProductListStore::instance()->brand->clear($this->obElement->brand_id); - ProductListStore::instance()->brand->clear((int) $this->obElement->getOriginal('brand_id')); - } - - /** - * Clear product count cache in category item - * @param int $iCategoryID - */ - protected function clearCategoryProductCount($iCategoryID) - { - $obCategoryItem = CategoryItem::make($iCategoryID); - if ($obCategoryItem->isNotEmpty()) { - $obCategoryItem->clearProductCount(); - } - } - - /** - * Clear offer sorting cache by price - */ - protected function clearProductSortingByPrice() - { - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_ASC); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_DESC); - - //Get price types - $obPriceTypeList = PriceType::active()->get(); - if ($obPriceTypeList->isEmpty()) { - return; - } - - foreach ($obPriceTypeList as $obPriceType) { - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_ASC.'|'.$obPriceType->code); - ProductListStore::instance()->sorting->clear(ProductListStore::SORT_PRICE_DESC.'|'.$obPriceType->code); - } - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() - { - return Product::class; - } - - /** - * Get item class name - * @return string - */ - protected function getItemClass() - { - return ProductItem::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/product/ProductRelationHandler.php b/plugins/lovata/shopaholic/classes/event/product/ProductRelationHandler.php deleted file mode 100644 index 210314db7..000000000 --- a/plugins/lovata/shopaholic/classes/event/product/ProductRelationHandler.php +++ /dev/null @@ -1,95 +0,0 @@ -clearListByPromoBlock($arAttachedIDList); - $this->clearListByCategory($arAttachedIDList); - } - - /** - * After detach event handler - * @param \Model $obModel - * @param array $arAttachedIDList - */ - protected function afterDetach($obModel, $arAttachedIDList) - { - $this->clearListByPromoBlock($arAttachedIDList); - $this->clearListByCategory($arAttachedIDList); - } - - /** - * Clear cached product list by promo block ID - * @param array $arAttachedIDList - */ - protected function clearListByPromoBlock($arAttachedIDList) - { - if ($this->sRelationName != 'promo_block') { - return; - } - - foreach ($arAttachedIDList as $iPromoBlockID) { - ProductListStore::instance()->promo_block->clear($iPromoBlockID); - } - } - - /** - * Clear cached product list by category ID - * @param array $arAttachedIDList - */ - protected function clearListByCategory($arAttachedIDList) - { - if ($this->sRelationName != 'additional_category') { - return; - } - - foreach ($arAttachedIDList as $iCategoryID) { - BrandListStore::instance()->category->clear($iCategoryID); - ProductListStore::instance()->category->clear($iCategoryID); - - $obCategoryItem = CategoryItem::make($iCategoryID); - if ($obCategoryItem->isNotEmpty()) { - $obCategoryItem->clearProductCount(); - } - } - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() : string - { - return Product::class; - } - - /** - * Get relation name - * @return array - */ - protected function getRelationName() - { - return ['promo_block', 'additional_category']; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/promoblock/PromoBlockModelHandler.php b/plugins/lovata/shopaholic/classes/event/promoblock/PromoBlockModelHandler.php deleted file mode 100644 index 4ac54ac14..000000000 --- a/plugins/lovata/shopaholic/classes/event/promoblock/PromoBlockModelHandler.php +++ /dev/null @@ -1,119 +0,0 @@ -translatable[] = ['slug', 'index' => true]; - } - }); - - $obEvent->listen('shopaholic.promo_block.update.sorting', function () { - $this->clearSortingList(); - }); - } - - /** - * After create event handler - */ - protected function afterCreate() - { - parent::afterCreate(); - $this->clearSortingList(); - } - - /** - * After save event handler - */ - protected function afterSave() - { - parent::afterSave(); - - if ($this->isFieldChanged('date_begin')) { - PromoBlockListStore::instance()->sorting->clear(PromoBlockListStore::SORT_DATE_BEGIN_ASC); - PromoBlockListStore::instance()->sorting->clear(PromoBlockListStore::SORT_DATE_BEGIN_DESC); - } - - if ($this->isFieldChanged('date_end')) { - PromoBlockListStore::instance()->sorting->clear(PromoBlockListStore::SORT_DATE_END_ASC); - PromoBlockListStore::instance()->sorting->clear(PromoBlockListStore::SORT_DATE_END_DESC); - } - - $this->checkFieldChanges('hidden', PromoBlockListStore::instance()->hidden); - $this->checkFieldChanges('hidden', PromoBlockListStore::instance()->not_hidden); - - $this->checkFieldChanges('active', PromoBlockListStore::instance()->active); - } - - /** - * After delete event handler - */ - protected function afterDelete() - { - parent::afterDelete(); - $this->clearSortingList(); - - ProductListStore::instance()->promo_block->clear($this->obElement->id); - - $this->clearCacheNotEmptyValue('hidden', PromoBlockListStore::instance()->hidden); - $this->clearCacheEmptyValue('hidden', PromoBlockListStore::instance()->not_hidden); - - $this->clearCacheNotEmptyValue('active', PromoBlockListStore::instance()->active); - } - - /** - * Clear sorting list - */ - protected function clearSortingList() - { - PromoBlockListStore::instance()->sorting->clear(PromoBlockListStore::SORT_DEFAULT); - PromoBlockListStore::instance()->sorting->clear(PromoBlockListStore::SORT_DATE_BEGIN_ASC); - PromoBlockListStore::instance()->sorting->clear(PromoBlockListStore::SORT_DATE_BEGIN_DESC); - PromoBlockListStore::instance()->sorting->clear(PromoBlockListStore::SORT_DATE_END_ASC); - PromoBlockListStore::instance()->sorting->clear(PromoBlockListStore::SORT_DATE_END_DESC); - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() - { - return PromoBlock::class; - } - - /** - * Get item class name - * @return string - */ - protected function getItemClass() - { - return PromoBlockItem::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/promoblock/PromoBlockRelationHandler.php b/plugins/lovata/shopaholic/classes/event/promoblock/PromoBlockRelationHandler.php deleted file mode 100644 index 3552ead0f..000000000 --- a/plugins/lovata/shopaholic/classes/event/promoblock/PromoBlockRelationHandler.php +++ /dev/null @@ -1,64 +0,0 @@ -clearCachedList($obModel); - } - - /** - * After detach event handler - * @param PromoBlock $obModel - * @param array $arAttachedIDList - */ - protected function afterDetach($obModel, $arAttachedIDList) - { - $this->clearCachedList($obModel); - } - - /** - * Clear cached list - * @param PromoBlock $obModel - */ - protected function clearCachedList($obModel) - { - ProductListStore::instance()->promo_block->clear($obModel->id); - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() : string - { - return PromoBlock::class; - } - - /** - * Get relation name - * @return array - */ - protected function getRelationName() - { - return ['product']; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/tax/ExtendTaxFieldsHandler.php b/plugins/lovata/shopaholic/classes/event/tax/ExtendTaxFieldsHandler.php deleted file mode 100644 index 75be4bce5..000000000 --- a/plugins/lovata/shopaholic/classes/event/tax/ExtendTaxFieldsHandler.php +++ /dev/null @@ -1,47 +0,0 @@ -hasPlugin('RainLab.Location')) { - return; - } - - $obWidget->removeField('country'); - $obWidget->removeField('state'); - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() : string - { - return Tax::class; - } - - /** - * Get controller class name - * @return string - */ - protected function getControllerClass() : string - { - return Taxes::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/tax/TaxModelHandler.php b/plugins/lovata/shopaholic/classes/event/tax/TaxModelHandler.php deleted file mode 100644 index 9e7d30902..000000000 --- a/plugins/lovata/shopaholic/classes/event/tax/TaxModelHandler.php +++ /dev/null @@ -1,100 +0,0 @@ -listen('shopaholic.tax.update.sorting', function () { - $this->clearSortingList(); - }); - - if (PluginManager::instance()->hasPlugin('RainLab.Location')) { - return; - } - - Tax::extend(function ($obTax) { - /** @var Tax $obTax */ - unset($obTax->belongsToMany['country']); - unset($obTax->belongsToMany['state']); - }); - } - - /** - * After create event handler - */ - protected function afterCreate() - { - parent::afterCreate(); - $this->clearSortingList(); - } - - /** - * After save event handler - */ - protected function afterSave() - { - parent::afterSave(); - - $this->checkFieldChanges('active', TaxListStore::instance()->active); - } - - /** - * After delete event handler - */ - protected function afterDelete() - { - parent::afterDelete(); - $this->clearSortingList(); - - if ($this->obElement->active) { - TaxListStore::instance()->active->clear(); - } - } - - /** - * Clear sorting list - */ - protected function clearSortingList() - { - TaxListStore::instance()->sorting->clear(); - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() - { - return Tax::class; - } - - /** - * Get item class name - * @return string - */ - protected function getItemClass() - { - return TaxItem::class; - } -} diff --git a/plugins/lovata/shopaholic/classes/event/tax/TaxRelationHandler.php b/plugins/lovata/shopaholic/classes/event/tax/TaxRelationHandler.php deleted file mode 100644 index b87b1bb13..000000000 --- a/plugins/lovata/shopaholic/classes/event/tax/TaxRelationHandler.php +++ /dev/null @@ -1,55 +0,0 @@ -id); - } - - /** - * After detach event handler - * @param Tax $obModel - * @param array $arAttachedIDList - */ - protected function afterDetach($obModel, $arAttachedIDList) - { - TaxItem::clearCache($obModel->id); - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() : string - { - return Tax::class; - } - - /** - * Get relation name - * @return array - */ - protected function getRelationName() - { - return ['category', 'product', 'country', 'state']; - } -} diff --git a/plugins/lovata/shopaholic/classes/helper/AllCategoriesMenuType.php b/plugins/lovata/shopaholic/classes/helper/AllCategoriesMenuType.php deleted file mode 100644 index f34d3551b..000000000 --- a/plugins/lovata/shopaholic/classes/helper/AllCategoriesMenuType.php +++ /dev/null @@ -1,57 +0,0 @@ - [], - ]; - - //Get category list with sorted by 'nest_left' - $obCategoryList = Category::active()->orderBy('nest_left', 'asc')->get(); - if ($obCategoryList->isEmpty()) { - return $arResult; - } - - /** @var Category $obCategory */ - foreach ($obCategoryList as $obCategory) { - $obCategoryItem = CategoryItem::make($obCategory->id, $obCategory); - - $arMenuItem = $this->getCategoryMenuData($obCategoryItem, $obMenuItem->cmsPage, $sURL); - $arResult['items'][] = $arMenuItem; - } - - return $arResult; - } - - /** - * Get default array for menu type - * @return array|null - */ - protected function getDefaultMenuTypeInfo() - { - $arResult = [ - 'dynamicItems' => true, - ]; - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/helper/CatalogMenuType.php b/plugins/lovata/shopaholic/classes/helper/CatalogMenuType.php deleted file mode 100644 index 2d547d9a2..000000000 --- a/plugins/lovata/shopaholic/classes/helper/CatalogMenuType.php +++ /dev/null @@ -1,60 +0,0 @@ - [], - ]; - - //Get category list with sorted by 'nest_left' - $obCategoryList = CategoryCollection::make()->tree(); - if ($obCategoryList->isEmpty()) { - return $arResult; - } - - /** @var \Lovata\Shopaholic\Classes\Item\CategoryItem $obCategoryItem */ - foreach ($obCategoryList as $obCategoryItem) { - $arMenuItem = $this->getCategoryMenuData($obCategoryItem, $obMenuItem->cmsPage, $sURL); - if ($obMenuItem->nesting) { - $arMenuItem['items'] = $this->getChildrenCategoryList($obCategoryItem, $obMenuItem->cmsPage, $sURL); - } - - $arResult['items'][] = $arMenuItem; - } - - return $arResult; - } - - /** - * Get default array for menu type - * @return array|null - */ - protected function getDefaultMenuTypeInfo() - { - $arResult = [ - 'dynamicItems' => true, - 'nesting' => true, - ]; - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/helper/CategoryMenuType.php b/plugins/lovata/shopaholic/classes/helper/CategoryMenuType.php deleted file mode 100644 index 650c425f4..000000000 --- a/plugins/lovata/shopaholic/classes/helper/CategoryMenuType.php +++ /dev/null @@ -1,59 +0,0 @@ -reference)) { - return $arResult; - } - - $obCategoryItem = CategoryItem::make($obMenuItem->reference); - if ($obCategoryItem->isEmpty()) { - return $arResult; - } - - $arResult = $this->getCategoryMenuData($obCategoryItem, $obMenuItem->cmsPage, $sURL); - if (!$obMenuItem->nesting || $obCategoryItem->children->isEmpty()) { - return $arResult; - } - - $arResult['items'] = $this->getChildrenCategoryList($obCategoryItem, $obMenuItem->cmsPage, $sURL); - - return $arResult; - } - - /** - * Get default array for menu type - * @return array|null - */ - protected function getDefaultMenuTypeInfo() - { - $arResult = [ - 'references' => $this->listSubCategoryOptions(), - 'nesting' => true, - 'dynamicItems' => true, - ]; - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/helper/CommonMenuType.php b/plugins/lovata/shopaholic/classes/helper/CommonMenuType.php deleted file mode 100644 index 98a95f960..000000000 --- a/plugins/lovata/shopaholic/classes/helper/CommonMenuType.php +++ /dev/null @@ -1,200 +0,0 @@ - "title" format for options that don't have sub-options, and in the format - * ["key"] => ["title"=>"Option title", "items"=>[...]] for options that have sub-options. Optional, - * required only if the menu item type requires references. - * - nesting - Boolean value indicating whether the item type supports nested items. Optional, - * false if omitted. - * - dynamicItems - Boolean value indicating whether the item type could generate new menu items. - * Optional, false if omitted. - * - cmsPages - a list of CMS pages (objects of the Cms\Classes\Page class), if the item type requires a CMS page reference to - * resolve the item URL. - * @return array Returns an array - */ - public function getMenuTypeInfo() - { - $arResult = $this->getDefaultMenuTypeInfo(); - if (empty($arResult)) { - return $arResult; - } - - $obTheme = Theme::getActiveTheme(); - $obPageList = CmsPage::listInTheme($obTheme, true); - - $arResult['cmsPages'] = $this->filterPageList($obPageList); - - return $arResult; - } - - /** - * Get default array for menu type - * @return array|null - */ - abstract protected function getDefaultMenuTypeInfo(); - - /** - * Filter page list, add pages with CategoryPage component to result - * @param \October\Rain\Support\Collection $obPageList - * @return array - */ - protected function filterPageList($obPageList) - { - $arCmsPageList = []; - if (empty($obPageList) || $obPageList->isEmpty()) { - return $arCmsPageList; - } - - /** @var CmsPage $obPage */ - foreach ($obPageList as $obPage) { - if (!$obPage->hasComponent('CategoryPage')) { - continue; - } - - /* - * Component must use a category filter with a routing parameter - * eg: categoryFilter = "{{ :somevalue }}" - */ - $arPropertyList = $obPage->getComponentProperties('CategoryPage'); - if (!isset($arPropertyList['slug']) || !preg_match('/{{\s*:/', $arPropertyList['slug'])) { - continue; - } - $arCmsPageList[] = $obPage; - } - - return $arCmsPageList; - } - - /** - * Get subcategories list - * @return array - */ - protected function listSubCategoryOptions() - { - $arResult = []; - $obCategoryList = CategoryCollection::make()->tree(); - if ($obCategoryList->isEmpty()) { - return $arResult; - } - - $arResult = $this->getCategoryMenuOptions($obCategoryList); - - return $arResult; - } - - /** - * Get option array for category - * @param CategoryCollection|\Lovata\Shopaholic\Classes\Item\CategoryItem[] $obCategoryList - * @return null|array|string - */ - protected function getCategoryMenuOptions($obCategoryList) - { - if (empty($obCategoryList) || $obCategoryList->isEmpty()) { - return null; - } - - $arResult = []; - foreach ($obCategoryList as $obCategory) { - if ($obCategory->children->isEmpty()) { - $arResult[$obCategory->id] = $obCategory->name; - } else { - $arResult[$obCategory->id] = [ - 'title' => $obCategory->name, - 'items' => $this->getCategoryMenuOptions($obCategory->children), - ]; - } - } - - return $arResult; - } - - /** - * Get array for menu item from category item - * @param \Lovata\Shopaholic\Classes\Item\CategoryItem $obCategoryItem - * @param string $sPageCode - * @param string $sURL - * - * @return array - */ - protected function getCategoryMenuData($obCategoryItem, $sPageCode, $sURL) - { - if (empty($obCategoryItem)) { - return []; - } - - $arMenuItem = [ - 'title' => $obCategoryItem->name, - 'url' => $obCategoryItem->getPageUrl($sPageCode), - 'mtime' => $obCategoryItem->updated_at, - 'viewBag' => ['object' => $obCategoryItem], - ]; - - $arMenuItem['isActive'] = $arMenuItem['url'] == $sURL; - - return $arMenuItem; - } - - /** - * Get list of children categories for menu items - * @param \Lovata\Shopaholic\Classes\Item\CategoryItem $obCategoryItem - * @param string $sPageCode - * @param string $sURL - * - * @return array - */ - protected function getChildrenCategoryList($obCategoryItem, $sPageCode, $sURL) - { - if (empty($obCategoryItem) || $obCategoryItem->children->isEmpty()) { - return []; - } - - $arResult = []; - foreach ($obCategoryItem->children as $obChildrenCategory) { - $arMenuItem = $this->getCategoryMenuData($obChildrenCategory, $sPageCode, $sURL); - if ($obChildrenCategory->children->isNotEmpty()) { - $arMenuItem['items'] = $this->getChildrenCategoryList($obChildrenCategory, $sPageCode, $sURL); - } - - $arResult[] = $arMenuItem; - } - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/helper/CurrencyHelper.php b/plugins/lovata/shopaholic/classes/helper/CurrencyHelper.php deleted file mode 100644 index daa90e826..000000000 --- a/plugins/lovata/shopaholic/classes/helper/CurrencyHelper.php +++ /dev/null @@ -1,221 +0,0 @@ -obActiveCurrency; - } - - /** - * Get default currency object - * @return Currency - */ - public function getDefault() - { - return $this->obDefaultCurrency; - } - - /** - * Set default currency as active - * Used in backend - */ - public function disableActiveCurrency() - { - if (empty($this->obDefaultCurrency)) { - return; - } - - $this->sActiveCurrencyCode = $this->obDefaultCurrency->code; - $this->obActiveCurrency = $this->obDefaultCurrency; - } - - /** - * Get active currency symbol - * @return null|string - */ - public function getActiveCurrencySymbol() - { - $obCurrency = $this->getActive(); - if (empty($obCurrency)) { - return null; - } - - return $obCurrency->symbol; - } - - /** - * Get active currency code - * @return null|string - */ - public function getActiveCurrencyCode() - { - $obCurrency = $this->getActive(); - if (empty($obCurrency)) { - return null; - } - - return $obCurrency->code; - } - - /** - * Get currency symbol - * @param string $sCurrencyCode - * @return null|string - */ - public function getCurrencySymbol($sCurrencyCode) - { - $obCurrency = $this->obCurrencyList->where('code', $sCurrencyCode)->first(); - if (empty($obCurrency)) { - return null; - } - - return $obCurrency->symbol; - } - - /** - * Get currency code - * @param string $sCurrencyCode - * @return null|string - */ - public function getCurrencyCode($sCurrencyCode) - { - $obCurrency = $this->obCurrencyList->where('code', $sCurrencyCode)->first(); - if (empty($obCurrency)) { - return null; - } - - return $obCurrency->code; - } - - /** - * Clear active currency value - * @param string $sCurrencyCode - */ - public function switchActive($sCurrencyCode) - { - $obUserStorage = $this->getUserStorage(); - $obUserStorage->put(self::FIELD_NAME, $sCurrencyCode); - $this->sActiveCurrencyCode = $sCurrencyCode; - - $this->initActiveCurrency(); - } - - /** - * Clear active currency value - */ - public function resetActive() - { - $obUserStorage = $this->getUserStorage(); - $obUserStorage->clear(self::FIELD_NAME); - - $this->obActiveCurrency = $this->obDefaultCurrency; - } - - /** - * @param float $fPrice - * @param string $sCurrencyTo - * @return float - */ - public function convert($fPrice, $sCurrencyTo = null) - { - if (empty($sCurrencyTo)) { - $obCurrencyTo = $this->obActiveCurrency; - } else { - $obCurrencyTo = $this->obCurrencyList->where('code', $sCurrencyTo)->first(); - } - - if (empty($obCurrencyTo) || empty($this->obDefaultCurrency) || $obCurrencyTo->id == $this->obDefaultCurrency->id) { - return $fPrice; - } - - $fResultPrice = PriceHelper::round(($this->obDefaultCurrency->rate * $fPrice) / $obCurrencyTo->rate); - - return $fResultPrice; - } - - /** - * Init currency data - */ - protected function init() - { - $this->obCurrencyList = Currency::active()->get(); - $this->obDefaultCurrency = $this->obCurrencyList->where('is_default', true)->first(); - - $this->sActiveCurrencyCode = $this->getActiveCurrencyFromStorage(); - $this->initActiveCurrency(); - } - - /** - * Get active currency code and find active currency object by code - */ - protected function initActiveCurrency() - { - $this->obActiveCurrency = null; - if (!empty($this->sActiveCurrencyCode)) { - $this->obActiveCurrency = $this->obCurrencyList->where('code', $this->sActiveCurrencyCode)->first(); - } - - if (empty($this->obActiveCurrency)) { - $this->obActiveCurrency = $this->obDefaultCurrency; - } - } - - /** - * Get active currency code from user storage - * @return array - */ - protected function getActiveCurrencyFromStorage() - { - $obUserStorage = $this->getUserStorage(); - $sActiveCurrencyCode = $obUserStorage->get(self::FIELD_NAME); - - return $sActiveCurrencyCode; - } - - /** - * Get user storage object (User model or cookie) - * @return UserStorage - */ - protected function getUserStorage() - { - /** @var UserStorage $obUserStorage */ - $obUserStorage = app(UserStorage::class); - $obUserStorage->setDefaultStorage(CookieUserStorage::class); - - return $obUserStorage; - } -} diff --git a/plugins/lovata/shopaholic/classes/helper/MeasureHelper.php b/plugins/lovata/shopaholic/classes/helper/MeasureHelper.php deleted file mode 100644 index 0dd889ad7..000000000 --- a/plugins/lovata/shopaholic/classes/helper/MeasureHelper.php +++ /dev/null @@ -1,40 +0,0 @@ -obPriceTypeList->where('code', $sPriceTypeCode)->first(); - - return $obPriceType; - } - - /** - * Get value of active price type - * @return PriceType - */ - public function getActive() - { - return $this->obActivePriceType; - } - - /** - * Get active price type code - * @return null|string - */ - public function getActivePriceTypeCode() - { - $obPriceType = $this->getActive(); - if (empty($obPriceType)) { - return null; - } - - return $obPriceType->code; - } - - /** - * Get active price type code - * @return null|string - */ - public function getActivePriceTypeID() - { - $obPriceType = $this->getActive(); - if (empty($obPriceType)) { - return null; - } - - return $obPriceType->id; - } - - /** - * Clear active currency value - * @param string $sPriceTypeCode - */ - public function switchActive($sPriceTypeCode) - { - $this->sActivePriceTypeCode = $sPriceTypeCode; - - $this->initActivePriceType(); - } - - /** - * Init price type data - */ - protected function init() - { - $this->obPriceTypeList = PriceType::active()->get(); - - $this->initActivePriceType(); - } - - /** - * Get active price type code and find active price type object by code - */ - protected function initActivePriceType() - { - $this->obActivePriceType = null; - if (!empty($this->sActivePriceTypeCode)) { - $this->obActivePriceType = $this->obPriceTypeList->where('code', $this->sActivePriceTypeCode)->first(); - } - } -} diff --git a/plugins/lovata/shopaholic/classes/helper/TaxHelper.php b/plugins/lovata/shopaholic/classes/helper/TaxHelper.php deleted file mode 100644 index f603be544..000000000 --- a/plugins/lovata/shopaholic/classes/helper/TaxHelper.php +++ /dev/null @@ -1,184 +0,0 @@ -bPriceIncludeTax; - } - - /** - * Switch active country by code - * @param string $sCountryCode - */ - public function switchCountry($sCountryCode) - { - if (empty($sCountryCode) || !PluginManager::instance()->hasPlugin('RainLab.Location')) { - return; - } - - $this->obActiveCountry = \RainLab\Location\Models\Country::whereCode($sCountryCode)->first(); - } - - /** - * Get active country object - * @return \RainLab\Location\Models\Country - */ - public function getActiveCountry() - { - return $this->obActiveCountry; - } - - /** - * Switch active state by code - * @param string $sStateCode - */ - public function switchState($sStateCode) - { - if (empty($sStateCode) || !PluginManager::instance()->hasPlugin('RainLab.Location')) { - return; - } - - $this->obActiveState = \RainLab\Location\Models\State::whereCode($sStateCode)->first(); - } - - /** - * Get active state object - * @return \RainLab\Location\Models\State - */ - public function getActiveState() - { - return $this->obActiveState; - } - - /** - * Get applied tax list - * @return \Lovata\Shopaholic\Classes\Collection\TaxCollection|\Lovata\Shopaholic\Classes\Item\TaxItem[] - */ - public function getTaxList() - { - return clone $this->obTaxList; - } - - /** - * Get price value without tax - * @param float $fPrice - * @param float $fPricePercent - * @return float - */ - public function getPriceWithoutTax($fPrice, $fPricePercent) - { - $fPriceResult = $fPrice; - if ($this->bPriceIncludeTax) { - $fPriceResult = $this->calculatePriceWithoutTax($fPrice, $fPricePercent); - } - - return $fPriceResult; - } - - /** - * Get price value with tax - * @param float $fPrice - * @param float $fPricePercent - * @return float - */ - public function getPriceWithTax($fPrice, $fPricePercent) - { - $fPriceResult = $fPrice; - if (!$this->bPriceIncludeTax) { - $fPriceResult = $this->calculatePriceWithTax($fPrice, $fPricePercent); - } - - return $fPriceResult; - } - - /** - * Calculate price + tax - * @param float $fPrice - * @param float $fTax - * @return float - */ - public function calculatePriceWithTax($fPrice, $fTax) - { - $fPrice = ($fPrice * (100 + $fTax)) / 100; - $fPrice = PriceHelper::round($fPrice); - - return $fPrice; - } - - /** - * Calculate price - tax - * @param float $fPrice - * @param float $fTax - * @return float - */ - public function calculatePriceWithoutTax($fPrice, $fTax) - { - $fPrice = ($fPrice * 100) / (100 + $fTax); - $fPrice = PriceHelper::round($fPrice); - - return $fPrice; - } - - /** - * Get tax percent - * @param \Lovata\Shopaholic\Classes\Collection\TaxCollection|\Lovata\Shopaholic\Classes\Item\TaxItem[] $obTaxList - * @return float - */ - public function getTaxPercent($obTaxList) - { - if (empty($obTaxList) || $obTaxList->isEmpty()) { - return 0; - } - - //Calculate tax percent - $fTaxPercent = 0; - foreach ($obTaxList as $obTaxItem) { - $fTaxPercent += $obTaxItem->percent; - } - - $fTaxPercent = PriceHelper::round($fTaxPercent); - - return $fTaxPercent; - } - - /** - * Init currency data - */ - protected function init() - { - $this->obTaxList = TaxCollection::make()->active()->sort(); - - $this->bPriceIncludeTax = (bool) Settings::getValue('price_include_tax'); - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ImportBrandModelFromCSV.php b/plugins/lovata/shopaholic/classes/import/ImportBrandModelFromCSV.php deleted file mode 100644 index 802f894b7..000000000 --- a/plugins/lovata/shopaholic/classes/import/ImportBrandModelFromCSV.php +++ /dev/null @@ -1,49 +0,0 @@ -arExistIDList = (array) Brand::whereNotNull('external_id')->lists('external_id', 'id'); - $this->arExistIDList = array_filter($this->arExistIDList); - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - $this->setActiveField(); - - $this->initPreviewImage(); - $this->initImageList(); - - parent::prepareImportData(); - } - - /** - * Process model object after creation/updating - */ - protected function processModelObject() - { - $this->importPreviewImage(); - $this->importImageList(); - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ImportBrandModelFromXML.php b/plugins/lovata/shopaholic/classes/import/ImportBrandModelFromXML.php deleted file mode 100644 index 0862d7564..000000000 --- a/plugins/lovata/shopaholic/classes/import/ImportBrandModelFromXML.php +++ /dev/null @@ -1,114 +0,0 @@ -arExistIDList = (array) Brand::whereNotNull('external_id')->lists('external_id', 'id'); - $this->arExistIDList = array_filter($this->arExistIDList); - - $this->prepareImportSettings(); - - parent::__construct(); - } - - /** - * Get import fields - * @return array - */ - public function getFields() : array - { - $this->arFieldList = [ - 'external_id' => Lang::get('lovata.toolbox::lang.field.external_id'), - 'active' => Lang::get('lovata.toolbox::lang.field.active'), - 'name' => Lang::get('lovata.toolbox::lang.field.name'), - 'code' => Lang::get('lovata.toolbox::lang.field.code'), - 'preview_text' => Lang::get('lovata.toolbox::lang.field.preview_text'), - 'description' => Lang::get('lovata.toolbox::lang.field.description'), - 'preview_image' => Lang::get('lovata.toolbox::lang.field.preview_image'), - 'images' => Lang::get('lovata.toolbox::lang.field.images'), - ]; - - return parent::getFields(); - } - - /** - * Start import - * @param $obProgressBar - * @throws - */ - public function import($obProgressBar = null) - { - parent::import($obProgressBar); - - $this->deactivateElements(); - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - $this->setActiveField(); - - $this->initPreviewImage(); - $this->initImageList(); - - parent::prepareImportData(); - } - - /** - * Process model object after creation/updating - */ - protected function processModelObject() - { - $this->importPreviewImage(); - $this->importImageList(); - - parent::processModelObject(); - } - - /** - * Prepare import settings - */ - protected function prepareImportSettings() - { - $this->arXMLFileList = XmlImportSettings::getValue('file_list'); - $this->sImageFolderPath = XmlImportSettings::getValue('image_folder'); - $this->sImageFolderPath = trim($this->sImageFolderPath, '/'); - - $this->bDeactivate = (bool) XmlImportSettings::getValue('brand_deactivate'); - $this->arImportSettings = XmlImportSettings::getValue('brand'); - $this->sElementListPath = XmlImportSettings::getValue('brand_path_to_list'); - - $iFileNumber = XmlImportSettings::getValue('brand_file_path'); - if ($iFileNumber !== null) { - $this->sMainFilePath = array_get($this->arXMLFileList, $iFileNumber.'.path'); - $this->sPrefix = array_get($this->arXMLFileList, $iFileNumber.'.path_prefix'); - $this->sNamespace = array_get($this->arXMLFileList, $iFileNumber.'.file_namespace'); - $this->sMainFilePath = trim($this->sMainFilePath, '/'); - } - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ImportCategoryModelFromCSV.php b/plugins/lovata/shopaholic/classes/import/ImportCategoryModelFromCSV.php deleted file mode 100644 index 43fa585b2..000000000 --- a/plugins/lovata/shopaholic/classes/import/ImportCategoryModelFromCSV.php +++ /dev/null @@ -1,81 +0,0 @@ -arExistIDList = (array) Category::whereNotNull('external_id')->lists('external_id', 'id'); - $this->arExistIDList = array_filter($this->arExistIDList); - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - $this->initParentCategory(); - $this->setActiveField(); - - $this->initPreviewImage(); - $this->initImageList(); - - parent::prepareImportData(); - } - - /** - * Process model object after creation/updating - */ - protected function processModelObject() - { - if ($this->obParentCategory === false) { - $this->obModel->parent_id = null; - $this->obModel->save(); - } elseif (!empty($this->obParentCategory)) { - $this->obModel->makeChildOf($this->obParentCategory); - } - - $this->importPreviewImage(); - $this->importImageList(); - } - - /** - * Find parent category by external ID and set parent_id - */ - protected function initParentCategory() - { - if (!array_key_exists('parent_id', $this->arImportData)) { - return; - } - - $iParentID = array_get($this->arImportData, 'parent_id'); - array_forget($this->arImportData, 'parent_id'); - if (empty($iParentID)) { - $this->obParentCategory = false; - - return; - } - - //Find parent category - $this->obParentCategory = Category::getByExternalID($iParentID)->first(); - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ImportCategoryModelFromXML.php b/plugins/lovata/shopaholic/classes/import/ImportCategoryModelFromXML.php deleted file mode 100644 index ec5d3b9b2..000000000 --- a/plugins/lovata/shopaholic/classes/import/ImportCategoryModelFromXML.php +++ /dev/null @@ -1,194 +0,0 @@ -arExistIDList = (array) Category::whereNotNull('external_id')->lists('external_id', 'id'); - $this->arExistIDList = array_filter($this->arExistIDList); - - $this->prepareImportSettings(); - - parent::__construct(); - } - - /** - * Get import fields - * @return array - */ - public function getFields() : array - { - $this->arFieldList = [ - 'external_id' => Lang::get('lovata.toolbox::lang.field.external_id'), - 'active' => Lang::get('lovata.toolbox::lang.field.active'), - 'name' => Lang::get('lovata.toolbox::lang.field.name'), - 'code' => Lang::get('lovata.toolbox::lang.field.code'), - 'preview_text' => Lang::get('lovata.toolbox::lang.field.preview_text'), - 'description' => Lang::get('lovata.toolbox::lang.field.description'), - 'preview_image' => Lang::get('lovata.toolbox::lang.field.preview_image'), - 'images' => Lang::get('lovata.toolbox::lang.field.images'), - 'parent_id' => Lang::get('lovata.toolbox::lang.field.category_parent_id'), - 'children' => Lang::get('lovata.toolbox::lang.field.children_category'), - ]; - - return parent::getFields(); - } - - /** - * Start import - * @param $obProgressBar - * @throws - */ - public function import($obProgressBar = null) - { - parent::import($obProgressBar); - - $this->deactivateElements(); - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - $this->initParentCategory(); - $this->setActiveField(); - - $this->initPreviewImage(); - $this->initImageList(); - - $this->initChildrenCategoryList(); - - parent::prepareImportData(); - } - - /** - * Process model object after creation/updating - */ - protected function processModelObject() - { - if ($this->obParentCategory === false || ($this->bHasChildrenField && empty($this->obParentCategory))) { - $this->obModel->parent_id = null; - $this->obModel->save(); - } elseif (!empty($this->obParentCategory)) { - $this->obModel->makeChildOf($this->obParentCategory); - } - - $this->importPreviewImage(); - $this->importImageList(); - - parent::processModelObject(); - - $this->importChildrenCategoryList(); - } - - /** - * Find parent category by external ID and set parent_id - */ - protected function initParentCategory() - { - if (!array_key_exists('parent_id', $this->arImportData) && !$this->bHasChildrenField) { - return; - } - - $iParentID = array_get($this->arImportData, 'parent_id'); - array_forget($this->arImportData, 'parent_id'); - if (empty($iParentID)) { - $this->obParentCategory = false; - - return; - } - - //Find parent category - $this->obParentCategory = Category::getByExternalID($iParentID)->first(); - } - - /** - * Init children category list - */ - protected function initChildrenCategoryList() - { - if (!array_key_exists('children', $this->arImportData)) { - return; - } - - $this->arChildrenCategoryList = array_get($this->arImportData, 'children'); - array_forget($this->arImportData, 'children'); - } - - /** - * Import children category list - */ - protected function importChildrenCategoryList() - { - if (empty($this->arChildrenCategoryList)) { - return; - } - - $iExternalID = $this->obModel->external_id; - foreach ($this->arChildrenCategoryList as $arCategoryData) { - $arCategoryData['parent_id'] = $iExternalID; - $this->importRow($arCategoryData); - } - } - - /** - * Prepare import settings - */ - protected function prepareImportSettings() - { - $this->arXMLFileList = XmlImportSettings::getValue('file_list'); - $this->sImageFolderPath = XmlImportSettings::getValue('image_folder'); - $this->sImageFolderPath = trim($this->sImageFolderPath, '/'); - - $this->bDeactivate = (bool) XmlImportSettings::getValue('category_deactivate'); - $this->arImportSettings = (array) XmlImportSettings::getValue('category'); - $this->sElementListPath = XmlImportSettings::getValue('category_path_to_list'); - - $iFileNumber = XmlImportSettings::getValue('category_file_path'); - if ($iFileNumber !== null) { - $this->sMainFilePath = array_get($this->arXMLFileList, $iFileNumber.'.path'); - $this->sPrefix = array_get($this->arXMLFileList, $iFileNumber.'.path_prefix'); - $this->sNamespace = array_get($this->arXMLFileList, $iFileNumber.'.file_namespace'); - $this->sMainFilePath = trim($this->sMainFilePath, '/'); - } - - foreach ($this->arImportSettings as $arFieldData) { - if (array_get($arFieldData, 'field') == 'children') { - $this->bHasChildrenField = true; - break; - } - } - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ImportOfferModelFromCSV.php b/plugins/lovata/shopaholic/classes/import/ImportOfferModelFromCSV.php deleted file mode 100644 index cf2951f39..000000000 --- a/plugins/lovata/shopaholic/classes/import/ImportOfferModelFromCSV.php +++ /dev/null @@ -1,152 +0,0 @@ -arExistIDList = (array) Offer::whereNotNull('external_id')->lists('external_id', 'id'); - $this->arExistIDList = array_filter($this->arExistIDList); - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - $this->setActiveField(); - $this->setProductField(); - $this->setQuantityField(); - $this->setMeasureField(); - $this->setMeasureOfUnitField(); - - $this->initPreviewImage(); - $this->initImageList(); - - parent::prepareImportData(); - } - - /** - * Process model object after creation/updating - */ - protected function processModelObject() - { - $this->importPreviewImage(); - $this->importImageList(); - } - - /** - * Set product_id filed value - */ - protected function setProductField() - { - $sProductID = array_get($this->arImportData, 'product_id'); - if ($sProductID === null) { - return; - } - - if (empty($sProductID)) { - $this->arImportData['product_id'] = null; - - return; - } - - //Find product by external ID - $obProduct = Product::withTrashed()->getByExternalID($sProductID)->first(); - if (empty($obProduct)) { - $this->arImportData['product_id'] = null; - } else { - $this->arImportData['product_id'] = $obProduct->id; - } - } - - /** - * Set quantity field value - */ - protected function setQuantityField() - { - $iQuantity = array_get($this->arImportData, 'quantity'); - if ($iQuantity === null) { - return; - } - - $iQuantity = (int) $iQuantity; - if ($iQuantity < 0) { - $iQuantity = 0; - } - - $this->arImportData['quantity'] = $iQuantity; - } - - /** - * Set measure filed value - */ - protected function setMeasureOfUnitField() - { - $sMeasure = array_get($this->arImportData, 'measure_of_unit'); - array_forget($this->arImportData, 'measure_of_unit'); - if ($sMeasure === null) { - return; - } - - if (empty($sMeasure)) { - $this->arImportData['measure_of_unit_id'] = null; - return; - } - - $obMeasure = Measure::getByName($sMeasure)->first(); - if (empty($obMeasure)) { - $obMeasure = Measure::create([ - 'name' => $sMeasure, - ]); - } - - $this->arImportData['measure_of_unit_id'] = $obMeasure->id; - } - - /** - * Set measure filed value - */ - protected function setMeasureField() - { - $sMeasure = array_get($this->arImportData, 'measure_id'); - array_forget($this->arImportData, 'measure_id'); - if ($sMeasure === null) { - return; - } - - if (empty($sMeasure)) { - $this->arImportData['measure_id'] = null; - return; - } - - $obMeasure = Measure::getByName($sMeasure)->first(); - if (empty($obMeasure)) { - $obMeasure = Measure::create([ - 'name' => $sMeasure, - ]); - } - - $this->arImportData['measure_id'] = $obMeasure->id; - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ImportOfferModelFromXML.php b/plugins/lovata/shopaholic/classes/import/ImportOfferModelFromXML.php deleted file mode 100644 index 035e92260..000000000 --- a/plugins/lovata/shopaholic/classes/import/ImportOfferModelFromXML.php +++ /dev/null @@ -1,212 +0,0 @@ -arExistIDList = (array) Offer::whereNotNull('external_id')->lists('external_id', 'id'); - $this->arExistIDList = array_filter($this->arExistIDList); - - $this->prepareImportSettings(); - - parent::__construct(); - } - - /** - * Get import fields - * @return array - */ - public function getFields() : array - { - $this->arFieldList = [ - 'external_id' => Lang::get('lovata.toolbox::lang.field.external_id'), - 'product_id' => Lang::get('lovata.shopaholic::lang.field.product_id'), - 'active' => Lang::get('lovata.toolbox::lang.field.active'), - 'name' => Lang::get('lovata.toolbox::lang.field.name'), - 'code' => Lang::get('lovata.toolbox::lang.field.code'), - 'price' => Lang::get('lovata.shopaholic::lang.field.price'), - 'old_price' => Lang::get('lovata.shopaholic::lang.field.old_price'), - 'quantity' => Lang::get('lovata.shopaholic::lang.field.quantity'), - 'weight' => Lang::get('lovata.toolbox::lang.field.weight'), - 'height' => Lang::get('lovata.toolbox::lang.field.height'), - 'length' => Lang::get('lovata.toolbox::lang.field.length'), - 'width' => Lang::get('lovata.toolbox::lang.field.width'), - 'measure_id' => Lang::get('lovata.shopaholic::lang.field.measure'), - 'quantity_in_unit' => Lang::get('lovata.shopaholic::lang.field.quantity_in_unit'), - 'measure_of_unit' => Lang::get('lovata.shopaholic::lang.field.measure_of_unit'), - 'preview_text' => Lang::get('lovata.toolbox::lang.field.preview_text'), - 'description' => Lang::get('lovata.toolbox::lang.field.description'), - 'preview_image' => Lang::get('lovata.toolbox::lang.field.preview_image'), - 'images' => Lang::get('lovata.toolbox::lang.field.images'), - ]; - - //Get price types - $arPriceTypeList = (array) PriceType::lists('name', 'id'); - if (!empty($arPriceTypeList)) { - foreach ($arPriceTypeList as $iPriceTypeID => $sName) { - $sKey = 'price_list.'.$iPriceTypeID; - $this->arFieldList[$sKey.'.price'] = Lang::get('lovata.shopaholic::lang.field.price')." ($sName)"; - $this->arFieldList[$sKey.'.old_price'] = Lang::get('lovata.shopaholic::lang.field.old_price')." ($sName)"; - } - } - - return parent::getFields(); - } - - /** - * Start import - * @param $obProgressBar - * @throws - */ - public function import($obProgressBar = null) - { - parent::import($obProgressBar); - - $this->deactivateElements(); - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - $this->setActiveField(); - $this->setProductField(); - $this->setQuantityField(); - $this->setMeasureField(); - - $this->initPreviewImage(); - $this->initImageList(); - - parent::prepareImportData(); - } - - /** - * Process model object after creation/updating - */ - protected function processModelObject() - { - $this->importPreviewImage(); - $this->importImageList(); - - parent::processModelObject(); - } - - /** - * Set product_id filed value - */ - protected function setProductField() - { - $sProductID = array_get($this->arImportData, 'product_id'); - if ($sProductID === null) { - return; - } - - if (empty($sProductID)) { - $this->arImportData['product_id'] = null; - - return; - } - - //Find product by external ID - $obProduct = Product::withTrashed()->getByExternalID($sProductID)->first(); - if (empty($obProduct)) { - $this->arImportData['product_id'] = null; - } else { - $this->arImportData['product_id'] = $obProduct->id; - } - } - - /** - * Set quantity field value - */ - protected function setQuantityField() - { - $iQuantity = array_get($this->arImportData, 'quantity'); - if ($iQuantity === null) { - return; - } - - $iQuantity = (int) $iQuantity; - if ($iQuantity < 0) { - $iQuantity = 0; - } - - $this->arImportData['quantity'] = $iQuantity; - } - - /** - * Set measure filed value - */ - protected function setMeasureField() - { - $sMeasure = array_get($this->arImportData, 'measure_of_unit'); - array_forget($this->arImportData, 'measure_of_unit'); - if ($sMeasure === null) { - return; - } - - if (empty($sMeasure)) { - $this->arImportData['measure_of_unit_id'] = null; - return; - } - - $obMeasure = Measure::getByName($sMeasure)->first(); - if (empty($obMeasure)) { - $obMeasure = Measure::create([ - 'name' => $sMeasure, - ]); - } - - $this->arImportData['measure_of_unit_id'] = $obMeasure->id; - } - - /** - * Prepare import settings - */ - protected function prepareImportSettings() - { - $this->arXMLFileList = XmlImportSettings::getValue('file_list'); - $this->sImageFolderPath = XmlImportSettings::getValue('image_folder'); - $this->sImageFolderPath = trim($this->sImageFolderPath, '/'); - - $this->bDeactivate = (bool) XmlImportSettings::getValue('offer_deactivate'); - $this->arImportSettings = XmlImportSettings::getValue('offer'); - $this->sElementListPath = XmlImportSettings::getValue('offer_path_to_list'); - - $iFileNumber = XmlImportSettings::getValue('offer_file_path'); - if ($iFileNumber !== null) { - $this->sMainFilePath = array_get($this->arXMLFileList, $iFileNumber.'.path'); - $this->sPrefix = array_get($this->arXMLFileList, $iFileNumber.'.path_prefix'); - $this->sNamespace = array_get($this->arXMLFileList, $iFileNumber.'.file_namespace'); - $this->sMainFilePath = trim($this->sMainFilePath, '/'); - } - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ImportOfferPriceFromXML.php b/plugins/lovata/shopaholic/classes/import/ImportOfferPriceFromXML.php deleted file mode 100644 index d89bcf4a3..000000000 --- a/plugins/lovata/shopaholic/classes/import/ImportOfferPriceFromXML.php +++ /dev/null @@ -1,127 +0,0 @@ -arExistIDList = (array) Offer::whereNotNull('external_id')->lists('external_id', 'id'); - $this->arExistIDList = array_filter($this->arExistIDList); - - $this->prepareImportSettings(); - - parent::__construct(); - } - - /** - * Get import fields - * @return array - */ - public function getFields() : array - { - $this->arFieldList = [ - 'external_id' => Lang::get('lovata.toolbox::lang.field.external_id'), - 'active' => Lang::get('lovata.toolbox::lang.field.active'), - 'price' => Lang::get('lovata.shopaholic::lang.field.price'), - 'old_price' => Lang::get('lovata.shopaholic::lang.field.old_price'), - 'quantity' => Lang::get('lovata.shopaholic::lang.field.quantity'), - ]; - - //Get price types - $arPriceTypeList = (array) PriceType::lists('name', 'id'); - if (!empty($arPriceTypeList)) { - foreach ($arPriceTypeList as $iPriceTypeID => $sName) { - $sKey = 'price_list.'.$iPriceTypeID; - $this->arFieldList[$sKey.'.price'] = Lang::get('lovata.shopaholic::lang.field.price')." ($sName)"; - $this->arFieldList[$sKey.'.old_price'] = Lang::get('lovata.shopaholic::lang.field.old_price')." ($sName)"; - } - } - - return parent::getFields(); - } - - /** - * Start import - * @param $obProgressBar - * @throws - */ - public function import($obProgressBar = null) - { - parent::import($obProgressBar); - - $this->deactivateElements(); - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - $this->setActiveField(); - $this->setQuantityField(); - - parent::prepareImportData(); - } - - /** - * Set quantity field value - */ - protected function setQuantityField() - { - $iQuantity = array_get($this->arImportData, 'quantity'); - if ($iQuantity === null) { - return; - } - - $iQuantity = (int) $iQuantity; - if ($iQuantity < 0) { - $iQuantity = 0; - } - - $this->arImportData['quantity'] = $iQuantity; - } - - /** - * Prepare import settings - */ - protected function prepareImportSettings() - { - $this->arXMLFileList = XmlImportSettings::getValue('file_list'); - $this->sImageFolderPath = XmlImportSettings::getValue('image_folder'); - $this->sImageFolderPath = trim($this->sImageFolderPath, '/'); - - $this->bDeactivate = (bool) XmlImportSettings::getValue('price_deactivate'); - $this->arImportSettings = XmlImportSettings::getValue('price'); - $this->sElementListPath = XmlImportSettings::getValue('price_path_to_list'); - - $iFileNumber = XmlImportSettings::getValue('price_file_path'); - if ($iFileNumber !== null) { - $this->sMainFilePath = array_get($this->arXMLFileList, $iFileNumber.'.path'); - $this->sMainFilePath = trim($this->sMainFilePath, '/'); - } - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ImportProductModelFromCSV.php b/plugins/lovata/shopaholic/classes/import/ImportProductModelFromCSV.php deleted file mode 100644 index 78f0fcea3..000000000 --- a/plugins/lovata/shopaholic/classes/import/ImportProductModelFromCSV.php +++ /dev/null @@ -1,148 +0,0 @@ -arExistIDList = (array) Product::whereNotNull('external_id')->lists('external_id', 'id'); - $this->arExistIDList = array_filter($this->arExistIDList); - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - $this->setActiveField(); - $this->setBrandField(); - $this->setCategoryField(); - - $this->initPreviewImage(); - $this->initImageList(); - $this->initAdditionalCategoryField(); - - parent::prepareImportData(); - } - - /** - * Process model object after creation/updating - */ - protected function processModelObject() - { - $this->importPreviewImage(); - $this->importImageList(); - - $this->syncAdditionalCategoryList(); - } - - /** - * Set brand_id filed value - */ - protected function setBrandField() - { - $sBrandID = array_get($this->arImportData, 'brand_id'); - if ($sBrandID === null) { - return; - } - - if (empty($sBrandID)) { - $this->arImportData['brand_id'] = null; - - return; - } - - //Find brand by external ID - $obBrand = Brand::getByExternalID($sBrandID)->first(); - if (empty($obBrand)) { - $this->arImportData['brand_id'] = null; - } else { - $this->arImportData['brand_id'] = $obBrand->id; - } - } - - /** - * Set category_id filed value - */ - protected function setCategoryField() - { - $sCategoryID = array_get($this->arImportData, 'category_id'); - if ($sCategoryID === null) { - return; - } - - if (empty($sCategoryID)) { - $this->arImportData['category_id'] = null; - - return; - } - - //Find category by external ID - $obCategory = Category::getByExternalID($sCategoryID)->first(); - if (empty($obCategory)) { - $this->arImportData['category_id'] = null; - } else { - $this->arImportData['category_id'] = $obCategory->id; - } - } - - /** - * Init additional category ID list - */ - protected function initAdditionalCategoryField() - { - $sCategoryList = array_get($this->arImportData, 'additional_category'); - if ($sCategoryList === null) { - return; - } - - $arCategoryIDList = explode(',', $sCategoryList); - foreach ($arCategoryIDList as $iKey => &$iCategoryID) { - $iCategoryID = trim($iCategoryID); - if (empty($iCategoryID)) { - unset($arCategoryIDList[$iKey]); - } - } - - if (empty($arCategoryIDList)) { - $this->arAdditionalCategoryList = []; - - return; - } - - $this->arAdditionalCategoryList = (array) Category::whereIn('external_id', $arCategoryIDList)->lists('id'); - } - - /** - * Sync link product with additional categories - */ - protected function syncAdditionalCategoryList() - { - if ($this->arAdditionalCategoryList === null) { - return; - } - - $this->obModel->additional_category()->sync($this->arAdditionalCategoryList); - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ImportProductModelFromXML.php b/plugins/lovata/shopaholic/classes/import/ImportProductModelFromXML.php deleted file mode 100644 index 187f2aaba..000000000 --- a/plugins/lovata/shopaholic/classes/import/ImportProductModelFromXML.php +++ /dev/null @@ -1,224 +0,0 @@ -arExistIDList = (array) Product::whereNotNull('external_id')->lists('external_id', 'id'); - $this->arExistIDList = array_filter($this->arExistIDList); - - $this->prepareImportSettings(); - - parent::__construct(); - } - - /** - * Get import fields - * @return array - */ - public function getFields() : array - { - $this->arFieldList = [ - 'external_id' => Lang::get('lovata.toolbox::lang.field.external_id'), - 'active' => Lang::get('lovata.toolbox::lang.field.active'), - 'name' => Lang::get('lovata.toolbox::lang.field.name'), - 'code' => Lang::get('lovata.toolbox::lang.field.code'), - 'preview_text' => Lang::get('lovata.toolbox::lang.field.preview_text'), - 'description' => Lang::get('lovata.toolbox::lang.field.description'), - 'preview_image' => Lang::get('lovata.toolbox::lang.field.preview_image'), - 'images' => Lang::get('lovata.toolbox::lang.field.images'), - 'brand_id' => Lang::get('lovata.shopaholic::lang.field.brand'), - 'category_id' => Lang::get('lovata.toolbox::lang.field.category'), - 'additional_category' => Lang::get('lovata.shopaholic::lang.field.additional_category'), - ]; - - return parent::getFields(); - } - - /** - * Start import - * @param $obProgressBar - * @throws - */ - public function import($obProgressBar = null) - { - parent::import($obProgressBar); - - $this->deactivateElements(); - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - $this->setActiveField(); - $this->setBrandField(); - $this->setCategoryField(); - - $this->initPreviewImage(); - $this->initImageList(); - $this->initAdditionalCategoryField(); - - parent::prepareImportData(); - } - - /** - * Process model object after creation/updating - */ - protected function processModelObject() - { - $this->importPreviewImage(); - $this->importImageList(); - - $this->syncAdditionalCategoryList(); - - parent::processModelObject(); - } - - /** - * Set brand_id filed value - */ - protected function setBrandField() - { - $sBrandID = array_get($this->arImportData, 'brand_id'); - if ($sBrandID === null) { - return; - } - - if (empty($sBrandID)) { - $this->arImportData['brand_id'] = null; - - return; - } - - //Find brand by external ID - $obBrand = Brand::getByExternalID($sBrandID)->first(); - if (empty($obBrand)) { - $this->arImportData['brand_id'] = null; - } else { - $this->arImportData['brand_id'] = $obBrand->id; - } - } - - /** - * Set category_id filed value - */ - protected function setCategoryField() - { - $sCategoryID = array_get($this->arImportData, 'category_id'); - if ($sCategoryID === null) { - return; - } - - if (empty($sCategoryID)) { - $this->arImportData['category_id'] = null; - - return; - } - - if (is_array($sCategoryID)) { - $sCategoryID = array_shift($sCategoryID); - } - - //Find category by external ID - $obCategory = Category::getByExternalID($sCategoryID)->first(); - if (empty($obCategory)) { - $this->arImportData['category_id'] = null; - } else { - $this->arImportData['category_id'] = $obCategory->id; - } - } - - /** - * Init additional category ID list - */ - protected function initAdditionalCategoryField() - { - $arCategoryIDList = (array) array_get($this->arImportData, 'additional_category'); - $arCategoryIDList = array_filter($arCategoryIDList); - if (empty($arCategoryIDList)) { - return; - } - - $iMainCategoryID = array_get($this->arImportData, 'category_id'); - - array_forget($this->arImportData, 'additional_category'); - foreach ($arCategoryIDList as $iKey => &$iCategoryID) { - $iCategoryID = trim($iCategoryID); - if (empty($iCategoryID)) { - unset($arCategoryIDList[$iKey]); - } - } - - if (empty($arCategoryIDList)) { - $this->arAdditionalCategoryList = []; - - return; - } - - $this->arAdditionalCategoryList = (array) Category::whereIn('external_id', $arCategoryIDList)->where('id', '!=', $iMainCategoryID)->lists('id'); - } - - /** - * Sync link product with additional categories - */ - protected function syncAdditionalCategoryList() - { - if ($this->arAdditionalCategoryList === null) { - return; - } - - $this->obModel->additional_category()->sync($this->arAdditionalCategoryList); - } - - /** - * Prepare import settings - */ - protected function prepareImportSettings() - { - $this->arXMLFileList = XmlImportSettings::getValue('file_list'); - $this->sImageFolderPath = XmlImportSettings::getValue('image_folder'); - $this->sImageFolderPath = trim($this->sImageFolderPath, '/'); - - $this->bDeactivate = (bool) XmlImportSettings::getValue('product_deactivate'); - $this->arImportSettings = XmlImportSettings::getValue('product'); - $this->sElementListPath = XmlImportSettings::getValue('product_path_to_list'); - - $iFileNumber = XmlImportSettings::getValue('product_file_path'); - if ($iFileNumber !== null) { - $this->sMainFilePath = array_get($this->arXMLFileList, $iFileNumber.'.path'); - $this->sPrefix = array_get($this->arXMLFileList, $iFileNumber.'.path_prefix'); - $this->sNamespace = array_get($this->arXMLFileList, $iFileNumber.'.file_namespace'); - $this->sMainFilePath = trim($this->sMainFilePath, '/'); - } - } -} diff --git a/plugins/lovata/shopaholic/classes/import/ParseCategoryXMLNode.php b/plugins/lovata/shopaholic/classes/import/ParseCategoryXMLNode.php deleted file mode 100644 index c3a60f5a3..000000000 --- a/plugins/lovata/shopaholic/classes/import/ParseCategoryXMLNode.php +++ /dev/null @@ -1,34 +0,0 @@ -obElementNode->findListByPath($sFieldPath); - if (empty($arNodeList)) { - return $arResult; - } - - foreach ($arNodeList as $obCategoryNode) { - $obParseNode = new ParseCategoryXMLNode($obCategoryNode, $this->arImportSettings); - $arResult[] = $obParseNode->get(); - } - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/item/BrandItem.php b/plugins/lovata/shopaholic/classes/item/BrandItem.php deleted file mode 100644 index 0910ef403..000000000 --- a/plugins/lovata/shopaholic/classes/item/BrandItem.php +++ /dev/null @@ -1,84 +0,0 @@ -getPageParamList($sPageCode, $arRemoveParamList); - - //Generate page URL - $sURL = CmsPage::url($sPageCode, $arParamList); - - return $sURL; - } - - /** - * Get URL param list by page code - * @param string $sPageCode - * @param array $arRemoveParamList - * @return array - */ - public function getPageParamList($sPageCode, $arRemoveParamList = []) : array - { - $arResult = []; - if (!empty($arRemoveParamList)) { - foreach ($arRemoveParamList as $sParamName) { - $arResult[$sParamName] = null; - } - } - - //Get URL params for page - $arParamList = PageHelper::instance()->getUrlParamList($sPageCode, 'BrandPage'); - if (!empty($arParamList)) { - $sPageParam = array_shift($arParamList); - $arResult[$sPageParam] = $this->slug; - } - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/item/CategoryItem.php b/plugins/lovata/shopaholic/classes/item/CategoryItem.php deleted file mode 100644 index cf28b068a..000000000 --- a/plugins/lovata/shopaholic/classes/item/CategoryItem.php +++ /dev/null @@ -1,259 +0,0 @@ - [ - 'class' => CategoryItem::class, - 'field' => 'parent_id', - ], - 'children' => [ - 'class' => CategoryCollection::class, - 'field' => 'children_id_list', - ], - ]; - - /** - * Clear product count cache - */ - public function clearProductCount() - { - $arCacheTag = [static::class]; - $sCacheKey = 'product_count_'.$this->id; - - CCache::clear($arCacheTag, $sCacheKey); - ItemStorage::clear(static::class, $this->id); - - $obParentItem = $this->parent; - if ($obParentItem->isEmpty()) { - return; - } - - $obParentItem->clearProductCount(); - } - - /** - * Returns URL of a category page. - * - * @param string|null $sPageCode - * @param array $arRemoveParamList - * - * @return string - */ - public function getPageUrl($sPageCode = null, $arRemoveParamList = []) - { - if (empty($sPageCode)) { - $sPageCode = Settings::getValue('default_category_page_id', 'catalog'); - } - - //Get URL params - $arParamList = $this->getPageParamList($sPageCode, $arRemoveParamList); - - //Generate page URL - $sURL = CmsPage::url($sPageCode, $arParamList); - - return $sURL; - } - - /** - * Get URL param list by page code - * @param string $sPageCode - * @param array $arRemoveParamList - * @return array - */ - public function getPageParamList($sPageCode, $arRemoveParamList = []) : array - { - $arResult = []; - if (!empty($arRemoveParamList)) { - foreach ($arRemoveParamList as $sParamName) { - $arResult[$sParamName] = null; - } - } - - //Get all slug params - $arParamList = PageHelper::instance()->getUrlParamList($sPageCode, null); - if (!empty($arParamList)) { - foreach ($arParamList as $sParamName) { - $arResult[$sParamName] = null; - } - } - - //Get URL params for page - $arParamList = PageHelper::instance()->getUrlParamList($sPageCode, 'CategoryPage'); - if (empty($arParamList)) { - return []; - } - - //Get slug list - $arSlugList = $this->getSlugList(); - - $arWildcardParamList = PageHelper::instance()->getUrlParamList($sPageCode, 'CategoryPage', 'slug', true); - if (!empty($arWildcardParamList)) { - $arSlugList = array_reverse($arSlugList); - $arResult[array_shift($arWildcardParamList)] = implode('/', $arSlugList); - - return $arResult; - } elseif (count($arParamList) == 1) { - $sParamName = array_shift($arParamList); - $arResult[$sParamName] = array_shift($arSlugList); - - return $arResult; - } - - //Prepare page property list - $arSlugList = array_reverse($arSlugList); - $arParamList = array_reverse($arParamList); - foreach ($arParamList as $sParamName) { - if (!empty($arSlugList)) { - $arResult[$sParamName] = array_shift($arSlugList); - } - } - - return $arResult; - } - - /** - * Get array with categories slugs - * @return array - */ - protected function getSlugList() : array - { - $arResult = [$this->slug]; - - $obParentCategory = $this->parent; - while ($obParentCategory->isNotEmpty()) { - $arResult[] = $obParentCategory->slug; - $obParentCategory = $obParentCategory->parent; - } - - return $arResult; - } - - /** - * Set element data from model object - * - * @return array - */ - protected function getElementData() - { - $arResult = [ - 'nest_depth' => $this->obElement->getDepth(), - ]; - - $arResult['children_id_list'] = $this->obElement->children() - ->active() - ->orderBy('nest_left', 'asc') - ->lists('id'); - - return $arResult; - } - - /** - * Get product count for category - * @return int - */ - protected function getProductCountAttribute() - { - $iProductCount = $this->getAttribute('product_count'); - if ($iProductCount !== null) { - return $iProductCount; - } - - //Get product count from cache - $arCacheTag = [static::class]; - $sCacheKey = 'product_count_'.$this->id; - - $iProductCount = CCache::get($arCacheTag, $sCacheKey); - if ($iProductCount !== null) { - return $iProductCount; - } - - //Calculate product count from child categories - $iProductCount = 0; - $obChildCategoryCollect = $this->children; - if ($obChildCategoryCollect->isNotEmpty()) { - /** @var CategoryItem $obChildCategoryItem */ - foreach ($obChildCategoryCollect as $obChildCategoryItem) { - if ($obChildCategoryItem->isEmpty()) { - continue; - } - - $iProductCount += $obChildCategoryItem->product_count; - } - } - - $iProductCount += ProductCollection::make()->active()->category($this->id)->count(); - - CCache::forever($arCacheTag, $sCacheKey, $iProductCount); - $this->setAttribute('product_count', $iProductCount); - - return $iProductCount; - } -} diff --git a/plugins/lovata/shopaholic/classes/item/CurrencyItem.php b/plugins/lovata/shopaholic/classes/item/CurrencyItem.php deleted file mode 100644 index 1a54163c6..000000000 --- a/plugins/lovata/shopaholic/classes/item/CurrencyItem.php +++ /dev/null @@ -1,37 +0,0 @@ -code == CurrencyHelper::instance()->getActiveCurrencyCode(); - - return $bResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/item/MeasureItem.php b/plugins/lovata/shopaholic/classes/item/MeasureItem.php deleted file mode 100644 index c64cbae72..000000000 --- a/plugins/lovata/shopaholic/classes/item/MeasureItem.php +++ /dev/null @@ -1,24 +0,0 @@ - [ - 'class' => ProductItem::class, - 'field' => 'product_id', - ], - 'measure' => [ - 'class' => MeasureItem::class, - 'field' => 'measure_id', - ], - ]; - - public $arPriceField = [ - 'price', - 'tax_price', - 'price_without_tax', - 'price_with_tax', - 'old_price', - 'tax_old_price', - 'old_price_without_tax', - 'old_price_with_tax', - 'discount_price', - 'tax_discount_price', - 'discount_price_without_tax', - 'discount_price_with_tax', - ]; - - protected $iActivePriceType = null; - protected $sActiveCurrency = null; - - /** - * Check element, active == true, trashed == false - * @return bool - */ - public function isActive() - { - return $this->active && !$this->trashed; - } - - /** - * Set active price type - * @param int $iPriceTypeID - * @return OfferItem - */ - public function setActivePriceType($iPriceTypeID) - { - $this->iActivePriceType = $iPriceTypeID; - - return $this; - } - - /** - * Set active currency code - * @param string $sActiveCurrencyCode - * @return OfferItem - */ - public function setActiveCurrency($sActiveCurrencyCode) - { - $this->sActiveCurrency = $sActiveCurrencyCode; - - return $this; - } - - /** - * Get active price type - * @return int|null - */ - public function getActivePriceType() - { - if (empty($this->iActivePriceType)) { - $this->iActivePriceType = PriceTypeHelper::instance()->getActivePriceTypeID(); - } - - return $this->iActivePriceType; - } - - /** - * Get active currency code - * @return int|null - */ - public function getActiveCurrency() - { - if (!empty($this->sActiveCurrency)) { - return $this->sActiveCurrency; - } - - return CurrencyHelper::instance()->getActiveCurrencyCode(); - } - - /** - * Get price_value attribute - * @return float - */ - protected function getPriceValueAttribute() - { - $iActivePriceType = $this->getActivePriceType(); - if (empty($iActivePriceType)) { - $fPrice = $this->getAttribute('price_value'); - } else { - $fPrice = array_get($this->price_list, $iActivePriceType.'.price'); - } - - $fPrice = CurrencyHelper::instance()->convert($fPrice, $this->getActiveCurrency()); - - return $fPrice; - } - - /** - * Get old_price_value attribute - * @return float - */ - protected function getOldPriceValueAttribute() - { - $iActivePriceType = $this->getActivePriceType(); - if (empty($iActivePriceType)) { - $fPrice = $this->getAttribute('old_price_value'); - } else { - $fPrice = array_get($this->price_list, $iActivePriceType.'.old_price'); - } - - $fPrice = CurrencyHelper::instance()->convert($fPrice, $this->getActiveCurrency()); - - return $fPrice; - } - - /** - * Get discount_price_value attribute - * @return float - */ - protected function getDiscountPriceValueAttribute() - { - $fOldPrice = $this->old_price_value; - $fPrice = $this->price_value; - - $fDiscountPrice = 0; - if ($fOldPrice > 0) { - $fDiscountPrice = PriceHelper::round($fOldPrice - $fPrice); - } - - $fPrice = CurrencyHelper::instance()->convert($fDiscountPrice, $this->getActiveCurrency()); - - return $fPrice; - } - - /** - * Get currency value - * @return null|string - */ - protected function getCurrencyAttribute() - { - if (empty($this->sActiveCurrency)) { - return CurrencyHelper::instance()->getActiveCurrencySymbol(); - } - - $sResult = CurrencyHelper::instance()->getCurrencySymbol($this->sActiveCurrency); - $this->sActiveCurrency = null; - - return $sResult; - } - - /** - * Get currency code value - * @return null|string - */ - protected function getCurrencyCodeAttribute() - { - if (empty($this->sActiveCurrency)) { - return CurrencyHelper::instance()->getActiveCurrencyCode(); - } - - $sResult = CurrencyHelper::instance()->getCurrencyCode($this->sActiveCurrency); - $this->sActiveCurrency = null; - - return $sResult; - } - - /** - * Get tax_price_value attribute value - * @return float - */ - protected function getTaxPriceValueAttribute() - { - $fPrice = PriceHelper::round($this->price_with_tax_value - $this->price_without_tax_value); - - return $fPrice; - } - - /** - * Get tax_old_price_value attribute value - * @return float - */ - protected function getTaxOldPriceValueAttribute() - { - $fPrice = PriceHelper::round($this->old_price_with_tax_value - $this->old_price_without_tax_value); - - return $fPrice; - } - - /** - * Get tax_discount_price_value attribute value - * @return float - */ - protected function getTaxDiscountPriceValueAttribute() - { - $fPrice = PriceHelper::round($this->discount_price_with_tax_value - $this->discount_price_without_tax_value); - - return $fPrice; - } - - /** - * Get price_with_tax_value attribute value - * @return float - */ - protected function getPriceWithTaxValueAttribute() - { - $fPrice = TaxHelper::instance()->getPriceWithTax($this->price_value, $this->tax_percent); - - return $fPrice; - } - - /** - * Get old_price_with_tax_value attribute value - * @return float - */ - protected function getOldPriceWithTaxValueAttribute() - { - $fPrice = TaxHelper::instance()->getPriceWithTax($this->old_price_value, $this->tax_percent); - - return $fPrice; - } - - /** - * Get discount_price_with_tax_value attribute value - * @return float - */ - protected function getDiscountPriceWithTaxValueAttribute() - { - $fPrice = TaxHelper::instance()->getPriceWithTax($this->discount_price_value, $this->tax_percent); - - return $fPrice; - } - - /** - * Get price_without_tax_value attribute value - * @return float - */ - protected function getPriceWithoutTaxValueAttribute() - { - $fPrice = TaxHelper::instance()->getPriceWithoutTax($this->price_value, $this->tax_percent); - - return $fPrice; - } - - /** - * Get old_price_without_tax_value attribute value - * @return float - */ - protected function getOldPriceWithoutTaxValueAttribute() - { - $fPrice = TaxHelper::instance()->getPriceWithoutTax($this->old_price_value, $this->tax_percent); - - return $fPrice; - } - - /** - * Get discount_price_without_tax_value attribute value - * @return float - */ - protected function getDiscountPriceWithoutTaxValueAttribute() - { - $fPrice = TaxHelper::instance()->getPriceWithoutTax($this->discount_price_value, $this->tax_percent); - - return $fPrice; - } - - /** - * Get tax_percent attribute value - * @return float - */ - protected function getTaxPercentAttribute() - { - $fTaxPercent = $this->getAttribute('tax_percent'); - if ($fTaxPercent === null) { - $fTaxPercent = TaxHelper::instance()->getTaxPercent($this->tax_list); - $this->setAttribute('tax_percent', $fTaxPercent); - } - - return $fTaxPercent; - } - - /** - * Get tax_list attribute value - * @return \Lovata\Shopaholic\Classes\Collection\TaxCollection|TaxItem[] - */ - protected function getTaxListAttribute() - { - $obTaxList = $this->getAttribute('tax_list'); - if ($obTaxList === null) { - $obTaxList = $this->getAppliedTaxList(); - $this->setAttribute('tax_list', $obTaxList); - } - - return $obTaxList; - } - - /** - * Get measure of one unit - * @return \Lovata\Shopaholic\Classes\Item\MeasureItem - */ - protected function getMeasureOfUnitAttribute() - { - $iMeasureID = $this->measure_of_unit_id; - if (empty($iMeasureID)) { - $iMeasureID = Settings::getValue('measure_of_unit'); - } - - $obMeasureItem = MeasureItem::make($iMeasureID); - - return $obMeasureItem; - } - - /** - * Get dimensions unit measure - * @return \Lovata\Shopaholic\Classes\Item\MeasureItem - */ - protected function getDimensionsMeasureAttribute() - { - $obMeasureItem = MeasureHelper::instance()->getDimensionsMeasureItem(); - - return $obMeasureItem; - } - - /** - * Get weight unit measure - * @return \Lovata\Shopaholic\Classes\Item\MeasureItem - */ - protected function getWeightMeasureAttribute() - { - $obMeasureItem = MeasureHelper::instance()->getWeightMeasureItem(); - - return $obMeasureItem; - } - - /** - * Get applied tax list - * @return \Lovata\Shopaholic\Classes\Collection\TaxCollection|\Lovata\Shopaholic\Classes\Item\TaxItem[] - */ - protected function getAppliedTaxList() - { - $obResultTaxList = TaxHelper::instance()->getTaxList(); - if ($obResultTaxList->isEmpty()) { - return $obResultTaxList; - } - - foreach ($obResultTaxList as $obTaxItem) { - $bSkipTax = !$obTaxItem->is_global - && !$obTaxItem->isAvailableForCategory($this->product->category) - && !$obTaxItem->isAvailableForProduct($this->product) - && !$obTaxItem->isAvailableForCountry(TaxHelper::instance()->getActiveCountry()) - && !$obTaxItem->isAvailableForState(TaxHelper::instance()->getActiveState()); - - if ($bSkipTax) { - $obResultTaxList->exclude($obTaxItem->id); - } - } - - return $obResultTaxList; - } - - /** - * Set element data from model object - * - * @return array - */ - protected function getElementData() - { - $obDefaultCurrency = CurrencyHelper::instance()->getDefault(); - $sCurrencyCode = !empty($obDefaultCurrency) ? $obDefaultCurrency->code : null; - - $arResult = [ - 'price_value' => $this->obElement->setActiveCurrency($sCurrencyCode)->setActivePriceType(null)->price_value, - 'old_price_value' => $this->obElement->setActiveCurrency($sCurrencyCode)->setActivePriceType(null)->old_price_value, - 'trashed' => $this->obElement->trashed(), - ]; - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/item/ProductItem.php b/plugins/lovata/shopaholic/classes/item/ProductItem.php deleted file mode 100644 index 97fc63035..000000000 --- a/plugins/lovata/shopaholic/classes/item/ProductItem.php +++ /dev/null @@ -1,208 +0,0 @@ - 0, 2 => 4, 3 => 7, 4 => 21, 5 => 48] - * @property \Lovata\ReviewsShopaholic\Classes\Collection\ReviewCollection|\Lovata\ReviewsShopaholic\Classes\Item\ReviewItem[] $review - * - * @method int getRatingCount(int $iRating) - * @method int getRatingPercent(int $iRating) - * @method int getRatingTotalCount() - * - * Related products for Shopaholic - * @property \Lovata\Shopaholic\Classes\Collection\ProductCollection|ProductItem[] $related - * - * Accessories for Shopaholic - * @property \Lovata\Shopaholic\Classes\Collection\ProductCollection|ProductItem[] $accessory - * - * Labels for Shopaholic - * @property \Lovata\LabelsShopaholic\Classes\Collection\LabelCollection|\Lovata\LabelsShopaholic\Classes\Item\LabelItem[] $label - * - * Compare for Shopaholic - * @method bool inCompare() - * - * Wish list for Shopaholic - * @method bool inWishList() - * - * YandexMarket for Shopaholic - * @property \System\Models\File $preview_image_yandex - * @property \October\Rain\Database\Collection|\System\Models\File[] $images_yandex - * - * Facebook for Shopaholic - * @property \System\Models\File $preview_image_facebook - * @property \October\Rain\Database\Collection|\System\Models\File[] $images_facebook - * - * VKontakte for Shopaholic - * @property bool $active_vk - * @property int $external_vk_id - * @property \System\Models\File $preview_image_vkontakte - * @property \October\Rain\Database\Collection|\System\Models\File[] $images_vkontakte - * - * Downloadable file for Shopaholic - * @property bool $is_file_access - */ -class ProductItem extends ElementItem -{ - const MODEL_CLASS = Product::class; - - public static $arQueryWith = [ - 'preview_image', - 'images', - 'additional_category', - 'offer', - 'offer.preview_image', - 'offer.images', - 'offer.main_price', - 'offer.price_link' - ]; - - /** @var Product */ - protected $obElement = null; - - public $arRelationList = [ - 'offer' => [ - 'class' => OfferCollection::class, - 'field' => 'offer_id_list', - ], - 'category' => [ - 'class' => CategoryItem::class, - 'field' => 'category_id', - ], - 'additional_category' => [ - 'class' => CategoryCollection::class, - 'field' => 'additional_category_id', - ], - 'brand' => [ - 'class' => BrandItem::class, - 'field' => 'brand_id', - ], - ]; - - /** - * Check element, active == true, trashed == false - * @return bool - */ - public function isActive() - { - return $this->active && !$this->trashed; - } - - /** - * Returns URL of a category page. - * - * @param string|null $sPageCode - * @param array $arRemoveParamList - * - * @return string - */ - public function getPageUrl($sPageCode = null, $arRemoveParamList = []) - { - if (empty($sPageCode)) { - $sPageCode = Settings::getValue('default_product_page_id', 'product'); - } - - //Get URL params - $arParamList = $this->getPageParamList($sPageCode, $arRemoveParamList); - - //Generate page URL - $sURL = CmsPage::url($sPageCode, $arParamList); - - return $sURL; - } - - /** - * Get URL param list by page code - * @param string $sPageCode - * @param array $arRemoveParamList - * @return array - */ - public function getPageParamList($sPageCode, $arRemoveParamList = []) : array - { - $arResult = []; - $arPageParamList = []; - if (!empty($arRemoveParamList)) { - foreach ($arRemoveParamList as $sParamName) { - $arResult[$sParamName] = null; - } - } - - //Get URL params for categories - $aCategoryParamList = $this->category->getPageParamList($sPageCode); - $aBrandParamList = $this->brand->getPageParamList($sPageCode); - - //Get URL params for page - $arParamList = (array) PageHelper::instance()->getUrlParamList($sPageCode, 'ProductPage'); - if (!empty($arParamList)) { - $sPageParam = array_shift($arParamList); - $arPageParamList[$sPageParam] = $this->slug; - } - - $arResult = array_merge($arResult, $aCategoryParamList, $aBrandParamList, $arPageParamList); - - return $arResult; - } - - /** - * Set element data from model object - * @return array - */ - protected function getElementData() - { - $arResult = [ - 'offer_id_list' => $this->obElement->offer->where('active', true)->pluck('id')->all(), - 'additional_category_id' => $this->obElement->additional_category->pluck('id')->all(), - 'trashed' => $this->obElement->trashed(), - ]; - - foreach ($this->obElement->offer as $obOffer) { - OfferItem::make($obOffer->id, $obOffer); - } - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/item/PromoBlockItem.php b/plugins/lovata/shopaholic/classes/item/PromoBlockItem.php deleted file mode 100644 index 89110768c..000000000 --- a/plugins/lovata/shopaholic/classes/item/PromoBlockItem.php +++ /dev/null @@ -1,93 +0,0 @@ -getPageParamList($sPageCode); - - //Generate page URL - $sURL = CmsPage::url($sPageCode, $arParamList); - - return $sURL; - } - - /** - * Get URL param list by page code - * @param string $sPageCode - * @return array - */ - public function getPageParamList($sPageCode) : array - { - $arPageParamList = []; - - //Get URL params for page - $arParamList = PageHelper::instance()->getUrlParamList($sPageCode, 'PromoBlockPage'); - if (!empty($arParamList)) { - $sPageParam = array_shift($arParamList); - $arPageParamList[$sPageParam] = $this->slug; - } - - return $arPageParamList; - } - - /** - * Get product collection attribute - * @return ProductCollection - */ - protected function getProductAttribute() : ProductCollection - { - $obProductList = ProductCollection::make()->promo($this->id); - - return $obProductList; - } -} diff --git a/plugins/lovata/shopaholic/classes/item/TaxItem.php b/plugins/lovata/shopaholic/classes/item/TaxItem.php deleted file mode 100644 index 8a027ef59..000000000 --- a/plugins/lovata/shopaholic/classes/item/TaxItem.php +++ /dev/null @@ -1,116 +0,0 @@ -category_id_list; - if (empty($arCategoryIDList) || empty($obCategoryItem)) { - return false; - } - - if (in_array($obCategoryItem->id, $arCategoryIDList)) { - return true; - } - - if ($obCategoryItem->parent->isNotEmpty()) { - return $this->isAvailableForCategory($obCategoryItem->parent); - } - - return false; - } - - /** - * Check tax is available for product - * @param \Lovata\Shopaholic\Classes\Item\ProductItem $obProductItem - * @return bool - */ - public function isAvailableForProduct($obProductItem) : bool - { - $arProductIDList = (array) $this->product_id_list; - - $bResult = !empty($arProductIDList) && !empty($obProductItem) && in_array($obProductItem->id, $arProductIDList); - - return $bResult; - } - - /** - * Check tax is available for country - * @param \RainLab\Location\Models\Country $obCountry - * @return bool - */ - public function isAvailableForCountry($obCountry) : bool - { - $arCountryIDList = (array) $this->country_id_list; - - $bResult = !empty($arCountryIDList) && !empty($obCountry) && in_array($obCountry->id, $arCountryIDList); - - return $bResult; - } - - /** - * Check tax is available for state - * @param \RainLab\Location\Models\State $obState - * @return bool - */ - public function isAvailableForState($obState) : bool - { - $arStateIDList = (array) $this->state_id_list; - - $bResult = !empty($arStateIDList) && !empty($obState) && in_array($obState->id, $arStateIDList); - - return $bResult; - } - - /** - * Set model data from object - * @return mixed - */ - protected function getElementData() - { - $arResult = [ - 'category_id_list' => $this->obElement->category()->lists('id'), - 'product_id_list' => $this->obElement->product()->lists('id'), - ]; - - if (PluginManager::instance()->hasPlugin('RainLab.Location')) { - $arResult['country_id_list'] = $this->obElement->country()->lists('id'); - $arResult['state_id_list'] = $this->obElement->state()->lists('id'); - } - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/BrandListStore.php b/plugins/lovata/shopaholic/classes/store/BrandListStore.php deleted file mode 100644 index ba3fdd524..000000000 --- a/plugins/lovata/shopaholic/classes/store/BrandListStore.php +++ /dev/null @@ -1,30 +0,0 @@ -addToStoreList('sorting', SortingListStore::class); - $this->addToStoreList('category', ListByCategoryStore::class); - $this->addToStoreList('active', ActiveListStore::class); - } -} diff --git a/plugins/lovata/shopaholic/classes/store/CategoryListStore.php b/plugins/lovata/shopaholic/classes/store/CategoryListStore.php deleted file mode 100644 index bb26aa47c..000000000 --- a/plugins/lovata/shopaholic/classes/store/CategoryListStore.php +++ /dev/null @@ -1,28 +0,0 @@ -addToStoreList('top_level', TopLevelListStore::class); - $this->addToStoreList('active', ActiveListStore::class); - } -} diff --git a/plugins/lovata/shopaholic/classes/store/CurrencyListStore.php b/plugins/lovata/shopaholic/classes/store/CurrencyListStore.php deleted file mode 100644 index 3496db850..000000000 --- a/plugins/lovata/shopaholic/classes/store/CurrencyListStore.php +++ /dev/null @@ -1,27 +0,0 @@ -addToStoreList('active', ActiveListStore::class); - $this->addToStoreList('sorting', SortingListStore::class); - } -} diff --git a/plugins/lovata/shopaholic/classes/store/OfferListStore.php b/plugins/lovata/shopaholic/classes/store/OfferListStore.php deleted file mode 100644 index 009c134b2..000000000 --- a/plugins/lovata/shopaholic/classes/store/OfferListStore.php +++ /dev/null @@ -1,33 +0,0 @@ -addToStoreList('sorting', SortingListStore::class); - $this->addToStoreList('active', ActiveListStore::class); - } -} diff --git a/plugins/lovata/shopaholic/classes/store/ProductListStore.php b/plugins/lovata/shopaholic/classes/store/ProductListStore.php deleted file mode 100644 index ba4705a71..000000000 --- a/plugins/lovata/shopaholic/classes/store/ProductListStore.php +++ /dev/null @@ -1,45 +0,0 @@ -addToStoreList('sorting', SortingListStore::class); - $this->addToStoreList('category', ListByCategoryStore::class); - $this->addToStoreList('brand', ListByBrandStore::class); - $this->addToStoreList('active', ActiveListStore::class); - $this->addToStoreList('promo_block', ListByPromoBlockStore::class); - } -} diff --git a/plugins/lovata/shopaholic/classes/store/PromoBlockListStore.php b/plugins/lovata/shopaholic/classes/store/PromoBlockListStore.php deleted file mode 100644 index 14f40c479..000000000 --- a/plugins/lovata/shopaholic/classes/store/PromoBlockListStore.php +++ /dev/null @@ -1,39 +0,0 @@ -addToStoreList('active', ActiveListStore::class); - $this->addToStoreList('sorting', SortingListStore::class); - $this->addToStoreList('hidden', HiddenListStore::class); - $this->addToStoreList('not_hidden', NotHiddenListStore::class); - } -} diff --git a/plugins/lovata/shopaholic/classes/store/TaxListStore.php b/plugins/lovata/shopaholic/classes/store/TaxListStore.php deleted file mode 100644 index 6d61ee3d6..000000000 --- a/plugins/lovata/shopaholic/classes/store/TaxListStore.php +++ /dev/null @@ -1,27 +0,0 @@ -addToStoreList('active', ActiveListStore::class); - $this->addToStoreList('sorting', SortingListStore::class); - } -} diff --git a/plugins/lovata/shopaholic/classes/store/brand/ActiveListStore.php b/plugins/lovata/shopaholic/classes/store/brand/ActiveListStore.php deleted file mode 100644 index e06ebf721..000000000 --- a/plugins/lovata/shopaholic/classes/store/brand/ActiveListStore.php +++ /dev/null @@ -1,26 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/brand/ListByCategoryStore.php b/plugins/lovata/shopaholic/classes/store/brand/ListByCategoryStore.php deleted file mode 100644 index 0f9ff44c5..000000000 --- a/plugins/lovata/shopaholic/classes/store/brand/ListByCategoryStore.php +++ /dev/null @@ -1,67 +0,0 @@ -sValue) - ->where('brand_id', '>', 0) - ->lists('brand_id', 'id'); - - $obCategory = Category::find($this->sValue); - if (!empty($obCategory)) { - $arAdditionalElementIDList = (array) $obCategory->product_link() - ->where('brand_id', '>', 0) - ->lists('brand_id', 'id'); - - $arElementIDList = $arElementIDList + $arAdditionalElementIDList; - } - - return $arElementIDList; - } - - /** - * Get ID list from cache - * @return array - */ - protected function getIDListFromCache() : array - { - $arElementIDList = parent::getIDListFromCache(); - - //Get active product list - $arActiveProductIDList = ProductListStore::instance()->active->get(); - if (empty($arActiveProductIDList) || empty($arElementIDList)) { - return []; - } - - $arResult = []; - foreach ($arElementIDList as $iProductID => $iBrandID) { - if (!in_array($iProductID, $arActiveProductIDList)) { - continue; - } - - $arResult[] = $iBrandID; - } - - $arResult = array_unique($arResult); - - return $arResult; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/brand/SortingListStore.php b/plugins/lovata/shopaholic/classes/store/brand/SortingListStore.php deleted file mode 100644 index 159a1f24c..000000000 --- a/plugins/lovata/shopaholic/classes/store/brand/SortingListStore.php +++ /dev/null @@ -1,26 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/category/ActiveListStore.php b/plugins/lovata/shopaholic/classes/store/category/ActiveListStore.php deleted file mode 100644 index c369261da..000000000 --- a/plugins/lovata/shopaholic/classes/store/category/ActiveListStore.php +++ /dev/null @@ -1,26 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/category/TopLevelListStore.php b/plugins/lovata/shopaholic/classes/store/category/TopLevelListStore.php deleted file mode 100644 index ee9c46c0f..000000000 --- a/plugins/lovata/shopaholic/classes/store/category/TopLevelListStore.php +++ /dev/null @@ -1,29 +0,0 @@ -where('nest_depth', 0) - ->orderBy('nest_left', 'asc') - ->lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/currency/ActiveListStore.php b/plugins/lovata/shopaholic/classes/store/currency/ActiveListStore.php deleted file mode 100644 index d0ccf40f8..000000000 --- a/plugins/lovata/shopaholic/classes/store/currency/ActiveListStore.php +++ /dev/null @@ -1,26 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/currency/SortingListStore.php b/plugins/lovata/shopaholic/classes/store/currency/SortingListStore.php deleted file mode 100644 index f29eef267..000000000 --- a/plugins/lovata/shopaholic/classes/store/currency/SortingListStore.php +++ /dev/null @@ -1,26 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/offer/ActiveListStore.php b/plugins/lovata/shopaholic/classes/store/offer/ActiveListStore.php deleted file mode 100644 index d0a74606c..000000000 --- a/plugins/lovata/shopaholic/classes/store/offer/ActiveListStore.php +++ /dev/null @@ -1,26 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/offer/SortingListStore.php b/plugins/lovata/shopaholic/classes/store/offer/SortingListStore.php deleted file mode 100644 index e5de58d24..000000000 --- a/plugins/lovata/shopaholic/classes/store/offer/SortingListStore.php +++ /dev/null @@ -1,181 +0,0 @@ -sValue == OfferListStore::SORT_PRICE_ASC) { - $arElementIDList = $this->getByPriceASC(); - } elseif ($this->sValue == OfferListStore::SORT_PRICE_DESC) { - $arElementIDList = $this->getByPriceDESC(); - } elseif ($this->sValue == OfferListStore::SORT_NEW) { - $arElementIDList = $this->getNewOfferList(); - } elseif ($this->sValue == OfferListStore::SORT_NO) { - $arElementIDList = $this->getOfferList(); - } elseif (preg_match('%^'.OfferListStore::SORT_PRICE_ASC.'\|.+%', $this->sValue)) { - $arElementIDList = $this->getByPriceTypeASC(); - } elseif (preg_match('%^'.OfferListStore::SORT_PRICE_DESC.'\|.+%', $this->sValue)) { - $arElementIDList = $this->getByPriceTypeDESC(); - } else { - $arElementIDList = $this->getCustomSortingList(); - } - - return $arElementIDList; - } - - /** - * Get product list with custom sorting - * @return array - */ - protected function getCustomSortingList() : array - { - $arEventResult = Event::fire('shopaholic.sorting.offer.get.list', [$this->sValue]); - if (empty($arEventResult)) { - return []; - } - - $arElementIDList = []; - foreach ($arEventResult as $arEventOfferIDList) { - if (empty($arEventOfferIDList) || !is_array($arEventOfferIDList)) { - continue; - } - - $arElementIDList = $arEventOfferIDList; - break; - } - - return $arElementIDList; - } - - /** - * Get sorting ID list by offer price (ASC) - * @return array - */ - protected function getByPriceASC() : array - { - $arElementIDList = (array) DB::table('lovata_shopaholic_prices') - ->select('lovata_shopaholic_offers.id') - ->whereNull('lovata_shopaholic_prices.price_type_id') - ->where('lovata_shopaholic_offers.active', true) - ->whereNull('lovata_shopaholic_offers.deleted_at') - ->where('lovata_shopaholic_prices.item_type', Offer::class) - ->orderBy('lovata_shopaholic_prices.price', 'asc') - ->join('lovata_shopaholic_offers', 'lovata_shopaholic_offers.id', '=', 'lovata_shopaholic_prices.item_id') - ->lists('id'); - - return $arElementIDList; - } - - /** - * Get sorting ID list by offer price (DESC) - * @return array - */ - protected function getByPriceDESC() : array - { - $arElementIDList = (array) DB::table('lovata_shopaholic_prices') - ->select('lovata_shopaholic_offers.id') - ->whereNull('lovata_shopaholic_prices.price_type_id') - ->where('lovata_shopaholic_offers.active', true) - ->whereNull('lovata_shopaholic_offers.deleted_at') - ->where('lovata_shopaholic_prices.item_type', Offer::class) - ->orderBy('lovata_shopaholic_prices.price', 'desc') - ->join('lovata_shopaholic_offers', 'lovata_shopaholic_offers.id', '=', 'lovata_shopaholic_prices.item_id') - ->lists('id'); - - return $arElementIDList; - } - - /** - * Get sorting ID list by offer price (ASC) - * @return array - */ - protected function getByPriceTypeASC() : array - { - $obPriceType = $this->getPriceTypeObject(); - if (empty($obPriceType)) { - return $this->getByPriceASC(); - } - - $arElementIDList = (array) Price::getByItemType(Offer::class) - ->getByPriceType($obPriceType->id) - ->orderBy('price', 'asc') - ->lists('item_id'); - - return $arElementIDList; - } - - /** - * Get sorting ID list by offer price (DESC) - * @return array - */ - protected function getByPriceTypeDESC() : array - { - $obPriceType = $this->getPriceTypeObject(); - if (empty($obPriceType)) { - return $this->getByPriceDESC(); - } - - $arElementIDList = (array) Price::getByItemType(Offer::class) - ->getByPriceType($obPriceType->id) - ->orderBy('price', 'desc') - ->lists('item_id'); - - return $arElementIDList; - } - - /** - * Get new products - * @return array - */ - protected function getNewOfferList() : array - { - $arElementIDList = (array) Offer::orderBy('id', 'desc')->lists('id'); - - return $arElementIDList; - } - - /** - * Get new products - * @return array - */ - protected function getOfferList() : array - { - $arElementIDList = (array) Offer::lists('id'); - - return $arElementIDList; - } - - /** - * Get price type object - * @return \Lovata\Shopaholic\Models\PriceType - */ - protected function getPriceTypeObject() - { - $arValuePartList = explode('|', $this->sValue); - $sPriceTypeCode = array_pop($arValuePartList); - - $obPriceType = PriceTypeHelper::instance()->findByCode($sPriceTypeCode); - - return $obPriceType; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/product/ActiveListStore.php b/plugins/lovata/shopaholic/classes/store/product/ActiveListStore.php deleted file mode 100644 index 581893d2a..000000000 --- a/plugins/lovata/shopaholic/classes/store/product/ActiveListStore.php +++ /dev/null @@ -1,43 +0,0 @@ -lists('id'); - if (empty($arProductIDList)) { - return []; - } - - //Check active offers - if (Settings::getValue('check_offer_active')) { - //Get product list with active offers - $arProductIDListWithOffers = (array) Offer::active()->groupBy('product_id')->lists('product_id'); - if (empty($arProductIDListWithOffers)) { - return []; - } - - $arProductIDList = array_intersect($arProductIDList, $arProductIDListWithOffers); - } - - return $arProductIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/product/ListByBrandStore.php b/plugins/lovata/shopaholic/classes/store/product/ListByBrandStore.php deleted file mode 100644 index 6e1047a6e..000000000 --- a/plugins/lovata/shopaholic/classes/store/product/ListByBrandStore.php +++ /dev/null @@ -1,26 +0,0 @@ -sValue)->lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/product/ListByCategoryStore.php b/plugins/lovata/shopaholic/classes/store/product/ListByCategoryStore.php deleted file mode 100644 index 4a61989e4..000000000 --- a/plugins/lovata/shopaholic/classes/store/product/ListByCategoryStore.php +++ /dev/null @@ -1,44 +0,0 @@ -sValue)->lists('id'); - - //Get product ID list for additional category relation - $arAdditionalElementIDList = (array) DB::table('lovata_shopaholic_additional_categories')->where('category_id', $this->sValue)->lists('product_id'); - $arElementIDList = array_merge($arElementIDList, $arAdditionalElementIDList); - $arElementIDList = array_unique($arElementIDList); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/product/ListByPromoBlockStore.php b/plugins/lovata/shopaholic/classes/store/product/ListByPromoBlockStore.php deleted file mode 100644 index f82bf8efb..000000000 --- a/plugins/lovata/shopaholic/classes/store/product/ListByPromoBlockStore.php +++ /dev/null @@ -1,25 +0,0 @@ -where('promo_id', $this->sValue)->lists('product_id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/product/SortingListStore.php b/plugins/lovata/shopaholic/classes/store/product/SortingListStore.php deleted file mode 100644 index e42bae6d5..000000000 --- a/plugins/lovata/shopaholic/classes/store/product/SortingListStore.php +++ /dev/null @@ -1,201 +0,0 @@ -sValue == ProductListStore::SORT_PRICE_ASC) { - $arElementIDList = $this->getByPriceASC(); - } elseif ($this->sValue == ProductListStore::SORT_PRICE_DESC) { - $arElementIDList = $this->getByPriceDESC(); - } elseif ($this->sValue == ProductListStore::SORT_NEW) { - $arElementIDList = $this->getNewProductList(); - } elseif ($this->sValue == ProductListStore::SORT_NO) { - $arElementIDList = $this->getProductList(); - } elseif (preg_match('%^'.ProductListStore::SORT_PRICE_ASC.'\|.+%', $this->sValue)) { - $arElementIDList = $this->getByPriceTypeASC(); - } elseif (preg_match('%^'.ProductListStore::SORT_PRICE_DESC.'\|.+%', $this->sValue)) { - $arElementIDList = $this->getByPriceTypeDESC(); - } else { - $arElementIDList = $this->getCustomSortingList(); - } - - return $arElementIDList; - } - - /** - * Get product list with custom sorting - * @return array - */ - protected function getCustomSortingList() : array - { - $arEventResult = Event::fire('shopaholic.sorting.get.list', [$this->sValue]); - if (empty($arEventResult)) { - return []; - } - - $arElementIDList = []; - foreach ($arEventResult as $arEventProductIDList) { - if (empty($arEventProductIDList) || !is_array($arEventProductIDList)) { - continue; - } - - $arElementIDList = $arEventProductIDList; - break; - } - - return $arElementIDList; - } - - /** - * Get sorting ID list by offer price (ASC) - * @return array - */ - protected function getByPriceASC() : array - { - //Get product ID list (sort by offer price) - //We can not use groupBy() in this place - $arElementIDList = (array) DB::table('lovata_shopaholic_prices') - ->select('lovata_shopaholic_offers.product_id') - ->whereNull('lovata_shopaholic_prices.price_type_id') - ->where('lovata_shopaholic_offers.active', true) - ->whereNull('lovata_shopaholic_offers.deleted_at') - ->where('lovata_shopaholic_prices.item_type', Offer::class) - ->orderBy('lovata_shopaholic_prices.price', 'asc') - ->join('lovata_shopaholic_offers', 'lovata_shopaholic_offers.id', '=', 'lovata_shopaholic_prices.item_id') - ->lists('product_id'); - $arElementIDList = array_unique($arElementIDList); - - return $arElementIDList; - } - - /** - * Get sorting ID list by offer price (DESC) - * @return array - */ - protected function getByPriceDESC() : array - { - //Get product ID list (sort by offer price) - //We can not use groupBy() in this place - $arElementIDList = (array) DB::table('lovata_shopaholic_prices') - ->select('lovata_shopaholic_offers.product_id') - ->whereNull('lovata_shopaholic_prices.price_type_id') - ->where('lovata_shopaholic_offers.active', true) - ->whereNull('lovata_shopaholic_offers.deleted_at') - ->where('lovata_shopaholic_prices.item_type', Offer::class) - ->orderBy('lovata_shopaholic_prices.price', 'desc') - ->join('lovata_shopaholic_offers', 'lovata_shopaholic_offers.id', '=', 'lovata_shopaholic_prices.item_id') - ->lists('product_id'); - $arElementIDList = array_unique($arElementIDList); - - return $arElementIDList; - } - - /** - * Get sorting ID list by offer price with filter by price type (ASC) - * @return array - */ - protected function getByPriceTypeASC() : array - { - $obPriceType = $this->getPriceTypeObject(); - if (empty($obPriceType)) { - return $this->getByPriceASC(); - } - - //Get product ID list (sort by offer price) - //We can not use groupBy() in this place - $arElementIDList = (array) DB::table('lovata_shopaholic_prices') - ->select('lovata_shopaholic_offers.product_id') - ->where('lovata_shopaholic_prices.price_type_id', $obPriceType->id) - ->where('lovata_shopaholic_offers.active', true) - ->where('lovata_shopaholic_prices.item_type', Offer::class) - ->orderBy('lovata_shopaholic_prices.price', 'asc') - ->join('lovata_shopaholic_offers', 'lovata_shopaholic_offers.id', '=', 'lovata_shopaholic_prices.item_id') - ->lists('product_id'); - $arElementIDList = array_unique($arElementIDList); - - return $arElementIDList; - } - - /** - * Get sorting ID list by offer price with filter by price type (DESC) - * @return array - */ - protected function getByPriceTypeDESC() : array - { - $obPriceType = $this->getPriceTypeObject(); - if (empty($obPriceType)) { - return $this->getByPriceDESC(); - } - - //Get product ID list (sort by offer price) - //We can not use groupBy() in this place - $arElementIDList = (array) DB::table('lovata_shopaholic_prices') - ->select('lovata_shopaholic_offers.product_id') - ->where('lovata_shopaholic_prices.price_type_id', $obPriceType->id) - ->where('lovata_shopaholic_offers.active', true) - ->where('lovata_shopaholic_prices.item_type', Offer::class) - ->orderBy('lovata_shopaholic_prices.price', 'desc') - ->join('lovata_shopaholic_offers', 'lovata_shopaholic_offers.id', '=', 'lovata_shopaholic_prices.item_id') - ->lists('product_id'); - $arElementIDList = array_unique($arElementIDList); - - return $arElementIDList; - } - - /** - * Get new products - * @return array - */ - protected function getNewProductList() : array - { - $arElementIDList = (array) Product::orderBy('id', 'desc')->lists('id'); - - return $arElementIDList; - } - - /** - * Get new products - * @return array - */ - protected function getProductList() : array - { - $arElementIDList = (array) Product::lists('id'); - - return $arElementIDList; - } - - /** - * Get price type object - * @return \Lovata\Shopaholic\Models\PriceType - */ - protected function getPriceTypeObject() - { - $arValuePartList = explode('|', $this->sValue); - $sPriceTypeCode = array_pop($arValuePartList); - - $obPriceType = PriceTypeHelper::instance()->findByCode($sPriceTypeCode); - - return $obPriceType; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/promoblock/ActiveListStore.php b/plugins/lovata/shopaholic/classes/store/promoblock/ActiveListStore.php deleted file mode 100644 index 48e9fca03..000000000 --- a/plugins/lovata/shopaholic/classes/store/promoblock/ActiveListStore.php +++ /dev/null @@ -1,36 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/promoblock/HiddenListStore.php b/plugins/lovata/shopaholic/classes/store/promoblock/HiddenListStore.php deleted file mode 100644 index 2fba4f2f2..000000000 --- a/plugins/lovata/shopaholic/classes/store/promoblock/HiddenListStore.php +++ /dev/null @@ -1,35 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/promoblock/NotHiddenListStore.php b/plugins/lovata/shopaholic/classes/store/promoblock/NotHiddenListStore.php deleted file mode 100644 index 3bc0782a1..000000000 --- a/plugins/lovata/shopaholic/classes/store/promoblock/NotHiddenListStore.php +++ /dev/null @@ -1,35 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/promoblock/SortingListStore.php b/plugins/lovata/shopaholic/classes/store/promoblock/SortingListStore.php deleted file mode 100644 index 82857c64b..000000000 --- a/plugins/lovata/shopaholic/classes/store/promoblock/SortingListStore.php +++ /dev/null @@ -1,161 +0,0 @@ -sValue) { - case PromoBlockListStore::SORT_DATE_BEGIN_ASC: - $arElementIDList = $this->getByDateBeginASC(); - break; - case PromoBlockListStore::SORT_DATE_BEGIN_DESC: - $arElementIDList = $this->getByDateBeginDESC(); - break; - case PromoBlockListStore::SORT_DATE_END_ASC: - $arElementIDList = $this->getByDateEndASC(); - break; - case PromoBlockListStore::SORT_DATE_END_DESC: - $arElementIDList = $this->getByDateEndDESC(); - break; - case PromoBlockListStore::SORT_DEFAULT: - $arElementIDList = $this->getBySortOrder(); - break; - default: - $arElementIDList = $this->getCustomSortingList(); - break; - } - - return $arElementIDList; - } - - /** - * Get element list with custom sorting - * @return array - */ - protected function getCustomSortingList() : array - { - $arEventResult = Event::fire('shopaholic.promo_block.sorting.get.list', [$this->sValue]); - if (empty($arEventResult)) { - return []; - } - - $arElementIDList = []; - foreach ($arEventResult as $arEventPromoBlockIDList) { - if (empty($arEventPromoBlockIDList) || !is_array($arEventPromoBlockIDList)) { - continue; - } - - $arElementIDList = $arEventPromoBlockIDList; - break; - } - - return $arElementIDList; - } - - /** - * Get discount list with sorting by "date_begin" (asc) - * @return array - */ - protected function getByDateBeginASC() : array - { - $arElementIDList = (array) PromoBlock::orderBy('date_begin', 'asc')->lists('id'); - - return $arElementIDList; - } - - /** - * Get discount list with sorting by "date_begin" (desc) - * @return array - */ - protected function getByDateBeginDESC() : array - { - $arElementIDList = (array) PromoBlock::orderBy('date_begin', 'desc')->lists('id'); - - return $arElementIDList; - } - - /** - * Get discount list with sorting by "date_end" (asc) - * @return array - */ - protected function getByDateEndASC() : array - { - $arElementIDList = (array) PromoBlock::orderBy('date_end', 'asc')->lists('id'); - - return $arElementIDList; - } - - /** - * Get discount list with sorting by "date_end" (desc) - * @return array - */ - protected function getByDateEndDESC() : array - { - $arElementIDList = (array) PromoBlock::orderBy('date_end', 'desc')->lists('id'); - - return $arElementIDList; - } - - /** - * Get discount list with sorting by "sort_order" (asc) - * @return array - */ - protected function getBySortOrder() :array - { - $arElementIDList = (array) PromoBlock::orderBy('sort_order', 'asc')->lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/tax/ActiveListStore.php b/plugins/lovata/shopaholic/classes/store/tax/ActiveListStore.php deleted file mode 100644 index 0a233a174..000000000 --- a/plugins/lovata/shopaholic/classes/store/tax/ActiveListStore.php +++ /dev/null @@ -1,26 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/classes/store/tax/SortingListStore.php b/plugins/lovata/shopaholic/classes/store/tax/SortingListStore.php deleted file mode 100644 index b180fecc0..000000000 --- a/plugins/lovata/shopaholic/classes/store/tax/SortingListStore.php +++ /dev/null @@ -1,26 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/shopaholic/components/BrandData.php b/plugins/lovata/shopaholic/components/BrandData.php deleted file mode 100644 index b2acb1da6..000000000 --- a/plugins/lovata/shopaholic/components/BrandData.php +++ /dev/null @@ -1,34 +0,0 @@ - 'lovata.shopaholic::lang.component.brand_data_name', - 'description' => 'lovata.shopaholic::lang.component.brand_data_description', - ]; - } - - /** - * Make new element item - * @param int $iElementID - * @return BrandItem - */ - protected function makeItem($iElementID) - { - return BrandItem::make($iElementID); - } -} diff --git a/plugins/lovata/shopaholic/components/BrandList.php b/plugins/lovata/shopaholic/components/BrandList.php deleted file mode 100644 index bc03ac52b..000000000 --- a/plugins/lovata/shopaholic/components/BrandList.php +++ /dev/null @@ -1,44 +0,0 @@ - 'lovata.shopaholic::lang.component.brand_list_name', - 'description' => 'lovata.shopaholic::lang.component.brand_list_description', - ]; - } - - /** - * Make element collection - * @param array $arElementIDList - * - * @return BrandCollection - */ - public function make($arElementIDList = null) - { - return BrandCollection::make($arElementIDList); - } - - /** - * Method for ajax request with empty response - * @deprecated - * @return bool - */ - public function onAjaxRequest() - { - return true; - } -} diff --git a/plugins/lovata/shopaholic/components/BrandPage.php b/plugins/lovata/shopaholic/components/BrandPage.php deleted file mode 100644 index c73ec92dc..000000000 --- a/plugins/lovata/shopaholic/components/BrandPage.php +++ /dev/null @@ -1,71 +0,0 @@ - 'lovata.shopaholic::lang.component.brand_page_name', - 'description' => 'lovata.shopaholic::lang.component.brand_page_description', - ]; - } - - /** - * Get element object - * @param string $sElementSlug - * @return Brand - */ - protected function getElementObject($sElementSlug) - { - if (empty($sElementSlug)) { - return null; - } - - if ($this->isSlugTranslatable()) { - $obElement = Brand::active()->transWhere('slug', $sElementSlug)->first(); - if (!$this->checkTransSlug($obElement, $sElementSlug)) { - $obElement = null; - } - } else { - $obElement = Brand::active()->getBySlug($sElementSlug)->first(); - } - if (!empty($obElement)) { - Event::fire('shopaholic.brand.open', [$obElement]); - } - - return $obElement; - } - - /** - * Make new element item - * @param int $iElementID - * @param Brand $obElement - * @return BrandItem - */ - protected function makeItem($iElementID, $obElement) - { - return BrandItem::make($iElementID, $obElement); - } -} diff --git a/plugins/lovata/shopaholic/components/Breadcrumbs.php b/plugins/lovata/shopaholic/components/Breadcrumbs.php deleted file mode 100644 index edf1bd625..000000000 --- a/plugins/lovata/shopaholic/components/Breadcrumbs.php +++ /dev/null @@ -1,135 +0,0 @@ - 'lovata.shopaholic::lang.component.breadcrumbs_name', - 'description' => 'lovata.shopaholic::lang.component.breadcrumbs_description', - ]; - } - - /** - * Get breadcrumbs for category page by category id - * @param int $iCategoryID - * @return array - */ - public function getByCategoryID($iCategoryID) - { - if (empty($iCategoryID)) { - return []; - } - - //Get category data - $this->addCategoryData($iCategoryID, true); - $this->arResult = array_reverse($this->arResult); - - return $this->arResult; - } - - /** - * Get breadcrumbs for tag page by tag ID - * @param int $iTagID - * @return array - */ - public function getByTagID($iTagID) - { - //Get tag element - if (!PluginManager::instance()->hasPlugin('Lovata.TagsShopaholic') || empty($iTagID)) { - return $this->arResult; - } - - $obTagItem = \Lovata\TagsShopaholic\Classes\Item\TagItem::make($iTagID); - if ($obTagItem->isEmpty()) { - return $this->arResult; - } - - $arTagData = $obTagItem->toArray(); - $arTagData['active'] = true; - $arTagData['item'] = $obTagItem; - - $this->arResult[] = $arTagData; - - //Get category data - $this->addCategoryData($obTagItem->category_id); - $this->arResult = array_reverse($this->arResult); - - return $this->arResult; - } - - /** - * Get breadcrumbs by product ID - * @param int $iProductID - * @return array - */ - public function getByProductID($iProductID) - { - if (empty($iProductID)) { - return $this->arResult; - } - - //Get product data - $obProductItem = ProductItem::make($iProductID); - if ($obProductItem->isEmpty()) { - return $this->arResult; - } - - //Add product data to list - $this->arResult[] = [ - 'id' => $obProductItem->id, - 'name' => $obProductItem->name, - 'slug' => $obProductItem->slug, - 'active' => true, - 'item' => $obProductItem, - ]; - - //Get category data - $this->addCategoryData($obProductItem->category_id); - $this->arResult = array_reverse($this->arResult); - - return $this->arResult; - } - - /** - * Add category data - * @param int $iCategoryID - * @param bool $bActiveCategory - */ - protected function addCategoryData($iCategoryID, $bActiveCategory = false) - { - $obCategoryItem = CategoryItem::make($iCategoryID); - if ($obCategoryItem->isEmpty()) { - return; - } - - $this->arResult[] = [ - 'id' => $obCategoryItem->id, - 'name' => $obCategoryItem->name, - 'slug' => $obCategoryItem->slug, - 'active' => $bActiveCategory, - 'item' => $obCategoryItem, - ]; - - if (!empty($obCategoryItem->parent_id)) { - $this->addCategoryData($obCategoryItem->parent_id); - } - } -} diff --git a/plugins/lovata/shopaholic/components/CategoryData.php b/plugins/lovata/shopaholic/components/CategoryData.php deleted file mode 100644 index a2e75e821..000000000 --- a/plugins/lovata/shopaholic/components/CategoryData.php +++ /dev/null @@ -1,34 +0,0 @@ - 'lovata.shopaholic::lang.component.category_data_name', - 'description' => 'lovata.shopaholic::lang.component.category_data_description', - ]; - } - - /** - * Make new element item - * @param int $iElementID - * @return CategoryItem - */ - protected function makeItem($iElementID) - { - return CategoryItem::make($iElementID); - } -} diff --git a/plugins/lovata/shopaholic/components/CategoryList.php b/plugins/lovata/shopaholic/components/CategoryList.php deleted file mode 100644 index 5244be889..000000000 --- a/plugins/lovata/shopaholic/components/CategoryList.php +++ /dev/null @@ -1,44 +0,0 @@ - 'lovata.shopaholic::lang.component.category_list_name', - 'description' => 'lovata.shopaholic::lang.component.category_list_description', - ]; - } - - /** - * Make element collection - * @param array $arElementIDList - * - * @return CategoryCollection - */ - public function make($arElementIDList = null) - { - return CategoryCollection::make($arElementIDList); - } - - /** - * Method for ajax request with empty response - * @deprecated - * @return bool - */ - public function onAjaxRequest() - { - return true; - } -} diff --git a/plugins/lovata/shopaholic/components/CategoryPage.php b/plugins/lovata/shopaholic/components/CategoryPage.php deleted file mode 100644 index 37690fe03..000000000 --- a/plugins/lovata/shopaholic/components/CategoryPage.php +++ /dev/null @@ -1,150 +0,0 @@ - 'lovata.shopaholic::lang.component.category_page_name', - 'description' => 'lovata.shopaholic::lang.component.category_page_description', - ]; - } - - /** - * Get element object - * @param string $sElementSlug - * @return Category - */ - protected function getElementObject($sElementSlug) - { - if (empty($sElementSlug)) { - return null; - } - - if (!$this->property('has_wildcard')) { - $obElement = $this->getElementBySlug($sElementSlug); - } else { - $obElement = $this->getElementByWildcard($sElementSlug); - } - - if (!empty($obElement)) { - Event::fire('shopaholic.category.open', [$obElement]); - } - - return $obElement; - } - - /** - * Get category by default - * @param string $sElementSlug - * @return Category|null - */ - protected function getElementBySlug($sElementSlug) - { - if ($this->isSlugTranslatable()) { - $obElement = Category::active()->transWhere('slug', $sElementSlug)->first(); - if (!$this->checkTransSlug($obElement, $sElementSlug)) { - $obElement = null; - } - } else { - $obElement = Category::active()->getBySlug($sElementSlug)->first(); - } - - return $obElement; - } - - /** - * Get category by wildcard - * @param string $sElementSlug - * @return Category|null - */ - protected function getElementByWildcard($sElementSlug) - { - $arSlugList = explode('/', $sElementSlug); - if (empty($arSlugList)) { - return null; - } - - $arSlugList = array_reverse($arSlugList); - $sElementSlug = array_shift($arSlugList); - - $obElement = $this->getElementBySlug($sElementSlug); - if (empty($obElement)) { - return null; - } - - if (empty($arSlugList) && empty($obElement->parent)) { - return $obElement; - } - - $obNestingElement = $obElement; - - foreach ($arSlugList as $sSlug) { - $obNestingElement = $this->getNestingElement($sSlug, $obNestingElement); - if (empty($obNestingElement)) { - return null; - } - } - - if (!empty($obNestingElement->parent)) { - return null; - } - - return $obElement; - } - - /** - * Get nesting element - * @param string $sElementSlug - * @param Category $obNestingElement - * @return Category - */ - protected function getNestingElement($sElementSlug, $obNestingElement) - { - if (empty($obNestingElement) || empty($sElementSlug)) { - return null; - } - - $obElement = $obNestingElement->parent; - - if (empty($obElement) || $obElement->slug != $sElementSlug) { - return null; - } - - return $obElement; - } - - /** - * Make new element item - * @param int $iElementID - * @param Category $obElement - * @return CategoryItem - */ - protected function makeItem($iElementID, $obElement) - { - return CategoryItem::make($iElementID, $obElement); - } -} diff --git a/plugins/lovata/shopaholic/components/CurrencyList.php b/plugins/lovata/shopaholic/components/CurrencyList.php deleted file mode 100644 index ffd30707d..000000000 --- a/plugins/lovata/shopaholic/components/CurrencyList.php +++ /dev/null @@ -1,65 +0,0 @@ - 'lovata.shopaholic::lang.component.currency_list_name', - 'description' => 'lovata.shopaholic::lang.component.currency_list_description', - ]; - } - - /** - * Make element collection - * @param array $arElementIDList - * - * @return CurrencyCollection - */ - public function make($arElementIDList = null) - { - return CurrencyCollection::make($arElementIDList); - } - - /** - * Axax request, switch active currency - */ - public function onSwitch() - { - $sActiveCurrency = Input::get('currency'); - - $this->switch($sActiveCurrency); - } - - /** - * switch active currency - * @param string $sCurrencyCode - */ - public function switch($sCurrencyCode = null) - { - CurrencyHelper::instance()->switchActive($sCurrencyCode); - } - - /** - * Method for ajax request with empty response - * @deprecated - * @return bool - */ - public function onAjaxRequest() - { - return true; - } -} diff --git a/plugins/lovata/shopaholic/components/ProductData.php b/plugins/lovata/shopaholic/components/ProductData.php deleted file mode 100644 index 5e3f8084d..000000000 --- a/plugins/lovata/shopaholic/components/ProductData.php +++ /dev/null @@ -1,47 +0,0 @@ - 'lovata.shopaholic::lang.component.product_data_name', - 'description' => 'lovata.shopaholic::lang.component.product_data_description', - ]; - } - - /** - * Make new element item - * @param int $iElementID - * @return ProductItem - */ - protected function makeItem($iElementID) - { - return ProductItem::make($iElementID); - } -} diff --git a/plugins/lovata/shopaholic/components/ProductList.php b/plugins/lovata/shopaholic/components/ProductList.php deleted file mode 100644 index 968a715aa..000000000 --- a/plugins/lovata/shopaholic/components/ProductList.php +++ /dev/null @@ -1,99 +0,0 @@ - 'lovata.shopaholic::lang.component.product_list_name', - 'description' => 'lovata.shopaholic::lang.component.product_list_description', - ]; - } - - /** - * @return array - */ - public function defineProperties() - { - $this->arPropertyList = [ - 'sorting' => [ - 'title' => 'lovata.shopaholic::lang.component.product_list_sorting', - 'type' => 'dropdown', - 'default' => ProductListStore::SORT_NO, - 'options' => [ - ProductListStore::SORT_NO => Lang::get('lovata.shopaholic::lang.component.sorting_no'), - ProductListStore::SORT_PRICE_ASC => Lang::get('lovata.shopaholic::lang.component.sorting_price_asc'), - ProductListStore::SORT_PRICE_DESC => Lang::get('lovata.shopaholic::lang.component.sorting_price_desc'), - ProductListStore::SORT_NEW => Lang::get('lovata.shopaholic::lang.component.sorting_new'), - ], - ], - ]; - - if (PluginManager::instance()->hasPlugin('Lovata.PopularityShopaholic')) { - $this->arPropertyList['sorting']['options'][ProductListStore::SORT_POPULARITY_DESC] = - Lang::get('lovata.shopaholic::lang.component.sorting_popularity_desc'); - } - - if (PluginManager::instance()->hasPlugin('Lovata.ReviewsShopaholic')) { - $this->arPropertyList['sorting']['options'][ProductListStore::SORT_RATING_DESC] = - Lang::get('lovata.shopaholic::lang.component.sorting_rating_desc'); - $this->arPropertyList['sorting']['options'][ProductListStore::SORT_RATING_ASC] = - Lang::get('lovata.shopaholic::lang.component.sorting_rating_asc'); - } - - return $this->arPropertyList; - } - - /** - * Make element collection - * @param array $arElementIDList - * - * @return ProductCollection - */ - public function make($arElementIDList = null) - { - return ProductCollection::make($arElementIDList); - } - - /** - * Method for ajax request with empty response - * @deprecated - * @return bool - */ - public function onAjaxRequest() - { - return true; - } -} diff --git a/plugins/lovata/shopaholic/components/ProductPage.php b/plugins/lovata/shopaholic/components/ProductPage.php deleted file mode 100644 index 680c1ec83..000000000 --- a/plugins/lovata/shopaholic/components/ProductPage.php +++ /dev/null @@ -1,85 +0,0 @@ - 'lovata.shopaholic::lang.component.product_page_name', - 'description' => 'lovata.shopaholic::lang.component.product_page_description', - ]; - } - - /** - * Get element object - * @param string $sElementSlug - * @return Product - */ - protected function getElementObject($sElementSlug) - { - if (empty($sElementSlug)) { - return null; - } - - if ($this->isSlugTranslatable()) { - $obElement = Product::active()->transWhere('slug', $sElementSlug)->first(); - if (!$this->checkTransSlug($obElement, $sElementSlug)) { - $obElement = null; - } - } else { - $obElement = Product::active()->getBySlug($sElementSlug)->first(); - } - if (!empty($obElement)) { - Event::fire('shopaholic.product.open', [$obElement]); - } - - return $obElement; - } - - /** - * Make new element item - * @param int $iElementID - * @param Product $obElement - * @return ProductItem - */ - protected function makeItem($iElementID, $obElement) - { - return ProductItem::make($iElementID, $obElement); - } -} diff --git a/plugins/lovata/shopaholic/components/PromoBlockData.php b/plugins/lovata/shopaholic/components/PromoBlockData.php deleted file mode 100644 index 8e23db542..000000000 --- a/plugins/lovata/shopaholic/components/PromoBlockData.php +++ /dev/null @@ -1,34 +0,0 @@ - 'lovata.shopaholic::lang.component.promo_block_data_name', - 'description' => 'lovata.shopaholic::lang.component.promo_block_data_description', - ]; - } - - /** - * Make new element item - * @param int $iElementID - * @return PromoBlockItem - */ - protected function makeItem($iElementID) - { - return PromoBlockItem::make($iElementID); - } -} diff --git a/plugins/lovata/shopaholic/components/PromoBlockList.php b/plugins/lovata/shopaholic/components/PromoBlockList.php deleted file mode 100644 index 8e852a318..000000000 --- a/plugins/lovata/shopaholic/components/PromoBlockList.php +++ /dev/null @@ -1,73 +0,0 @@ - 'lovata.shopaholic::lang.component.promo_block_list_name', - 'description' => 'lovata.shopaholic::lang.component.promo_block_list_description', - ]; - } - - /** - * @return array - */ - public function defineProperties() - { - $this->arPropertyList = [ - 'sorting' => [ - 'title' => 'lovata.shopaholic::lang.component.product_list_sorting', - 'type' => 'dropdown', - 'default' => PromoBlockListStore::SORT_DEFAULT, - 'options' => [ - PromoBlockListStore::SORT_DEFAULT => Lang::get('lovata.shopaholic::lang.component.sorting_no'), - PromoBlockListStore::SORT_DATE_BEGIN_ASC => Lang::get('lovata.shopaholic::lang.component.sorting_date_begin_asc'), - PromoBlockListStore::SORT_DATE_BEGIN_DESC => Lang::get('lovata.shopaholic::lang.component.sorting_date_begin_desc'), - PromoBlockListStore::SORT_DATE_END_ASC => Lang::get('lovata.shopaholic::lang.component.sorting_date_end_asc'), - PromoBlockListStore::SORT_DATE_END_DESC => Lang::get('lovata.shopaholic::lang.component.sorting_date_end_desc'), - ], - ], - ]; - - return $this->arPropertyList; - } - - /** - * Make element collection - * @param array $arElementIDList - * - * @return PromoBlockCollection - */ - public function make($arElementIDList = null) - { - return PromoBlockCollection::make($arElementIDList); - } - - /** - * Method for ajax request with empty response - * @deprecated - * @return bool - */ - public function onAjaxRequest() - { - return true; - } -} diff --git a/plugins/lovata/shopaholic/components/PromoBlockPage.php b/plugins/lovata/shopaholic/components/PromoBlockPage.php deleted file mode 100644 index 7d58b0f18..000000000 --- a/plugins/lovata/shopaholic/components/PromoBlockPage.php +++ /dev/null @@ -1,72 +0,0 @@ - 'lovata.shopaholic::lang.component.promo_block_page_name', - 'description' => 'lovata.shopaholic::lang.component.promo_block_page_description', - ]; - } - - /** - * Get element object - * @param string $sElementSlug - * @return PromoBlock - */ - protected function getElementObject($sElementSlug) - { - if (empty($sElementSlug)) { - return null; - } - - if ($this->isSlugTranslatable()) { - $obElement = PromoBlock::active()->transWhere('slug', $sElementSlug)->first(); - if (!$this->checkTransSlug($obElement, $sElementSlug)) { - $obElement = null; - } - } else { - $obElement = PromoBlock::active()->getBySlug($sElementSlug)->first(); - } - - if (!empty($obElement)) { - Event::fire('shopaholic.promo_block.open', [$obElement]); - } - - return $obElement; - } - - /** - * Make new element item - * @param int $iElementID - * @param PromoBlock $obElement - * @return PromoBlockItem - */ - protected function makeItem($iElementID, $obElement) - { - return PromoBlockItem::make($iElementID, $obElement); - } -} diff --git a/plugins/lovata/shopaholic/composer.json b/plugins/lovata/shopaholic/composer.json deleted file mode 100644 index 639133f47..000000000 --- a/plugins/lovata/shopaholic/composer.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "name": "lovata/shopaholic-plugin", - "type": "october-plugin", - "description": "eCommerce plugin for October CMS", - "require": { - "composer/installers": "~1.0" - } -} diff --git a/plugins/lovata/shopaholic/controllers/Brands.php b/plugins/lovata/shopaholic/controllers/Brands.php deleted file mode 100644 index ec77bf766..000000000 --- a/plugins/lovata/shopaholic/controllers/Brands.php +++ /dev/null @@ -1,79 +0,0 @@ -rules['external_id'] = 'required'; - }); - } - - parent::__construct(); - BackendMenu::setContext('Lovata.Shopaholic', 'shopaholic-menu-main', 'shopaholic-menu-brands'); - } - - /** - * Ajax handler onReorder event - * - * @return mixed - */ - public function onReorder() - { - $obResult = parent::onReorder(); - Event::fire('shopaholic.brand.update.sorting'); - - return $obResult; - } - - /** - * Start import from XML - */ - public function onImportFromXML() - { - $obImport = new ImportBrandModelFromXML(); - $obImport->import(); - - $arReportData = [ - 'created' => $obImport->getCreatedCount(), - 'updated' => $obImport->getUpdatedCount(), - 'skipped' => $obImport->getSkippedCount(), - 'processed' => $obImport->getProcessedCount(), - ]; - - Flash::info(Lang::get('lovata.toolbox::lang.message.import_from_xml_report', $arReportData)); - - return $this->listRefresh(); - } -} diff --git a/plugins/lovata/shopaholic/controllers/Categories.php b/plugins/lovata/shopaholic/controllers/Categories.php deleted file mode 100644 index 86aaebc00..000000000 --- a/plugins/lovata/shopaholic/controllers/Categories.php +++ /dev/null @@ -1,81 +0,0 @@ -rules['external_id'] = 'required'; - }); - } - - parent::__construct(); - BackendMenu::setContext('Lovata.Shopaholic', 'shopaholic-menu-main', 'shopaholic-menu-categories'); - } - - /** - * Ajax handler onReorder event - * - * @return mixed - */ - public function onReorder() - { - $obResult = parent::onReorder(); - Event::fire('shopaholic.category.update.sorting'); - - return $obResult; - } - - /** - * Start import from XML - */ - public function onImportFromXML() - { - $obImport = new ImportCategoryModelFromXML(); - $obImport->import(); - - $arReportData = [ - 'created' => $obImport->getCreatedCount(), - 'updated' => $obImport->getUpdatedCount(), - 'skipped' => $obImport->getSkippedCount(), - 'processed' => $obImport->getProcessedCount(), - ]; - - Flash::info(Lang::get('lovata.toolbox::lang.message.import_from_xml_report', $arReportData)); - - return $this->listRefresh(); - } -} diff --git a/plugins/lovata/shopaholic/controllers/Currencies.php b/plugins/lovata/shopaholic/controllers/Currencies.php deleted file mode 100644 index 3c321b028..000000000 --- a/plugins/lovata/shopaholic/controllers/Currencies.php +++ /dev/null @@ -1,47 +0,0 @@ -disableActiveCurrency(); - - if (BackendController::$action == 'import') { - Offer::extend(function ($obModel) { - $obModel->rules['external_id'] = 'required'; - }); - } - - parent::__construct(); - BackendMenu::setContext('Lovata.Shopaholic', 'shopaholic-menu-main', 'shopaholic-menu-products'); - } -} diff --git a/plugins/lovata/shopaholic/controllers/PriceTypes.php b/plugins/lovata/shopaholic/controllers/PriceTypes.php deleted file mode 100644 index c0d19144f..000000000 --- a/plugins/lovata/shopaholic/controllers/PriceTypes.php +++ /dev/null @@ -1,47 +0,0 @@ -disableActiveCurrency(); - - if (BackendController::$action == 'import') { - Product::extend(function ($obModel) { - $obModel->rules['external_id'] = 'required'; - }); - } - - parent::__construct(); - BackendMenu::setContext('Lovata.Shopaholic', 'shopaholic-menu-main', 'shopaholic-menu-products'); - } - - /** - * Start import from XML - */ - public function onImportFromXML() - { - $obImport = new ImportProductModelFromXML(); - $obImport->import(); - - $arReportData = [ - 'created' => $obImport->getCreatedCount(), - 'updated' => $obImport->getUpdatedCount(), - 'skipped' => $obImport->getSkippedCount(), - 'processed' => $obImport->getProcessedCount(), - ]; - - Flash::info(Lang::get('lovata.toolbox::lang.message.import_from_xml_report', $arReportData)); - - return $this->listRefresh(); - } - - /** - * Start import from XML - */ - public function onImportOffersFromXML() - { - $obImport = new ImportOfferModelFromXML(); - $obImport->import(); - - $arReportData = [ - 'created' => $obImport->getCreatedCount(), - 'updated' => $obImport->getUpdatedCount(), - 'skipped' => $obImport->getSkippedCount(), - 'processed' => $obImport->getProcessedCount(), - ]; - - Flash::info(Lang::get('lovata.toolbox::lang.message.import_from_xml_report', $arReportData)); - - return $this->listRefresh(); - } - - /** - * Start import from XML - */ - public function onImportPricesFromXML() - { - $obImport = new ImportOfferPriceFromXML(); - $obImport->import(); - - $arReportData = [ - 'created' => $obImport->getCreatedCount(), - 'updated' => $obImport->getUpdatedCount(), - 'skipped' => $obImport->getSkippedCount(), - 'processed' => $obImport->getProcessedCount(), - ]; - - Flash::info(Lang::get('lovata.toolbox::lang.message.import_from_xml_report', $arReportData)); - - return $this->listRefresh(); - } -} diff --git a/plugins/lovata/shopaholic/controllers/PromoBlocks.php b/plugins/lovata/shopaholic/controllers/PromoBlocks.php deleted file mode 100644 index de9418889..000000000 --- a/plugins/lovata/shopaholic/controllers/PromoBlocks.php +++ /dev/null @@ -1,47 +0,0 @@ - true - - active = true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/brands/_list_toolbar.htm b/plugins/lovata/shopaholic/controllers/brands/_list_toolbar.htm deleted file mode 100644 index a59865db3..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/_list_toolbar.htm +++ /dev/null @@ -1,38 +0,0 @@ -
    - - - - - - - - - - - - - - - - fireViewEvent('lovata.backend.extend_list_toolbar', [$this]) ?> -
    diff --git a/plugins/lovata/shopaholic/controllers/brands/config_form.yaml b/plugins/lovata/shopaholic/controllers/brands/config_form.yaml deleted file mode 100644 index 0e4bd4d11..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/config_form.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: 'lovata.shopaholic::lang.brand.name' -modelClass: Lovata\Shopaholic\Models\Brand -form: $/lovata/shopaholic/models/brand/fields.yaml -defaultRedirect: lovata/shopaholic/brands -create: - title: 'backend::lang.form.create_title' - redirect: 'lovata/shopaholic/brands/update/:id' - redirectClose: lovata/shopaholic/brands - flashSave: 'lovata.toolbox::lang.message.create_success' -update: - title: 'backend::lang.form.update_title' - redirect: lovata/shopaholic/brands - redirectClose: lovata/shopaholic/brands - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' -preview: { } diff --git a/plugins/lovata/shopaholic/controllers/brands/config_import_export.yaml b/plugins/lovata/shopaholic/controllers/brands/config_import_export.yaml deleted file mode 100644 index 274fd41c6..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/config_import_export.yaml +++ /dev/null @@ -1,28 +0,0 @@ -import: - title: 'lovata.shopaholic::lang.brand.import_title' - modelClass: Lovata\Shopaholic\Models\Brand - redirect: lovata/shopaholic/brands - list: - columns: - external_id: - label: 'lovata.toolbox::lang.field.external_id' - active: - label: 'lovata.toolbox::lang.field.active' - name: - label: 'lovata.toolbox::lang.field.name' - code: - label: 'lovata.toolbox::lang.field.code' - preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - description: - label: 'lovata.toolbox::lang.field.description' - preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - images: - label: 'lovata.toolbox::lang.field.images' - form: - fields: - deactivate: - label: 'lovata.toolbox::lang.field.import_deactivate' - comment: 'lovata.toolbox::lang.field.import_deactivate_description' - type: checkbox \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/brands/config_list.yaml b/plugins/lovata/shopaholic/controllers/brands/config_list.yaml deleted file mode 100644 index 4459751dc..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/config_list.yaml +++ /dev/null @@ -1,17 +0,0 @@ -title: 'lovata.shopaholic::lang.brand.list_title' -modelClass: Lovata\Shopaholic\Models\Brand -list: $/lovata/shopaholic/models/brand/columns.yaml -recordUrl: 'lovata/shopaholic/brands/update/:id' -noRecordsMessage: 'backend::lang.list.no_records' -recordsPerPage: '10' -showSetup: true -showCheckboxes: true -showSorting: 1 -defaultSort: - column: sort_order - direction: asc -toolbar: - buttons: list_toolbar - search: - prompt: 'backend::lang.list.search_prompt' -filter: _config_filter.yaml diff --git a/plugins/lovata/shopaholic/controllers/brands/config_reorder.yaml b/plugins/lovata/shopaholic/controllers/brands/config_reorder.yaml deleted file mode 100644 index 702f7f45d..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/config_reorder.yaml +++ /dev/null @@ -1,3 +0,0 @@ -title: 'backend::lang.reorder.default_title' -modelClass: Lovata\Shopaholic\Models\Brand -nameFrom: name diff --git a/plugins/lovata/shopaholic/controllers/brands/create.htm b/plugins/lovata/shopaholic/controllers/brands/create.htm deleted file mode 100644 index 4c063f221..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/create.htm +++ /dev/null @@ -1,46 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - -
    -
    - - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/brands/import.htm b/plugins/lovata/shopaholic/controllers/brands/import.htm deleted file mode 100644 index e1aa7fc15..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/import.htm +++ /dev/null @@ -1,36 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - - 'layout']) ?> - -
    -
    - -

    -
      -
    • -
    • -
    • -
    -
    -
    -
    - importRender() ?> -
    - -
    - -
    - - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/brands/index.htm b/plugins/lovata/shopaholic/controllers/brands/index.htm deleted file mode 100644 index ea43a3636..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/index.htm +++ /dev/null @@ -1 +0,0 @@ -listRender() ?> diff --git a/plugins/lovata/shopaholic/controllers/brands/preview.htm b/plugins/lovata/shopaholic/controllers/brands/preview.htm deleted file mode 100644 index d6145ccc8..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/preview.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - -
    - formRenderPreview() ?> -
    - - -

    fatalError) ?>

    - - -

    - - - -

    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/brands/reorder.htm b/plugins/lovata/shopaholic/controllers/brands/reorder.htm deleted file mode 100644 index fa6a5daf9..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/reorder.htm +++ /dev/null @@ -1,8 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -reorderRender() ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/brands/update.htm b/plugins/lovata/shopaholic/controllers/brands/update.htm deleted file mode 100644 index 1282f8618..000000000 --- a/plugins/lovata/shopaholic/controllers/brands/update.htm +++ /dev/null @@ -1,54 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - - - -
    -
    - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/categories/_config_filter.yaml b/plugins/lovata/shopaholic/controllers/categories/_config_filter.yaml deleted file mode 100644 index e48ef8269..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/_config_filter.yaml +++ /dev/null @@ -1,11 +0,0 @@ -# =================================== -# Filter Scope Definitions -# =================================== - -scopes: - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - conditions: - - active <> true - - active = true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/categories/_list_toolbar.htm b/plugins/lovata/shopaholic/controllers/categories/_list_toolbar.htm deleted file mode 100644 index a7cdb6d54..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/_list_toolbar.htm +++ /dev/null @@ -1,38 +0,0 @@ -
    - - - - - - - - - - - - - - - - fireViewEvent('lovata.backend.extend_list_toolbar', [$this]) ?> -
    diff --git a/plugins/lovata/shopaholic/controllers/categories/config_form.yaml b/plugins/lovata/shopaholic/controllers/categories/config_form.yaml deleted file mode 100644 index fff83fa34..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/config_form.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: 'lovata.shopaholic::lang.category.name' -modelClass: Lovata\Shopaholic\Models\Category -form: $/lovata/shopaholic/models/category/fields.yaml -defaultRedirect: lovata/shopaholic/categories -create: - title: 'backend::lang.form.create_title' - redirect: 'lovata/shopaholic/categories/update/:id' - redirectClose: lovata/shopaholic/categories - flashSave: 'lovata.toolbox::lang.message.create_success' -update: - title: 'backend::lang.form.update_title' - redirect: lovata/shopaholic/categories - redirectClose: lovata/shopaholic/categories - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' -preview: { } diff --git a/plugins/lovata/shopaholic/controllers/categories/config_import_export.yaml b/plugins/lovata/shopaholic/controllers/categories/config_import_export.yaml deleted file mode 100644 index 66099647b..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/config_import_export.yaml +++ /dev/null @@ -1,30 +0,0 @@ -import: - title: 'lovata.shopaholic::lang.category.import_title' - modelClass: Lovata\Shopaholic\Models\Category - redirect: lovata/shopaholic/categories - list: - columns: - external_id: - label: 'lovata.toolbox::lang.field.external_id' - active: - label: 'lovata.toolbox::lang.field.active' - name: - label: 'lovata.toolbox::lang.field.name' - code: - label: 'lovata.toolbox::lang.field.code' - preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - description: - label: 'lovata.toolbox::lang.field.description' - parent_id: - label: 'lovata.toolbox::lang.field.category_parent_id' - preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - images: - label: 'lovata.toolbox::lang.field.images' - form: - fields: - deactivate: - label: 'lovata.toolbox::lang.field.import_deactivate' - comment: 'lovata.toolbox::lang.field.import_deactivate_description' - type: checkbox \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/categories/config_list.yaml b/plugins/lovata/shopaholic/controllers/categories/config_list.yaml deleted file mode 100644 index 8fa83e32c..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/config_list.yaml +++ /dev/null @@ -1,14 +0,0 @@ -title: 'lovata.shopaholic::lang.category.list_title' -modelClass: Lovata\Shopaholic\Models\Category -list: $/lovata/shopaholic/models/category/columns.yaml -recordUrl: 'lovata/shopaholic/categories/update/:id' -noRecordsMessage: 'backend::lang.list.no_records' -showSetup: true -showCheckboxes: true -showSorting: 1 -toolbar: - buttons: list_toolbar - search: - prompt: 'backend::lang.list.search_prompt' -showTree: 1 -filter: _config_filter.yaml diff --git a/plugins/lovata/shopaholic/controllers/categories/config_relation.yaml b/plugins/lovata/shopaholic/controllers/categories/config_relation.yaml deleted file mode 100644 index e69de29bb..000000000 diff --git a/plugins/lovata/shopaholic/controllers/categories/config_reorder.yaml b/plugins/lovata/shopaholic/controllers/categories/config_reorder.yaml deleted file mode 100644 index e189f5d09..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/config_reorder.yaml +++ /dev/null @@ -1,3 +0,0 @@ -title: 'backend::lang.reorder.default_title' -modelClass: Lovata\Shopaholic\Models\Category -nameFrom: name diff --git a/plugins/lovata/shopaholic/controllers/categories/create.htm b/plugins/lovata/shopaholic/controllers/categories/create.htm deleted file mode 100644 index 5bc403acd..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/create.htm +++ /dev/null @@ -1,46 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - -
    -
    - - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/categories/import.htm b/plugins/lovata/shopaholic/controllers/categories/import.htm deleted file mode 100644 index ea5dd03df..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/import.htm +++ /dev/null @@ -1,36 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - - 'layout']) ?> - -
    -
    - -

    -
      -
    • -
    • -
    • -
    -
    -
    -
    - importRender() ?> -
    - -
    - -
    - - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/categories/index.htm b/plugins/lovata/shopaholic/controllers/categories/index.htm deleted file mode 100644 index ea43a3636..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/index.htm +++ /dev/null @@ -1 +0,0 @@ -listRender() ?> diff --git a/plugins/lovata/shopaholic/controllers/categories/preview.htm b/plugins/lovata/shopaholic/controllers/categories/preview.htm deleted file mode 100644 index d574031c3..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/preview.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - -
    - formRenderPreview() ?> -
    - - -

    fatalError) ?>

    - - -

    - - - -

    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/categories/reorder.htm b/plugins/lovata/shopaholic/controllers/categories/reorder.htm deleted file mode 100644 index 3e8423c20..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/reorder.htm +++ /dev/null @@ -1,8 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -reorderRender() ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/categories/update.htm b/plugins/lovata/shopaholic/controllers/categories/update.htm deleted file mode 100644 index 073066fe7..000000000 --- a/plugins/lovata/shopaholic/controllers/categories/update.htm +++ /dev/null @@ -1,54 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - - - -
    -
    - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/currencies/_config_filter.yaml b/plugins/lovata/shopaholic/controllers/currencies/_config_filter.yaml deleted file mode 100644 index e48ef8269..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/_config_filter.yaml +++ /dev/null @@ -1,11 +0,0 @@ -# =================================== -# Filter Scope Definitions -# =================================== - -scopes: - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - conditions: - - active <> true - - active = true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/currencies/_list_toolbar.htm b/plugins/lovata/shopaholic/controllers/currencies/_list_toolbar.htm deleted file mode 100644 index 31241930a..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/_list_toolbar.htm +++ /dev/null @@ -1,24 +0,0 @@ -
    - - - - - - - - fireViewEvent('lovata.backend.extend_list_toolbar', [$this]) ?> -
    diff --git a/plugins/lovata/shopaholic/controllers/currencies/config_form.yaml b/plugins/lovata/shopaholic/controllers/currencies/config_form.yaml deleted file mode 100644 index ce58805ff..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/config_form.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: 'lovata.shopaholic::lang.currency.name' -modelClass: Lovata\Shopaholic\Models\Currency -form: $/lovata/shopaholic/models/currency/fields.yaml -defaultRedirect: lovata/shopaholic/currencies -create: - title: 'backend::lang.form.create_title' - redirect: 'lovata/shopaholic/currencies/update/:id' - redirectClose: lovata/shopaholic/currencies - flashSave: 'lovata.toolbox::lang.message.create_success' -update: - title: 'backend::lang.form.update_title' - redirect: lovata/shopaholic/currencies - redirectClose: lovata/shopaholic/currencies - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' -preview: { } diff --git a/plugins/lovata/shopaholic/controllers/currencies/config_list.yaml b/plugins/lovata/shopaholic/controllers/currencies/config_list.yaml deleted file mode 100644 index 578b46690..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/config_list.yaml +++ /dev/null @@ -1,17 +0,0 @@ -title: 'lovata.shopaholic::lang.currency.list_title' -modelClass: Lovata\Shopaholic\Models\Currency -list: $/lovata/shopaholic/models/currency/columns.yaml -recordUrl: 'lovata/shopaholic/currencies/update/:id' -noRecordsMessage: 'backend::lang.list.no_records' -recordsPerPage: '10' -showSetup: true -showCheckboxes: true -showSorting: 1 -defaultSort: - column: sort_order - direction: asc -toolbar: - buttons: list_toolbar - search: - prompt: 'backend::lang.list.search_prompt' -filter: _config_filter.yaml diff --git a/plugins/lovata/shopaholic/controllers/currencies/config_reorder.yaml b/plugins/lovata/shopaholic/controllers/currencies/config_reorder.yaml deleted file mode 100644 index c2a13593a..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/config_reorder.yaml +++ /dev/null @@ -1,3 +0,0 @@ -title: 'backend::lang.reorder.default_title' -modelClass: Lovata\Shopaholic\Models\Currency -nameFrom: name diff --git a/plugins/lovata/shopaholic/controllers/currencies/create.htm b/plugins/lovata/shopaholic/controllers/currencies/create.htm deleted file mode 100644 index 3fc2704e8..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/create.htm +++ /dev/null @@ -1,46 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - -
    -
    - - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/currencies/index.htm b/plugins/lovata/shopaholic/controllers/currencies/index.htm deleted file mode 100644 index ea43a3636..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/index.htm +++ /dev/null @@ -1 +0,0 @@ -listRender() ?> diff --git a/plugins/lovata/shopaholic/controllers/currencies/preview.htm b/plugins/lovata/shopaholic/controllers/currencies/preview.htm deleted file mode 100644 index e699105dc..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/preview.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - -
    - formRenderPreview() ?> -
    - - -

    fatalError) ?>

    - - -

    - - - -

    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/currencies/reorder.htm b/plugins/lovata/shopaholic/controllers/currencies/reorder.htm deleted file mode 100644 index 7bea491f0..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/reorder.htm +++ /dev/null @@ -1,8 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -reorderRender() ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/currencies/update.htm b/plugins/lovata/shopaholic/controllers/currencies/update.htm deleted file mode 100644 index e1646b5e1..000000000 --- a/plugins/lovata/shopaholic/controllers/currencies/update.htm +++ /dev/null @@ -1,53 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - - -
    -
    - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/measures/_list_toolbar.htm b/plugins/lovata/shopaholic/controllers/measures/_list_toolbar.htm deleted file mode 100644 index 83dbc4dba..000000000 --- a/plugins/lovata/shopaholic/controllers/measures/_list_toolbar.htm +++ /dev/null @@ -1,21 +0,0 @@ -
    - - - - - fireViewEvent('lovata.backend.extend_list_toolbar', [$this]) ?> -
    diff --git a/plugins/lovata/shopaholic/controllers/measures/config_form.yaml b/plugins/lovata/shopaholic/controllers/measures/config_form.yaml deleted file mode 100644 index 73b5eea4d..000000000 --- a/plugins/lovata/shopaholic/controllers/measures/config_form.yaml +++ /dev/null @@ -1,15 +0,0 @@ -name: 'lovata.shopaholic::lang.measure.name' -modelClass: Lovata\Shopaholic\Models\Measure -form: $/lovata/shopaholic/models/measure/fields.yaml -defaultRedirect: lovata/shopaholic/measures -create: - title: 'backend::lang.form.create_title' - redirect: 'lovata/shopaholic/measures/update/:id' - redirectClose: lovata/shopaholic/measures - flashSave: 'lovata.toolbox::lang.message.create_success' -update: - title: 'backend::lang.form.update_title' - redirect: lovata/shopaholic/measures - redirectClose: lovata/shopaholic/measures - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' diff --git a/plugins/lovata/shopaholic/controllers/measures/config_list.yaml b/plugins/lovata/shopaholic/controllers/measures/config_list.yaml deleted file mode 100644 index de019a2fa..000000000 --- a/plugins/lovata/shopaholic/controllers/measures/config_list.yaml +++ /dev/null @@ -1,13 +0,0 @@ -title: 'lovata.shopaholic::lang.measure.list_title' -modelClass: Lovata\Shopaholic\Models\Measure -list: $/lovata/shopaholic/models/measure/columns.yaml -recordUrl: 'lovata/shopaholic/measures/update/:id' -noRecordsMessage: 'backend::lang.list.no_records' -recordsPerPage: 10 -showSetup: true -showCheckboxes: 1 -showSorting: 1 -toolbar: - buttons: list_toolbar - search: - prompt: 'backend::lang.list.search_prompt' diff --git a/plugins/lovata/shopaholic/controllers/measures/create.htm b/plugins/lovata/shopaholic/controllers/measures/create.htm deleted file mode 100644 index 45bb9eae9..000000000 --- a/plugins/lovata/shopaholic/controllers/measures/create.htm +++ /dev/null @@ -1,46 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - -
    -
    - - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/measures/index.htm b/plugins/lovata/shopaholic/controllers/measures/index.htm deleted file mode 100644 index ea43a3636..000000000 --- a/plugins/lovata/shopaholic/controllers/measures/index.htm +++ /dev/null @@ -1 +0,0 @@ -listRender() ?> diff --git a/plugins/lovata/shopaholic/controllers/measures/preview.htm b/plugins/lovata/shopaholic/controllers/measures/preview.htm deleted file mode 100644 index 09f8ff3eb..000000000 --- a/plugins/lovata/shopaholic/controllers/measures/preview.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - -
    - formRenderPreview() ?> -
    - - -

    fatalError) ?>

    - - -

    - - - -

    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/measures/update.htm b/plugins/lovata/shopaholic/controllers/measures/update.htm deleted file mode 100644 index 37c7e094c..000000000 --- a/plugins/lovata/shopaholic/controllers/measures/update.htm +++ /dev/null @@ -1,54 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - - - -
    -
    - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/offers/config_form.yaml b/plugins/lovata/shopaholic/controllers/offers/config_form.yaml deleted file mode 100644 index f3011019c..000000000 --- a/plugins/lovata/shopaholic/controllers/offers/config_form.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: 'lovata.shopaholic::lang.offer.name' -modelClass: Lovata\Shopaholic\Models\Offer -form: $/lovata/shopaholic/models/offer/fields.yaml -defaultRedirect: 'lovata/shopaholic/products/update/:product_id' -create: - title: 'backend::lang.form.create_title' - redirect: 'lovata/shopaholic/offers/update/:id' - redirectClose: 'lovata/shopaholic/products/update/:product_id' - flashSave: 'lovata.toolbox::lang.message.create_success' -update: - title: 'backend::lang.form.update_title' - redirect: 'lovata/shopaholic/products/update/:product_id' - redirectClose: 'lovata/shopaholic/products/update/:product_id' - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' -preview: { } diff --git a/plugins/lovata/shopaholic/controllers/offers/config_import_export.yaml b/plugins/lovata/shopaholic/controllers/offers/config_import_export.yaml deleted file mode 100644 index 2d0a548d5..000000000 --- a/plugins/lovata/shopaholic/controllers/offers/config_import_export.yaml +++ /dev/null @@ -1,50 +0,0 @@ -import: - title: 'lovata.shopaholic::lang.offer.import_title' - modelClass: Lovata\Shopaholic\Models\Offer - redirect: lovata/shopaholic/products - list: - columns: - external_id: - label: 'lovata.toolbox::lang.field.external_id' - product_id: - label: 'lovata.shopaholic::lang.field.product_id' - active: - label: 'lovata.toolbox::lang.field.active' - name: - label: 'lovata.toolbox::lang.field.name' - code: - label: 'lovata.toolbox::lang.field.code' - price: - label: 'lovata.shopaholic::lang.field.price' - old_price: - label: 'lovata.shopaholic::lang.field.old_price' - quantity: - label: 'lovata.shopaholic::lang.field.quantity' - weight: - label: 'lovata.toolbox::lang.field.weight' - height: - label: 'lovata.toolbox::lang.field.height' - length: - label: 'lovata.toolbox::lang.field.length' - width: - label: 'lovata.toolbox::lang.field.width' - measure_id: - label: 'lovata.shopaholic::lang.field.measure' - quantity_in_unit: - label: 'lovata.shopaholic::lang.field.quantity_in_unit' - measure_of_unit: - label: 'lovata.shopaholic::lang.field.measure_of_unit' - preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - description: - label: 'lovata.toolbox::lang.field.description' - preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - images: - label: 'lovata.toolbox::lang.field.images' - form: - fields: - deactivate: - label: 'lovata.toolbox::lang.field.import_deactivate' - comment: 'lovata.toolbox::lang.field.import_deactivate_description' - type: checkbox diff --git a/plugins/lovata/shopaholic/controllers/offers/config_relation.yaml b/plugins/lovata/shopaholic/controllers/offers/config_relation.yaml deleted file mode 100644 index e69de29bb..000000000 diff --git a/plugins/lovata/shopaholic/controllers/offers/create.htm b/plugins/lovata/shopaholic/controllers/offers/create.htm deleted file mode 100644 index b4ca0ee7a..000000000 --- a/plugins/lovata/shopaholic/controllers/offers/create.htm +++ /dev/null @@ -1,46 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - -
    -
    - - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/offers/import.htm b/plugins/lovata/shopaholic/controllers/offers/import.htm deleted file mode 100644 index 35fcb0ba9..000000000 --- a/plugins/lovata/shopaholic/controllers/offers/import.htm +++ /dev/null @@ -1,39 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - - 'layout']) ?> - -
    -
    - -

    -
      -
    • -
    • -
    • - hasPlugin('Lovata.PropertiesShopaholic')) {?> -
    • - -
    -
    -
    -
    - importRender() ?> -
    - -
    - -
    - - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/offers/preview.htm b/plugins/lovata/shopaholic/controllers/offers/preview.htm deleted file mode 100644 index 29547819a..000000000 --- a/plugins/lovata/shopaholic/controllers/offers/preview.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - -
    - formRenderPreview() ?> -
    - - -

    fatalError) ?>

    - - -

    - - - -

    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/offers/update.htm b/plugins/lovata/shopaholic/controllers/offers/update.htm deleted file mode 100644 index 92af6cc4a..000000000 --- a/plugins/lovata/shopaholic/controllers/offers/update.htm +++ /dev/null @@ -1,60 +0,0 @@ - -
      -
    • - product)) { - $obProduct = $formModel->product; - ?> -
    • name ?>
    • - -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - - - -
    -
    - - - -

    fatalError)) ?>

    -

    - diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/_config_filter.yaml b/plugins/lovata/shopaholic/controllers/pricetypes/_config_filter.yaml deleted file mode 100644 index e48ef8269..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/_config_filter.yaml +++ /dev/null @@ -1,11 +0,0 @@ -# =================================== -# Filter Scope Definitions -# =================================== - -scopes: - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - conditions: - - active <> true - - active = true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/_list_toolbar.htm b/plugins/lovata/shopaholic/controllers/pricetypes/_list_toolbar.htm deleted file mode 100644 index 41bbba5a3..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/_list_toolbar.htm +++ /dev/null @@ -1,24 +0,0 @@ -
    - - - - - - - - fireViewEvent('lovata.backend.extend_list_toolbar', [$this]) ?> -
    diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/config_form.yaml b/plugins/lovata/shopaholic/controllers/pricetypes/config_form.yaml deleted file mode 100644 index 959e76731..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/config_form.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: 'lovata.shopaholic::lang.price_type.name' -modelClass: Lovata\Shopaholic\Models\PriceType -form: $/lovata/shopaholic/models/pricetype/fields.yaml -defaultRedirect: lovata/shopaholic/pricetypes -create: - title: 'backend::lang.form.create_title' - redirect: 'lovata/shopaholic/pricetypes/update/:id' - redirectClose: lovata/shopaholic/pricetypes - flashSave: 'lovata.toolbox::lang.message.create_success' -update: - title: 'backend::lang.form.update_title' - redirect: lovata/shopaholic/pricetypes - redirectClose: lovata/shopaholic/pricetypes - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' -preview: { } diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/config_list.yaml b/plugins/lovata/shopaholic/controllers/pricetypes/config_list.yaml deleted file mode 100644 index 9d5dee1fc..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/config_list.yaml +++ /dev/null @@ -1,17 +0,0 @@ -title: 'lovata.shopaholic::lang.price_type.list_title' -modelClass: Lovata\Shopaholic\Models\PriceType -list: $/lovata/shopaholic/models/pricetype/columns.yaml -recordUrl: 'lovata/shopaholic/pricetypes/update/:id' -noRecordsMessage: 'backend::lang.list.no_records' -recordsPerPage: '10' -showSetup: true -showCheckboxes: true -showSorting: 1 -defaultSort: - column: sort_order - direction: asc -toolbar: - buttons: list_toolbar - search: - prompt: 'backend::lang.list.search_prompt' -filter: _config_filter.yaml diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/config_reorder.yaml b/plugins/lovata/shopaholic/controllers/pricetypes/config_reorder.yaml deleted file mode 100644 index d00047914..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/config_reorder.yaml +++ /dev/null @@ -1,3 +0,0 @@ -title: 'backend::lang.reorder.default_title' -modelClass: Lovata\Shopaholic\Models\PriceType -nameFrom: name diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/create.htm b/plugins/lovata/shopaholic/controllers/pricetypes/create.htm deleted file mode 100644 index 1ddf6b8bf..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/create.htm +++ /dev/null @@ -1,46 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - -
    -
    - - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/index.htm b/plugins/lovata/shopaholic/controllers/pricetypes/index.htm deleted file mode 100644 index ea43a3636..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/index.htm +++ /dev/null @@ -1 +0,0 @@ -listRender() ?> diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/preview.htm b/plugins/lovata/shopaholic/controllers/pricetypes/preview.htm deleted file mode 100644 index 5c3096e2a..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/preview.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - -
    - formRenderPreview() ?> -
    - - -

    fatalError) ?>

    - - -

    - - - -

    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/reorder.htm b/plugins/lovata/shopaholic/controllers/pricetypes/reorder.htm deleted file mode 100644 index f685d10e3..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/reorder.htm +++ /dev/null @@ -1,8 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -reorderRender() ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/pricetypes/update.htm b/plugins/lovata/shopaholic/controllers/pricetypes/update.htm deleted file mode 100644 index b49f26e67..000000000 --- a/plugins/lovata/shopaholic/controllers/pricetypes/update.htm +++ /dev/null @@ -1,53 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - - -
    -
    - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/products/_config_filter.yaml b/plugins/lovata/shopaholic/controllers/products/_config_filter.yaml deleted file mode 100644 index a265e0bc1..000000000 --- a/plugins/lovata/shopaholic/controllers/products/_config_filter.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# =================================== -# Filter Scope Definitions -# =================================== - -scopes: - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - conditions: - - active <> true - - active = true - category: - label: 'lovata.toolbox::lang.field.category' - modelClass: Lovata\Shopaholic\Models\Category - nameFrom: name - scope: getByCategories - brand: - label: 'lovata.shopaholic::lang.field.brand' - modelClass: Lovata\Shopaholic\Models\Brand - nameFrom: name - conditions: brand_id in (:filtered) diff --git a/plugins/lovata/shopaholic/controllers/products/_list_toolbar.htm b/plugins/lovata/shopaholic/controllers/products/_list_toolbar.htm deleted file mode 100644 index 03bff1fdf..000000000 --- a/plugins/lovata/shopaholic/controllers/products/_list_toolbar.htm +++ /dev/null @@ -1,58 +0,0 @@ -
    - - - - - - - - - - - - - - - - - - - - - - - - fireViewEvent('lovata.backend.extend_list_toolbar', [$this]) ?> -
    diff --git a/plugins/lovata/shopaholic/controllers/products/_offer.htm b/plugins/lovata/shopaholic/controllers/products/_offer.htm deleted file mode 100644 index bc4366057..000000000 --- a/plugins/lovata/shopaholic/controllers/products/_offer.htm +++ /dev/null @@ -1 +0,0 @@ -relationRender('offer') ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/products/config_form.yaml b/plugins/lovata/shopaholic/controllers/products/config_form.yaml deleted file mode 100644 index f90963454..000000000 --- a/plugins/lovata/shopaholic/controllers/products/config_form.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: 'lovata.shopaholic::lang.product.name' -modelClass: Lovata\Shopaholic\Models\Product -form: $/lovata/shopaholic/models/product/fields.yaml -defaultRedirect: lovata/shopaholic/products -create: - title: 'backend::lang.form.create_title' - redirect: 'lovata/shopaholic/products/update/:id' - redirectClose: lovata/shopaholic/products - flashSave: 'lovata.toolbox::lang.message.create_success' -update: - title: 'backend::lang.form.update_title' - redirect: lovata/shopaholic/products - redirectClose: lovata/shopaholic/products - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' -preview: { } diff --git a/plugins/lovata/shopaholic/controllers/products/config_import_export.yaml b/plugins/lovata/shopaholic/controllers/products/config_import_export.yaml deleted file mode 100644 index 053ede306..000000000 --- a/plugins/lovata/shopaholic/controllers/products/config_import_export.yaml +++ /dev/null @@ -1,34 +0,0 @@ -import: - title: 'lovata.shopaholic::lang.product.import_title' - modelClass: Lovata\Shopaholic\Models\Product - redirect: lovata/shopaholic/products - list: - columns: - external_id: - label: 'lovata.toolbox::lang.field.external_id' - active: - label: 'lovata.toolbox::lang.field.active' - name: - label: 'lovata.toolbox::lang.field.name' - code: - label: 'lovata.toolbox::lang.field.code' - preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - description: - label: 'lovata.toolbox::lang.field.description' - preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - images: - label: 'lovata.toolbox::lang.field.images' - brand_id: - label: 'lovata.shopaholic::lang.field.brand' - category_id: - label: 'lovata.toolbox::lang.field.category' - additional_category: - label: 'lovata.shopaholic::lang.field.additional_category' - form: - fields: - deactivate: - label: 'lovata.toolbox::lang.field.import_deactivate' - comment: 'lovata.toolbox::lang.field.import_deactivate_description' - type: checkbox \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/products/config_list.yaml b/plugins/lovata/shopaholic/controllers/products/config_list.yaml deleted file mode 100644 index 34e78c5aa..000000000 --- a/plugins/lovata/shopaholic/controllers/products/config_list.yaml +++ /dev/null @@ -1,14 +0,0 @@ -title: 'lovata.shopaholic::lang.product.list_title' -modelClass: Lovata\Shopaholic\Models\Product -list: $/lovata/shopaholic/models/product/columns.yaml -recordUrl: 'lovata/shopaholic/products/update/:id' -noRecordsMessage: 'backend::lang.list.no_records' -recordsPerPage: '10' -showSetup: true -showCheckboxes: true -showSorting: 1 -toolbar: - buttons: list_toolbar - search: - prompt: 'backend::lang.list.search_prompt' -filter: _config_filter.yaml diff --git a/plugins/lovata/shopaholic/controllers/products/config_relation.yaml b/plugins/lovata/shopaholic/controllers/products/config_relation.yaml deleted file mode 100644 index b1ff200ec..000000000 --- a/plugins/lovata/shopaholic/controllers/products/config_relation.yaml +++ /dev/null @@ -1,15 +0,0 @@ -offer: - label: 'lovata.shopaholic::lang.offer.name' - manage: - list: $/lovata/shopaholic/models/offer/columns.yaml - form: $/lovata/shopaholic/models/offer/fields.yaml - showSearch: true - showSorting: true - recordsPerPage: 10 - view: - list: $/lovata/shopaholic/models/offer/columns.yaml - recordUrl: lovata/shopaholic/offers/update/:id - toolbarButtons: 'create|delete' - showSearch: true - showSorting: true - recordsPerPage: 10 \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/products/create.htm b/plugins/lovata/shopaholic/controllers/products/create.htm deleted file mode 100644 index b4ca0ee7a..000000000 --- a/plugins/lovata/shopaholic/controllers/products/create.htm +++ /dev/null @@ -1,46 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - -
    -
    - - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/products/import.htm b/plugins/lovata/shopaholic/controllers/products/import.htm deleted file mode 100644 index 1194a9fed..000000000 --- a/plugins/lovata/shopaholic/controllers/products/import.htm +++ /dev/null @@ -1,40 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - - 'layout']) ?> - -
    -
    - -

    -
      -
    • -
    • -
    • -
    • - hasPlugin('Lovata.PropertiesShopaholic')) {?> -
    • - -
    -
    -
    -
    - importRender() ?> -
    - -
    - -
    - - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/products/index.htm b/plugins/lovata/shopaholic/controllers/products/index.htm deleted file mode 100644 index ea43a3636..000000000 --- a/plugins/lovata/shopaholic/controllers/products/index.htm +++ /dev/null @@ -1 +0,0 @@ -listRender() ?> diff --git a/plugins/lovata/shopaholic/controllers/products/preview.htm b/plugins/lovata/shopaholic/controllers/products/preview.htm deleted file mode 100644 index 29547819a..000000000 --- a/plugins/lovata/shopaholic/controllers/products/preview.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - -
    - formRenderPreview() ?> -
    - - -

    fatalError) ?>

    - - -

    - - - -

    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/products/reorder.htm b/plugins/lovata/shopaholic/controllers/products/reorder.htm deleted file mode 100644 index 6c10fa800..000000000 --- a/plugins/lovata/shopaholic/controllers/products/reorder.htm +++ /dev/null @@ -1,8 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -reorderRender() ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/products/update.htm b/plugins/lovata/shopaholic/controllers/products/update.htm deleted file mode 100644 index 86c48d943..000000000 --- a/plugins/lovata/shopaholic/controllers/products/update.htm +++ /dev/null @@ -1,54 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - - - -
    -
    - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/_config_filter.yaml b/plugins/lovata/shopaholic/controllers/promoblocks/_config_filter.yaml deleted file mode 100644 index 252431f96..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/_config_filter.yaml +++ /dev/null @@ -1,19 +0,0 @@ -# =================================== -# Filter Scope Definitions -# =================================== - -scopes: - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - conditions: - - active <> true - - active = true - date_begin: - label: 'lovata.toolbox::lang.field.date_begin' - type: daterange - conditions: date_begin >= ':after' AND date_begin <= ':before' - date_end: - label: 'lovata.toolbox::lang.field.date_end' - type: daterange - conditions: date_end >= ':after' AND date_end <= ':before' \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/_list_toolbar.htm b/plugins/lovata/shopaholic/controllers/promoblocks/_list_toolbar.htm deleted file mode 100644 index 1b1eb494b..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/_list_toolbar.htm +++ /dev/null @@ -1,24 +0,0 @@ -
    - - - - - - - - fireViewEvent('lovata.backend.extend_list_toolbar', [$this]) ?> -
    diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/_product.htm b/plugins/lovata/shopaholic/controllers/promoblocks/_product.htm deleted file mode 100644 index ab8f51b26..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/_product.htm +++ /dev/null @@ -1 +0,0 @@ -relationRender('product') ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/config_form.yaml b/plugins/lovata/shopaholic/controllers/promoblocks/config_form.yaml deleted file mode 100644 index c8dae6ba8..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/config_form.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: 'lovata.shopaholic::lang.promo_block.name' -modelClass: Lovata\Shopaholic\Models\PromoBlock -form: $/lovata/shopaholic/models/promoblock/fields.yaml -defaultRedirect: lovata/shopaholic/promoblocks -create: - title: 'backend::lang.form.create_title' - redirect: 'lovata/shopaholic/promoblocks/update/:id' - redirectClose: lovata/shopaholic/promoblocks - flashSave: 'lovata.toolbox::lang.message.create_success' -update: - title: 'backend::lang.form.update_title' - redirect: lovata/shopaholic/promoblocks - redirectClose: lovata/shopaholic/promoblocks - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' -preview: { } diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/config_list.yaml b/plugins/lovata/shopaholic/controllers/promoblocks/config_list.yaml deleted file mode 100644 index 4b2ff065f..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/config_list.yaml +++ /dev/null @@ -1,17 +0,0 @@ -title: 'lovata.shopaholic::lang.promo_block.list_title' -modelClass: Lovata\Shopaholic\Models\PromoBlock -list: $/lovata/shopaholic/models/promoblock/columns.yaml -recordUrl: 'lovata/shopaholic/promoblocks/update/:id' -noRecordsMessage: 'backend::lang.list.no_records' -recordsPerPage: '10' -showSetup: true -showCheckboxes: true -showSorting: 1 -defaultSort: - column: sort_order - direction: asc -toolbar: - buttons: list_toolbar - search: - prompt: 'backend::lang.list.search_prompt' -filter: _config_filter.yaml diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/config_relation.yaml b/plugins/lovata/shopaholic/controllers/promoblocks/config_relation.yaml deleted file mode 100644 index be522819a..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/config_relation.yaml +++ /dev/null @@ -1,14 +0,0 @@ -product: - label: 'lovata.shopaholic::lang.product.name' - manage: - list: $/lovata/shopaholic/models/product/relation_columns.yaml - showSearch: true - showSorting: true - recordsPerPage: 10 - view: - list: $/lovata/shopaholic/models/product/relation_columns.yaml - recordUrl: lovata/shopaholic/products/update/:id - toolbarButtons: 'add|remove' - showSearch: true - showSorting: true - recordsPerPage: 10 \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/config_reorder.yaml b/plugins/lovata/shopaholic/controllers/promoblocks/config_reorder.yaml deleted file mode 100644 index 3a67ca854..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/config_reorder.yaml +++ /dev/null @@ -1,3 +0,0 @@ -title: 'backend::lang.reorder.default_title' -modelClass: Lovata\Shopaholic\Models\PromoBlock -nameFrom: name diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/create.htm b/plugins/lovata/shopaholic/controllers/promoblocks/create.htm deleted file mode 100644 index 2adcf7c7b..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/create.htm +++ /dev/null @@ -1,46 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - -
    -
    - - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/index.htm b/plugins/lovata/shopaholic/controllers/promoblocks/index.htm deleted file mode 100644 index ea43a3636..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/index.htm +++ /dev/null @@ -1 +0,0 @@ -listRender() ?> diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/preview.htm b/plugins/lovata/shopaholic/controllers/promoblocks/preview.htm deleted file mode 100644 index 1de4f6825..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/preview.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - -
    - formRenderPreview() ?> -
    - - -

    fatalError) ?>

    - - -

    - - - -

    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/reorder.htm b/plugins/lovata/shopaholic/controllers/promoblocks/reorder.htm deleted file mode 100644 index f47d2c42b..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/reorder.htm +++ /dev/null @@ -1,8 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -reorderRender() ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/promoblocks/update.htm b/plugins/lovata/shopaholic/controllers/promoblocks/update.htm deleted file mode 100644 index 8c9d86108..000000000 --- a/plugins/lovata/shopaholic/controllers/promoblocks/update.htm +++ /dev/null @@ -1,54 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - - - -
    -
    - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/_category.htm b/plugins/lovata/shopaholic/controllers/taxes/_category.htm deleted file mode 100644 index 12bcf3cce..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/_category.htm +++ /dev/null @@ -1 +0,0 @@ -relationRender('category') ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/_config_filter.yaml b/plugins/lovata/shopaholic/controllers/taxes/_config_filter.yaml deleted file mode 100644 index e48ef8269..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/_config_filter.yaml +++ /dev/null @@ -1,11 +0,0 @@ -# =================================== -# Filter Scope Definitions -# =================================== - -scopes: - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - conditions: - - active <> true - - active = true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/_country.htm b/plugins/lovata/shopaholic/controllers/taxes/_country.htm deleted file mode 100644 index 774b3975b..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/_country.htm +++ /dev/null @@ -1 +0,0 @@ -relationRender('country') ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/_list_toolbar.htm b/plugins/lovata/shopaholic/controllers/taxes/_list_toolbar.htm deleted file mode 100644 index c55e26a87..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/_list_toolbar.htm +++ /dev/null @@ -1,24 +0,0 @@ -
    - - - - - - - - fireViewEvent('lovata.backend.extend_list_toolbar', [$this]) ?> -
    diff --git a/plugins/lovata/shopaholic/controllers/taxes/_product.htm b/plugins/lovata/shopaholic/controllers/taxes/_product.htm deleted file mode 100644 index ab8f51b26..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/_product.htm +++ /dev/null @@ -1 +0,0 @@ -relationRender('product') ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/_state.htm b/plugins/lovata/shopaholic/controllers/taxes/_state.htm deleted file mode 100644 index 377171747..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/_state.htm +++ /dev/null @@ -1 +0,0 @@ -relationRender('state') ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/config_form.yaml b/plugins/lovata/shopaholic/controllers/taxes/config_form.yaml deleted file mode 100644 index d9f0f1c10..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/config_form.yaml +++ /dev/null @@ -1,16 +0,0 @@ -name: 'lovata.shopaholic::lang.tax.name' -modelClass: Lovata\Shopaholic\Models\Tax -form: $/lovata/shopaholic/models/tax/fields.yaml -defaultRedirect: lovata/shopaholic/taxes -create: - title: 'backend::lang.form.create_title' - redirect: 'lovata/shopaholic/taxes/update/:id' - redirectClose: lovata/shopaholic/taxes - flashSave: 'lovata.toolbox::lang.message.create_success' -update: - title: 'backend::lang.form.update_title' - redirect: lovata/shopaholic/taxes - redirectClose: lovata/shopaholic/taxes - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' -preview: { } diff --git a/plugins/lovata/shopaholic/controllers/taxes/config_list.yaml b/plugins/lovata/shopaholic/controllers/taxes/config_list.yaml deleted file mode 100644 index 23b5e7ed1..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/config_list.yaml +++ /dev/null @@ -1,17 +0,0 @@ -title: 'lovata.shopaholic::lang.tax.list_title' -modelClass: Lovata\Shopaholic\Models\Tax -list: $/lovata/shopaholic/models/tax/columns.yaml -recordUrl: 'lovata/shopaholic/taxes/update/:id' -noRecordsMessage: 'backend::lang.list.no_records' -recordsPerPage: '10' -showSetup: true -showCheckboxes: true -showSorting: 1 -defaultSort: - column: sort_order - direction: asc -toolbar: - buttons: list_toolbar - search: - prompt: 'backend::lang.list.search_prompt' -filter: _config_filter.yaml diff --git a/plugins/lovata/shopaholic/controllers/taxes/config_relation.yaml b/plugins/lovata/shopaholic/controllers/taxes/config_relation.yaml deleted file mode 100644 index 34bc2cef4..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/config_relation.yaml +++ /dev/null @@ -1,54 +0,0 @@ -category: - label: 'lovata.shopaholic::lang.category.name' - manage: - list: $/lovata/shopaholic/models/category/columns.yaml - showSearch: true - showSorting: true - recordsPerPage: 10 - view: - list: $/lovata/shopaholic/models/category/columns.yaml - recordUrl: lovata/shopaholic/categories/update/:id - toolbarButtons: 'add|remove' - showSearch: true - showSorting: true - recordsPerPage: 10 -product: - label: 'lovata.shopaholic::lang.product.name' - manage: - list: $/lovata/shopaholic/models/product/columns.yaml - showSearch: true - showSorting: true - recordsPerPage: 10 - view: - list: $/lovata/shopaholic/models/product/columns.yaml - recordUrl: lovata/shopaholic/products/update/:id - toolbarButtons: 'add|remove' - showSearch: true - showSorting: true - recordsPerPage: 10 -country: - label: 'lovata.shopaholic::lang.country.name' - manage: - list: $/rainlab/location/models/country/columns.yaml - showSearch: true - showSorting: true - recordsPerPage: 10 - view: - list: $/rainlab/location/models/country/columns.yaml - toolbarButtons: 'add|remove' - showSearch: true - showSorting: true - recordsPerPage: 10 -state: - label: 'lovata.shopaholic::lang.state.name' - manage: - list: $/rainlab/location/models/state/columns.yaml - showSearch: true - showSorting: true - recordsPerPage: 10 - view: - list: $/rainlab/location/models/state/columns.yaml - toolbarButtons: 'add|remove' - showSearch: true - showSorting: true - recordsPerPage: 10 \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/config_reorder.yaml b/plugins/lovata/shopaholic/controllers/taxes/config_reorder.yaml deleted file mode 100644 index 5606ffef2..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/config_reorder.yaml +++ /dev/null @@ -1,3 +0,0 @@ -title: 'backend::lang.reorder.default_title' -modelClass: Lovata\Shopaholic\Models\Tax -nameFrom: name diff --git a/plugins/lovata/shopaholic/controllers/taxes/create.htm b/plugins/lovata/shopaholic/controllers/taxes/create.htm deleted file mode 100644 index ed256235a..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/create.htm +++ /dev/null @@ -1,46 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - -
    -
    - - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/index.htm b/plugins/lovata/shopaholic/controllers/taxes/index.htm deleted file mode 100644 index ea43a3636..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/index.htm +++ /dev/null @@ -1 +0,0 @@ -listRender() ?> diff --git a/plugins/lovata/shopaholic/controllers/taxes/preview.htm b/plugins/lovata/shopaholic/controllers/taxes/preview.htm deleted file mode 100644 index 706b2936e..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/preview.htm +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - -
    - formRenderPreview() ?> -
    - - -

    fatalError) ?>

    - - -

    - - - -

    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/reorder.htm b/plugins/lovata/shopaholic/controllers/taxes/reorder.htm deleted file mode 100644 index 44dd4d347..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/reorder.htm +++ /dev/null @@ -1,8 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -reorderRender() ?> \ No newline at end of file diff --git a/plugins/lovata/shopaholic/controllers/taxes/update.htm b/plugins/lovata/shopaholic/controllers/taxes/update.htm deleted file mode 100644 index 4e5745d05..000000000 --- a/plugins/lovata/shopaholic/controllers/taxes/update.htm +++ /dev/null @@ -1,53 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - - -fatalError): ?> - - 'layout']) ?> - -
    - formRender() ?> -
    - -
    -
    - - - - - - -
    -
    - - - -

    fatalError)) ?>

    -

    - \ No newline at end of file diff --git a/plugins/lovata/shopaholic/crowdin.yml b/plugins/lovata/shopaholic/crowdin.yml deleted file mode 100644 index 535152bcc..000000000 --- a/plugins/lovata/shopaholic/crowdin.yml +++ /dev/null @@ -1,3 +0,0 @@ -files: - - source: /lang/en/*php - translation: /lang/%two_letters_code%/%original_file_name% diff --git a/plugins/lovata/shopaholic/lang/ar/lang.php b/plugins/lovata/shopaholic/lang/ar/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/ar/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/be/lang.php b/plugins/lovata/shopaholic/lang/be/lang.php deleted file mode 100644 index b955c69f4..000000000 --- a/plugins/lovata/shopaholic/lang/be/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Бясплатны eCommerce-плагін з вялікім наборам пашырэнняў.', - ], - 'field' => [ - 'vendor_code' => 'Артыкул', - 'price' => 'Цана', - 'old_price' => 'Старая цана', - 'quantity' => 'Колькасць', - 'brand' => 'Брэнд', - 'offer' => 'Таварныя прапановы', - 'currency' => 'Валюта', - 'check_offer_active' => 'Правяраць наяўнасць актыўных гандлёвых прапаноў пры атрыманні спісу актыўных тавараў.', - 'additional_category' => 'Дадатковыя катэгорыі', - 'promo_block_type' => 'Промо-блок со списком товаров', - 'promo_block' => 'Прома-блок', - 'product_id' => 'ID тавару', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Каталог', - 'categories' => 'Катэгорыі', - 'product' => 'Тавары', - 'brands' => 'Брэнды', - 'shop_catalog' => 'Каталог тавараў', - 'shop_category' => 'Катэгорыя тавараў', - 'all_shop_categories' => 'Усе катэгорыі тавараў', - 'promo_block' => 'Прома-блокі', - 'promo' => 'Прома-акцыі', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Гандлёвыя прапановы', - 'price' => 'Цэны', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'катэгорыі', - 'list_title' => 'Cпіс катэгорый', - 'import_title' => 'Iмпарт катэгорый', - 'export_title' => 'Экспарт катэгорый', - ], - 'brand' => [ - 'name' => 'брэнду', - 'list_title' => 'Спіс брэндаў', - 'import_title' => 'Iмпарт брэндаў', - 'export_title' => 'Экспарт брэндаў', - ], - 'product' => [ - 'name' => 'тавару', - 'list_title' => 'Спіс тавараў', - 'import_title' => 'Iмпарт тавараў', - 'export_title' => 'Экспарт тавараў', - ], - 'offer' => [ - 'name' => 'гандлёвай прапановы', - 'list_title' => 'Спіс гандлёвых прапаноў', - 'import_title' => 'Імпарт гандлёвых прапаноў', - 'export_title' => 'Экспарт гандлёвых прапаноў', - ], - 'promo_block' => [ - 'name' => 'прома-блоку', - 'list_title' => 'Спіс прома-блокаў', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Старонка тавару', - 'product_page_description' => 'Атрымаць даныя для старонкі тавару', - 'product_data_name' => 'Дадзеныя тавару', - 'product_data_description' => 'Атрымаць даныя тавару па ID', - 'product_list_name' => 'Спіс тавараў', - 'product_list_description' => 'Атрымаць спіс тавараў', - - //Brand components - 'brand_page_name' => 'Старонка брэнду', - 'brand_page_description' => 'Атрымаць даныя для старонкі брэнду', - 'brand_data_name' => 'Дадзеныя брэнду', - 'brand_data_description' => 'Атрымаць дадзеныя брэнду па ID', - 'brand_list_name' => 'Спіс брэндаў', - 'brand_list_description' => 'Атрымаць спіс брэндаў', - - //Promo block components - 'promo_block_page_name' => 'Страница промо-блока', - 'promo_block_page_description' => 'Атрымаць даныя для старонкі прома-блоку', - 'promo_block_data_name' => 'Дадзеныя прома-блоку', - 'promo_block_data_description' => 'Атрымаць даныя прома-блоку па ID', - 'promo_block_list_name' => 'Спіс прома-блокаў', - 'promo_block_list_description' => 'Атрымаць спіс прома-блокаў', - - //Category components - 'category_page_name' => 'Старонка катэгорыі', - 'category_page_description' => 'Атрымаць даныя для старонкі катэгорыі', - 'category_data_name' => 'Дадзеныя катэгорыі', - 'category_data_description' => 'Атрымаць даныя катэгорыі па ID', - 'category_list_name' => 'Спіс катэгорый', - 'category_list_description' => 'Атрымаць дрэва катэгорый', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Хлебныя крошкі', - 'breadcrumbs_description' => 'Атрымаць даныя для фарміравання хлебных крошак каталогу', - - //Components settings - 'product_list_sorting' => 'Сартаванне па змаўчанні', - 'sorting_no' => 'Без сартавання', - 'sorting_price_desc' => 'Дарагiя', - 'sorting_price_asc' => 'Танныя', - 'sorting_new' => 'Новыя', - 'sorting_popularity_desc' => 'Папулярныя', - 'sorting_rating_desc' => 'Высокі рэйтынг', - 'sorting_rating_asc' => 'Нізкі рэйтынг', - 'sorting_date_begin_asc' => 'Дата пачатку (ASC)', - 'sorting_date_begin_desc' => 'Дата пачатку (DESC)', - 'sorting_date_end_asc' => 'Дата заканчэння (ASC)', - 'sorting_date_end_desc' => 'Дата заканчэння (DESC)', - ], - 'permission' => [ - 'category' => 'Кіраванне катэгорыямі', - 'brand' => 'Кіраванне брэндамi', - 'product' => 'Кіраванне таварамі', - 'settings' => 'Кіраванне наладамі', - 'promo_block' => 'Кіраванне прома-блокамі', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Пазначце праз коску спіс дадатковых катэгорый тавараў.', - ], - 'button' => [ - 'import_offer_button' => 'Імпартаваць прапановы з CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/bg/lang.php b/plugins/lovata/shopaholic/lang/bg/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/bg/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/ca/lang.php b/plugins/lovata/shopaholic/lang/ca/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/ca/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/cs/lang.php b/plugins/lovata/shopaholic/lang/cs/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/cs/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/da/lang.php b/plugins/lovata/shopaholic/lang/da/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/da/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/de/lang.php b/plugins/lovata/shopaholic/lang/de/lang.php deleted file mode 100644 index d86e2c0d0..000000000 --- a/plugins/lovata/shopaholic/lang/de/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Kostenlose E-Commerce-Plugin mit einer großen Reihe von Erweiterungen.', - ], - 'field' => [ - 'vendor_code' => 'Herstellerkürzel', - 'price' => 'Preis', - 'old_price' => 'Alter Preis', - 'quantity' => 'Menge', - 'brand' => 'Marke', - 'offer' => 'Produktangebote', - 'currency' => 'Währung', - 'check_offer_active' => 'Wenn Sie eine Liste aktiver Produkte erhalten, prüfen Sie nach aktive Produktangeboten.', - 'additional_category' => 'Zusätzliche Kategorien', - 'promo_block_type' => 'Promoblock mit Produktliste', - 'promo_block' => 'Promoblock', - 'product_id' => 'Produkt ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Katalog', - 'categories' => 'Kategorien', - 'product' => 'Produkte', - 'brands' => 'Marken', - 'shop_catalog' => 'Produktkatalog', - 'shop_category' => 'Produktkategorie', - 'all_shop_categories' => 'Alle Produktkategorien', - 'promo_block' => 'Promoblöcke', - 'promo' => 'Beförderungen', - 'price_type' => 'Preistypen', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Preise', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'Kategorie', - 'list_title' => 'Kategorienliste', - 'import_title' => 'Importiere Kategorien', - 'export_title' => 'Exportiere Kategorien', - ], - 'brand' => [ - 'name' => 'Marke', - 'list_title' => 'Markenliste', - 'import_title' => 'Importiere Marken', - 'export_title' => 'Exportiere Marken', - ], - 'product' => [ - 'name' => 'Produktes', - 'list_title' => 'Produktliste', - 'import_title' => 'Importiere Produkte', - 'export_title' => 'Exportiere Produkte', - ], - 'offer' => [ - 'name' => 'Produktangebotes', - 'list_title' => 'Produktangeboteliste', - 'import_title' => 'Importiere Produktangebote', - 'export_title' => 'Exportiere Produktangebote', - ], - 'promo_block' => [ - 'name' => 'Promoblockes', - 'list_title' => 'Promoblöckeliste', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Länderliste', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Produktseite', - 'product_page_description' => 'Daten für die Produktseite abrufen', - 'product_data_name' => 'Produktdaten', - 'product_data_description' => 'Produktdaten nach ID abrufen', - 'product_list_name' => 'Produktliste', - 'product_list_description' => 'Produktliste abrufen', - - //Brand components - 'brand_page_name' => 'Markenseite', - 'brand_page_description' => 'Daten für Markenseite abrufen', - 'brand_data_name' => 'Markendaten', - 'brand_data_description' => 'Markendaten nach ID abrufen', - 'brand_list_name' => 'Markenliste', - 'brand_list_description' => 'Markenübersicht abrufen', - - //Promo block components - 'promo_block_page_name' => 'Promoblockseite', - 'promo_block_page_description' => 'Daten für Promoblockseite abrufen', - 'promo_block_data_name' => 'Promoblockdaten', - 'promo_block_data_description' => 'Promoblöckeliste nach ID abrufen', - 'promo_block_list_name' => 'Promoblöckeliste', - 'promo_block_list_description' => 'Promoblockeliste abrufen', - - //Category components - 'category_page_name' => 'Kategorieseite', - 'category_page_description' => 'Daten für Kategorieseite abrufen', - 'category_data_name' => 'Kategoriedaten', - 'category_data_description' => 'Kategoriedaten nach ID abrufen', - 'category_list_name' => 'Kategorienliste', - 'category_list_description' => 'Kategoriebaum abrufen', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Daten für Brotkrümel abrufen', - - //Components settings - 'product_list_sorting' => 'Standardsortierung', - 'sorting_no' => 'Ohne Sortierung', - 'sorting_price_desc' => 'Teuer', - 'sorting_price_asc' => 'Billig', - 'sorting_new' => 'Neu', - 'sorting_popularity_desc' => 'Populär', - 'sorting_rating_desc' => 'Hohe Bewertung', - 'sorting_rating_asc' => 'Niedrige Bewertung', - 'sorting_date_begin_asc' => 'Datumsanfang (ASC)', - 'sorting_date_begin_desc' => 'Datumsanfang (DESC)', - 'sorting_date_end_asc' => 'Datumsende (ASC)', - 'sorting_date_end_desc' => 'Datumsende (DESC)', - ], - 'permission' => [ - 'category' => 'Kategorien verwalten', - 'brand' => 'Marken verwalten', - 'product' => 'Produkte verwalten', - 'settings' => 'Einstellungen verwalten', - 'promo_block' => 'Werbeblöcke verwalten', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Importiere Angebote mit CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/el/lang.php b/plugins/lovata/shopaholic/lang/el/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/el/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/en/lang.php b/plugins/lovata/shopaholic/lang/en/lang.php deleted file mode 100644 index 711f21a33..000000000 --- a/plugins/lovata/shopaholic/lang/en/lang.php +++ /dev/null @@ -1,226 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers.', - 'allow_negative_offer_quantity' => 'Allow negative offer quantity', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - 'measure' => 'Unit measure', - 'measure_of_unit' => 'Unit measure of one unit', - 'quantity_in_unit' => 'Quantity in one unit', - 'dimensions_measure' => 'Unit measure of dimensions', - 'weight_measure' => 'Unit measure of weight', - - 'hide_brand_import_from_csv' => 'Hide "Import from CSV" button for brands', - 'hide_brand_import_from_xml' => 'Hide "Import from XML" button for brands', - 'hide_category_import_from_csv' => 'Hide "Import from CSV" button for categories', - 'hide_category_import_from_xml' => 'Hide "Import from XML" button for categories', - 'hide_product_import_from_csv' => 'Hide "Import from CSV" button for products', - 'hide_product_import_from_xml' => 'Hide "Import from XML" button for products', - 'hide_offer_import_from_csv' => 'Hide "Import from CSV" button for offers', - 'hide_offer_import_from_xml' => 'Hide "Import from XML" button for offers', - 'hide_price_import_from_xml' => 'Hide "Import from XML" button for prices', - - 'default_product_page' => 'Choose the default product page', - 'default_category_page' => 'Choose the default category page', - 'default_brand_page' => 'Choose the default brand page', - 'default_promo_block_page' => 'Choose the default promo block page', - ], - 'settings' => [ - 'formula_calculate_discount_from_price' => 'Formula of calculating discounts on prices with taxes', - 'formula_calculation_from_backend_price' => 'Discount is deducted from backend price (default)', - 'formula_calculation_from_price_without_tax' => 'Discount is deducted from price without taxes', - 'formula_calculation_from_price_with_tax' => 'Discount is deducted from price with taxes', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - 'import_xml_file' => 'Import from XML', - 'import_xml_file_description' => 'Settings of import from XML file', - 'measure' => 'Unit measure', - 'measure_description' => 'Manage unit measure', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - 'import_setting' => 'Import', - 'dimensions' => 'Dimensions and weight', - 'page_settings' => 'Page settings' - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'measure' => [ - 'name' => 'Unit measure', - 'list_title' => 'Unit measure list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - 'import_xml_file' => 'Manage settings of import from XML file', - 'measure' => 'Manage unit measure list', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - 'import_from_xml_files_is_disabled' => 'Import from XML files is disabled.', - 'import_from_xml_info' => '

    You can use XPath syntax to set path to elements.

    ', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - 'import_offer_from_xml' => 'Import offers from XML', - 'import_price_from_xml' => 'Import prices from XML', - ], - 'widget' => [ - 'import_from_xml_files' => 'Import from XML', - 'import_from_csv_files' => 'Import from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/es/lang.php b/plugins/lovata/shopaholic/lang/es/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/es/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/et/lang.php b/plugins/lovata/shopaholic/lang/et/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/et/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/fa/lang.php b/plugins/lovata/shopaholic/lang/fa/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/fa/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/fi/lang.php b/plugins/lovata/shopaholic/lang/fi/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/fi/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/fr/lang.php b/plugins/lovata/shopaholic/lang/fr/lang.php deleted file mode 100644 index 16eb73386..000000000 --- a/plugins/lovata/shopaholic/lang/fr/lang.php +++ /dev/null @@ -1,93 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Code vendeur', - 'price' => 'Prix', - 'old_price' => 'Ancien prix', - 'quantity' => 'Quantité', - 'brand' => 'Marque', - 'offer' => 'Offres', - 'currency' => 'Devise', - 'check_offer_active' => 'Lorsque vous recevez une liste de produits actifs, recherchez des offres actives', - 'additional_category' => 'Catégories supplémentaires', - ], - 'menu' => [ - 'main' => 'Catalogue', - 'categories' => 'Catégories', - 'product' => 'Produits', - 'brands' => 'Marques', - 'shop_catalog' => 'Catalogue de produits', - 'shop_category' => 'Catégorie des produits', - 'all_shop_categories' => 'Toutes les catégories de produits', - ], - 'tab' => [ - 'offer' => 'Offres', - 'price' => 'Des prix', - 'permissions' => 'Shopaholic', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Liste des catégories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Liste des marques', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Liste des produits', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Liste des offres', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Page du produit', - 'product_page_description' => 'Obtenir les données pour la page du produit', - 'product_data_name' => 'Données du produit', - 'product_data_description' => 'Obtenir les données du produit par ID', - 'product_list_name' => 'Liste des produits', - 'product_list_description' => 'Récupérer la liste des produits', - - //Brand components - 'brand_page_name' => 'Page de la marque', - 'brand_page_description' => 'Obtenir les données pour la page de la marque', - 'brand_data_name' => 'Données de la marque', - 'brand_data_description' => 'Obtenir les données de la marque par ID', - 'brand_list_name' => 'Liste des marques', - 'brand_list_description' => 'Récupérer la liste des marques', - - //Category components - 'category_page_name' => 'Page de la catégorie', - 'category_page_description' => 'Obtenir les données pour la page de catégorie', - 'category_data_name' => 'Données de la catégorie', - 'category_data_description' => 'Obtenir les données de la catégorie par ID', - 'category_list_name' => 'Liste des catégories', - 'category_list_description' => 'Récupérer la liste des catégories', - - //Common components - 'breadcrumbs_name' => "Fil d'Ariane", - 'breadcrumbs_description' => "Récupérer les données pour le fil d'Ariane du catalogue", - - //Components settings - 'product_list_sorting' => 'Tri par défaut', - 'sorting_no' => 'Sans tri', - 'sorting_price_desc' => 'Coûteux', - 'sorting_price_asc' => 'Pas cher', - 'sorting_new' => 'Nouveau', - 'sorting_popularity_desc' => 'Le plus populaire', - 'sorting_rating_desc' => 'Note élevée', - 'sorting_rating_asc' => 'Note basse', - ], - 'permission' => [ - 'category' => 'Gérer les catégories', - 'brand' => 'Gérer les marques', - 'product' => 'Gérer les produits', - 'settings' => 'Gérer les paramètres', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/hu/lang.php b/plugins/lovata/shopaholic/lang/hu/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/hu/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/id/lang.php b/plugins/lovata/shopaholic/lang/id/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/id/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/it/lang.php b/plugins/lovata/shopaholic/lang/it/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/it/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/ja/lang.php b/plugins/lovata/shopaholic/lang/ja/lang.php deleted file mode 100644 index 197f5cf83..000000000 --- a/plugins/lovata/shopaholic/lang/ja/lang.php +++ /dev/null @@ -1,129 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'ベンダーコード', - 'price' => '価格', - 'old_price' => '通常価格', - 'quantity' => '数量', - 'brand' => 'ブランド', - 'offer' => 'オファー', - 'currency' => '通貨', - 'check_offer_active' => '有効な製品のリストを取得する際、有効なオファーを持つものに限定する', - 'additional_category' => '追加のカテゴリ', - 'promo_block_type' => '製品リストを含む販促ブロック', - 'promo_block' => '販促ブロック', - 'product_id' => '製品ID', - ], - 'menu' => [ - 'main' => 'カタログ', - 'categories' => 'カテゴリ', - 'product' => '製品', - 'brands' => 'ブランド', - 'shop_catalog' => '製品カタログ', - 'shop_category' => '製品カテゴリ', - 'all_shop_categories' => '全ての製品カテゴリ', - 'promo_block' => '販促ブロック', - 'promo' => '販促', - ], - 'tab' => [ - 'offer' => 'オファー', - 'price' => '価格', - 'permissions' => 'Shopaholic', - ], - 'category' => [ - 'name' => 'カテゴリ', - 'list_title' => 'カテゴリリスト', - 'import_title' => 'カテゴリデータのインポート', - 'export_title' => 'カテゴリデータのエクスポート', - ], - 'brand' => [ - 'name' => 'ブランド', - 'list_title' => 'ブランドリスト', - 'import_title' => 'ブランドデータのインポート', - 'export_title' => 'ブランドデータのエクスポート', - ], - 'product' => [ - 'name' => '製品', - 'list_title' => '製品リスト', - 'import_title' => '製品データのインポート', - 'export_title' => '製品データのエクスポート', - ], - 'offer' => [ - 'name' => 'オファー', - 'list_title' => 'オファーリスト', - 'import_title' => 'オファーデータのインポート', - 'export_title' => 'オファーデータのエクスポート', - ], - 'promo_block' => [ - 'name' => '販促ブロック', - 'list_title' => '販促ブロックリスト', - ], - 'component' => [ - - //Product components - 'product_page_name' => '製品ページ', - 'product_page_description' => '製品データをURL slugで取得します', - 'product_data_name' => '製品データ', - 'product_data_description' => '製品データをIDで取得します', - 'product_list_name' => '製品リスト', - 'product_list_description' => '製品リストを取得します', - - //Brand components - 'brand_page_name' => 'ブランドページ', - 'brand_page_description' => 'ブランドデータをURL slugで取得します', - 'brand_data_name' => 'ブランドデータ', - 'brand_data_description' => 'ブランドデータをIDで取得します', - 'brand_list_name' => 'ブランドリスト', - 'brand_list_description' => 'ブランドリストを取得します', - - //Promo block components - 'promo_block_page_name' => '販促ブロックページ', - 'promo_block_page_description' => '販促ブロックデータをURL slugで取得します', - 'promo_block_data_name' => '販促ブロックデータ', - 'promo_block_data_description' => '販促ブロックデータをIDで取得します', - 'promo_block_list_name' => '販促ブロックリスト', - 'promo_block_list_description' => '販促ブロックリストを取得します', - - //Category components - 'category_page_name' => 'カテゴリページ', - 'category_page_description' => 'カテゴリデータをURL slugで取得します', - 'category_data_name' => 'カテゴリデータ', - 'category_data_description' => 'カテゴリデータをIDで取得します', - 'category_list_name' => 'カテゴリリスト', - 'category_list_description' => 'カテゴリリストを取得します', - - //Common components - 'breadcrumbs_name' => 'パンくずリスト', - 'breadcrumbs_description' => 'カタログパンくずリストのためのデータを取得します', - - //Components settings - 'product_list_sorting' => 'デフォルトソート方法', - 'sorting_no' => 'ソートしない', - 'sorting_price_desc' => '価格高い順', - 'sorting_price_asc' => '価格安い順', - 'sorting_new' => '新しい順', - 'sorting_popularity_desc' => '人気順', - 'sorting_rating_desc' => '評価の高い順', - 'sorting_rating_asc' => '評価の低い順', - 'sorting_date_begin_asc' => '開始日早い順', - 'sorting_date_begin_desc' => '開始日遅い順', - 'sorting_date_end_asc' => '終了日早い順', - 'sorting_date_end_desc' => '終了日遅い順', - ], - 'permission' => [ - 'category' => 'カテゴリ管理', - 'brand' => 'ブランド管理', - 'product' => '製品管理', - 'settings' => '設定管理', - 'promo_block' => '販促ブロック管理', - ], - 'message' => [ - 'import_additional_category_info' => '追加の製品カテゴリはカンマ区切りで入力してください', - ], - 'button' => [ - 'import_offer_button' => 'オファーをCSVから読み込む', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/kk/lang.php b/plugins/lovata/shopaholic/lang/kk/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/kk/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/ko/lang.php b/plugins/lovata/shopaholic/lang/ko/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/ko/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/ky/lang.php b/plugins/lovata/shopaholic/lang/ky/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/ky/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/lt/lang.php b/plugins/lovata/shopaholic/lang/lt/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/lt/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/lv/lang.php b/plugins/lovata/shopaholic/lang/lv/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/lv/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/nb/lang.php b/plugins/lovata/shopaholic/lang/nb/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/nb/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/nl/lang.php b/plugins/lovata/shopaholic/lang/nl/lang.php deleted file mode 100644 index a1d55b1e8..000000000 --- a/plugins/lovata/shopaholic/lang/nl/lang.php +++ /dev/null @@ -1,179 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'allow_negative_offer_quantity' => 'Allow negative offer quantity', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/pl/lang.php b/plugins/lovata/shopaholic/lang/pl/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/pl/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/pt/lang.php b/plugins/lovata/shopaholic/lang/pt/lang.php deleted file mode 100644 index 5d8184154..000000000 --- a/plugins/lovata/shopaholic/lang/pt/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Baratos', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/ro/lang.php b/plugins/lovata/shopaholic/lang/ro/lang.php deleted file mode 100644 index dad5278fa..000000000 --- a/plugins/lovata/shopaholic/lang/ro/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => 'Plugin gratuit de comerț electronic cu un set mare de extensii.', - ], - 'field' => [ - 'vendor_code' => 'Cod furnizor', - 'price' => 'Pret', - 'old_price' => 'Pret Vechi', - 'quantity' => 'Cantitate', - 'brand' => 'Marca', - 'offer' => 'Oferte', - 'currency' => 'Valuta', - 'check_offer_active' => 'Când primiți o listă de produse active, verificați dacă există oferte active', - 'additional_category' => 'Categorii aditionale', - 'promo_block_type' => 'Bloc promotional cu listă de produse', - 'promo_block' => 'Bloc promotional', - 'product_id' => 'Id produs', - 'rate' => 'Taxa', - 'tax_is_global' => 'Taxa se va aplica tuturor produselor', - 'tax_percent' => 'Procentul de impozitare', - 'tax' => 'Taxa', - 'without_tax' => 'Fara taxa', - 'with_tax' => 'Cu taxa', - 'countries' => 'Tari', - 'states' => 'Judete', - 'main_price_type' => 'Pretul principal', - 'price_include_tax' => 'Pretul include taxe', - 'discount_price' => 'Pret redus', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categorii', - 'product' => 'Produse', - 'brands' => 'Branduri', - 'shop_catalog' => 'Catalog produse', - 'shop_category' => 'Categoria produsului', - 'all_shop_categories' => 'Toate categoriile produselor', - 'promo_block' => 'Blocuri promotionale', - 'promo' => 'Promotii', - 'price_type' => 'Tipuri preturi', - 'price_type_description' => 'Gestionați tipurile de pret', - 'currency' => 'Valuta', - 'currency_description' => 'Gestionati monedele', - 'tax' => 'Taxe', - 'tax_description' => 'Gestionati taxe', - 'configuration' => 'Catalog setari', - 'main_settings' => 'Setari de baza', - 'main_settings_description' => 'Setările de baza ale catalogului dvs.', - ], - 'tab' => [ - 'offer' => 'Oferte comerciale', - 'price' => 'Preturi', - 'permissions' => 'Shopaholic', - 'settings' => 'Configurare catalog', - 'taxes' => 'Taxe', - ], - 'category' => [ - 'name' => 'categorie', - 'list_title' => 'Lista categorii', - 'import_title' => 'Importeaza categorii', - 'export_title' => 'Exporteaza categorii', - ], - 'brand' => [ - 'name' => 'marca', - 'list_title' => 'Lista marci', - 'import_title' => 'Importeaza marci', - 'export_title' => 'Exporteaza marci', - ], - 'product' => [ - 'name' => 'produs', - 'list_title' => 'Lista produse', - 'import_title' => 'Importeaza produse', - 'export_title' => 'Exporteaza produse', - ], - 'offer' => [ - 'name' => 'oferta', - 'list_title' => 'Lista oferte', - 'import_title' => 'Importeaza oferte', - 'export_title' => 'Exporteaza oferte', - ], - 'promo_block' => [ - 'name' => 'bloc promotonal', - 'list_title' => 'Lista blocuri promotionale', - ], - 'price_type' => [ - 'name' => 'tip pret', - 'list_title' => 'Lista tipuri pret', - ], - 'currency' => [ - 'name' => 'valuta', - 'list_title' => 'Lista valuta', - ], - 'tax' => [ - 'name' => 'taxa', - 'list_title' => 'Lista taxe', - ], - 'country' => [ - 'name' => 'tara', - 'list_title' => 'Lista tari', - ], - 'state' => [ - 'name' => 'judet', - 'list_title' => 'Lista judete', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Pagina produs', - 'product_page_description' => 'Obțineti date pentru pagina produsului', - 'product_data_name' => 'Datele produselor', - 'product_data_description' => 'Obțineti date despre produs după ID', - 'product_list_name' => 'Lista produse', - 'product_list_description' => 'Obtineti lista de produse', - - //Brand components - 'brand_page_name' => 'Pagina marca', - 'brand_page_description' => 'Obtineti date pentru pagina marcii', - 'brand_data_name' => 'Data marci', - 'brand_data_description' => 'Obtineti date despre marca după ID', - 'brand_list_name' => 'Lista marcilor', - 'brand_list_description' => 'Obtineti lista de marci', - - //Promo block components - 'promo_block_page_name' => 'Pagina blocului promotional', - 'promo_block_page_description' => 'Obtineti date pentru pagina de bloc promotional', - 'promo_block_data_name' => 'Datele blocului promotional', - 'promo_block_data_description' => 'Obtineti date de blocare promotionala prin ID', - 'promo_block_list_name' => 'Lista blocurilor promotionale', - 'promo_block_list_description' => 'Obtineti lista de blocuri promotionale', - - //Category components - 'category_page_name' => 'Pagina categoriei', - 'category_page_description' => 'Obtineti date pentru pagina categoriei', - 'category_data_name' => 'Date de categorie', - 'category_data_description' => 'Obtineti date de categorie după ID', - 'category_list_name' => 'Lista categoriilor', - 'category_list_description' => 'Obtineti arborele categoriilor', - - //Currency components - 'currency_list_name' => 'Lista valute', - 'currency_list_description' => 'Descriere lista valute', - - //Common components - 'breadcrumbs_name' => 'Url-urile breadcrumbs', - 'breadcrumbs_description' => 'Gestioneaza data pentru catalog-ul url-urilor breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Sortare default', - 'sorting_no' => 'Fara sortare', - 'sorting_price_desc' => 'Scump', - 'sorting_price_asc' => 'Ieftin', - 'sorting_new' => 'Nou', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'Bine cotate', - 'sorting_rating_asc' => 'Prost cotate', - 'sorting_date_begin_asc' => 'Data de incepere (ASC)', - 'sorting_date_begin_desc' => 'Data de incepere (DESC)', - 'sorting_date_end_asc' => 'Data de sfarsit (ASC)', - 'sorting_date_end_desc' => 'Data de sfarsit (DESC)', - ], - 'permission' => [ - 'category' => 'Gestionați categorii', - 'brand' => 'Gestionați marci', - 'product' => 'Gestionați produse', - 'settings' => 'Gestionați setarile', - 'promo_block' => 'Gestionați blocurile promotionale', - 'currency' => 'Gestionați tipurile de valuta', - 'tax' => 'Gestionați tipurile de taxe', - 'price_type' => 'Gestionați tipurile de pret', - ], - 'message' => [ - 'import_additional_category_info' => 'Setati lista de categorii de produse suplimentare separate prin virgule.', - ], - 'button' => [ - 'import_offer_button' => 'Importeaza oferte din fiser CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/ru/lang.php b/plugins/lovata/shopaholic/lang/ru/lang.php deleted file mode 100644 index 359416798..000000000 --- a/plugins/lovata/shopaholic/lang/ru/lang.php +++ /dev/null @@ -1,221 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Бесплатный eCommerce-плагин с большим набором расширений.', - ], - 'field' => [ - 'vendor_code' => 'Артикул', - 'price' => 'Цена', - 'old_price' => 'Старая цена', - 'quantity' => 'Количество', - 'brand' => 'Бренд', - 'offer' => 'Товарные предложения', - 'currency' => 'Валюта', - 'check_offer_active' => 'Проверять наличие активных торговых предложений при получении списка активных товаров.', - 'allow_negative_offer_quantity' => 'Разрешить отрицательное количество предложений', - 'additional_category' => 'Дополнительные категории', - 'promo_block_type' => 'Промо-блок со списком товаров', - 'promo_block' => 'Промо-блок', - 'product_id' => 'ID товара', - 'rate' => 'Курс', - 'tax_is_global' => 'Налог будет применяться ко всем товарам', - 'tax_percent' => 'Процент налога', - 'tax' => 'Налог', - 'without_tax' => 'Без налога', - 'with_tax' => 'С налогом', - 'countries' => 'Страны', - 'states' => 'Регионы', - 'main_price_type' => 'Основная цена', - 'price_include_tax' => 'Цена включает в себя налоги', - 'discount_price' => 'Значение скидки', - 'measure' => 'Ед. измерения', - 'measure_of_unit' => 'Ед. измерения одной штуки', - 'quantity_in_unit' => 'Количество в одной штуке', - 'weight_measure' => 'Ед. измерения веса', - - 'hide_brand_import_from_csv' => 'Скрыть кнопку "Импорт из CSV" для брендов', - 'hide_brand_import_from_xml' => 'Скрыть кнопку "Импорт из XML" для брендов', - 'hide_category_import_from_csv' => 'Скрыть кнопку "Импорт из CSV" для категорий', - 'hide_category_import_from_xml' => 'Скрыть кнопку "Импорт из XML" для категорий', - 'hide_product_import_from_csv' => 'Скрыть кнопку "Импорт из CSV" для товаров', - 'hide_product_import_from_xml' => 'Скрыть кнопку "Импорт из XML" для товаров', - 'hide_offer_import_from_csv' => 'Скрыть кнопку "Импорт из CSV" для товарных предложений', - 'hide_offer_import_from_xml' => 'Скрыть кнопку "Импорт из XML" для товарных предложений', - 'hide_price_import_from_xml' => 'Скрыть кнопку "Импорт из XML" для цен', - ], - 'settings' => [ - 'formula_calculate_discount_from_price' => 'Формула подсчета скидки для цен с налогами', - 'formula_calculation_from_backend_price' => 'Скидка вычитается из заданной цены (по-умолчанию)', - 'formula_calculation_from_price_without_tax' => 'Скидка вычитается из цены без налога', - 'formula_calculation_from_price_with_tax' => 'Скидка вычитается из цены с налогом', - ], - 'menu' => [ - 'main' => 'Каталог', - 'categories' => 'Категории', - 'product' => 'Товары', - 'brands' => 'Бренды', - 'shop_catalog' => 'Каталог товаров', - 'shop_category' => 'Категория товаров', - 'all_shop_categories' => 'Все категории товаров', - 'promo_block' => 'Промо-блоки', - 'promo' => 'Промо-акции', - 'price_type' => 'Типы цен', - 'price_type_description' => 'Управление типами цен', - 'currency' => 'Валюта', - 'currency_description' => 'Управление валютами', - 'tax' => 'Налоги', - 'tax_description' => 'Управление налогами', - 'configuration' => 'Настройки каталога', - 'main_settings' => 'Основные параметры', - 'main_settings_description' => 'Основные параметры вашего каталога', - 'import_xml_file' => 'Импорт из XML', - 'import_xml_file_description' => 'Настройки импорта из XML файла', - 'measure' => 'Единицы измерения', - 'measure_description' => 'Управление единицами измерения', - 'measure_of_unit' => 'Ед. измерения одной штуки', - 'quantity_in_unit' => 'Количество в одной штуке', - ], - 'tab' => [ - 'offer' => 'Торговые предложения', - 'price' => 'Цены', - 'permissions' => 'Shopaholic', - 'settings' => 'Конфигурация каталога', - 'taxes' => 'Налоги', - 'import_from_xml' => 'Импорт из XML', - 'dimensions' => 'Габариты и вес', - ], - 'category' => [ - 'name' => 'категории', - 'list_title' => 'Список категорий', - 'import_title' => 'Импорт категорий', - 'export_title' => 'Экспорт категорий', - ], - 'brand' => [ - 'name' => 'бренда', - 'list_title' => 'Список брендов', - 'import_title' => 'Импорт брендов', - 'export_title' => 'Экспорт брендов', - ], - 'product' => [ - 'name' => 'товара', - 'list_title' => 'Список товаров', - 'import_title' => 'Импорт товаров', - 'export_title' => 'Экспорт товаров', - ], - 'offer' => [ - 'name' => 'торгового предложения', - 'list_title' => 'Список торговых предложений', - 'import_title' => 'Импорт торговых предложений', - 'export_title' => 'Экспорт торговых предложений', - ], - 'promo_block' => [ - 'name' => 'промо-блока', - 'list_title' => 'Список промо-блоков', - ], - 'price_type' => [ - 'name' => 'типа цен', - 'list_title' => 'Список типов цен', - ], - 'currency' => [ - 'name' => 'валюты', - 'list_title' => 'Список валют', - ], - 'tax' => [ - 'name' => 'налога', - 'list_title' => 'Список налогов', - ], - 'country' => [ - 'name' => 'страны', - 'list_title' => 'Список стран', - ], - 'state' => [ - 'name' => 'региона', - 'list_title' => 'Список регионов', - ], - 'measure' => [ - 'name' => 'ед. измерения', - 'list_title' => 'Список ед. измерения', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Страница товара', - 'product_page_description' => 'Получить данные для страницы товара', - 'product_data_name' => 'Данные товара', - 'product_data_description' => 'Получить данные товара по ID', - 'product_list_name' => 'Список товаров', - 'product_list_description' => 'Получить список товаров', - - //Brand components - 'brand_page_name' => 'Страница бренда', - 'brand_page_description' => 'Получить данные для страницы бренда', - 'brand_data_name' => 'Данные бренда', - 'brand_data_description' => 'Получить данные бренда по ID', - 'brand_list_name' => 'Список брендов', - 'brand_list_description' => 'Получить список брендов', - - //Promo block components - 'promo_block_page_name' => 'Страница промо-блока', - 'promo_block_page_description' => 'Получить данные для страницы промо-блока', - 'promo_block_data_name' => 'Данные промо-блока', - 'promo_block_data_description' => 'Получить данные промо-блока по ID', - 'promo_block_list_name' => 'Список промо-блоков', - 'promo_block_list_description' => 'Получить список промо-блоков', - - //Category components - 'category_page_name' => 'Страница категории', - 'category_page_description' => 'Получить данные для страницы категории', - 'category_data_name' => 'Данные категории', - 'category_data_description' => 'Получить данные категории по ID', - 'category_list_name' => 'Список категорий', - 'category_list_description' => 'Получить дерево категорий', - - //Currency components - 'currency_list_name' => 'Список валют', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Хлебные крошки', - 'breadcrumbs_description' => 'Получить данные для формирования хлебных крошек каталога', - - //Components settings - 'product_list_sorting' => 'Сортировка по умолчанию', - 'sorting_no' => 'Без сортировки', - 'sorting_price_desc' => 'Дорогие', - 'sorting_price_asc' => 'Дешёвые', - 'sorting_new' => 'Новые', - 'sorting_popularity_desc' => 'Популярные', - 'sorting_rating_desc' => 'Высокий рейтинг', - 'sorting_rating_asc' => 'Низкий рейтинг', - 'sorting_date_begin_asc' => 'Дата начала (ASC)', - 'sorting_date_begin_desc' => 'Дата начала (DESC)', - 'sorting_date_end_asc' => 'Дата окончания (ASC)', - 'sorting_date_end_desc' => 'Дата окончания (DESC)', - ], - 'permission' => [ - 'category' => 'Управление категориями', - 'brand' => 'Управление брендами', - 'product' => 'Управление товарами', - 'settings' => 'Управление настройками', - 'promo_block' => 'Управление промо-блоками', - 'currency' => 'Управление валютами', - 'tax' => 'Управление налогами', - 'price_type' => 'Управление типами цен', - 'import_xml_file' => 'Управление настройками импорта из XML файла', - 'measure' => 'Управление ед. измерения', - ], - 'message' => [ - 'import_additional_category_info' => 'Укажите через запятую список дополнительных категорий товаров.', - 'import_from_xml_files_is_disabled' => 'Импорт из XML файлов отключен.', - 'import_from_xml_info' => '

    Вы можите использовать синтаксис XPath для задания пути к элементам.

    ', - ], - 'button' => [ - 'import_offer_button' => 'Импортировать предложения из CSV', - 'import_offer_from_xml' => 'Импортировать предложения из XML', - 'import_price_from_xml' => 'Импортировать цены из XML', - ], - 'widget' => [ - 'import_from_xml_files' => 'Импорт из XML файла', - 'import_from_csv_files' => 'Импорт из CSV файла', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/sk/lang.php b/plugins/lovata/shopaholic/lang/sk/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/sk/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/sv/lang.php b/plugins/lovata/shopaholic/lang/sv/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/sv/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/tr/lang.php b/plugins/lovata/shopaholic/lang/tr/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/tr/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/uk/lang.php b/plugins/lovata/shopaholic/lang/uk/lang.php deleted file mode 100644 index a6c6d327a..000000000 --- a/plugins/lovata/shopaholic/lang/uk/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Безкоштовний eCommerce-плагін з великим набором розширень.', - ], - 'field' => [ - 'vendor_code' => 'Артикул', - 'price' => 'Ціна', - 'old_price' => 'Стара ціна', - 'quantity' => 'Кількість', - 'brand' => 'Бренд', - 'offer' => 'Торгові пропозиції', - 'currency' => 'Валюта', - 'check_offer_active' => 'Перевіряти наявність активних пропозицій при отриманні списку активних товарів', - 'additional_category' => 'Додаткові категорії', - 'promo_block_type' => 'Промо-блок зі списком товарів', - 'promo_block' => 'Промо-блок', - 'product_id' => 'ID товару', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Каталог', - 'categories' => 'Категорії', - 'product' => 'Товари', - 'brands' => 'Бренди', - 'shop_catalog' => 'Каталог товарів', - 'shop_category' => 'Категорія товарів', - 'all_shop_categories' => 'Всі категорії товарів', - 'promo_block' => 'Промо-блоки', - 'promo' => 'Промо-акції', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Торгові пропозиції', - 'price' => 'Ціни', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'категорії', - 'list_title' => 'Список категорій', - 'import_title' => 'Імпорт категорій', - 'export_title' => 'Експорт категорій', - ], - 'brand' => [ - 'name' => 'бренду', - 'list_title' => 'Список брендів', - 'import_title' => 'Імпорт брендів', - 'export_title' => 'Експорт брендів', - ], - 'product' => [ - 'name' => 'товару', - 'list_title' => 'Список товарів', - 'import_title' => 'Імпорт товарів', - 'export_title' => 'Експорт товарів', - ], - 'offer' => [ - 'name' => 'торгової пропозиції', - 'list_title' => 'Список торгових пропозицій', - 'import_title' => 'Імпорт торгових пропозицій', - 'export_title' => 'Експорт торгових пропозицій', - ], - 'promo_block' => [ - 'name' => 'промо-блоку', - 'list_title' => 'Список промо-блоків', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Сторінка товару', - 'product_page_description' => 'Отримати дані для сторінки товару', - 'product_data_name' => 'Дані товару', - 'product_data_description' => 'Отримати дані товару по ID', - 'product_list_name' => 'Список товарів', - 'product_list_description' => 'Отримати список товарів', - - //Brand components - 'brand_page_name' => 'Сторінка бренда', - 'brand_page_description' => 'Отримати дані для сторінки бренда', - 'brand_data_name' => 'Дані бренда', - 'brand_data_description' => 'Отримати дані бренду за ID', - 'brand_list_name' => 'Список брендів', - 'brand_list_description' => 'Отримати список брендів', - - //Promo block components - 'promo_block_page_name' => 'Сторінка промо-блоку', - 'promo_block_page_description' => 'Отримати дані для сторінки промо-блоку', - 'promo_block_data_name' => 'Дані промо-блоку', - 'promo_block_data_description' => 'Отримати дані промо-блоку за ID', - 'promo_block_list_name' => 'Список промо-блоків', - 'promo_block_list_description' => 'Отримати список промо-блоків', - - //Category components - 'category_page_name' => 'Сторінка категорії', - 'category_page_description' => 'Отримати дані для сторінки категорії', - 'category_data_name' => 'Дані категорії', - 'category_data_description' => 'Отримати дані категорії по ID', - 'category_list_name' => 'Список категорій', - 'category_list_description' => 'Отримати дерево категорій', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Хлібні крихти', - 'breadcrumbs_description' => 'Отримати дані для формування хлібних крихт каталогу', - - //Components settings - 'product_list_sorting' => 'Сортування за замовчуванням', - 'sorting_no' => 'Без сортування', - 'sorting_price_desc' => 'Дорогі', - 'sorting_price_asc' => 'Дешеві', - 'sorting_new' => 'Нові', - 'sorting_popularity_desc' => 'Популярні', - 'sorting_rating_desc' => 'Високий рейтинг', - 'sorting_rating_asc' => 'Низький рейтинг', - 'sorting_date_begin_asc' => 'Дата початку (ASC)', - 'sorting_date_begin_desc' => 'Дата початку (DESC)', - 'sorting_date_end_asc' => 'Дата завершення (ASC)', - 'sorting_date_end_desc' => 'Дата завершення (DESC)', - ], - 'permission' => [ - 'category' => 'Управління категоріями', - 'brand' => 'Управління брендами', - 'product' => 'Управління товарами', - 'settings' => 'Управління налаштуваннями', - 'promo_block' => 'Управління промо-блоками', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Вкажіть через кому список додаткових категорій товарів.', - ], - 'button' => [ - 'import_offer_button' => 'Імпортувати пропозиції з CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/vi/lang.php b/plugins/lovata/shopaholic/lang/vi/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/vi/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/lang/zh/lang.php b/plugins/lovata/shopaholic/lang/zh/lang.php deleted file mode 100644 index ca3031f60..000000000 --- a/plugins/lovata/shopaholic/lang/zh/lang.php +++ /dev/null @@ -1,178 +0,0 @@ - [ - 'name' => 'Shopaholic', - 'description' => '🛍️ Free eCommerce plugin with a large set of extensions.', - ], - 'field' => [ - 'vendor_code' => 'Vendor code', - 'price' => 'Price', - 'old_price' => 'Old price', - 'quantity' => 'Quantity', - 'brand' => 'Brand', - 'offer' => 'Offers', - 'currency' => 'Currency', - 'check_offer_active' => 'When you receive a list of active products, check for active offers', - 'additional_category' => 'Additional categories', - 'promo_block_type' => 'Promo block with product list', - 'promo_block' => 'Promo block', - 'product_id' => 'Product ID', - 'rate' => 'Rate', - 'tax_is_global' => 'Tax will apply to all products', - 'tax_percent' => 'Tax percent', - 'tax' => 'Tax', - 'without_tax' => 'Without tax', - 'with_tax' => 'With tax', - 'countries' => 'Countries', - 'states' => 'States', - 'main_price_type' => 'Main price', - 'price_include_tax' => 'Price includes taxes', - 'discount_price' => 'Discount price', - ], - 'menu' => [ - 'main' => 'Catalog', - 'categories' => 'Categories', - 'product' => 'Products', - 'brands' => 'Brands', - 'shop_catalog' => 'Product catalog', - 'shop_category' => 'Product category', - 'all_shop_categories' => 'All categories of products', - 'promo_block' => 'Promo blocks', - 'promo' => 'Promotions', - 'price_type' => 'Price types', - 'price_type_description' => 'Manage price types', - 'currency' => 'Currency', - 'currency_description' => 'Manage currencies', - 'tax' => 'Taxes', - 'tax_description' => 'Manage taxes', - 'configuration' => 'Catalog settings', - 'main_settings' => 'Basic settings', - 'main_settings_description' => 'Basic settings of your catalog', - ], - 'tab' => [ - 'offer' => 'Trade offers', - 'price' => 'Prices', - 'permissions' => 'Shopaholic', - 'settings' => 'Catalog configuration', - 'taxes' => 'Taxes', - ], - 'category' => [ - 'name' => 'category', - 'list_title' => 'Category list', - 'import_title' => 'Import categories', - 'export_title' => 'Export categories', - ], - 'brand' => [ - 'name' => 'brand', - 'list_title' => 'Brand list', - 'import_title' => 'Import brands', - 'export_title' => 'Export brands', - ], - 'product' => [ - 'name' => 'product', - 'list_title' => 'Product list', - 'import_title' => 'Import products', - 'export_title' => 'Export products', - ], - 'offer' => [ - 'name' => 'offer', - 'list_title' => 'Offer list', - 'import_title' => 'Import offers', - 'export_title' => 'Export offers', - ], - 'promo_block' => [ - 'name' => 'promo block', - 'list_title' => 'Promo block list', - ], - 'price_type' => [ - 'name' => 'price type', - 'list_title' => 'Price type list', - ], - 'currency' => [ - 'name' => 'currency', - 'list_title' => 'Currency list', - ], - 'tax' => [ - 'name' => 'tax', - 'list_title' => 'Tax list', - ], - 'country' => [ - 'name' => 'country', - 'list_title' => 'Country list', - ], - 'state' => [ - 'name' => 'state', - 'list_title' => 'State list', - ], - 'component' => [ - - //Product components - 'product_page_name' => 'Product page', - 'product_page_description' => 'Get data for product page', - 'product_data_name' => 'Product data', - 'product_data_description' => 'Get product data by ID', - 'product_list_name' => 'Product list', - 'product_list_description' => 'Get product list', - - //Brand components - 'brand_page_name' => 'Brand page', - 'brand_page_description' => 'Get data for brand page', - 'brand_data_name' => 'Brand data', - 'brand_data_description' => 'Get brand data by ID', - 'brand_list_name' => 'Brand list', - 'brand_list_description' => 'Get brand list', - - //Promo block components - 'promo_block_page_name' => 'Promo block page', - 'promo_block_page_description' => 'Get data for promo block page', - 'promo_block_data_name' => 'Promo block data', - 'promo_block_data_description' => 'Get promo block data by ID', - 'promo_block_list_name' => 'Promo block list', - 'promo_block_list_description' => 'Get promo block list', - - //Category components - 'category_page_name' => 'Category page', - 'category_page_description' => 'Get data for category page', - 'category_data_name' => 'Category data', - 'category_data_description' => 'Get category data by ID', - 'category_list_name' => 'Category list', - 'category_list_description' => 'Get category tree', - - //Currency components - 'currency_list_name' => 'Currency list', - 'currency_list_description' => '', - - //Common components - 'breadcrumbs_name' => 'Breadcrumbs', - 'breadcrumbs_description' => 'Get data for catalog breadcrumbs', - - //Components settings - 'product_list_sorting' => 'Default sorting', - 'sorting_no' => 'Without sorting', - 'sorting_price_desc' => 'Expensive', - 'sorting_price_asc' => 'Cheap', - 'sorting_new' => 'New', - 'sorting_popularity_desc' => 'Popular', - 'sorting_rating_desc' => 'High rating', - 'sorting_rating_asc' => 'Low rating', - 'sorting_date_begin_asc' => 'Date begin (ASC)', - 'sorting_date_begin_desc' => 'Date begin (DESC)', - 'sorting_date_end_asc' => 'Date end (ASC)', - 'sorting_date_end_desc' => 'Date end (DESC)', - ], - 'permission' => [ - 'category' => 'Manage categories', - 'brand' => 'Manage brands', - 'product' => 'Manage products', - 'settings' => 'Manage settings', - 'promo_block' => 'Manage promo blocks', - 'currency' => 'Manage currencies', - 'tax' => 'Manage taxes', - 'price_type' => 'Manage price types', - ], - 'message' => [ - 'import_additional_category_info' => 'Set the list of additional product categories separated by commas.', - ], - 'button' => [ - 'import_offer_button' => 'Import offers from CSV', - ], -]; diff --git a/plugins/lovata/shopaholic/models/Brand.php b/plugins/lovata/shopaholic/models/Brand.php deleted file mode 100644 index 8bf1f3841..000000000 --- a/plugins/lovata/shopaholic/models/Brand.php +++ /dev/null @@ -1,173 +0,0 @@ - 'required', - 'slug' => 'required|unique:lovata_shopaholic_brands', - ]; - - public $attributeNames = [ - 'name' => 'lovata.toolbox::lang.field.name', - 'slug' => 'lovata.toolbox::lang.field.slug', - ]; - - public $slugs = ['slug' => 'name']; - - public $attachOne = [ - 'preview_image' => 'System\Models\File', - 'icon' => 'System\Models\File', - 'import_file' => [\System\Models\File::class, 'public' => false], - ]; - public $attachMany = ['images' => 'System\Models\File']; - public $hasMany = ['product' => Product::class]; - public $belongsToMany = []; - public $morphMany = []; - public $belongsTo = []; - - public $dates = ['created_at', 'updated_at']; - - public $appends = []; - public $purgeable = []; - - public $fillable = [ - 'active', - 'name', - 'slug', - 'code', - 'external_id', - 'preview_text', - 'description', - ]; - - public $cached = [ - 'id', - 'name', - 'slug', - 'code', - 'preview_text', - 'preview_image', - 'icon', - 'description', - 'images', - ]; - - public $visible = []; - public $hidden = []; - - /** - * Before validate event handler - */ - public function beforeValidate() - { - if (empty($this->slug)) { - $this->slugAttributes(); - } - } - - /** - * Import item list from CSV file - * @param array $arElementList - * @param null $sSessionKey - * @throws \Throwable - */ - public function importData($arElementList, $sSessionKey = null) - { - if (empty($arElementList)) { - return; - } - - $obImport = new ImportBrandModelFromCSV(); - $obImport->setDeactivateFlag(); - - foreach ($arElementList as $iKey => $arImportData) { - $obImport->import($arImportData); - $sResultMethod = $obImport->getResultMethod(); - if (in_array($sResultMethod, ['logUpdated', 'logCreated'])) { - $this->$sResultMethod(); - } else { - $sErrorMessage = $obImport->getResultError(); - $this->$sResultMethod($iKey, $sErrorMessage); - } - } - - $obImport->deactivateElements(); - } -} diff --git a/plugins/lovata/shopaholic/models/Category.php b/plugins/lovata/shopaholic/models/Category.php deleted file mode 100644 index 555f7b2d1..000000000 --- a/plugins/lovata/shopaholic/models/Category.php +++ /dev/null @@ -1,217 +0,0 @@ - 'required', - 'slug' => 'required|unique:lovata_shopaholic_categories', - ]; - - public $attributeNames = [ - 'name' => 'lovata.toolbox::lang.field.name', - 'slug' => 'lovata.toolbox::lang.field.slug', - ]; - - public $slugs = ['slug' => 'name']; - - public $attachOne = [ - 'preview_image' => 'System\Models\File', - 'icon' => 'System\Models\File', - 'import_file' => [\System\Models\File::class, 'public' => false], - ]; - public $attachMany = ['images' => 'System\Models\File']; - - public $belongsTo = []; - public $belongsToMany = [ - 'product_link' => [ - Product::class, - 'table' => 'lovata_shopaholic_additional_categories', - ], - ]; - public $hasMany = ['product' => Product::class]; - - public $appends = []; - public $purgeable = []; - public $fillable = [ - 'active', - 'name', - 'slug', - 'code', - 'external_id', - 'preview_text', - 'description', - ]; - - public $cached = [ - 'id', - 'name', - 'slug', - 'code', - 'preview_text', - 'description', - 'parent_id', - 'preview_image', - 'icon', - 'images', - 'updated_at', - ]; - - public $dates = ['created_at', 'updated_at']; - public $casts = []; - - public $visible = []; - public $hidden = []; - - /** - * Before validate event handler - */ - public function beforeValidate() - { - if (empty($this->slug)) { - $this->slugAttributes(); - } - } - - /** - * Get by parent ID - * @param Category $obQuery - * @param string $sData - * @return Category - */ - public function scopeGetByParentID($obQuery, $sData) - { - return $obQuery->where('parent_id', $sData); - } - - /** - * Import item list from CSV file - * @param array $arElementList - * @param null $sSessionKey - * @throws \Throwable - */ - public function importData($arElementList, $sSessionKey = null) - { - if (empty($arElementList)) { - return; - } - - $obImport = new ImportCategoryModelFromCSV(); - $obImport->setDeactivateFlag(); - - foreach ($arElementList as $iKey => $arImportData) { - $obImport->import($arImportData); - $sResultMethod = $obImport->getResultMethod(); - if (in_array($sResultMethod, ['logUpdated', 'logCreated'])) { - $this->$sResultMethod(); - } else { - $sErrorMessage = $obImport->getResultError(); - $this->$sResultMethod($iKey, $sErrorMessage); - } - } - - $obImport->deactivateElements(); - } -} diff --git a/plugins/lovata/shopaholic/models/Currency.php b/plugins/lovata/shopaholic/models/Currency.php deleted file mode 100644 index 744c9909f..000000000 --- a/plugins/lovata/shopaholic/models/Currency.php +++ /dev/null @@ -1,162 +0,0 @@ - 'required', - 'symbol' => 'required', - 'code' => 'required|unique:lovata_shopaholic_currency', - ]; - - public $attributeNames = [ - 'name' => 'lovata.toolbox::lang.field.name', - 'code' => 'lovata.toolbox::lang.field.code', - 'symbol' => 'lovata.shopaholic::lang.field.currency_symbol', - ]; - - public $attachOne = []; - public $attachMany = []; - public $hasMany = []; - public $belongsTo = []; - public $belongsToMany = []; - public $morphMany = []; - - public $dates = ['created_at', 'updated_at', 'deleted_at']; - - public $appends = []; - public $purgeable = []; - - public $fillable = [ - 'active', - 'is_default', - 'name', - 'code', - 'symbol', - 'rate', - 'external_id', - 'sort_order', - ]; - - public $cached = [ - 'id', - 'is_default', - 'name', - 'code', - 'rate', - 'symbol', - ]; - - public $visible = []; - public $hidden = []; - - /** - * Check, currency is active - * @return bool - */ - public function isActive() - { - $bResult = $this->code == CurrencyHelper::instance()->getActiveCurrencyCode(); - - return $bResult; - } - - /** - * After save model event - */ - public function afterSave() - { - if ($this->is_default && !$this->getOriginal('is_default')) { - $this->disableDefaultCurrency(); - } - } - - /** - * Get element with is_default flag == true - * @param Currency $obQuery - * @return Currency - */ - public function scopeIsDefault($obQuery) - { - return $obQuery->where('is_default', true); - } - - /** - * Set rate attribute - * @param string $sValue - */ - protected function setRateAttribute($sValue) - { - $this->attributes['rate'] = PriceHelper::toFloat($sValue); - } - - /** - * Disable default currency, because only one can be an active currency - */ - protected function disableDefaultCurrency() - { - $obCurrencyList = Currency::isDefault()->get(); - if ($obCurrencyList->isEmpty()) { - return; - } - - /** @var Currency $obCurrency */ - foreach ($obCurrencyList as $obCurrency) { - if ($obCurrency->id == $this->id) { - continue; - } - - $obCurrency->is_default = false; - $obCurrency->save(); - } - } -} diff --git a/plugins/lovata/shopaholic/models/Measure.php b/plugins/lovata/shopaholic/models/Measure.php deleted file mode 100644 index 809e1154b..000000000 --- a/plugins/lovata/shopaholic/models/Measure.php +++ /dev/null @@ -1,59 +0,0 @@ - 'required', - ]; - - public $attributeNames = [ - 'name' => 'lovata.toolbox::lang.field.name', - ]; - - public $dates = ['created_at', 'updated_at']; - - public $hasMany = []; - - public $fillable = [ - 'name', - 'code', - ]; - - public $cached = [ - 'id', - 'name', - 'code', - ]; -} diff --git a/plugins/lovata/shopaholic/models/Offer.php b/plugins/lovata/shopaholic/models/Offer.php deleted file mode 100644 index 400166742..000000000 --- a/plugins/lovata/shopaholic/models/Offer.php +++ /dev/null @@ -1,598 +0,0 @@ - 'required']; - - public $attributeNames = [ - 'name' => 'lovata.toolbox::lang.field.name', - ]; - - public $attachOne = [ - 'preview_image' => 'System\Models\File', - 'import_file' => [\System\Models\File::class, 'public' => false], - ]; - public $attachMany = ['images' => 'System\Models\File']; - public $belongsTo = [ - 'product' => [Product::class], - 'measure_of_unit' => [Measure::class, 'key' => 'measure_of_unit_id', 'order' => 'name asc'], - 'measure' => [Measure::class, 'order' => 'name asc'], - ]; - public $morphMany = [ - 'price_link' => [ - Price::class, - 'name' => 'item', - 'conditions' => 'price_type_id is NOT NULL', - ], - ]; - public $morphOne = [ - 'main_price' => [ - Price::class, - 'name' => 'item', - 'conditions' => 'price_type_id is NULL', - ], - ]; - public $belongsToMany = []; - - public $fillable = [ - 'active', - 'name', - 'code', - 'product_id', - 'external_id', - 'price', - 'old_price', - 'price_list', - 'quantity', - 'preview_text', - 'description', - 'weight', - 'height', - 'length', - 'width', - 'measure_of_unit_id', - 'measure_id', - 'quantity_in_unit', - ]; - - public $cached = [ - 'id', - 'active', - 'product_id', - 'name', - 'code', - 'preview_text', - 'preview_image', - 'description', - 'images', - 'price_list', - 'quantity', - 'weight', - 'height', - 'length', - 'width', - 'measure_of_unit_id', - 'measure_id', - 'quantity_in_unit', - ]; - - public $dates = ['created_at', 'updated_at', 'deleted_at']; - public $appends = [ - 'price', - 'price_value', - 'old_price', - 'old_price_value', - 'discount_price', - 'discount_price_value', - 'price_list', - ]; - public $purgeable = []; - public $casts = []; - - public $arPriceField = ['price', 'old_price', 'discount_price']; - - public $visible = []; - public $hidden = []; - - protected $fSavedPrice = null; - protected $fSavedOldPrice = null; - protected $arSavedPriceList = []; - protected $iActivePriceType = null; - protected $sActiveCurrency = null; - - /** - * Set active price type - * @param int $iPriceTypeID - * @return Offer - */ - public function setActivePriceType($iPriceTypeID) - { - $this->iActivePriceType = $iPriceTypeID; - - return $this; - } - - /** - * Set active currency code - * @param string $sActiveCurrencyCode - * @return Offer - */ - public function setActiveCurrency($sActiveCurrencyCode) - { - $this->sActiveCurrency = $sActiveCurrencyCode; - - return $this; - } - - /** - * Get price object - * @param int $iPriceTypeID - * @return \Illuminate\Database\Eloquent\Model|Price|null - */ - public function getPriceObject($iPriceTypeID = null) - { - if (empty($iPriceTypeID)) { - $obPriceModel = $this->main_price; - } else { - $obPriceModel = $this->price_link->where('price_type_id', $iPriceTypeID)->first(); - } - - return $obPriceModel; - } - - /** - * After save model event - */ - public function afterSave() - { - $this->savePriceValue(null, $this->fSavedPrice, $this->fSavedOldPrice); - $this->savePriceListValue(); - - //Clear relations with old prices and saved values - $this->reloadRelations('main_price'); - $this->reloadRelations('price_link'); - $this->fSavedPrice = null; - $this->fSavedOldPrice = null; - } - - /** - * Get element by product ID - * @param Offer $obQuery - * @param string $sData - * - * @return Offer - */ - public function scopeGetByProduct($obQuery, $sData) - { - if (!empty($sData)) { - $obQuery->where('product_id', $sData); - } - - return $obQuery; - } - - /** - * Get by quantity - * @param Offer $obQuery - * @param string $sData - * @param string $sCondition - * - * @return Offer - */ - public function scopeGetByQuantity($obQuery, $sData, $sCondition = '=') - { - if (empty($sData)) { - $sData = 0; - } - - if (!empty($sCondition)) { - $obQuery->where('quantity', $sCondition, $sData); - } - - return $obQuery; - } - - /** - * Import item list from CSV file - * @param array $arElementList - * @param null $sSessionKey - * @throws \Throwable - */ - public function importData($arElementList, $sSessionKey = null) - { - if (empty($arElementList)) { - return; - } - - $obImport = new ImportOfferModelFromCSV(); - $obImport->setDeactivateFlag(); - - foreach ($arElementList as $iKey => $arImportData) { - $obImport->import($arImportData); - $sResultMethod = $obImport->getResultMethod(); - if (in_array($sResultMethod, ['logUpdated', 'logCreated'])) { - $this->$sResultMethod(); - } else { - $sErrorMessage = $obImport->getResultError(); - $this->$sResultMethod($iKey, $sErrorMessage); - } - } - - $obImport->deactivateElements(); - } - - /** - * Get active price type - * @return int|null - */ - public function getActivePriceType() - { - return $this->iActivePriceType; - } - - /** - * Get active currency code - * @return int|null - */ - public function getActiveCurrency() - { - return $this->sActiveCurrency; - } - - /** - * Get price_value attribute - * @return float - */ - protected function getPriceValueAttribute() - { - if ($this->fSavedPrice !== null) { - $fPrice = $this->fSavedPrice; - } else { - $obPriceModel = $this->getPriceObject($this->getActivePriceType()); - $this->setActivePriceType(null); - - if (empty($obPriceModel)) { - return 0; - } - - $fPrice = $obPriceModel->price_value; - } - - $fPrice = CurrencyHelper::instance()->convert($fPrice, $this->getActiveCurrency()); - - return $fPrice; - } - - /** - * Get old_price_value attribute - * @return float - */ - protected function getOldPriceValueAttribute() - { - if ($this->fSavedOldPrice !== null) { - $fPrice = $this->fSavedOldPrice; - } else { - $obPriceModel = $this->getPriceObject($this->getActivePriceType()); - $this->setActivePriceType(null); - - if (empty($obPriceModel)) { - return 0; - } - - $fPrice = $obPriceModel->old_price_value; - } - - $fPrice = CurrencyHelper::instance()->convert($fPrice, $this->getActiveCurrency()); - $this->setActiveCurrency(null); - - return $fPrice; - } - - /** - * Get discount_price_value attribute - * @return float - */ - protected function getDiscountPriceValueAttribute() - { - $obPriceModel = $this->getPriceObject($this->getActivePriceType()); - $this->setActivePriceType(null); - - if (empty($obPriceModel)) { - return 0; - } - - $fPrice = $obPriceModel->discount_price_value; - $fPrice = CurrencyHelper::instance()->convert($fPrice, $this->getActiveCurrency()); - - return $fPrice; - } - - /** - * Get price_list attribute - * @return array - */ - protected function getPriceListAttribute() - { - $arResult = []; - - foreach ($this->price_link as $obPrice) { - $arResult[$obPrice->price_type_id] = [ - 'price' => $obPrice->price_value, - 'old_price' => $obPrice->old_price_value, - ]; - } - - return $arResult; - } - - /** - * Set price attribute - * Create or update Price model object - * @param string|float $sValue - */ - protected function setPriceAttribute($sValue) - { - $this->fSavedPrice = PriceHelper::toFloat($sValue); - } - - /** - * Set old price attribute - * Create or update Price model object - * @param string|float $sValue - */ - protected function setOldPriceAttribute($sValue) - { - $this->fSavedOldPrice = PriceHelper::toFloat($sValue); - } - - /** - * Set price list attribute - * Create or update Price model object - * @param string|float $arPriceList - */ - protected function setPriceListAttribute($arPriceList) - { - if (empty($arPriceList) || !is_array($arPriceList)) { - return; - } - - if (isset($arPriceList[0])) { - $this->fSavedPrice = PriceHelper::toFloat(array_get($arPriceList[0], 'price')); - $this->fSavedOldPrice = PriceHelper::toFloat(array_get($arPriceList[0], 'old_price')); - unset($arPriceList[0]); - } - - $this->arSavedPriceList = $arPriceList; - } - - /** - * Get tax_percent attribute value - * @return float - */ - protected function getTaxPercentAttribute() - { - $obOfferItem = OfferItem::make($this->id, $this); - - return $obOfferItem->tax_percent; - } - - /** - * Set quantity attribute value - * @param int $iQuantity - */ - protected function setQuantityAttribute($iQuantity) - { - $bAllowNegativeOfferQuantity = (bool) Settings::getValue('allow_negative_offer_quantity'); - - $iQuantity = (int) $iQuantity; - if (empty($iQuantity) || ($iQuantity < 0 && !$bAllowNegativeOfferQuantity)) { - $iQuantity = 0; - } - - $this->attributes['quantity'] = $iQuantity; - } - - /** - * Set quantity_in_unit attribute value - * @param int $iQuantity - */ - protected function setQuantityInUnitAttribute($sQuantity) - { - $fQuantity = (float) PriceHelper::toFloat($sQuantity); - if (empty($fQuantity) || $fQuantity < 0) { - $fQuantity = 0; - } - - $this->attributes['quantity_in_unit'] = $fQuantity; - } - - /** - * Create or update main price object - * @param int|null $iPriceTypeID - * @param float $fPrice - * @param float $fOldPrice - */ - protected function savePriceValue($iPriceTypeID, $fPrice, $fOldPrice) - { - $obPriceModel = $this->getPriceObject($iPriceTypeID); - if (empty($obPriceModel)) { - $obPriceModel = Price::create([ - 'item_id' => $this->id, - 'item_type' => static::class, - 'price' => $fPrice, - 'old_price' => $fOldPrice, - 'price_type_id' => $iPriceTypeID, - ]); - - if (empty($iPriceTypeID)) { - $this->main_price = $obPriceModel; - } else { - $this->price_link()->add($obPriceModel); - } - } else { - $obPriceModel->price = $fPrice !== null ? $fPrice : $obPriceModel->price; - $obPriceModel->old_price = $fOldPrice !== null ? $fOldPrice : $obPriceModel->old_price; - $obPriceModel->save(); - } - } - - /** - * Save additional price list - */ - protected function savePriceListValue() - { - if (empty($this->arSavedPriceList)) { - return; - } - - foreach ($this->arSavedPriceList as $iPriceTypeID => $arPriceData) { - if (empty($iPriceTypeID)) { - continue; - } - - $this->savePriceValue($iPriceTypeID, array_get($arPriceData, 'price'), array_get($arPriceData, 'old_price')); - } - } -} diff --git a/plugins/lovata/shopaholic/models/Price.php b/plugins/lovata/shopaholic/models/Price.php deleted file mode 100644 index 8dadd1853..000000000 --- a/plugins/lovata/shopaholic/models/Price.php +++ /dev/null @@ -1,146 +0,0 @@ - 'required', - 'item_type' => 'required', - ]; - - public $attributeNames = []; - - public $attachOne = []; - public $attachMany = []; - public $hasMany = []; - public $belongsTo = [ - 'price_type' => [PriceType::class], - ]; - public $belongsToMany = []; - public $morphTo = [ - 'item' => [], - ]; - public $morphMany = []; - - public $dates = ['created_at', 'updated_at']; - - public $appends = []; - public $purgeable = []; - - public $arPriceField = ['price', 'old_price', 'discount_price']; - - public $fillable = [ - 'item_id', - 'item_type', - 'price', - 'discount_price', - 'old_price', - 'price_type_id', - ]; - - public $visible = []; - public $hidden = []; - - /** - * Get by item id - * @param Offer $obQuery - * @param int $sData - * - * @return Offer - */ - public function scopeGetByItemID($obQuery, $sData) - { - if (!empty($sData)) { - $obQuery->where('item_id', $sData); - } - - return $obQuery; - } - - /** - * Get by item type - * @param Offer $obQuery - * @param int $sData - * - * @return Offer - */ - public function scopeGetByItemType($obQuery, $sData) - { - if (!empty($sData)) { - $obQuery->where('item_type', $sData); - } - - return $obQuery; - } - - /** - * Get by price type ID - * @param Offer $obQuery - * @param int $sData - * - * @return Offer - */ - public function scopeGetByPriceType($obQuery, $sData) - { - if (!empty($sData)) { - $obQuery->where('price_type_id', $sData); - } else { - $obQuery->whereNull('price_type_id'); - } - - return $obQuery; - } - - /** - * Get discount_price_value attribute - * @return float - */ - protected function getDiscountPriceValueAttribute() - { - $fPrice = 0; - if ($this->old_price_value > 0) { - $fPrice = PriceHelper::round($this->old_price_value - $this->price_value); - } - - return $fPrice; - } -} diff --git a/plugins/lovata/shopaholic/models/PriceType.php b/plugins/lovata/shopaholic/models/PriceType.php deleted file mode 100644 index c0e3277cd..000000000 --- a/plugins/lovata/shopaholic/models/PriceType.php +++ /dev/null @@ -1,91 +0,0 @@ - 'required', - 'code' => 'required|unique:lovata_shopaholic_price_types', - ]; - - public $attributeNames = [ - 'name' => 'lovata.toolbox::lang.field.name', - 'code' => 'lovata.toolbox::lang.field.code', - ]; - - public $attachOne = []; - public $attachMany = []; - public $hasMany = []; - public $belongsTo = [ - 'currency' => [Currency::class], - ]; - public $belongsToMany = []; - public $morphMany = []; - - public $dates = ['created_at', 'updated_at', 'deleted_at']; - - public $appends = []; - public $purgeable = []; - - public $fillable = [ - 'active', - 'name', - 'code', - 'external_id', - 'sort_order', - ]; - - public $cached = [ - 'id', - 'name', - 'code', - ]; - - public $visible = []; - public $hidden = []; -} diff --git a/plugins/lovata/shopaholic/models/Product.php b/plugins/lovata/shopaholic/models/Product.php deleted file mode 100644 index 7a99f2a73..000000000 --- a/plugins/lovata/shopaholic/models/Product.php +++ /dev/null @@ -1,296 +0,0 @@ - 'required', - 'slug' => 'required|unique:lovata_shopaholic_products', - ]; - - public $attributeNames = [ - 'name' => 'lovata.toolbox::lang.field.name', - 'slug' => 'lovata.toolbox::lang.field.slug', - ]; - - public $slugs = ['slug' => 'name']; - - public $attachOne = [ - 'preview_image' => 'System\Models\File', - 'import_file' => [\System\Models\File::class, 'public' => false], - ]; - public $attachMany = ['images' => 'System\Models\File']; - public $hasMany = ['offer' => [Offer::class]]; - public $belongsTo = [ - 'category' => [Category::class], - 'brand' => [Brand::class], - ]; - public $belongsToMany = [ - 'additional_category' => [ - Category::class, - 'table' => 'lovata_shopaholic_additional_categories', - ], - 'promo_block' => [ - PromoBlock::class, - 'table' => 'lovata_shopaholic_promo_block_relation', - 'otherKey' => 'promo_id', - ], - ]; - - public $morphMany = []; - - public $appends = []; - public $purgeable = []; - public $nullable = []; - public $fillable = [ - 'active', - 'name', - 'slug', - 'code', - 'external_id', - 'preview_text', - 'description', - 'brand_id', - 'category_id', - ]; - - public $cached = [ - 'id', - 'active', - 'name', - 'slug', - 'code', - 'category_id', - 'brand_id', - 'preview_text', - 'preview_image', - 'description', - 'images', - ]; - - public $dates = ['created_at', 'updated_at', 'deleted_at']; - - public $jsonable = []; - - public $visible = []; - public $hidden = []; - - /** - * Get element by brand ID - * @param Product $obQuery - * @param string $sData - * @return $this - */ - public function scopeGetByBrand($obQuery, $sData) - { - if (!empty($sData)) { - $obQuery->where('brand_id', $sData); - } - - return $obQuery; - } - - /** - * Get element by categories - * @param Product $obQuery - * @param string $sData - * @return $this - */ - public function scopeGetByCategories($obQuery, $sData) - { - if (!empty($sData)) { - foreach ($sData as $category) { - $obQuery->orWhere('category_id', $category)->orWhereHas('additional_category', function ($obQuery) use ($category) { - $obQuery->where('category_id', $category); - }); - } - } - - return $obQuery; - } - - /** - * Before validate event handler - */ - public function beforeValidate() - { - if (empty($this->slug)) { - $this->slugAttributes(); - } - } - - /** - * Import item list from CSV file - * @param array $arElementList - * @param null $sSessionKey - * @throws \Throwable - */ - public function importData($arElementList, $sSessionKey = null) - { - if (empty($arElementList)) { - return; - } - - $obImport = new ImportProductModelFromCSV(); - $obImport->setDeactivateFlag(); - - foreach ($arElementList as $iKey => $arImportData) { - $obImport->import($arImportData); - $sResultMethod = $obImport->getResultMethod(); - if (in_array($sResultMethod, ['logUpdated', 'logCreated'])) { - $this->$sResultMethod(); - } else { - $sErrorMessage = $obImport->getResultError(); - $this->$sResultMethod($iKey, $sErrorMessage); - } - } - - $obImport->deactivateElements(); - } -} diff --git a/plugins/lovata/shopaholic/models/PromoBlock.php b/plugins/lovata/shopaholic/models/PromoBlock.php deleted file mode 100644 index 41511e8e5..000000000 --- a/plugins/lovata/shopaholic/models/PromoBlock.php +++ /dev/null @@ -1,192 +0,0 @@ - 'required', - 'type' => 'required', - 'date_begin' => 'required', - 'slug' => 'required|unique:lovata_shopaholic_promo_block', - ]; - - public $attributeNames = [ - 'name' => 'lovata.toolbox::lang.field.name', - 'type' => 'lovata.toolbox::lang.field.type', - 'slug' => 'lovata.toolbox::lang.field.slug', - 'date_begin' => 'lovata.toolbox::lang.field.date_begin', - ]; - - public $slugs = ['slug' => 'name']; - - public $attachOne = [ - 'preview_image' => 'System\Models\File', - 'icon' => 'System\Models\File', - ]; - public $attachMany = ['images' => 'System\Models\File']; - public $belongsTo = []; - public $hasMany = []; - public $belongsToMany = [ - 'product' => [ - Product::class, - 'table' => 'lovata_shopaholic_promo_block_relation', - 'key' => 'promo_id', - ], - ]; - public $morphMany = []; - - public $appends = []; - public $purgeable = []; - - public $dates = ['created_at', 'updated_at', 'date_begin', 'date_end']; - - public $fillable = [ - 'active', - 'name', - 'slug', - 'type', - 'code', - 'preview_text', - 'description', - 'sort_order', - 'date_begin', - 'date_end', - ]; - - public $cached = [ - 'id', - 'name', - 'slug', - 'type', - 'code', - 'preview_text', - 'preview_image', - 'icon', - 'description', - 'images', - 'date_begin', - 'date_end', - ]; - - public $visible = []; - public $hidden = []; - - /** - * Fire event and get promo content type list - * @return array - */ - public static function getTypeList(): array - { - $arResult = [ - self::PROMO_BLOCK_TYPE => Lang::get('lovata.shopaholic::lang.field.promo_block_type'), - ]; - - $arEventDataList = Event::fire(self::EVENT_GET_TYPE_LIST); - if (empty($arEventDataList)) { - return $arResult; - } - - foreach ($arEventDataList as $arEventData) { - if (empty($arEventData) || !is_array($arEventData)) { - continue; - } - - $arResult = array_merge($arResult, $arEventData); - } - - return $arResult; - } - - /** - * Get type list for backend fields - * @return array - */ - public function getTypeOptions(): array - { - return self::getTypeList(); - } -} diff --git a/plugins/lovata/shopaholic/models/Settings.php b/plugins/lovata/shopaholic/models/Settings.php deleted file mode 100644 index 29ccd081c..000000000 --- a/plugins/lovata/shopaholic/models/Settings.php +++ /dev/null @@ -1,62 +0,0 @@ -lists('name', 'id'); - - return $arResult; - } - - /** - * Get measure list - * @return array - */ - public function getWeightMeasureOptions() - { - $arResult = (array) Measure::orderBy('name', 'asc')->lists('name', 'id'); - - return $arResult; - } - - /** - * Get measure list - * @return array - */ - public function getMeasureOfUnitOptions() - { - $arResult = (array) Measure::orderBy('name', 'asc')->lists('name', 'id'); - - return $arResult; - } - - /** - * Get page id list. - * @return array|\Cms\Classes\Page[] - */ - public function getPageIdListOptions() - { - return PageHelper::instance()->getPageNameList(); - } -} diff --git a/plugins/lovata/shopaholic/models/Tax.php b/plugins/lovata/shopaholic/models/Tax.php deleted file mode 100644 index 9ed894321..000000000 --- a/plugins/lovata/shopaholic/models/Tax.php +++ /dev/null @@ -1,128 +0,0 @@ - 'required', - 'percent' => 'required', - ]; - - public $attributeNames = [ - 'name' => 'lovata.toolbox::lang.field.name', - 'percent' => 'lovata.shopaholic::lang.field.tax_percent', - ]; - - public $attachOne = []; - public $attachMany = []; - public $hasMany = []; - public $belongsTo = []; - public $belongsToMany = [ - 'category' => [ - Category::class, - 'table' => 'lovata_shopaholic_tax_category_link', - ], - 'product' => [ - Product::class, - 'table' => 'lovata_shopaholic_tax_product_link', - ], - 'country' => [ - 'RainLab\Location\Models\Country', - 'table' => 'lovata_shopaholic_tax_country_link', - ], - 'state' => [ - 'RainLab\Location\Models\State', - 'table' => 'lovata_shopaholic_tax_state_link', - ], - ]; - public $morphMany = []; - - public $dates = ['created_at', 'updated_at', 'deleted_at']; - - public $appends = []; - public $purgeable = []; - - public $fillable = [ - 'active', - 'is_global', - 'name', - 'description', - 'percent', - 'sort_order', - ]; - - public $cached = [ - 'id', - 'is_global', - 'name', - 'description', - 'percent', - ]; - - public $visible = []; - public $hidden = []; - - /** - * Set percent attribute - * @param string $sValue - */ - protected function setPercentAttribute($sValue) - { - $this->attributes['percent'] = PriceHelper::toFloat($sValue); - } -} diff --git a/plugins/lovata/shopaholic/models/XmlImportSettings.php b/plugins/lovata/shopaholic/models/XmlImportSettings.php deleted file mode 100644 index b964e3d2b..000000000 --- a/plugins/lovata/shopaholic/models/XmlImportSettings.php +++ /dev/null @@ -1,97 +0,0 @@ -get('file_list'); - $arFileList = array_pluck($arFileList, 'path'); - - return $arFileList; - } - - /** - * Get product field list - * @return array - */ - public function getProductFields() - { - $obParser = new ImportProductModelFromXML(); - $arFileList = $obParser->getFields(); - - return $arFileList; - } - - /** - * Get offer field list - * @return array - */ - public function getOfferFields() - { - $obParser = new ImportOfferModelFromXML(); - $arFileList = $obParser->getFields(); - - return $arFileList; - } - - /** - * Get offer price field list - * @return array - */ - public function getPriceFields() - { - $obParser = new ImportOfferPriceFromXML(); - $arFileList = $obParser->getFields(); - - return $arFileList; - } - - /** - * Get brand field list - * @return array - */ - public function getBrandFields() - { - $obParser = new ImportBrandModelFromXML(); - $arFileList = $obParser->getFields(); - - return $arFileList; - } - - /** - * Get category field list - * @return array - */ - public function getCategoryFields() - { - $obParser = new ImportCategoryModelFromXML(); - $arFileList = $obParser->getFields(); - - return $arFileList; - } -} diff --git a/plugins/lovata/shopaholic/models/brand/columns.yaml b/plugins/lovata/shopaholic/models/brand/columns.yaml deleted file mode 100644 index ad2bf5a53..000000000 --- a/plugins/lovata/shopaholic/models/brand/columns.yaml +++ /dev/null @@ -1,48 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - code: - label: 'lovata.toolbox::lang.field.code' - type: text - searchable: true - sortable: true - slug: - label: 'lovata.toolbox::lang.field.slug' - type: text - searchable: true - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - external_id: - label: 'lovata.toolbox::lang.field.external_id' - type: text - searchable: true - sortable: true - sort_order: - label: 'lovata.toolbox::lang.field.sort_order' - type: text - searchable: false - sortable: true - width: 150px - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - sortable: true - invisible: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - sortable: true - invisible: true diff --git a/plugins/lovata/shopaholic/models/brand/fields.yaml b/plugins/lovata/shopaholic/models/brand/fields.yaml deleted file mode 100644 index dbe4bf756..000000000 --- a/plugins/lovata/shopaholic/models/brand/fields.yaml +++ /dev/null @@ -1,76 +0,0 @@ -fields: - active: - label: 'lovata.toolbox::lang.field.active' - span: left - default: 1 - type: switch - name: - label: 'lovata.toolbox::lang.field.name' - span: left - required: 1 - type: text - slug: - label: 'lovata.toolbox::lang.field.slug' - span: right - required: 1 - preset: - field: name - type: slug - type: text -tabs: - fields: - code: - label: 'lovata.toolbox::lang.field.code' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' - external_id: - label: 'lovata.toolbox::lang.field.external_id' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' - preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - size: large - span: full - type: textarea - tab: 'lovata.toolbox::lang.tab.description' - description: - label: 'lovata.toolbox::lang.field.description' - size: giant - span: full - type: richeditor - tab: 'lovata.toolbox::lang.tab.description' - preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - icon: - label: 'lovata.toolbox::lang.field.icon' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: right - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - images: - label: 'lovata.toolbox::lang.field.images' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' diff --git a/plugins/lovata/shopaholic/models/category/columns.yaml b/plugins/lovata/shopaholic/models/category/columns.yaml deleted file mode 100644 index ff975c4a9..000000000 --- a/plugins/lovata/shopaholic/models/category/columns.yaml +++ /dev/null @@ -1,42 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - code: - label: 'lovata.toolbox::lang.field.code' - type: text - searchable: true - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - slug: - label: 'lovata.toolbox::lang.field.slug' - type: text - searchable: true - sortable: true - external_id: - label: 'lovata.toolbox::lang.field.external_id' - type: text - searchable: true - sortable: true - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - sortable: true - invisible: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - sortable: true - invisible: true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/models/category/fields.yaml b/plugins/lovata/shopaholic/models/category/fields.yaml deleted file mode 100644 index e40bfbe83..000000000 --- a/plugins/lovata/shopaholic/models/category/fields.yaml +++ /dev/null @@ -1,83 +0,0 @@ -fields: - active: - label: 'lovata.toolbox::lang.field.active' - span: left - default: 1 - type: switch - name: - label: 'lovata.toolbox::lang.field.name' - span: left - required: 1 - type: text - slug: - label: 'lovata.toolbox::lang.field.slug' - span: auto - required: 1 - preset: - field: name - type: slug - type: text -tabs: - fields: - parent: - label: 'lovata.toolbox::lang.field.category_parent' - span: left - type: relation - nameFrom: name - emptyOption: 'lovata.toolbox::lang.field.empty' - tab: 'lovata.toolbox::lang.tab.settings' - code: - label: 'lovata.toolbox::lang.field.code' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' - external_id: - label: 'lovata.toolbox::lang.field.external_id' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' - preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - size: large - span: full - type: textarea - tab: 'lovata.toolbox::lang.tab.description' - description: - label: 'lovata.toolbox::lang.field.description' - size: giant - span: full - type: richeditor - tab: 'lovata.toolbox::lang.tab.description' - preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - icon: - label: 'lovata.toolbox::lang.field.icon' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: right - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - images: - label: 'lovata.toolbox::lang.field.images' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' diff --git a/plugins/lovata/shopaholic/models/currency/columns.yaml b/plugins/lovata/shopaholic/models/currency/columns.yaml deleted file mode 100644 index 704132933..000000000 --- a/plugins/lovata/shopaholic/models/currency/columns.yaml +++ /dev/null @@ -1,53 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - is_default: - label: 'lovata.toolbox::lang.field.is_default' - type: switch - searchable: false - sortable: true - code: - label: 'lovata.toolbox::lang.field.code' - type: text - searchable: true - sortable: true - symbol: - label: 'lovata.toolbox::lang.field.symbol' - type: text - searchable: true - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - external_id: - label: 'lovata.toolbox::lang.field.external_id' - type: text - searchable: true - sortable: true - sort_order: - label: 'lovata.toolbox::lang.field.sort_order' - type: text - searchable: false - sortable: true - width: 150px - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - sortable: true - invisible: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - sortable: true - invisible: true diff --git a/plugins/lovata/shopaholic/models/currency/fields.yaml b/plugins/lovata/shopaholic/models/currency/fields.yaml deleted file mode 100644 index 408879c2d..000000000 --- a/plugins/lovata/shopaholic/models/currency/fields.yaml +++ /dev/null @@ -1,32 +0,0 @@ -fields: - active: - label: 'lovata.toolbox::lang.field.active' - span: left - default: 1 - type: switch - is_default: - label: 'lovata.toolbox::lang.field.is_default' - span: right - default: 0 - type: switch - name: - label: 'lovata.toolbox::lang.field.name' - span: left - required: 1 - type: text - code: - label: 'lovata.toolbox::lang.field.code' - span: right - type: text - symbol: - label: 'lovata.toolbox::lang.field.symbol' - span: left - type: text - rate: - label: 'lovata.shopaholic::lang.field.rate' - span: right - type: number - external_id: - label: 'lovata.toolbox::lang.field.external_id' - span: left - type: text \ No newline at end of file diff --git a/plugins/lovata/shopaholic/models/measure/columns.yaml b/plugins/lovata/shopaholic/models/measure/columns.yaml deleted file mode 100644 index 8d40171e1..000000000 --- a/plugins/lovata/shopaholic/models/measure/columns.yaml +++ /dev/null @@ -1,22 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: number - sortable: true - searchable: true - width: 100px - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - invisible: true - sortable: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - invisible: true - sortable: true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/models/measure/fields.yaml b/plugins/lovata/shopaholic/models/measure/fields.yaml deleted file mode 100644 index e06715533..000000000 --- a/plugins/lovata/shopaholic/models/measure/fields.yaml +++ /dev/null @@ -1,10 +0,0 @@ -fields: - name: - label: 'lovata.toolbox::lang.field.name' - span: left - required: 1 - type: text - code: - label: 'lovata.toolbox::lang.field.code' - span: right - type: text diff --git a/plugins/lovata/shopaholic/models/offer/columns.yaml b/plugins/lovata/shopaholic/models/offer/columns.yaml deleted file mode 100644 index 5b4f3a62f..000000000 --- a/plugins/lovata/shopaholic/models/offer/columns.yaml +++ /dev/null @@ -1,52 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - code: - label: 'lovata.shopaholic::lang.field.vendor_code' - type: text - searchable: true - sortable: true - price: - label: 'lovata.shopaholic::lang.field.price' - type: text - searchable: false - sortable: false - old_price: - label: 'lovata.shopaholic::lang.field.old_price' - type: text - searchable: false - sortable: false - quantity: - label: 'lovata.shopaholic::lang.field.quantity' - type: text - searchable: false - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - external_id: - label: 'lovata.toolbox::lang.field.external_id' - type: text - searchable: true - sortable: true - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - sortable: true - invisible: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - sortable: true - invisible: true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/models/offer/fields.yaml b/plugins/lovata/shopaholic/models/offer/fields.yaml deleted file mode 100644 index 76a5c21e6..000000000 --- a/plugins/lovata/shopaholic/models/offer/fields.yaml +++ /dev/null @@ -1,66 +0,0 @@ -fields: - active: - label: 'lovata.toolbox::lang.field.active' - span: left - default: 1 - type: switch - name: - label: 'lovata.toolbox::lang.field.name' - span: left - required: 1 - type: text -tabs: - fields: - quantity: - label: 'lovata.shopaholic::lang.field.quantity' - span: left - type: number - default: 0 - tab: 'lovata.toolbox::lang.tab.settings' - code: - label: 'lovata.shopaholic::lang.field.vendor_code' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' - external_id: - label: 'lovata.toolbox::lang.field.external_id' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' - price_list: - span: left - type: partial - path: ~/plugins/lovata/shopaholic/views/offer_price_list.htm - tab: 'lovata.shopaholic::lang.tab.price' - preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - size: large - span: full - type: textarea - tab: 'lovata.toolbox::lang.tab.description' - description: - label: 'lovata.toolbox::lang.field.description' - size: giant - span: full - type: richeditor - tab: 'lovata.toolbox::lang.tab.description' - preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - mode: image - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: full - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - images: - label: 'lovata.toolbox::lang.field.images' - mode: image - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: full - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' diff --git a/plugins/lovata/shopaholic/models/offer/relation_columns.yaml b/plugins/lovata/shopaholic/models/offer/relation_columns.yaml deleted file mode 100644 index 89c6aded5..000000000 --- a/plugins/lovata/shopaholic/models/offer/relation_columns.yaml +++ /dev/null @@ -1,43 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - product: - label: 'lovata.toolbox::lang.field.product' - relation: product - select: name - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - code: - label: 'lovata.shopaholic::lang.field.vendor_code' - type: text - searchable: true - sortable: true - price: - label: 'lovata.shopaholic::lang.field.price' - type: text - searchable: false - sortable: false - old_price: - label: 'lovata.shopaholic::lang.field.old_price' - type: text - searchable: false - sortable: false - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - external_id: - label: 'lovata.toolbox::lang.field.external_id' - type: text - searchable: true - sortable: true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/models/pricetype/columns.yaml b/plugins/lovata/shopaholic/models/pricetype/columns.yaml deleted file mode 100644 index 87c5abb3e..000000000 --- a/plugins/lovata/shopaholic/models/pricetype/columns.yaml +++ /dev/null @@ -1,43 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - code: - label: 'lovata.toolbox::lang.field.code' - type: text - searchable: true - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - external_id: - label: 'lovata.toolbox::lang.field.external_id' - type: text - searchable: true - sortable: true - sort_order: - label: 'lovata.toolbox::lang.field.sort_order' - type: text - searchable: false - sortable: true - width: 150px - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - sortable: true - invisible: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - sortable: true - invisible: true diff --git a/plugins/lovata/shopaholic/models/pricetype/fields.yaml b/plugins/lovata/shopaholic/models/pricetype/fields.yaml deleted file mode 100644 index 2e7b86c4c..000000000 --- a/plugins/lovata/shopaholic/models/pricetype/fields.yaml +++ /dev/null @@ -1,21 +0,0 @@ -fields: - active: - label: 'lovata.toolbox::lang.field.active' - span: left - default: 1 - type: switch - name: - label: 'lovata.toolbox::lang.field.name' - span: left - required: 1 - type: text - code: - label: 'lovata.toolbox::lang.field.code' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' - external_id: - label: 'lovata.toolbox::lang.field.external_id' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' \ No newline at end of file diff --git a/plugins/lovata/shopaholic/models/product/columns.yaml b/plugins/lovata/shopaholic/models/product/columns.yaml deleted file mode 100644 index b73ae90d8..000000000 --- a/plugins/lovata/shopaholic/models/product/columns.yaml +++ /dev/null @@ -1,55 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - category_name: - label: 'lovata.toolbox::lang.field.category' - type: text - searchable: true - sortable: true - relation: category - select: name - brand_name: - label: 'lovata.shopaholic::lang.field.brand' - type: text - sortable: true - relation: brand - select: name - code: - label: 'lovata.shopaholic::lang.field.vendor_code' - type: text - searchable: true - sortable: true - slug: - label: 'lovata.toolbox::lang.field.slug' - type: text - searchable: true - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - external_id: - label: 'lovata.toolbox::lang.field.external_id' - type: text - searchable: true - sortable: true - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - sortable: true - invisible: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - sortable: true - invisible: true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/models/product/fields.yaml b/plugins/lovata/shopaholic/models/product/fields.yaml deleted file mode 100644 index 5000145e2..000000000 --- a/plugins/lovata/shopaholic/models/product/fields.yaml +++ /dev/null @@ -1,106 +0,0 @@ -fields: - active: - label: 'lovata.toolbox::lang.field.active' - span: left - default: 0 - type: switch - name: - label: 'lovata.toolbox::lang.field.name' - span: left - required: 1 - type: text - slug: - label: 'lovata.toolbox::lang.field.slug' - span: right - required: 1 - preset: - field: name - type: slug - type: text -tabs: - lazy: - - 'lovata.toolbox::lang.tab.settings' - - 'lovata.toolbox::lang.tab.description' - - 'lovata.toolbox::lang.tab.images' - - 'lovata.shopaholic::lang.tab.offer' - - 'lovata.toolbox::lang.tab.properties' - - 'lovata.discountsshopaholic::lang.menu.discount' - - 'lovata.couponsshopaholic::lang.menu.coupon_group' - - 'lovata.relatedproductsshopaholic::lang.tab.related' - - 'lovata.reviewsshopaholic::lang.field.reviews' - fields: - category: - label: 'lovata.toolbox::lang.field.category' - nameFrom: name - descriptionFrom: description - span: left - type: relation - tab: 'lovata.toolbox::lang.tab.settings' - additional_category: - label: 'lovata.shopaholic::lang.field.additional_category' - type: relation - span: right - nameFrom: name - context: - - update - - preview - tab: 'lovata.toolbox::lang.tab.settings' - brand: - label: 'lovata.shopaholic::lang.field.brand' - span: left - type: relation - tab: 'lovata.toolbox::lang.tab.settings' - emptyOption: 'lovata.toolbox::lang.field.empty' - code: - label: 'lovata.shopaholic::lang.field.vendor_code' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' - external_id: - label: 'lovata.toolbox::lang.field.external_id' - span: left - type: text - tab: 'lovata.toolbox::lang.tab.settings' - preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - size: large - span: full - type: textarea - tab: 'lovata.toolbox::lang.tab.description' - description: - label: 'lovata.toolbox::lang.field.description' - size: giant - span: full - type: richeditor - tab: 'lovata.toolbox::lang.tab.description' - preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - images: - label: 'lovata.toolbox::lang.field.images' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - offer: - label: 'lovata.shopaholic::lang.field.offer' - span: full - context: - - update - - preview - type: partial - path: ~/plugins/lovata/shopaholic/controllers/products/_offer.htm - tab: 'lovata.shopaholic::lang.tab.offer' diff --git a/plugins/lovata/shopaholic/models/product/relation_columns.yaml b/plugins/lovata/shopaholic/models/product/relation_columns.yaml deleted file mode 100644 index e0d133a5f..000000000 --- a/plugins/lovata/shopaholic/models/product/relation_columns.yaml +++ /dev/null @@ -1,40 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - category_name: - label: 'lovata.toolbox::lang.field.category' - type: text - searchable: true - sortable: true - relation: category - select: name - brand_name: - label: 'lovata.shopaholic::lang.field.brand' - type: text - sortable: true - relation: brand - select: name - code: - label: 'lovata.shopaholic::lang.field.vendor_code' - type: text - searchable: true - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - external_id: - label: 'lovata.toolbox::lang.field.external_id' - type: text - searchable: true - sortable: true \ No newline at end of file diff --git a/plugins/lovata/shopaholic/models/promoblock/columns.yaml b/plugins/lovata/shopaholic/models/promoblock/columns.yaml deleted file mode 100644 index 9de3fff1b..000000000 --- a/plugins/lovata/shopaholic/models/promoblock/columns.yaml +++ /dev/null @@ -1,53 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - code: - label: 'lovata.toolbox::lang.field.code' - type: text - searchable: true - sortable: true - date_begin: - label: 'lovata.toolbox::lang.field.date_begin' - type: datetime - sortable: true - searchable: false - date_end: - label: 'lovata.toolbox::lang.field.date_end' - type: datetime - sortable: true - searchable: false - slug: - label: 'lovata.toolbox::lang.field.slug' - type: text - searchable: true - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - sort_order: - label: 'lovata.toolbox::lang.field.sort_order' - type: text - searchable: false - sortable: true - width: 150px - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - sortable: true - invisible: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - sortable: true - invisible: true diff --git a/plugins/lovata/shopaholic/models/promoblock/fields.yaml b/plugins/lovata/shopaholic/models/promoblock/fields.yaml deleted file mode 100644 index a58670f0b..000000000 --- a/plugins/lovata/shopaholic/models/promoblock/fields.yaml +++ /dev/null @@ -1,94 +0,0 @@ -fields: - active: - label: 'lovata.toolbox::lang.field.active' - span: left - default: 1 - type: switch - name: - label: 'lovata.toolbox::lang.field.name' - span: left - required: 1 - type: text - slug: - label: 'lovata.toolbox::lang.field.slug' - span: right - required: 1 - preset: - field: name - type: slug - type: text -tabs: - fields: - type: - label: 'lovata.toolbox::lang.field.type' - tab: 'lovata.toolbox::lang.tab.settings' - span: left - type: dropdown - code: - label: 'lovata.toolbox::lang.field.code' - tab: 'lovata.toolbox::lang.tab.settings' - span: right - type: text - date_begin: - label: 'lovata.toolbox::lang.field.date_begin' - tab: 'lovata.toolbox::lang.tab.settings' - span: left - type: datepicker - date_end: - label: 'lovata.toolbox::lang.field.date_end' - tab: 'lovata.toolbox::lang.tab.settings' - span: right - type: datepicker - preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - size: large - span: full - type: textarea - tab: 'lovata.toolbox::lang.tab.description' - description: - label: 'lovata.toolbox::lang.field.description' - size: giant - span: full - type: richeditor - tab: 'lovata.toolbox::lang.tab.description' - preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - icon: - label: 'lovata.toolbox::lang.field.icon' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: right - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - images: - label: 'lovata.toolbox::lang.field.images' - mode: image - fileTypes: jpg,jpeg,bmp,png,webp,gif,svg - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' - product: - span: full - context: - - update - - preview - type: partial - path: ~/plugins/lovata/shopaholic/controllers/promoblocks/_product.htm - tab: 'lovata.shopaholic::lang.menu.product' diff --git a/plugins/lovata/shopaholic/models/settings/fields.yaml b/plugins/lovata/shopaholic/models/settings/fields.yaml deleted file mode 100644 index 589875e61..000000000 --- a/plugins/lovata/shopaholic/models/settings/fields.yaml +++ /dev/null @@ -1,117 +0,0 @@ -tabs: - fields: - check_offer_active: - tab: lovata.toolbox::lang.tab.settings - span: left - label: lovata.shopaholic::lang.field.check_offer_active - type: checkbox - allow_negative_offer_quantity: - tab: lovata.toolbox::lang.tab.settings - span: left - label: lovata.shopaholic::lang.field.allow_negative_offer_quantity - type: checkbox - price_include_tax: - tab: lovata.shopaholic::lang.tab.taxes - span: left - type: checkbox - label: lovata.shopaholic::lang.field.price_include_tax - formula_calculate_discount_from_price: - tab: lovata.shopaholic::lang.tab.taxes - label: lovata.shopaholic::lang.settings.formula_calculate_discount_from_price - span: left - type: radio - options: - discount_from_backend_price: lovata.shopaholic::lang.settings.formula_calculation_from_backend_price - discount_from_price_without_tax: lovata.shopaholic::lang.settings.formula_calculation_from_price_without_tax - discount_from_price_with_tax: lovata.shopaholic::lang.settings.formula_calculation_from_price_with_tax - dimensions_measure: - label: lovata.shopaholic::lang.field.dimensions_measure - tab: lovata.shopaholic::lang.tab.dimensions - type: dropdown - emptyOption: lovata.toolbox::lang.field.empty - span: left - weight_measure: - label: lovata.shopaholic::lang.field.weight_measure - tab: lovata.shopaholic::lang.tab.dimensions - type: dropdown - emptyOption: lovata.toolbox::lang.field.empty - span: left - measure_of_unit: - label: lovata.shopaholic::lang.field.measure_of_unit - tab: lovata.shopaholic::lang.tab.dimensions - type: dropdown - emptyOption: lovata.toolbox::lang.field.empty - span: left - hide_brand_import_from_csv: - label: lovata.shopaholic::lang.field.hide_brand_import_from_csv - tab: lovata.shopaholic::lang.tab.import_setting - type: checkbox - span: left - hide_brand_import_from_xml: - label: lovata.shopaholic::lang.field.hide_brand_import_from_xml - tab: lovata.shopaholic::lang.tab.import_setting - type: checkbox - span: right - hide_category_import_from_csv: - label: lovata.shopaholic::lang.field.hide_category_import_from_csv - tab: lovata.shopaholic::lang.tab.import_setting - type: checkbox - span: left - hide_category_import_from_xml: - label: lovata.shopaholic::lang.field.hide_category_import_from_xml - tab: lovata.shopaholic::lang.tab.import_setting - type: checkbox - span: right - hide_product_import_from_csv: - label: lovata.shopaholic::lang.field.hide_product_import_from_csv - tab: lovata.shopaholic::lang.tab.import_setting - type: checkbox - span: left - hide_product_import_from_xml: - label: lovata.shopaholic::lang.field.hide_product_import_from_xml - tab: lovata.shopaholic::lang.tab.import_setting - type: checkbox - span: right - hide_offer_import_from_csv: - label: lovata.shopaholic::lang.field.hide_offer_import_from_csv - tab: lovata.shopaholic::lang.tab.import_setting - type: checkbox - span: left - hide_offer_import_from_xml: - label: lovata.shopaholic::lang.field.hide_offer_import_from_xml - tab: lovata.shopaholic::lang.tab.import_setting - type: checkbox - span: right - hide_price_import_from_xml: - label: lovata.shopaholic::lang.field.hide_price_import_from_xml - tab: lovata.shopaholic::lang.tab.import_setting - type: checkbox - span: right - default_product_page_id: - label: lovata.shopaholic::lang.field.default_product_page - tab: lovata.shopaholic::lang.tab.page_settings - type: dropdown - span: left - emptyOption: lovata.toolbox::lang.field.empty - options: getPageIdListOptions - default_category_page_id: - label: lovata.shopaholic::lang.field.default_category_page - tab: lovata.shopaholic::lang.tab.page_settings - type: dropdown - span: left - emptyOption: lovata.toolbox::lang.field.empty - options: getPageIdListOptions - default_brand_page_id: - label: lovata.shopaholic::lang.field.default_brand_page - tab: lovata.shopaholic::lang.tab.page_settings - type: dropdown - span: left - emptyOption: lovata.toolbox::lang.field.empty - options: getPageIdListOptions - default_promo_block_page_id: - label: lovata.shopaholic::lang.field.default_promo_block_page - tab: lovata.shopaholic::lang.tab.page_settings - type: dropdown - span: left - emptyOption: lovata.toolbox::lang.field.empty - options: getPageIdListOptions diff --git a/plugins/lovata/shopaholic/models/tax/columns.yaml b/plugins/lovata/shopaholic/models/tax/columns.yaml deleted file mode 100644 index 6fe4bc5f3..000000000 --- a/plugins/lovata/shopaholic/models/tax/columns.yaml +++ /dev/null @@ -1,43 +0,0 @@ -columns: - name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true - active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true - is_global: - label: 'lovata.shopaholic::lang.field.tax_is_global' - type: switch - searchable: false - sortable: true - percent: - label: 'lovata.shopaholic::lang.field.tax_percent' - type: text - searchable: true - sortable: true - id: - label: 'lovata.toolbox::lang.field.id' - type: text - searchable: true - sortable: true - width: 100px - sort_order: - label: 'lovata.toolbox::lang.field.sort_order' - type: text - searchable: false - sortable: true - width: 150px - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - sortable: true - invisible: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - sortable: true - invisible: true diff --git a/plugins/lovata/shopaholic/models/tax/fields.yaml b/plugins/lovata/shopaholic/models/tax/fields.yaml deleted file mode 100644 index 6612ee6a7..000000000 --- a/plugins/lovata/shopaholic/models/tax/fields.yaml +++ /dev/null @@ -1,75 +0,0 @@ -fields: - active: - label: 'lovata.toolbox::lang.field.active' - span: left - default: 1 - type: switch - is_global: - label: 'lovata.shopaholic::lang.field.tax_is_global' - span: right - default: 1 - type: switch - name: - label: 'lovata.toolbox::lang.field.name' - span: left - required: 1 - type: text - percent: - label: 'lovata.shopaholic::lang.field.tax_percent' - span: right - type: number -tabs: - fields: - description: - label: 'lovata.toolbox::lang.field.description' - span: left - type: textarea - tab: 'lovata.toolbox::lang.tab.settings' - category: - span: full - context: - - update - - preview - type: partial - path: ~/plugins/lovata/shopaholic/controllers/taxes/_category.htm - tab: 'lovata.shopaholic::lang.menu.categories' - trigger: - action: hide - field: is_global - condition: checked - product: - span: full - context: - - update - - preview - type: partial - path: ~/plugins/lovata/shopaholic/controllers/taxes/_product.htm - tab: 'lovata.shopaholic::lang.menu.product' - trigger: - action: hide - field: is_global - condition: checked - country: - span: full - context: - - update - - preview - type: partial - path: ~/plugins/lovata/shopaholic/controllers/taxes/_country.htm - tab: 'lovata.shopaholic::lang.field.countries' - trigger: - action: hide - field: is_global - condition: checked - state: - span: full - context: - - update - - preview - type: partial - path: ~/plugins/lovata/shopaholic/controllers/taxes/_state.htm - tab: 'lovata.shopaholic::lang.field.states' - trigger: - action: hide - field: is_global - condition: checked \ No newline at end of file diff --git a/plugins/lovata/shopaholic/models/xmlimportsettings/fields.yaml b/plugins/lovata/shopaholic/models/xmlimportsettings/fields.yaml deleted file mode 100644 index 0c613fea2..000000000 --- a/plugins/lovata/shopaholic/models/xmlimportsettings/fields.yaml +++ /dev/null @@ -1,228 +0,0 @@ -fields: - offer_info: - path: $/lovata/shopaholic/views/import_from_xml_info.htm - tab: lovata.shopaholic::lang.field.offer - type: partial - span: full -tabs: - fields: - file_list: - label: lovata.toolbox::lang.field.import_file_list - tab: lovata.toolbox::lang.tab.settings - type: repeater - span: left - form: - fields: - path: - label: lovata.toolbox::lang.field.import_file_path - placeholder: temp/import/import.xml - type: text - span: full - path_prefix: - label: lovata.toolbox::lang.field.import_path_prefix - tab: lovata.toolbox::lang.tab.settings - placeholder: m - type: text - span: auto - file_namespace: - label: lovata.toolbox::lang.field.import_file_namespace - tab: lovata.toolbox::lang.tab.settings - placeholder: urn:1C.ru:commerceml_210 - type: text - span: auto - image_folder: - label: lovata.toolbox::lang.field.import_image_folder - placeholder: temp/import - tab: lovata.toolbox::lang.tab.settings - type: text - span: right - product_file_path: - label: lovata.toolbox::lang.field.import_from_file - tab: lovata.shopaholic::lang.menu.product - type: dropdown - emptyOption: lovata.toolbox::lang.field.empty - options: getFileList - dependsOn: file_list - span: full - product_path_to_list: - label: lovata.toolbox::lang.field.import_path_to_list - placeholder: lovata.toolbox::lang.field.import_path_to_list_example - tab: lovata.shopaholic::lang.menu.product - type: text - span: full - product_deactivate: - label: lovata.toolbox::lang.field.import_deactivate - comment: lovata.toolbox::lang.field.import_deactivate_description - tab: lovata.shopaholic::lang.menu.product - type: checkbox - span: full - product: - label: lovata.toolbox::lang.field.import_field_list - tab: lovata.shopaholic::lang.menu.product - span: full - type: repeater - form: - fields: - field: - label: lovata.toolbox::lang.field.field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: dropdown - options: getProductFields - span: full - path_to_field: - label: lovata.toolbox::lang.field.import_path_to_field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: text - span: full - offer_file_path: - label: lovata.toolbox::lang.field.import_from_file - tab: lovata.shopaholic::lang.field.offer - type: dropdown - emptyOption: lovata.toolbox::lang.field.empty - options: getFileList - dependsOn: file_list - span: full - offer_path_to_list: - label: lovata.toolbox::lang.field.import_path_to_list - placeholder: lovata.toolbox::lang.field.import_path_to_list_example - tab: lovata.shopaholic::lang.field.offer - type: text - span: full - offer_deactivate: - label: lovata.toolbox::lang.field.import_deactivate - comment: lovata.toolbox::lang.field.import_deactivate_description - tab: lovata.shopaholic::lang.field.offer - type: checkbox - span: full - offer: - label: lovata.toolbox::lang.field.import_field_list - tab: lovata.shopaholic::lang.field.offer - span: full - type: repeater - form: - fields: - field: - label: lovata.toolbox::lang.field.field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: dropdown - options: getOfferFields - span: full - path_to_field: - label: lovata.toolbox::lang.field.import_path_to_field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: text - span: full - price_file_path: - label: lovata.toolbox::lang.field.import_from_file - tab: lovata.shopaholic::lang.tab.price - type: dropdown - emptyOption: lovata.toolbox::lang.field.empty - options: getFileList - dependsOn: file_list - span: full - price_path_to_list: - label: lovata.toolbox::lang.field.import_path_to_list - placeholder: lovata.toolbox::lang.field.import_path_to_list_example - tab: lovata.shopaholic::lang.tab.price - type: text - span: full - price_deactivate: - label: lovata.toolbox::lang.field.import_deactivate - comment: lovata.toolbox::lang.field.import_deactivate_description - tab: lovata.shopaholic::lang.tab.price - type: checkbox - span: full - price: - label: lovata.toolbox::lang.field.import_field_list - tab: lovata.shopaholic::lang.tab.price - span: full - type: repeater - form: - fields: - field: - label: lovata.toolbox::lang.field.field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: dropdown - options: getPriceFields - span: full - path_to_field: - label: lovata.toolbox::lang.field.import_path_to_field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: text - span: full - brand_file_path: - label: lovata.toolbox::lang.field.import_from_file - tab: lovata.shopaholic::lang.menu.brands - type: dropdown - emptyOption: lovata.toolbox::lang.field.empty - options: getFileList - dependsOn: file_list - span: full - brand_path_to_list: - label: lovata.toolbox::lang.field.import_path_to_list - placeholder: lovata.toolbox::lang.field.import_path_to_list_example - tab: lovata.shopaholic::lang.menu.brands - type: text - span: full - brand_deactivate: - label: lovata.toolbox::lang.field.import_deactivate - comment: lovata.toolbox::lang.field.import_deactivate_description - tab: lovata.shopaholic::lang.menu.brands - type: checkbox - span: full - brand: - label: lovata.toolbox::lang.field.import_field_list - tab: lovata.shopaholic::lang.menu.brands - span: full - type: repeater - form: - fields: - field: - label: lovata.toolbox::lang.field.field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: dropdown - options: getBrandFields - span: full - path_to_field: - label: lovata.toolbox::lang.field.import_path_to_field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: text - span: full - category_file_path: - label: lovata.toolbox::lang.field.import_from_file - tab: lovata.shopaholic::lang.menu.categories - type: dropdown - emptyOption: lovata.toolbox::lang.field.empty - options: getFileList - dependsOn: file_list - span: full - category_path_to_list: - label: lovata.toolbox::lang.field.import_path_to_list - placeholder: lovata.toolbox::lang.field.import_path_to_list_example - tab: lovata.shopaholic::lang.menu.categories - type: text - span: full - category_deactivate: - label: lovata.toolbox::lang.field.import_deactivate - comment: lovata.toolbox::lang.field.import_deactivate_description - tab: lovata.shopaholic::lang.menu.categories - type: checkbox - span: full - category: - label: lovata.toolbox::lang.field.import_field_list - tab: lovata.shopaholic::lang.menu.categories - span: full - type: repeater - form: - fields: - field: - label: lovata.toolbox::lang.field.field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: dropdown - options: getCategoryFields - span: full - path_to_field: - label: lovata.toolbox::lang.field.import_path_to_field - placeholder: lovata.toolbox::lang.field.import_path_to_field_example - type: text - span: full diff --git a/plugins/lovata/shopaholic/phpunit.xml b/plugins/lovata/shopaholic/phpunit.xml deleted file mode 100644 index 158ab6818..000000000 --- a/plugins/lovata/shopaholic/phpunit.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - ./tests/unit - ./../toolbox/tests/unit - - - -         -            ./classes -            ./components -         -     - - - - - - diff --git a/plugins/lovata/shopaholic/plugin.yaml b/plugins/lovata/shopaholic/plugin.yaml deleted file mode 100644 index b7c220fa5..000000000 --- a/plugins/lovata/shopaholic/plugin.yaml +++ /dev/null @@ -1,80 +0,0 @@ -plugin: - name: 'lovata.shopaholic::lang.plugin.name' - description: 'lovata.shopaholic::lang.plugin.description' - author: Lovata - icon: oc-icon-book - homepage: '' -navigation: - shopaholic-menu-main: - label: 'lovata.shopaholic::lang.menu.main' - url: lovata/shopaholic/products - icon: icon-th-large - permissions: - - 'shopaholic-menu-*' - sideMenu: - shopaholic-menu-products: - label: 'lovata.shopaholic::lang.menu.product' - url: lovata/shopaholic/products - icon: icon-book - order: 100 - permissions: - - shopaholic-menu-product - shopaholic-menu-categories: - label: 'lovata.shopaholic::lang.menu.categories' - url: lovata/shopaholic/categories - icon: icon-sitemap - order: 200 - permissions: - - shopaholic-menu-category - shopaholic-menu-brands: - label: 'lovata.shopaholic::lang.menu.brands' - url: lovata/shopaholic/brands - icon: icon-star-o - order: 300 - permissions: - - shopaholic-menu-brand - shopaholic-menu-promo: - label: 'lovata.shopaholic::lang.menu.promo' - url: lovata/shopaholic/promoblocks - icon: oc-icon-money - permissions: - - 'shopaholic-menu-promo-block' - sideMenu: - shopaholic-menu-promo-block: - label: 'lovata.shopaholic::lang.menu.promo_block' - url: lovata/shopaholic/promoblocks - icon: oc-icon-line-chart - order: 100 - permissions: - - shopaholic-menu-promo-block -permissions: - shopaholic-menu-category: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.category' - shopaholic-menu-brand: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.brand' - shopaholic-menu-product: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.product' - shopaholic-settings: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.settings' - shopaholic-menu-promo-block: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.promo_block' - shopaholic-menu-currency: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.currency' - shopaholic-menu-tax: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.tax' - shopaholic-menu-price-type: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.price_type' - shopaholic-menu-measure: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.measure' - shopaholic-menu-import-xml-file: - tab: 'lovata.shopaholic::lang.tab.permissions' - label: 'lovata.shopaholic::lang.permission.import_xml_file' diff --git a/plugins/lovata/shopaholic/tests/unit/collection/BrandCollectionTest.php b/plugins/lovata/shopaholic/tests/unit/collection/BrandCollectionTest.php deleted file mode 100644 index 24da7f4e9..000000000 --- a/plugins/lovata/shopaholic/tests/unit/collection/BrandCollectionTest.php +++ /dev/null @@ -1,214 +0,0 @@ - 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - protected $arProductData = [ - 'name' => 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - protected $arOfferData = [ - 'active' => true, - 'name' => 'name', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - 'price' => 10.50, - 'old_price' => 11.50, - 'quantity' => 5, - ]; - - protected $arCategoryData = [ - 'active' => true, - 'name' => 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - 'nest_depth' => 0, - 'parent_id' => 0, - ]; - - /** - * Check item collection - */ - public function testCollectionItem() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Brand collection item data is not correct'; - - //Check item collection - $obCollection = BrandCollection::make([$this->obElement->id]); - - /** @var BrandItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(BrandItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - } - - /** - * Check item collection "active" method - */ - public function testActiveList() - { - BrandCollection::make()->active(); - - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Brand collection "active" method is not correct'; - - //Check item collection after create - $obCollection = BrandCollection::make()->active(); - - /** @var BrandItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(BrandItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->active = false; - $this->obElement->save(); - - //Check item collection, after active = false - $obCollection = BrandCollection::make()->active(); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - - $this->obElement->active = true; - $this->obElement->save(); - - //Check item collection, after active = true - $obCollection = BrandCollection::make()->active(); - - /** @var BrandItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(BrandItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->delete(); - - //Check item collection, after element remove - $obCollection = BrandCollection::make()->active(); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - } - - /** - * Check item collection "category" method - */ - public function testCategoryFilter() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - BrandCollection::make()->category($this->obCategory->id); - - $sErrorMessage = 'Brand collection "category" method is not correct'; - - //Check item collection after create - $obCollection = BrandCollection::make()->category($this->obCategory->id); - - /** @var BrandItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(BrandItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obProduct->category_id = $this->obCategory->id + 1; - $this->obProduct->save(); - - //Check item collection, after change category_id field - $obCollection = BrandCollection::make()->category($this->obCategory->id); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - - $this->obProduct->category_id = $this->obCategory->id; - $this->obProduct->save(); - - //Check item collection, after change category_id field - $obCollection = BrandCollection::make()->category($this->obCategory->id); - - /** @var BrandItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(BrandItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obProduct->delete(); - - //Check item collection, after element remove - $obCollection = BrandCollection::make()->category($this->obCategory->id); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - } - - /** - * Create brand object for test - */ - protected function createTestData() - { - //Create new element data - $arCreateData = $this->arCreateData; - $arCreateData['active'] = true; - - $this->obElement = Brand::create($arCreateData); - - - //Create category data - $arCreateData = $this->arCategoryData; - $this->obCategory = Category::create($arCreateData); - - //Create product data - $arCreateData = $this->arCreateData; - $arCreateData['active'] = true; - $arCreateData['category_id'] = $this->obCategory->id; - $arCreateData['brand_id'] = $this->obElement->id; - $this->obProduct = Product::create($arCreateData); - - //Create offer data - $arCreateData = $this->arOfferData; - $arCreateData['product_id'] = $this->obProduct->id; - $this->obOffer = Offer::create($arCreateData); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/collection/CategoryCollectionTest.php b/plugins/lovata/shopaholic/tests/unit/collection/CategoryCollectionTest.php deleted file mode 100644 index 1906e480e..000000000 --- a/plugins/lovata/shopaholic/tests/unit/collection/CategoryCollectionTest.php +++ /dev/null @@ -1,148 +0,0 @@ - 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - /** - * Check item collection - */ - public function testCollectionItem() - { - $this->createTestData(); - if (empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Category collection item data is not correct'; - - //Check item collection - $obCollection = CategoryCollection::make([$this->obElement->id]); - - /** @var CategoryItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(CategoryItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - } - - /** - * Check item collection "tree" method - */ - public function testTreeMethod() - { - $this->createTestData(); - if (empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Category collection "tree" method is not correct'; - - //Check item collection - $obCollection = CategoryCollection::make()->tree(); - - /** @var CategoryItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(CategoryItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - self::assertEquals(1, $obCollection->count(), $sErrorMessage); - } - - /** - * Check item collection "active" method - */ - public function testActiveList() - { - CategoryCollection::make()->active(); - - $this->createTestData(); - if (empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Category collection "active" method is not correct'; - - //Check item collection after create - $obCollection = CategoryCollection::make()->active(); - - /** @var CategoryItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(CategoryItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->active = false; - $this->obElement->save(); - - - //Check item collection, after active = true - $obCollection = CategoryCollection::make()->active(); - - /** @var CategoryItem $obItem */ - $obItem = $obCollection->first(); - self::assertEquals($this->obElement->id + 1, $obItem->id, $sErrorMessage); - self::assertEquals(1, $obCollection->count(), $sErrorMessage); - - $this->obElement->active = true; - $this->obElement->save(); - - //Check item collection, after active = true - $obCollection = CategoryCollection::make()->active(); - - /** @var CategoryItem $obItem */ - $obItem = $obCollection->first(); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - self::assertEquals(2, $obCollection->count(), $sErrorMessage); - - $this->obElement->delete(); - - //Check item collection, after element remove - $obCollection = CategoryCollection::make()->active(); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - } - - /** - * Create brand object for test - */ - protected function createTestData() - { - //Create new element data - $arCreatedData = $this->arCreateData; - $arCreatedData['active'] = true; - - $this->obElement = Category::create($arCreatedData); - - $arCreatedData = $this->arCreateData; - $arCreatedData['active'] = true; - $arCreatedData['slug'] = 'slug1'; - - $this->obChildElement = Category::create($arCreatedData); - - $this->obChildElement->parent_id = $this->obElement->id; - $this->obChildElement->nest_depth = 1; - $this->obChildElement->save(); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/collection/OfferCollectionTest.php b/plugins/lovata/shopaholic/tests/unit/collection/OfferCollectionTest.php deleted file mode 100644 index 2beef4952..000000000 --- a/plugins/lovata/shopaholic/tests/unit/collection/OfferCollectionTest.php +++ /dev/null @@ -1,147 +0,0 @@ - 'name', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - 'price' => 10.50, - 'old_price' => 11.50, - 'quantity' => 5, - ]; - - /** - * Check item collection - */ - public function testCollectionItem() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Offer collection item data is not correct'; - - //Check item collection - $obCollection = OfferCollection::make([$this->obElement->id]); - - /** @var OfferItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(OfferItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - } - - /** - * Check item collection "active" method - */ - public function testActiveList() - { - OfferCollection::make()->active(); - - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Offer collection "active" method is not correct'; - - //Check item collection after create - $obCollection = OfferCollection::make()->active(); - - /** @var OfferItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(OfferItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->active = false; - $this->obElement->save(); - - //Check item collection, after active = false - $obCollection = OfferCollection::make()->active(); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - - $this->obElement->active = true; - $this->obElement->save(); - - //Check item collection, after active = true - $obCollection = OfferCollection::make()->active(); - - /** @var OfferItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(OfferItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->delete(); - - //Check item collection, after element remove - $obCollection = OfferCollection::make()->active(); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - } - - /** - * Check item collection "sort" method (price desc, asc) - */ - public function testSortingByPrice() - { - $this->createTestData(1); - $this->createTestData(2); - if(empty($this->obElement)) { - return; - } - - OfferCollection::make()->sort(OfferListStore::SORT_PRICE_ASC); - OfferCollection::make()->sort(OfferListStore::SORT_PRICE_DESC); - - $sErrorMessage = 'Offer collection "sort" method is not correct'; - - //Check item collection after create - $obCollection = OfferCollection::make()->sort(OfferListStore::SORT_PRICE_ASC); - self::assertEquals([1,2], array_values($obCollection->getIDList()), $sErrorMessage); - - $obCollection = OfferCollection::make()->sort(OfferListStore::SORT_PRICE_DESC); - self::assertEquals([2,1], array_values($obCollection->getIDList()), $sErrorMessage); - - //Check item collection, after update offer price - $this->obElement->price = 1; - $this->obElement->save(); - - $obCollection = OfferCollection::make()->sort(OfferListStore::SORT_PRICE_DESC); - self::assertEquals([1,2], array_values($obCollection->getIDList()), $sErrorMessage); - - $obCollection = OfferCollection::make()->sort(OfferListStore::SORT_PRICE_ASC); - self::assertEquals([2,1], array_values($obCollection->getIDList()), $sErrorMessage); - } - - /** - * Create brand object for test - * @param int $iCount - */ - protected function createTestData($iCount= null) - { - //Create new element data - $arCreateData = $this->arCreateData; - $arCreateData['price'] = $iCount + $arCreateData['price']; - $arCreateData['active'] = true; - - $this->obElement = Offer::create($arCreateData); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/collection/ProductCollectionTest.php b/plugins/lovata/shopaholic/tests/unit/collection/ProductCollectionTest.php deleted file mode 100644 index 3051dabdd..000000000 --- a/plugins/lovata/shopaholic/tests/unit/collection/ProductCollectionTest.php +++ /dev/null @@ -1,552 +0,0 @@ - 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - protected $arOfferData = [ - 'active' => true, - 'name' => 'name', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - 'price' => 10.50, - 'old_price' => 11.50, - 'quantity' => 5, - ]; - - protected $arBrandData = [ - 'active' => true, - 'name' => 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - protected $arCategoryData = [ - 'active' => true, - 'name' => 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - 'nest_depth' => 0, - 'parent_id' => 0, - ]; - - /** - * Check item collection - */ - public function testCollectionItem() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Product collection item data is not correct'; - - //Check item collection - $obCollection = ProductCollection::make([$this->obElement->id]); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - } - - /** - * Check item collection "active" method - */ - public function testActiveList() - { - ProductCollection::make()->active(); - - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Product collection "active" method is not correct'; - - //Check item collection after create - $obCollection = ProductCollection::make()->active(); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->active = false; - $this->obElement->save(); - - //Check item collection, after active = false - $obCollection = ProductCollection::make()->active(); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - - $this->obElement->active = true; - $this->obElement->save(); - - //Check item collection, after active = true - $obCollection = ProductCollection::make()->active(); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->delete(); - - //Check item collection, after element remove - $obCollection = ProductCollection::make()->active(); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - } - - /** - * Check item collection "active" method with checking offer - */ - public function testActiveListWithCheckingOffer() - { - ProductCollection::make()->active(); - Settings::set('check_offer_active', true); - - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Product collection "active" method is not correct'; - - //Check item collection after create - $obCollection = ProductCollection::make()->active(); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obOffer->active = false; - $this->obOffer->save(); - - //Check item collection, after active = false - $obCollection = ProductCollection::make()->active(); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - - $this->obOffer->active = true; - $this->obOffer->save(); - - //Check item collection, after active = true - $obCollection = ProductCollection::make()->active(); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obOffer->delete(); - - //Check item collection, after element remove - $obCollection = ProductCollection::make()->active(); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - - Settings::set('check_offer_active', false); - } - - /** - * Check item collection "category" method - */ - public function testCategoryFilter() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - ProductCollection::make()->category($this->obCategory->id); - - $sErrorMessage = 'Product collection "category" method is not correct'; - - //Check item collection after create - $obCollection = ProductCollection::make()->category($this->obCategory->id); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->category_id = $this->obCategory->id + 1; - $this->obElement->save(); - - //Check item collection, after change category_id field - $obCollection = ProductCollection::make()->category($this->obCategory->id); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - - $this->obElement->category_id = $this->obCategory->id; - $this->obElement->save(); - - //Check item collection, after change category_id field - $obCollection = ProductCollection::make()->category($this->obCategory->id); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->delete(); - - //Check item collection, after element remove - $obCollection = ProductCollection::make()->category($this->obCategory->id); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - } - - /** - * Check item collection "category" method - */ - public function testParentCategoryFilter() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - ProductCollection::make()->category($this->obCategory->id); - - $sErrorMessage = 'Product collection "category" method is not correct'; - - //Check item collection after create - $obCollection = ProductCollection::make()->category($this->obCategory->id - 1, true); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->category_id = $this->obCategory->id + 1; - $this->obElement->save(); - - //Check item collection, after change category_id field - $obCollection = ProductCollection::make()->category($this->obCategory->id -1, true); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - - $this->obElement->category_id = $this->obCategory->id; - $this->obElement->save(); - - //Check item collection, after change category_id field - $obCollection = ProductCollection::make()->category($this->obCategory->id - 1, true); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->delete(); - - //Check item collection, after element remove - $obCollection = ProductCollection::make()->category($this->obCategory->id -1, true); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - } - - /** - * Check item collection "category" method - */ - public function testMultiCategoryFilter() - { - $this->createTestData(1); - $this->createTestData(2); - if(empty($this->obElement)) { - return; - } - - ProductCollection::make()->category([$this->obCategory->id - 2, $this->obCategory->id]); - - $sErrorMessage = 'Product collection "category" method is not correct'; - - //Check item collection after create - $obCollection = ProductCollection::make()->category([$this->obCategory->id - 2, $this->obCategory->id]); - - self::assertEquals(2, $obCollection->count(), $sErrorMessage); - self::assertEquals([$this->obElement->id - 1, $this->obElement->id], $obCollection->getIDList(), $sErrorMessage); - - $this->obElement->category_id = $this->obCategory->id + 1; - $this->obElement->save(); - - //Check item collection, after change category_id field - $obCollection = ProductCollection::make()->category([$this->obCategory->id - 2, $this->obCategory->id]); - - self::assertEquals(1, $obCollection->count(), $sErrorMessage); - self::assertEquals([$this->obElement->id - 1], $obCollection->getIDList(), $sErrorMessage); - - $this->obElement->category_id = $this->obCategory->id; - $this->obElement->save(); - - //Check item collection, after change category_id field - $obCollection = ProductCollection::make()->category([$this->obCategory->id - 2, $this->obCategory->id]); - - self::assertEquals(2, $obCollection->count(), $sErrorMessage); - self::assertEquals([$this->obElement->id - 1, $this->obElement->id], $obCollection->getIDList(), $sErrorMessage); - - $this->obElement->delete(); - - $obCollection = ProductCollection::make()->category([$this->obCategory->id - 2, $this->obCategory->id]); - - //Check item collection, after element remove - self::assertEquals(1, $obCollection->count(), $sErrorMessage); - self::assertEquals([$this->obElement->id - 1], $obCollection->getIDList(), $sErrorMessage); - } - - /** - * Check item collection "brand" method - */ - public function testBrandFilter() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - ProductCollection::make()->brand($this->obBrand->id); - - $sErrorMessage = 'Product collection "brand" method is not correct'; - - //Check item collection after create - $obCollection = ProductCollection::make()->brand($this->obBrand->id); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->brand_id = $this->obBrand->id + 1; - $this->obElement->save(); - - //Check item collection, after change brand_id field - $obCollection = ProductCollection::make()->brand($this->obBrand->id); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - - $this->obElement->brand_id = $this->obBrand->id; - $this->obElement->save(); - - //Check item collection, after change brand_id field - $obCollection = ProductCollection::make()->brand($this->obBrand->id); - - /** @var ProductItem $obItem */ - $obItem = $obCollection->first(); - self::assertInstanceOf(ProductItem::class, $obItem, $sErrorMessage); - self::assertEquals($this->obElement->id, $obItem->id, $sErrorMessage); - - $this->obElement->delete(); - - //Check item collection, after element remove - $obCollection = ProductCollection::make()->brand($this->obBrand->id); - self::assertEquals(true, $obCollection->isEmpty(), $sErrorMessage); - } - - /** - * Check item collection "sort" method (default, new) - */ - public function testSortingByID() - { - $this->createTestData(1); - $this->createTestData(2); - if(empty($this->obElement)) { - return; - } - - ProductCollection::make()->sort(ProductListStore::SORT_NO); - ProductCollection::make()->sort(ProductListStore::SORT_NEW); - - $sErrorMessage = 'Product collection "sort" method is not correct'; - - //Check item collection after create - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_NO); - self::assertEquals([1,2], array_values($obCollection->getIDList()), $sErrorMessage); - - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_NEW); - self::assertEquals([2,1], array_values($obCollection->getIDList()), $sErrorMessage); - - $this->obElement->delete(); - - //Check item collection, after element remove - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_NO); - self::assertEquals([1], array_values($obCollection->getIDList()), $sErrorMessage); - - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_NEW); - self::assertEquals([1], array_values($obCollection->getIDList()), $sErrorMessage); - } - - /** - * Check item collection "sort" method (price desc, asc) - */ - public function testSortingByPrice() - { - $this->createTestData(1); - $this->createTestData(2); - if(empty($this->obElement)) { - return; - } - - ProductCollection::make()->sort(ProductListStore::SORT_PRICE_ASC); - ProductCollection::make()->sort(ProductListStore::SORT_PRICE_DESC); - - $sErrorMessage = 'Product collection "sort" method is not correct'; - - //Check item collection after create - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_ASC); - self::assertEquals([1,2], array_values($obCollection->getIDList()), $sErrorMessage); - - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_DESC); - self::assertEquals([2,1], array_values($obCollection->getIDList()), $sErrorMessage); - - //Check item collection, after update offer price - $this->obOffer->price = 1; - $this->obOffer->save(); - - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_DESC); - self::assertEquals([1,2], array_values($obCollection->getIDList()), $sErrorMessage); - - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_ASC); - self::assertEquals([2,1], array_values($obCollection->getIDList()), $sErrorMessage); - - $this->obOffer->active = false; - $this->obOffer->save(); - - //Check item collection, after offer active = false - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_ASC); - self::assertEquals([1], array_values($obCollection->getIDList()), $sErrorMessage); - - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_DESC); - self::assertEquals([1], array_values($obCollection->getIDList()), $sErrorMessage); - - //Check item collection, after offer active = true - $this->obOffer->active = true; - $this->obOffer->save(); - - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_DESC); - self::assertEquals([1,2], array_values($obCollection->getIDList()), $sErrorMessage); - - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_ASC); - self::assertEquals([2,1], array_values($obCollection->getIDList()), $sErrorMessage); - - $this->obElement->delete(); - - //Check item collection, after element remove - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_ASC); - self::assertEquals([1], array_values($obCollection->getIDList()), $sErrorMessage); - - $obCollection = ProductCollection::make()->sort(ProductListStore::SORT_PRICE_DESC); - self::assertEquals([1], array_values($obCollection->getIDList()), $sErrorMessage); - } - - /** - * Check item collection "getOfferMinPrice" method - */ - public function testOfferMinPriceMethod() - { - $this->createTestData(1); - $this->createTestData(2); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Product collection "getOfferMinPrice" method is not correct'; - - $obOfferItem = ProductCollection::make()->active()->getOfferMinPrice(); - - self::assertInstanceOf(OfferItem::class, $obOfferItem, $sErrorMessage); - self::assertEquals(1, $obOfferItem->id, $sErrorMessage); - } - - /** - * Check item collection "getOfferMaxPrice" method - */ - public function testOfferMaxPriceMethod() - { - $this->createTestData(1); - $this->createTestData(2); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Product collection "getOfferMaxPrice" method is not correct'; - - $obOfferItem = ProductCollection::make()->active()->getOfferMaxPrice(); - - self::assertInstanceOf(OfferItem::class, $obOfferItem, $sErrorMessage); - self::assertEquals(2, $obOfferItem->id, $sErrorMessage); - } - - /** - * Create brand object for test - * @param int $iCount - */ - protected function createTestData($iCount= null) - { - //Create category data - $arCreateData = $this->arCategoryData; - $arCreateData['slug'] = $arCreateData['slug'].'_parent_'.$iCount; - $this->obCategory = Category::create($arCreateData); - - $arCreateData = $this->arCategoryData; - $arCreateData['slug'] = $arCreateData['slug'].$iCount; - $this->obCategory = Category::create($arCreateData); - $this->obCategory->parent_id = $this->obCategory->id -1; - $this->obCategory->save(); - - //Create brand data - $arCreateData = $this->arBrandData; - $arCreateData['slug'] = $arCreateData['slug'].$iCount; - $this->obBrand = Brand::create($arCreateData); - - //Create product data - $arCreateData = $this->arCreateData; - $arCreateData['active'] = true; - $arCreateData['slug'] = $arCreateData['slug'].$iCount; - $arCreateData['category_id'] = $this->obCategory->id; - $arCreateData['brand_id'] = $this->obBrand->id; - $this->obElement = Product::create($arCreateData); - - //Create offer data - $arCreateData = $this->arOfferData; - $arCreateData['product_id'] = $this->obElement->id; - $arCreateData['price'] = $iCount + $arCreateData['price']; - $this->obOffer = Offer::create($arCreateData); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/item/BrandItemTest.php b/plugins/lovata/shopaholic/tests/unit/item/BrandItemTest.php deleted file mode 100644 index 28637eb5a..000000000 --- a/plugins/lovata/shopaholic/tests/unit/item/BrandItemTest.php +++ /dev/null @@ -1,106 +0,0 @@ - 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - /** - * Check item fields - */ - public function testItemFields() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Brand item data is not correct'; - - $arCreatedData = $this->arCreateData; - $arCreatedData['id'] = $this->obElement->id; - - //Check item fields - $obItem = BrandItem::make($this->obElement->id); - foreach ($arCreatedData as $sField => $sValue) { - self::assertEquals($sValue, $obItem->$sField, $sErrorMessage); - } - } - - /** - * Check update cache item data, after update model data - */ - public function testItemClearCache() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Brand item data is not correct, after model update'; - - $obItem = BrandItem::make($this->obElement->id); - self::assertEquals('name', $obItem->name, $sErrorMessage); - - //Check cache update - $this->obElement->name = 'test'; - $this->obElement->save(); - - $obItem = BrandItem::make($this->obElement->id); - self::assertEquals('test', $obItem->name, $sErrorMessage); - } - - /** - * Check update cache item data, after remove element - */ - public function testRemoveElement() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Brand item data is not correct, after model remove'; - - $obItem = BrandItem::make($this->obElement->id); - self::assertEquals(false, $obItem->isEmpty(), $sErrorMessage); - - //Remove element - $this->obElement->delete(); - - $obItem = BrandItem::make($this->obElement->id); - self::assertEquals(true, $obItem->isEmpty(), $sErrorMessage); - } - - /** - * Create brand object for test - */ - protected function createTestData() - { - //Create new element data - $arCreateData = $this->arCreateData; - $arCreateData['active'] = true; - - $this->obElement = Brand::create($arCreateData); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/item/CategoryItemTest.php b/plugins/lovata/shopaholic/tests/unit/item/CategoryItemTest.php deleted file mode 100644 index 46064d0a6..000000000 --- a/plugins/lovata/shopaholic/tests/unit/item/CategoryItemTest.php +++ /dev/null @@ -1,237 +0,0 @@ - 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - protected $arProductData = [ - 'active' => true, - 'name' => 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - /** - * Check item fields - */ - public function testItemFields() - { - $this->createTestData(); - if (empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Category item data is not correct'; - - $arCreatedData = $this->arCreateData; - $arCreatedData['id'] = $this->obElement->id; - $arCreatedData['nest_depth'] = 0; - $arCreatedData['parent_id'] = 0; - $arCreatedData['children_id_list'] = [$this->obChildElement->id]; - - //Check item fields - $obItem = CategoryItem::make($this->obElement->id); - foreach ($arCreatedData as $sField => $sValue) { - self::assertEquals($sValue, $obItem->$sField, $sErrorMessage); - } - - if (empty($this->obChildElement)) { - return; - } - - $arCreatedData = $this->arCreateData; - $arCreatedData['id'] = $this->obChildElement->id; - $arCreatedData['slug'] = 'slug1'; - $arCreatedData['nest_depth'] = 1; - $arCreatedData['parent_id'] = $this->obElement->id; - - $obChildrenCollection = $obItem->children; - self::assertNotEmpty($obChildrenCollection, $sErrorMessage); - self::assertInstanceOf(CategoryCollection::class, $obChildrenCollection, $sErrorMessage); - - /** @var CategoryItem $obChildItem */ - $obChildItem = $obChildrenCollection->shift(); - - //Check item fields - foreach ($arCreatedData as $sField => $sValue) { - self::assertEquals($sValue, $obChildItem->$sField, $sErrorMessage); - } - } - - /** - * Check update cache item data, after update model data - */ - public function testItemClearCache() - { - $this->createTestData(); - if (empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Category item data is not correct, after model update'; - - $obItem = CategoryItem::make($this->obElement->id); - self::assertEquals('name', $obItem->name, $sErrorMessage); - - //Check cache update - $this->obElement->name = 'test'; - $this->obElement->save(); - - $obItem = CategoryItem::make($this->obElement->id); - self::assertEquals('test', $obItem->name, $sErrorMessage); - } - - /** - * Check update cache item data, after remove element - */ - public function testRemoveElement() - { - $this->createTestData(); - if (empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Category item data is not correct, after model remove'; - - $obItem = CategoryItem::make($this->obChildElement->id); - self::assertEquals(false, $obItem->isEmpty(), $sErrorMessage); - - //Remove element - $this->obChildElement->delete(); - - $obItem = CategoryItem::make($this->obChildElement->id); - self::assertEquals(true, $obItem->isEmpty(), $sErrorMessage); - - $obItem = CategoryItem::make($this->obElement->id); - $obChildCollection = $obItem->children; - self::assertEquals(true, $obChildCollection->isEmpty(), $sErrorMessage); - } - - /** - * Test product_count field for main category - */ - public function testProductCountField() - { - $this->createTestData(); - if (empty($this->obElement)) { - return; - } - - $obParentItem = CategoryItem::make($this->obElement->id); - $obItem = CategoryItem::make($this->obChildElement->id); - - self::assertEquals(1, $obParentItem->product_count); - self::assertEquals(1, $obItem->product_count); - - //Set empty category_id in Product object - $this->obProduct->category_id = null; - $this->obProduct->save(); - - $obParentItem = CategoryItem::make($this->obElement->id); - $obItem = CategoryItem::make($this->obChildElement->id); - - self::assertEquals(0, $obParentItem->product_count); - self::assertEquals(0, $obItem->product_count); - - //Set parent category_id in Product object - $this->obProduct->category_id = $this->obElement->id; - $this->obProduct->save(); - - $obParentItem = CategoryItem::make($this->obElement->id); - $obItem = CategoryItem::make($this->obChildElement->id); - - self::assertEquals(1, $obParentItem->product_count); - self::assertEquals(0, $obItem->product_count); - - //Set child category_id in Product object - $this->obProduct->category_id = $this->obChildElement->id; - $this->obProduct->save(); - - $obParentItem = CategoryItem::make($this->obElement->id); - $obItem = CategoryItem::make($this->obChildElement->id); - - self::assertEquals(1, $obParentItem->product_count); - self::assertEquals(1, $obItem->product_count); - - //Set active == false in Product object - $this->obProduct->active = false; - $this->obProduct->save(); - - ProductCollection::make()->active()->save(CategoryItem::class.'_active'); - $obParentItem = CategoryItem::make($this->obElement->id); - $obItem = CategoryItem::make($this->obChildElement->id); - - self::assertEquals(0, $obParentItem->product_count); - self::assertEquals(0, $obItem->product_count); - - //Set active == true in Product object - $this->obProduct->active = true; - $this->obProduct->save(); - - ProductCollection::make()->active()->save(CategoryItem::class.'_active'); - $obParentItem = CategoryItem::make($this->obElement->id); - $obItem = CategoryItem::make($this->obChildElement->id); - - self::assertEquals(1, $obParentItem->product_count); - self::assertEquals(1, $obItem->product_count); - } - - /** - * Create data for test - */ - protected function createTestData() - { - //Create new element data - $arCreatedData = $this->arCreateData; - $arCreatedData['active'] = true; - - $this->obElement = Category::create($arCreatedData); - - $arCreatedData = $this->arCreateData; - $arCreatedData['active'] = true; - $arCreatedData['slug'] = 'slug1'; - - $this->obChildElement = Category::create($arCreatedData); - - $this->obChildElement->parent_id = $this->obElement->id; - $this->obChildElement->nest_depth = 1; - $this->obChildElement->save(); - - $arProductData = $this->arProductData; - $arProductData['category_id'] = $this->obChildElement->id; - - $this->obProduct = Product::create($arProductData); - } -} diff --git a/plugins/lovata/shopaholic/tests/unit/item/MeasureItemTest.php b/plugins/lovata/shopaholic/tests/unit/item/MeasureItemTest.php deleted file mode 100644 index b97448bc3..000000000 --- a/plugins/lovata/shopaholic/tests/unit/item/MeasureItemTest.php +++ /dev/null @@ -1,101 +0,0 @@ - 'name', - ]; - - /** - * Check item fields - */ - public function testItemFields() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Measure item data is not correct'; - - $arCreatedData = $this->arCreateData; - $arCreatedData['id'] = $this->obElement->id; - - //Check item fields - $obItem = MeasureItem::make($this->obElement->id); - foreach ($arCreatedData as $sField => $sValue) { - self::assertEquals($sValue, $obItem->$sField, $sErrorMessage); - } - } - - /** - * Check update cache item data, after update model data - */ - public function testItemClearCache() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Measure item data is not correct, after model update'; - - $obItem = MeasureItem::make($this->obElement->id); - self::assertEquals('name', $obItem->name, $sErrorMessage); - - //Check cache update - $this->obElement->name = 'test'; - $this->obElement->save(); - - $obItem = MeasureItem::make($this->obElement->id); - self::assertEquals('test', $obItem->name, $sErrorMessage); - } - - /** - * Check update cache item data, after remove element - */ - public function testRemoveElement() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Measure item data is not correct, after model remove'; - - $obItem = MeasureItem::make($this->obElement->id); - self::assertEquals(false, $obItem->isEmpty(), $sErrorMessage); - - //Remove element - $this->obElement->delete(); - - $obItem = MeasureItem::make($this->obElement->id); - self::assertEquals(true, $obItem->isEmpty(), $sErrorMessage); - } - - /** - * Create measure object for test - */ - protected function createTestData() - { - //Create new element data - $arCreateData = $this->arCreateData; - - $this->obElement = Measure::create($arCreateData); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/item/OfferItemTest.php b/plugins/lovata/shopaholic/tests/unit/item/OfferItemTest.php deleted file mode 100644 index da51df7eb..000000000 --- a/plugins/lovata/shopaholic/tests/unit/item/OfferItemTest.php +++ /dev/null @@ -1,142 +0,0 @@ - 'name', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - 'price' => '10,50', - 'old_price' => '11,50', - 'quantity' => 5, - ]; - - protected $arProductData = [ - 'name' => 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - /** - * Check item fields - */ - public function testItemFields() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Offer item data is not correct'; - - $arCreatedData = $this->arCreateData; - $arCreatedData['id'] = $this->obElement->id; - $arCreatedData['product_id'] = $this->obProduct->id; - - $arCreatedData['price'] = 10.50; - $arCreatedData['old_price'] = 11.50; - $arCreatedData['price_value'] = 10.50; - $arCreatedData['old_price_value'] = 11.50; - - //Check item fields - $obItem = OfferItem::make($this->obElement->id); - foreach ($arCreatedData as $sField => $sValue) { - self::assertEquals($sValue, $obItem->$sField, $sErrorMessage); - } - - //Check product item data - $obProductItem = $obItem->product; - self::assertInstanceOf(ProductItem::class, $obProductItem); - self::assertEquals($this->obProduct->id, $obProductItem->id, $sErrorMessage); - } - - /** - * Check update cache item data, after update model data - */ - public function testItemClearCache() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Offer item data is not correct, after model update'; - - $obItem = OfferItem::make($this->obElement->id); - self::assertEquals('name', $obItem->name, $sErrorMessage); - - //Check cache update - $this->obElement->name = 'test'; - $this->obElement->save(); - - $obItem = OfferItem::make($this->obElement->id); - self::assertEquals('test', $obItem->name, $sErrorMessage); - } - - /** - * Check item data, after delete model - */ - public function testDeleteElement() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Offer item data is not correct, after model delete'; - - $obItem = OfferItem::make($this->obElement->id); - self::assertEquals(false, $obItem->isEmpty(), $sErrorMessage); - - //Check active flag in item data - $this->obElement->delete(); - - $obItem = OfferItem::make($this->obElement->id); - self::assertEquals(false, $obItem->isEmpty(), $sErrorMessage); - } - - /** - * Create test data - */ - protected function createTestData() - { - Settings::set('decimals', 2); - PriceHelper::forgetInstance(); - - //Create product data - $arCreateData = $this->arProductData; - $arCreateData['active'] = true; - $this->obProduct = Product::create($arCreateData); - - //Create new element data - $arCreateData = $this->arCreateData; - $arCreateData['active'] = true; - $arCreateData['product_id'] = $this->obProduct->id; - - $this->obElement = Offer::create($arCreateData); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/item/ProductItemTest.php b/plugins/lovata/shopaholic/tests/unit/item/ProductItemTest.php deleted file mode 100644 index ce755cd28..000000000 --- a/plugins/lovata/shopaholic/tests/unit/item/ProductItemTest.php +++ /dev/null @@ -1,186 +0,0 @@ - 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - protected $arOfferData = [ - 'active' => true, - 'name' => 'name', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - 'price' => '10,50', - 'old_price' => '11,50', - 'quantity' => 5, - ]; - - protected $arBrandData = [ - 'active' => true, - 'name' => 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - ]; - - protected $arCategoryData = [ - 'active' => true, - 'name' => 'name', - 'slug' => 'slug', - 'code' => 'code', - 'preview_text' => 'preview_text', - 'description' => 'description', - 'nest_depth' => 0, - 'parent_id' => 0, - ]; - - /** - * Check item fields - */ - public function testItemFields() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Product item data is not correct'; - - $arCreatedData = $this->arCreateData; - $arCreatedData['id'] = $this->obElement->id; - $arCreatedData['category_id'] = $this->obCategory->id; - $arCreatedData['brand_id'] = $this->obBrand->id; - $arCreatedData['offer_id_list'] = [$this->obOffer->id]; - - //Check item fields - $obItem = ProductItem::make($this->obElement->id); - foreach ($arCreatedData as $sField => $sValue) { - self::assertEquals($sValue, $obItem->$sField, $sErrorMessage); - } - - //Check category item data - $obCategoryItem = $obItem->category; - self::assertInstanceOf(CategoryItem::class, $obCategoryItem); - self::assertEquals($this->obCategory->id, $obCategoryItem->id, $sErrorMessage); - - //Check brand item data - $obBrandItem = $obItem->brand; - self::assertInstanceOf(BrandItem::class, $obBrandItem); - self::assertEquals($this->obBrand->id, $obBrandItem->id, $sErrorMessage); - - //Check offer collection - $obOfferCollection = $obItem->offer; - self::assertInstanceOf(OfferCollection::class, $obOfferCollection); - - /** @var OfferItem $obOfferItem */ - $obOfferItem = $obOfferCollection->first(); - self::assertInstanceOf(OfferItem::class, $obOfferItem); - self::assertEquals($this->obOffer->id, $obOfferItem->id, $sErrorMessage); - } - - /** - * Check update cache item data, after update model data - */ - public function testItemClearCache() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Product item data is not correct, after model update'; - - $obItem = ProductItem::make($this->obElement->id); - self::assertEquals('name', $obItem->name, $sErrorMessage); - - //Check cache update - $this->obElement->name = 'test'; - $this->obElement->save(); - - $obItem = ProductItem::make($this->obElement->id); - self::assertEquals('test', $obItem->name, $sErrorMessage); - } - - /** - * Check item data, after delete model - */ - public function testDeleteElement() - { - $this->createTestData(); - if(empty($this->obElement)) { - return; - } - - $sErrorMessage = 'Product item data is not correct, after model delete'; - - $obItem = ProductItem::make($this->obElement->id); - self::assertEquals(false, $obItem->isEmpty(), $sErrorMessage); - - //Check active flag in item data - $this->obElement->delete(); - - $obItem = ProductItem::make($this->obElement->id); - self::assertEquals(false, $obItem->isEmpty(), $sErrorMessage); - } - - /** - * Create test data - */ - protected function createTestData() - { - //Create category data - $this->obCategory = Category::create($this->arCategoryData); - - //Create brand data - $this->obBrand = Brand::create($this->arBrandData); - - //Create product data - $arCreateData = $this->arCreateData; - $arCreateData['active'] = true; - $arCreateData['category_id'] = $this->obCategory->id; - $arCreateData['brand_id'] = $this->obBrand->id; - $this->obElement = Product::create($arCreateData); - - //Create offer data - $arCreateData = $this->arOfferData; - $arCreateData['product_id'] = $this->obElement->id; - $this->obOffer = Offer::create($arCreateData); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/models/BrandTest.php b/plugins/lovata/shopaholic/tests/unit/models/BrandTest.php deleted file mode 100644 index 2f3dc1508..000000000 --- a/plugins/lovata/shopaholic/tests/unit/models/BrandTest.php +++ /dev/null @@ -1,53 +0,0 @@ -sModelClass = Brand::class; - parent::__construct(); - } - - /** - * Check model "product" relation config - */ - public function testHasProductRelation() - { - $sErrorMessage = $this->sModelClass.' model has not correct "product" relation config'; - - /** @var Brand $obModel */ - $obModel = new Brand(); - self::assertNotEmpty($obModel->hasMany, $sErrorMessage); - self::assertArrayHasKey('product', $obModel->hasMany, $sErrorMessage); - self::assertEquals(Product::class, $obModel->hasMany['product'], $sErrorMessage); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/models/CategoryTest.php b/plugins/lovata/shopaholic/tests/unit/models/CategoryTest.php deleted file mode 100644 index 44e1af372..000000000 --- a/plugins/lovata/shopaholic/tests/unit/models/CategoryTest.php +++ /dev/null @@ -1,53 +0,0 @@ -sModelClass = Category::class; - parent::__construct(); - } - - /** - * Check model "product" relation config - */ - public function testHasProductRelation() - { - $sErrorMessage = $this->sModelClass.' model has not correct "product" relation config'; - - /** @var Category $obModel */ - $obModel = new Category(); - self::assertNotEmpty($obModel->hasMany, $sErrorMessage); - self::assertArrayHasKey('product', $obModel->hasMany, $sErrorMessage); - self::assertEquals(Product::class, $obModel->hasMany['product'], $sErrorMessage); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/models/MeasureTest.php b/plugins/lovata/shopaholic/tests/unit/models/MeasureTest.php deleted file mode 100644 index 9b406228c..000000000 --- a/plugins/lovata/shopaholic/tests/unit/models/MeasureTest.php +++ /dev/null @@ -1,31 +0,0 @@ -sModelClass = Measure::class; - parent::__construct(); - } -} diff --git a/plugins/lovata/shopaholic/tests/unit/models/OfferTest.php b/plugins/lovata/shopaholic/tests/unit/models/OfferTest.php deleted file mode 100644 index 198455522..000000000 --- a/plugins/lovata/shopaholic/tests/unit/models/OfferTest.php +++ /dev/null @@ -1,51 +0,0 @@ -sModelClass = Offer::class; - parent::__construct(); - } - - /** - * Check model "product" relation config - */ - public function testHasProductRelation() - { - $sErrorMessage = $this->sModelClass.' model has not correct "product" relation config'; - - /** @var Offer $obModel */ - $obModel = new Offer(); - self::assertNotEmpty($obModel->belongsTo, $sErrorMessage); - self::assertArrayHasKey('product', $obModel->belongsTo, $sErrorMessage); - self::assertEquals([Product::class], $obModel->belongsTo['product'], $sErrorMessage); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/tests/unit/models/ProductTest.php b/plugins/lovata/shopaholic/tests/unit/models/ProductTest.php deleted file mode 100644 index 77f641c9a..000000000 --- a/plugins/lovata/shopaholic/tests/unit/models/ProductTest.php +++ /dev/null @@ -1,82 +0,0 @@ -sModelClass = Product::class; - parent::__construct(); - } - - /** - * Check model "offer" relation config - */ - public function testHasOfferRelation() - { - $sErrorMessage = $this->sModelClass.' model has not correct "offer" relation config'; - - /** @var Product $obModel */ - $obModel = new Product(); - self::assertNotEmpty($obModel->hasMany, $sErrorMessage); - self::assertArrayHasKey('offer', $obModel->hasMany, $sErrorMessage); - self::assertEquals([Offer::class], $obModel->hasMany['offer'], $sErrorMessage); - } - - /** - * Check model "category" relation config - */ - public function testHasCategoryRelation() - { - $sErrorMessage = $this->sModelClass.' model has not correct "category" relation config'; - - /** @var Product $obModel */ - $obModel = new Product(); - self::assertNotEmpty($obModel->belongsTo, $sErrorMessage); - self::assertArrayHasKey('category', $obModel->belongsTo, $sErrorMessage); - self::assertEquals([Category::class], $obModel->belongsTo['category'], $sErrorMessage); - } - - /** - * Check model "brand" relation config - */ - public function testHasBrandRelation() - { - $sErrorMessage = $this->sModelClass.' model has not correct "brand" relation config'; - - /** @var Product $obModel */ - $obModel = new Product(); - self::assertNotEmpty($obModel->belongsTo, $sErrorMessage); - self::assertArrayHasKey('brand', $obModel->belongsTo, $sErrorMessage); - self::assertEquals([Brand::class], $obModel->belongsTo['brand'], $sErrorMessage); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/updates/create_table_additional_categories.php b/plugins/lovata/shopaholic/updates/create_table_additional_categories.php deleted file mode 100644 index d26d9ec06..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_additional_categories.php +++ /dev/null @@ -1,38 +0,0 @@ -engine = 'InnoDB'; - $obTable->integer('category_id')->unsigned(); - $obTable->integer('product_id')->unsigned(); - $obTable->primary(['category_id', 'product_id'], 'product_category'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists('lovata_shopaholic_additional_categories'); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_brands.php b/plugins/lovata/shopaholic/updates/create_table_brands.php deleted file mode 100644 index df33941d5..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_brands.php +++ /dev/null @@ -1,48 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); - $obTable->boolean('active')->default(0); - $obTable->string('name'); - $obTable->string('slug')->unique(); - $obTable->string('code')->nullable(); - $obTable->string('external_id')->nullable(); - $obTable->text('preview_text')->nullable(); - $obTable->text('description')->nullable(); - $obTable->integer('sort_order')->nullable(); - $obTable->timestamps(); - - $obTable->index('name'); - $obTable->index('code'); - $obTable->index('external_id'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists('lovata_shopaholic_brands'); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_categories.php b/plugins/lovata/shopaholic/updates/create_table_categories.php deleted file mode 100644 index d316eb7e5..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_categories.php +++ /dev/null @@ -1,52 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); - $obTable->boolean('active')->default(0); - $obTable->string('name'); - $obTable->string('slug')->unique(); - $obTable->string('code')->nullable(); - $obTable->string('external_id')->nullable(); - $obTable->text('preview_text')->nullable(); - $obTable->text('description')->nullable(); - $obTable->integer('parent_id')->nullable()->unsigned(); - $obTable->integer('nest_left')->nullable()->unsigned(); - $obTable->integer('nest_right')->nullable()->unsigned(); - $obTable->integer('nest_depth')->nullable()->unsigned(); - $obTable->timestamps(); - - $obTable->index('name'); - $obTable->index('code'); - $obTable->index('external_id'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists('lovata_shopaholic_categories'); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_currency.php b/plugins/lovata/shopaholic/updates/create_table_currency.php deleted file mode 100644 index 20276bc24..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_currency.php +++ /dev/null @@ -1,49 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); - $obTable->boolean('active')->default(0); - $obTable->boolean('is_default')->default(0); - $obTable->string('name'); - $obTable->string('code')->unique(); - $obTable->string('symbol'); - $obTable->decimal('rate'); - $obTable->string('external_id')->nullable(); - $obTable->integer('sort_order')->nullable(); - $obTable->softDeletes(); - $obTable->timestamps(); - - $obTable->index('external_id'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_measure.php b/plugins/lovata/shopaholic/updates/create_table_measure.php deleted file mode 100644 index f4c93a657..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_measure.php +++ /dev/null @@ -1,58 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id'); - $obTable->string('name'); - $obTable->string('code')->nullable(); - $obTable->timestamps(); - }); - - if (!Schema::hasTable(self::OLD_TABLE_NAME)) { - return; - } - - $obMeasureList = DB::table(self::OLD_TABLE_NAME)->get(); - if ($obMeasureList->isEmpty()) { - return; - } - - foreach ($obMeasureList as $obMeasure) { - Measure::create(['name' => $obMeasure->name]); - } - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} \ No newline at end of file diff --git a/plugins/lovata/shopaholic/updates/create_table_offers.php b/plugins/lovata/shopaholic/updates/create_table_offers.php deleted file mode 100644 index f3a8d7515..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_offers.php +++ /dev/null @@ -1,56 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); - $obTable->boolean('active')->default(0); - $obTable->integer('product_id')->unsigned()->nullable(); - $obTable->string('name'); - $obTable->string('code')->nullable(); - $obTable->string('external_id')->nullable(); - $obTable->decimal('price', 15, 2)->nullable(); - $obTable->decimal('old_price', 15, 2)->nullable(); - $obTable->integer('quantity')->unsigned()->default(0); - $obTable->text('preview_text')->nullable(); - $obTable->text('description')->nullable(); - $obTable->softDeletes(); - $obTable->timestamps(); - - $obTable->index('name'); - $obTable->index('code'); - $obTable->index('external_id'); - $obTable->index('product_id'); - $obTable->index('price'); - $obTable->index('old_price'); - $obTable->index('quantity'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists('lovata_shopaholic_offers'); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_price_types.php b/plugins/lovata/shopaholic/updates/create_table_price_types.php deleted file mode 100644 index ee41584a5..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_price_types.php +++ /dev/null @@ -1,48 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); - $obTable->boolean('active')->default(0); - $obTable->string('name'); - $obTable->string('code')->nullable(); - $obTable->string('external_id')->nullable(); - $obTable->integer('currency_id')->nullable(); - $obTable->integer('sort_order')->nullable(); - $obTable->softDeletes(); - $obTable->timestamps(); - - $obTable->index('code'); - $obTable->index('external_id'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_prices.php b/plugins/lovata/shopaholic/updates/create_table_prices.php deleted file mode 100644 index 0422b00c6..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_prices.php +++ /dev/null @@ -1,50 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); - $obTable->integer('item_id')->unsigned(); - $obTable->string('item_type'); - $obTable->decimal('price', 15, 2)->nullable(); - $obTable->decimal('old_price', 15, 2)->nullable(); - $obTable->integer('price_type_id')->unsigned()->nullable(); - $obTable->timestamps(); - - $obTable->index('item_id'); - $obTable->index('item_type'); - $obTable->index('price'); - $obTable->index('old_price'); - $obTable->index('price_type_id'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_products.php b/plugins/lovata/shopaholic/updates/create_table_products.php deleted file mode 100644 index 02e32bda2..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_products.php +++ /dev/null @@ -1,53 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); - $obTable->boolean('active')->default(0); - $obTable->string('name'); - $obTable->string('slug')->unique(); - $obTable->integer('brand_id')->nullable()->unsigned(); - $obTable->integer('category_id')->nullable()->unsigned(); - $obTable->string('external_id')->nullable(); - $obTable->string('code')->nullable(); - $obTable->text('preview_text')->nullable(); - $obTable->text('description')->nullable(); - $obTable->softDeletes(); - $obTable->timestamps(); - - $obTable->index('name'); - $obTable->index('code'); - $obTable->index('external_id'); - $obTable->index('brand_id'); - $obTable->index('category_id'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists('lovata_shopaholic_products'); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_promo_block.php b/plugins/lovata/shopaholic/updates/create_table_promo_block.php deleted file mode 100644 index 566c4d8a1..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_promo_block.php +++ /dev/null @@ -1,52 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); - $obTable->boolean('active')->default(0); - $obTable->boolean('hidden')->default(0); - $obTable->string('name'); - $obTable->string('slug')->unique(); - $obTable->string('type'); - $obTable->string('code')->nullable(); - $obTable->dateTime('date_begin'); - $obTable->dateTime('date_end')->nullable(); - $obTable->text('preview_text')->nullable(); - $obTable->text('description')->nullable(); - $obTable->integer('sort_order')->nullable(); - $obTable->timestamps(); - - $obTable->index('name'); - $obTable->index('code'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_promo_block_relation.php b/plugins/lovata/shopaholic/updates/create_table_promo_block_relation.php deleted file mode 100644 index 75a93542a..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_promo_block_relation.php +++ /dev/null @@ -1,39 +0,0 @@ -engine = 'InnoDB'; - $obTable->integer('promo_id')->unsigned(); - $obTable->integer('product_id')->unsigned(); - $obTable->primary(['promo_id', 'product_id'], 'product_promo'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_tax_category_relation.php b/plugins/lovata/shopaholic/updates/create_table_tax_category_relation.php deleted file mode 100644 index fef08e7f2..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_tax_category_relation.php +++ /dev/null @@ -1,39 +0,0 @@ -engine = 'InnoDB'; - $obTable->integer('tax_id')->unsigned(); - $obTable->integer('category_id')->unsigned(); - $obTable->primary(['category_id', 'tax_id'], 'tax_category'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_tax_country_relation.php b/plugins/lovata/shopaholic/updates/create_table_tax_country_relation.php deleted file mode 100644 index 6df74a2ea..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_tax_country_relation.php +++ /dev/null @@ -1,39 +0,0 @@ -engine = 'InnoDB'; - $obTable->integer('tax_id')->unsigned(); - $obTable->integer('country_id')->unsigned(); - $obTable->primary(['country_id', 'tax_id'], 'tax_country'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_tax_product_relation.php b/plugins/lovata/shopaholic/updates/create_table_tax_product_relation.php deleted file mode 100644 index 2637ce9ee..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_tax_product_relation.php +++ /dev/null @@ -1,39 +0,0 @@ -engine = 'InnoDB'; - $obTable->integer('tax_id')->unsigned(); - $obTable->integer('product_id')->unsigned(); - $obTable->primary(['product_id', 'tax_id'], 'tax_product'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_tax_state_relation.php b/plugins/lovata/shopaholic/updates/create_table_tax_state_relation.php deleted file mode 100644 index caf576387..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_tax_state_relation.php +++ /dev/null @@ -1,39 +0,0 @@ -engine = 'InnoDB'; - $obTable->integer('tax_id')->unsigned(); - $obTable->integer('state_id')->unsigned(); - $obTable->primary(['state_id', 'tax_id'], 'tax_state'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/create_table_taxes.php b/plugins/lovata/shopaholic/updates/create_table_taxes.php deleted file mode 100644 index 2cdd8bd76..000000000 --- a/plugins/lovata/shopaholic/updates/create_table_taxes.php +++ /dev/null @@ -1,45 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); - $obTable->boolean('active')->default(0); - $obTable->boolean('is_global')->default(0); - $obTable->decimal('percent')->nullable(); - $obTable->string('name'); - $obTable->text('description')->nullable(); - $obTable->integer('sort_order')->nullable(); - $obTable->softDeletes(); - $obTable->timestamps(); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE_NAME); - } -} diff --git a/plugins/lovata/shopaholic/updates/seeder_create_default_currency.php b/plugins/lovata/shopaholic/updates/seeder_create_default_currency.php deleted file mode 100644 index 83356d8c5..000000000 --- a/plugins/lovata/shopaholic/updates/seeder_create_default_currency.php +++ /dev/null @@ -1,47 +0,0 @@ - 0) { - return; - } - - $arDefaultCurrencyData = [ - 'active' => true, - 'is_default' => true, - 'name' => 'USD', - 'code' => 'USD', - 'symbol' => '$', - 'rate' => 1, - 'sort_order' => 1, - ]; - - //Get currency value from settings - $sCurrency = trim(Settings::getValue('currency')); - if (!empty($sCurrency)) { - $arDefaultCurrencyData['name'] = $sCurrency; - $arDefaultCurrencyData['code'] = $sCurrency; - $arDefaultCurrencyData['symbol'] = $sCurrency; - } - - try { - Currency::create($arDefaultCurrencyData); - } catch (\Exception $obException) { - return; - } - } -} diff --git a/plugins/lovata/shopaholic/updates/seeder_price_format.php b/plugins/lovata/shopaholic/updates/seeder_price_format.php deleted file mode 100644 index 4a463fc80..000000000 --- a/plugins/lovata/shopaholic/updates/seeder_price_format.php +++ /dev/null @@ -1,21 +0,0 @@ -get(); - - //Get offer list - $obOfferList = Offer::withTrashed()->get(); - if ($obOfferList->isEmpty()) { - return; - } - - foreach ($obOfferList as $obOffer) { - $obOfferModel = $obPriceList->where('id', $obOffer->id)->first(); - $obOffer->price = $obOfferModel->price; - $obOffer->old_price = $obOfferModel->old_price; - $obOffer->save(); - } - } -} diff --git a/plugins/lovata/shopaholic/updates/update_table_offers_add_dimensions_field.php b/plugins/lovata/shopaholic/updates/update_table_offers_add_dimensions_field.php deleted file mode 100644 index 7433b54dd..000000000 --- a/plugins/lovata/shopaholic/updates/update_table_offers_add_dimensions_field.php +++ /dev/null @@ -1,97 +0,0 @@ - $sFieldName) { - if (Schema::hasColumn(self::TABLE_NAME, $sFieldName)) { - unset($arNewFieldList[$iKey]); - } - } - - if (empty($arNewFieldList)) { - return; - } - - Schema::table(self::TABLE_NAME, function (Blueprint $obTable) use ($arNewFieldList) { - if (in_array('quantity_in_unit', $arNewFieldList)) { - $obTable->double('quantity_in_unit')->nullable()->after('quantity'); - } - if (in_array('measure_of_unit_id', $arNewFieldList)) { - $obTable->integer('measure_of_unit_id')->nullable()->after('quantity'); - } - if (in_array('width', $arNewFieldList)) { - $obTable->double('width')->nullable()->after('quantity'); - } - if (in_array('length', $arNewFieldList)) { - $obTable->double('length')->nullable()->after('quantity'); - } - if (in_array('height', $arNewFieldList)) { - $obTable->double('height')->nullable()->after('quantity'); - } - if (in_array('weight', $arNewFieldList)) { - $obTable->double('weight')->nullable()->after('quantity'); - } - }); - } - - /** - * Rollback migration - */ - public function down() - { - if (!Schema::hasTable(self::TABLE_NAME)) { - return; - } - - $arNewFieldList = [ - 'weight', - 'height', - 'length', - 'width', - 'measure_of_unit_id', - 'quantity_in_unit', - ]; - - foreach ($arNewFieldList as $iKey => $sFieldName) { - if (!Schema::hasColumn(self::TABLE_NAME, $sFieldName)) { - unset($arNewFieldList[$iKey]); - } - } - - if (empty($arNewFieldList)) { - return; - } - - Schema::table(self::TABLE_NAME, function (Blueprint $obTable) use ($arNewFieldList) { - $obTable->dropColumn($arNewFieldList); - }); - } -} diff --git a/plugins/lovata/shopaholic/updates/update_table_offers_add_measure_field.php b/plugins/lovata/shopaholic/updates/update_table_offers_add_measure_field.php deleted file mode 100644 index 187211cb0..000000000 --- a/plugins/lovata/shopaholic/updates/update_table_offers_add_measure_field.php +++ /dev/null @@ -1,42 +0,0 @@ -integer('measure_id')->nullable()->after('quantity'); - }); - } - - /** - * Rollback migration - */ - public function down() - { - if (!Schema::hasTable(self::TABLE_NAME) || !Schema::hasColumn(self::TABLE_NAME, 'measure_id')) { - return; - } - - Schema::table(self::TABLE_NAME, function (Blueprint $obTable) { - $obTable->dropColumn(['measure_id']); - }); - } -} diff --git a/plugins/lovata/shopaholic/updates/update_table_offers_change_quantity_field.php b/plugins/lovata/shopaholic/updates/update_table_offers_change_quantity_field.php deleted file mode 100644 index cf44688af..000000000 --- a/plugins/lovata/shopaholic/updates/update_table_offers_change_quantity_field.php +++ /dev/null @@ -1,42 +0,0 @@ -integer('quantity')->default(0)->change(); - }); - } - - /** - * Rollback migration - */ - public function down() - { - if (!Schema::hasTable(self::TABLE_NAME) || !Schema::hasColumn(self::TABLE_NAME, 'quantity')) { - return; - } - - Schema::table(self::TABLE_NAME, function (Blueprint $obTable) { - $obTable->integer('quantity')->unsigned()->default(0)->change(); - }); - } -} diff --git a/plugins/lovata/shopaholic/updates/update_table_offers_remove_price_field.php b/plugins/lovata/shopaholic/updates/update_table_offers_remove_price_field.php deleted file mode 100644 index 1c062a259..000000000 --- a/plugins/lovata/shopaholic/updates/update_table_offers_remove_price_field.php +++ /dev/null @@ -1,46 +0,0 @@ -dropColumn(['price', 'old_price']); - }); - } - - /** - * Rollback migration - */ - public function down() - { - if (!Schema::hasTable(self::TABLE_NAME) || Schema::hasColumn(self::TABLE_NAME, 'price')) { - return; - } - - Schema::table(self::TABLE_NAME, function (Blueprint $obTable) { - $obTable->decimal('price', 15, 2)->nullable(); - $obTable->decimal('old_price', 15, 2)->nullable(); - - $obTable->index('price'); - $obTable->index('old_price'); - }); - } -} diff --git a/plugins/lovata/shopaholic/updates/update_table_users_add_currency_field.php b/plugins/lovata/shopaholic/updates/update_table_users_add_currency_field.php deleted file mode 100644 index feac5142a..000000000 --- a/plugins/lovata/shopaholic/updates/update_table_users_add_currency_field.php +++ /dev/null @@ -1,50 +0,0 @@ -string('active_currency_code')->nullable(); - }); - } - - if (Schema::hasTable('users') && !Schema::hasColumn('users', 'active_currency_code')) { - - Schema::table('users', function (Blueprint $obTable) { - $obTable->string('active_currency_code')->nullable(); - }); - } - } - - /** - * Rollback migration - */ - public function down() - { - if (Schema::hasTable('lovata_buddies_users') && Schema::hasColumn('lovata_buddies_users', 'active_currency_code')) { - Schema::table('lovata_buddies_users', function (Blueprint $obTable) { - $obTable->dropColumn(['active_currency_code']); - }); - } - - if (Schema::hasTable('users') && Schema::hasColumn('users', 'active_currency_code')) { - Schema::table('users', function (Blueprint $obTable) { - $obTable->dropColumn(['active_currency_code']); - }); - } - } -} diff --git a/plugins/lovata/shopaholic/updates/version.yaml b/plugins/lovata/shopaholic/updates/version.yaml deleted file mode 100644 index 08aac8c4a..000000000 --- a/plugins/lovata/shopaholic/updates/version.yaml +++ /dev/null @@ -1,136 +0,0 @@ -1.0.0: - - 'Initialize plugin.' - - create_table_categories.php - - create_table_products.php - - create_table_offers.php - - create_table_brands.php -1.1.0: - - 'Add integration with "Popularity for Shopaholic" and "Tags for Shopaholic" plugins' -1.2.0: - - 'preview_image, images fields in item classes returns \System\Models\File class objects. Add integration with "Reviews for Shopaholic" plugin' -1.2.1: - - 'Remove php short tags from offers/update.htm' -1.2.2: - - 'Add additional cache cleaning after category reordering' -1.2.3: - - 'Adding additional cache cleaning for the sorted list of brands, after the creation of a new brand. Requires Toolbox plugin version 1.3.0 and later.' -1.3.0: - - 'Add menu types for integration with the StaticPage plugin. Add getPageUrl() method to the CategoryItem class. Requires Toolbox plugin version 1.4.0 and later. Thanks for contribution Alvaro Cánepa.' -1.3.1: - - 'Fix: processing of the "nesting" flag for the menu type "catalog"' -1.4.0: - - 'Replace code of product sorting by popularity and rating from Shopaholic to extension plugins. Add event "shopaholic.sorting.get.list" for custom sorting of products. Add integration with "Related products for Shopaholic" and "Accessories for Shopaholic" plugins' -1.4.1: - - 'Update annotations for "Reviews for Shopaholic" plugin. Fix $dates array in Product model. Thanks for contribution Alexander Shapoval.' -1.5.0: - - 'Add integration with "Search for Shopaholic","Sphinx for Shopaholic" plugins' -1.6.0: - - 'Add integration with "Compare for Shopaholic"' -1.7.0: - - 'Added translation into French. Thanks for contribution philmarc.' -1.8.0: - - 'Add integration with "Viewed products for Shopaholic" plugin' -1.9.0: - - 'Add PriceHelperTrait, TraitCached in models. Add active() method to CategoryCollection class. Move PriceHelper class from Shopaholic plugin to Toolbox plugin. Add new store classes. Refactoring *Store, *Item, *Collection classes. Requires Toolbox plugin version 1.10.0 and later.' - - seeder_price_format.php -1.10.0: - - 'Adding relation between Product model and additional categories. Adding ability to get list of products by category ID list, by the parent category ID.' - - create_table_additional_categories.php -1.11.0: - - 'Adding getPageUrl() method to ProductItem, BrandItem classes.' -1.11.1: - - 'Adding "field.additional_category" value to lang files. Fixed displaying "additional categories" field only for update/preview forms.' -1.11.2: - - 'Fix work with *Store classes in *Handler classes.' -1.11.3: - - 'Fix error in ProductCollection class, if product list by category is empty.' -1.12.0: - - 'Added type returned by methods in AbstractStore * classes' -1.13.0: - - 'Added PromoBlock model. Promo blocks are sections of content that you can place throughout your eCommerce website and advertise products, offers, discounts, campaigns, and other activity. Added PromoBlockData, PromoBlockPage, PromoBlockList components. Added PromoBlockItem, PromoBlockCollection classes.' - - create_table_promo_block.php - - create_table_promo_block_relation.php -1.13.1: - - 'Added annotations for integration with Coupons for Shopaholic, Discounts for Shopaholic, Campaigns for Shopaholic plugins.' -1.14.0: - - 'Added "additional_category" field to ProductItem class.' -1.14.1: - - 'Remove vendor folder from plugin.' -1.15.0: - - 'Added import product, offers, categories, brands from CSV file in backend. Requires Toolbox plugin version 1.18.0 and later' -1.16.0: - - 'Added block with description about import of product/offer properties from CSV file.' -1.16.1: - - 'Added annotations of filterByDiscount(), filterByQuantity() methods to OfferCollection class.' -1.17.0: - - 'Added Japanese language. Thanks for contribution pikanji.' -1.18.0: - - 'Added German language. Thanks for contribution Gerald.' -1.19.0: - - 'Added translatable slug in Product, Brand, Category, PromoBlock models.' -1.19.1: - - 'Fixed permissions for promo block menu item. Thanks for contribution Andreas Kosmowicz.' -1.20.0: - - 'Added Slovak language. Thanks for contribution vosco88.' -1.21.0: - - 'Added multicurrency. Added taxes. Added price types. Added shopaholic:check.table.integrity artisan command.' - - create_table_taxes.php - - create_table_tax_category_relation.php - - create_table_tax_product_relation.php - - create_table_tax_country_relation.php - - create_table_tax_state_relation.php - - create_table_currency.php - - seeder_create_default_currency.php - - create_table_price_types.php - - create_table_prices.php - - update_table_users_add_currency_field.php - - seeder_transfer_offer_prices.php - - update_table_offers_remove_price_field.php -1.21.1: - - 'Fixed labels for tax settings.' -1.21.2: - - 'Fix error with saving offer without prices.' -1.22.0: - - 'Added customizable import from xml file. Thanks to Rolands Zeltins. His donation made this feature available for everyone.' -1.22.1: - - 'Fixed command shopaholic:import_from_xml.' -1.22.2: - - 'Added "deactivate" fields to config of XmlImportSettings model.' -1.22.3: - - 'Fixed attaching of children categories to parent category in script of import from XML.' -1.22.4: - - 'Removed deleted offers from sorting by price.' -1.22.5: - - 'Fixed bug with deactivating items in import from XML files.' -1.23.0: - - 'Added ability to show catalog with active price type. Added annotations for integration with Subscriptions for Shopaholic plugin.' -1.23.1: - - 'Added step attribute to offer price field in backend view' -1.24.0: - - 'Added support of wildcard params to CategoryPage component. Requires Toolbox plugin version 1.26.0 and later' -1.24.1: - - 'Fixed support of wildcard params in CategoryPage component. Requires Toolbox plugin version 1.26.1 and later' -1.24.2: - - 'Added annotations for Subscriptions for Shopaholic plugin.' -1.24.3: - - 'Added validation of import fields that contains relation IDs.' -1.25.0: - - 'Moved "Measure" model from "Properties for Shopaholic" plugin. Added weight, height, length, width, measure_of_unit, quantity_in_unit fields to Offer model. Added new global settings: size unit measure, weight unit measure, piece unit measure.' - - create_table_measure.php - - update_table_offers_add_dimensions_field.php -1.26.0: - - 'Added relation to Offer model with Measure model.' - - update_table_offers_add_measure_field.php -1.27.0: - - 'Added parent category field to backend in Category model. Thanks for contribution Dinwid.' -1.27.1: - - 'Fixed logic of getting prices in Offer model.' -1.28.0: - - 'Added "with children" param in BrandCollection->category method. Added settings for "default pages". Added "lovata.backend.extend_list_toolbar" event to controllers. Added "icon" field to Brand, Category and PromoBlock models. Added settings "Allow negative offer quantity".' - - update_table_offers_change_quantity_field.php -1.29.0: - - 'Added composer.json to plugin' -1.30.0: - - 'Reduced count of database queries, if cache is empty. Requires Toolbox plugin version 1.32.0 and later.' -1.30.1: - - 'Added "lazy" param to tabs config of Products controller' diff --git a/plugins/lovata/shopaholic/views/import_from_xml_info.htm b/plugins/lovata/shopaholic/views/import_from_xml_info.htm deleted file mode 100644 index e90ed8cd5..000000000 --- a/plugins/lovata/shopaholic/views/import_from_xml_info.htm +++ /dev/null @@ -1,8 +0,0 @@ -
    -
    - -
    - -
    -
    -
    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/views/offer_price_list.htm b/plugins/lovata/shopaholic/views/offer_price_list.htm deleted file mode 100644 index c524e6b98..000000000 --- a/plugins/lovata/shopaholic/views/offer_price_list.htm +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - get(); - if ($obPriceTypeList->isNotEmpty()) { - foreach ($obPriceTypeList as $obPriceType) { - ?> - - - - - - - -
    name ?>
    \ No newline at end of file diff --git a/plugins/lovata/shopaholic/widgets/ImportFromCSV.php b/plugins/lovata/shopaholic/widgets/ImportFromCSV.php deleted file mode 100644 index 132176120..000000000 --- a/plugins/lovata/shopaholic/widgets/ImportFromCSV.php +++ /dev/null @@ -1,21 +0,0 @@ -makePartial('widget'); - } -} diff --git a/plugins/lovata/shopaholic/widgets/ImportFromXML.php b/plugins/lovata/shopaholic/widgets/ImportFromXML.php deleted file mode 100644 index 6c5c74564..000000000 --- a/plugins/lovata/shopaholic/widgets/ImportFromXML.php +++ /dev/null @@ -1,75 +0,0 @@ - ImportBrandModelFromXML::class, - 'import-categories' => ImportCategoryModelFromXML::class, - 'import-properties' => 'Lovata\PropertiesShopaholic\Classes\Import\ImportPropertyModelFromXML', - 'import-products' => ImportProductModelFromXML::class, - 'import-offers' => ImportOfferModelFromXML::class, - 'import-prices' => ImportOfferPriceFromXML::class, - ]; - - /** - * Render method - * @return mixed|string - * @throws \SystemException - */ - public function render() - { - return $this->makePartial('widget'); - } - - /** - * Start import from XML - */ - public function onImportFromXML() - { - foreach ($this->arClassList as $sKey => $sImportClass) { - $bEnableImport = (bool) Input::get($sKey); - if (!class_exists($sImportClass) || !$bEnableImport) { - continue; - } - - /** @var \Lovata\Toolbox\Classes\Helper\AbstractImportModelFromXML $obImport */ - $obImport = new $sImportClass(); - $obImport->import(); - - $this->iCreatedCount += $obImport->getCreatedCount(); - $this->iUpdatedCount += $obImport->getUpdatedCount(); - $this->iSkippedCount += $obImport->getSkippedCount(); - $this->iProcessedCount += $obImport->getProcessedCount(); - } - - $arReportData = [ - 'created' => $this->iCreatedCount, - 'updated' => $this->iUpdatedCount, - 'skipped' => $this->iSkippedCount, - 'processed' => $this->iProcessedCount, - ]; - - Flash::info(Lang::get('lovata.toolbox::lang.message.import_from_xml_report', $arReportData)); - } -} diff --git a/plugins/lovata/shopaholic/widgets/importfromcsv/partials/_widget.htm b/plugins/lovata/shopaholic/widgets/importfromcsv/partials/_widget.htm deleted file mode 100644 index 7105d25af..000000000 --- a/plugins/lovata/shopaholic/widgets/importfromcsv/partials/_widget.htm +++ /dev/null @@ -1,57 +0,0 @@ -hasPlugin('Lovata.PropertiesShopaholic'); -?> - -
    -

    - -

    - -
    diff --git a/plugins/lovata/shopaholic/widgets/importfromxml/partials/_widget.htm b/plugins/lovata/shopaholic/widgets/importfromxml/partials/_widget.htm deleted file mode 100644 index aaab5d685..000000000 --- a/plugins/lovata/shopaholic/widgets/importfromxml/partials/_widget.htm +++ /dev/null @@ -1,62 +0,0 @@ -hasPlugin('Lovata.PropertiesShopaholic'); -?> - -
    -
    -

    -
    - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - - -
    - -
    -
    -
    -
    diff --git a/plugins/lovata/toolbox/.codeclimate.yml b/plugins/lovata/toolbox/.codeclimate.yml deleted file mode 100644 index 2a893c73c..000000000 --- a/plugins/lovata/toolbox/.codeclimate.yml +++ /dev/null @@ -1,31 +0,0 @@ ---- -plugins: - duplication: - enabled: true - config: - languages: - php: - mass_threshold: 50 - fixme: - enabled: true - phpmd: - enabled: true - config: - file_extensions: "php" - rulesets: "controversial,design,unusedcode,PHPMD_custom.xml" - phpcodesniffer: - enabled: true - config: - standard: "Symfony2" - sonar-php: - enabled: true -ratings: - paths: - - "**.php" -exclude_patterns: - - 'tests/' - - 'traits/tests/' - - 'vendor/' - - 'lang/' - - 'classes/item/TestItem.php' - - 'classes/collection/TestCollection.php' \ No newline at end of file diff --git a/plugins/lovata/toolbox/.editorconfig b/plugins/lovata/toolbox/.editorconfig deleted file mode 100644 index 50d0b7a7a..000000000 --- a/plugins/lovata/toolbox/.editorconfig +++ /dev/null @@ -1,36 +0,0 @@ -# Defining consistent coding styles between different editors and IDEs -# Support info @ http://editorconfig.org/#download -# editorconfig.org - -# Top-most EditorConfig file -root = true - -# General settings -[*] -charset = utf-8 -end_of_line = lf -trim_trailing_whitespace = true -insert_final_newline = true -indent_style = space -indent_size = 4 - -# CSS settings -[*.css] -indent_size = 2 - -# YAML settings -[*.yml] -indent_size = 2 - -# Markdown settings -[*.md] -trim_trailing_whitespace = false - -# Resetting rules for third-party libraries -# [{lib/**.js, lib/**.css}] -# charset = unset -# end_of_line = unset -# trim_trailing_whitespace = unset -# insert_final_newline = unset -# indent_style = unset -# indent_size = unset diff --git a/plugins/lovata/toolbox/.gitignore b/plugins/lovata/toolbox/.gitignore deleted file mode 100644 index 9eb7bf849..000000000 --- a/plugins/lovata/toolbox/.gitignore +++ /dev/null @@ -1,93 +0,0 @@ -/node_modules -Homestead.yaml -/_ide_helper.php -build.sh - -vendor -composer.lock - -#site -pdf/ -_backup/ -cgi-bin/ - -*.log -*.bin -*.komodoproject -/.komodotools/ - -# PhpStorm -.idea - -# Eclipse -*.pydevproject -.project -.metadata -bin/** -tmp/** -tmp/**/* -*.tmp -*.bak -*.swp -*~.nib -local.properties -.classpath -.settings/ -.loadpath -.externalToolBuilders/ -*.launch -.cproject -.buildpath - -# SublimeText -/*.sublime-project -*.sublime-workspace - -# NetBeans -nbproject/ -build/ -nbbuild/ -dist/ -nbdist/ -nbactions.xml -nb-configuration.xml - -# Windows system files -$RECYCLE.BIN/ -Thumbs.db -ehthumbs.db -Desktop.ini - -# OSX system files -.DS_store -.AppleDouble -.LSOverride -Icon -._* -.Spotlight-V100 -.Trashes - -# SVN/CVS -.svn -/CVS/* -*/CVS/* -.cvsignore -*/.cvsignore - -# temporary files/folders - -tmp* -~* -*.~* -*.bak -*.swp - -build/ -png/ -psd/ -doc/ -svg/ -vendors/ -pixelPerfect/ -node_modules/ -docs/ diff --git a/plugins/lovata/toolbox/CONTRIBUTING.md b/plugins/lovata/toolbox/CONTRIBUTING.md deleted file mode 100644 index 73fcc8f70..000000000 --- a/plugins/lovata/toolbox/CONTRIBUTING.md +++ /dev/null @@ -1,60 +0,0 @@ -# Contributing - -When contributing to this repository, please first discuss the change you wish to make via issue with the owners of this repository before making a change. - -Please note we have a code of conduct, please follow it in all your interactions with the project. - -## Pull Request Process - -1. Ensure any install or build dependencies are removed before the end of the layer when doing a build. -2. Cover your code contribution with unit tests and ensure your Pull Request passes all the tests. -3. Open a Pull Request to a `develop` branch. -4. Add to the Pull Request details of changes to the interface, this includes new environment variables, exposed ports, useful file locations and container parameters. -5. You may merge the Pull Request in once you have the sign-off of two other developers, or if you do not have permission to do that, you may request the second reviewer to merge it for you. - -## Code of Conduct - -### Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -### Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language. -* Being respectful of differing viewpoints and experiences. -* Gracefully accepting constructive criticism. -* Focusing on what is best for the community. -* Showing empathy towards other community members. - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances. -* Trolling, insulting/derogatory comments, and personal or political attacks. -* Public or private harassment. -* Publishing others' private information, such as a physical or electronic address, without explicit permission. -* Other conduct which could reasonably be considered inappropriate in a professional setting. - -### Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -### Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -### Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at [support@lovata.com](mailto:support@lovata.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -### Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/plugins/lovata/toolbox/LICENSE.md b/plugins/lovata/toolbox/LICENSE.md deleted file mode 100644 index 9cecc1d46..000000000 --- a/plugins/lovata/toolbox/LICENSE.md +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - {one line to give the program's name and a brief idea of what it does.} - Copyright (C) {year} {name of author} - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - {project} Copyright (C) {year} {fullname} - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/plugins/lovata/toolbox/PHPMD_custom.xml b/plugins/lovata/toolbox/PHPMD_custom.xml deleted file mode 100644 index a24b60992..000000000 --- a/plugins/lovata/toolbox/PHPMD_custom.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - Custom rules for checking project LOVATA Group - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/plugins/lovata/toolbox/Plugin.php b/plugins/lovata/toolbox/Plugin.php deleted file mode 100644 index 7fc928c4c..000000000 --- a/plugins/lovata/toolbox/Plugin.php +++ /dev/null @@ -1,135 +0,0 @@ - 'Pagination', - ]; - } - - /** - * @return array - */ - public function registerSettings() - { - return [ - 'config' => [ - 'label' => 'lovata.toolbox::lang.field.site_settings', - 'icon' => 'icon-cogs', - 'description' => 'lovata.toolbox::lang.field.site_settings_description', - 'class' => 'Lovata\Toolbox\Models\Settings', - 'order' => 300, - 'permissions' => [ - 'toolbox-menu-settings', - ], - ], - ]; - } - - /** - * Extending twig - * @return array - */ - public function registerMarkupTags() - { - return [ - 'functions' => [ - 'choice' => function ($sLangString, $iNumber) { - return $this->twigChoice($sLangString, $iNumber); - }, - ], - 'filters' => [ - 'phone' => [$this, 'applyPhoneFilter'], - ], - ]; - } - - /** - * Plugin boot method - */ - public function boot() - { - if (env('APP_ENV') == 'testing') { - $this->app->bind(\Lovata\Toolbox\Classes\Item\TestItem::class, \Lovata\Toolbox\Classes\Item\TestItem::class); - $this->app->bind(\Lovata\Toolbox\Classes\Collection\TestCollection::class, \Lovata\Toolbox\Classes\Collection\TestCollection::class); - } - } - - /** - * Register commands - */ - public function register() - { - $this->registerConsoleCommand('toolbox:helper', ToolBoxHelper::class); - $this->registerConsoleCommand('toolbox:create.all', CreateAll::class); - $this->registerConsoleCommand('toolbox:create.plugin', CreatePlugin::class); - $this->registerConsoleCommand('toolbox:create.model', CreateModel::class); - $this->registerConsoleCommand('toolbox:create.model.columns', CreateModelColumn::class); - $this->registerConsoleCommand('toolbox:create.model.fields', CreateModelField::class); - $this->registerConsoleCommand('toolbox:create.controller', CreateController::class); - $this->registerConsoleCommand('toolbox:create.migration', CreateMigration::class); - $this->registerConsoleCommand('toolbox:create.component.data', CreateComponentData::class); - $this->registerConsoleCommand('toolbox:create.component.list', CreateComponentList::class); - $this->registerConsoleCommand('toolbox:create.component.page', CreateComponentPage::class); - $this->registerConsoleCommand('toolbox:create.item', CreateItem::class); - $this->registerConsoleCommand('toolbox:create.collection', CreateCollection::class); - $this->registerConsoleCommand('toolbox:create.event.model', CreateEventModel::class); - $this->registerConsoleCommand('toolbox:create.store', CreateStore::class); - $this->registerConsoleCommand('toolbox:create.event.menu', CreateExtendBackendMenuHandler::class); - $this->registerConsoleCommand('toolbox:create.event.fields', CreateExtendModelFieldsHandler::class); - $this->registerConsoleCommand('toolbox:create.event.columns', CreateExtendModelColumnsHandler::class); - } - - /** - * Apply Lang::choice method to string - * @param string $sLangString - * @param int $iNumber - * @return string - */ - protected function twigChoice($sLangString, $iNumber) - { - return Lang::choice($sLangString, $iNumber); - } - - /** - * Deletes all characters from string except digits and plus - * @param $sValue - * @return string - */ - public function applyPhoneFilter($sValue) { - return preg_replace("%[^\d\+]%", '', $sValue); - } -} diff --git a/plugins/lovata/toolbox/README.md b/plugins/lovata/toolbox/README.md deleted file mode 100644 index 749b2856d..000000000 --- a/plugins/lovata/toolbox/README.md +++ /dev/null @@ -1,38 +0,0 @@ -# Toolbox - -[![Build Status](https://travis-ci.org/lovata/oc-toolbox-plugin.svg?branch=master)](https://travis-ci.org/lovata/oc-toolbox-plugin) -[![Dependency Status](https://www.versioneye.com/user/projects/59d504fc2de28c002c1882b5/badge.svg)](https://www.versioneye.com/user/projects/59d504fc2de28c002c1882b5) -[![Coverage Status](https://coveralls.io/repos/github/lovata/oc-toolbox-plugin/badge.svg?branch=master)](https://coveralls.io/github/lovata/oc-toolbox-plugin?branch=master) -[![Code Climate](https://codeclimate.com/github/lovata/oc-toolbox-plugin/badges/gpa.svg)](https://codeclimate.com/github/lovata/oc-toolbox-plugin) -[![Crowdin](https://d322cqt584bo4o.cloudfront.net/toolbox-plugin-for-october-cms/localized.svg)](https://crowdin.com/project/toolbox-plugin-for-october-cms) -[![SemVer 2.0.0](http://img.shields.io/SemVer/2.0.0.png)](http://semver.org/spec/v2.0.0.html) -[![License: GPL v3](https://img.shields.io/badge/License-GPL%20v3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) - -![Toolbox Banner](assets/images/toolbox-banner.png) - -Toolbox is a set of helpers for faster development for [October CMS](https://github.com/octobercms/october). It includes a universal component for rendering pagination navigation controls, a set of tools for caching of objects and lists. Also, it includes a list of most common language strings for using in third-party plugins: name, title, description etc. - -## Features - -* Components - * Pagination is used to get a list of pagination buttons and provides flexible settings. -* Classes - * `ElementCollection` provides a flexible tool for working with cached lists of model elements. - * `ElementData` is an abstract class for components that returns object of `ElementItem` class for model. - * `ElementItem` provides a flexible tool for single element data caching. - * etc. - -[Read more…](https://github.com/lovata/oc-toolbox-plugin/wiki) - -## Get involved - -If you're interested in the improvement of this project you can help in the following ways: -* bug reporting and new feature requesting by creating issues on plugin [GitHub page](https://github.com/lovata/oc-toolbox-plugin/issues); -* contribution to a project following these [instructions](https://github.com/lovata/oc-toolbox-plugin/blob/master/CONTRIBUTING.md); -* localization to your language using [Crowdin](https://crowdin.com/project/toolbox-plugin-for-october-cms) service. - -## License - -© 2017, [LOVATA Group, LLC](https://github.com/lovata) under [GNU GPL v3](https://opensource.org/licenses/GPL-3.0). - -Developed by [Andrey Kharanenka](https://github.com/kharanenka). diff --git a/plugins/lovata/toolbox/assets/images/logo.svg b/plugins/lovata/toolbox/assets/images/logo.svg deleted file mode 100644 index 1e3917848..000000000 --- a/plugins/lovata/toolbox/assets/images/logo.svg +++ /dev/null @@ -1,12 +0,0 @@ - - Toolbox - - - - - - - - - - diff --git a/plugins/lovata/toolbox/assets/images/toolbox-banner.png b/plugins/lovata/toolbox/assets/images/toolbox-banner.png deleted file mode 100644 index 01688fb9952ece29bd7f189dd88344db2ff3e74c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20054 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

    t%y1uSRmb0pqPNe(`EH zIdX$Q7|pJZ@tuMVwWu8%Brbrm1rC9{2&c$x)0jzOx83QgQIaQ3OVhH=Pu0T(GlSmI z05CHU_OUO%?_V#3=w%vz+J%!v*Ea z(w4}Eo1se_))NF0EN?Q#g=Dm-18%0=k-iU1v~R>^(LD-_OfFn4dJq8=m!+QHl3(99 z&xpuJi-5GE0I5tJgZd-(JgjFA>+*5(&V$I4|NzSgn??P=z#QGT%B_- zX)J2LdJ;2*SUAS6Am4Oik2U>&< zh*L=1z( zw&3Xao9b0K@WP@1Sc!>yVsjqA}6`{!OK*-fvh8qKrwRe{T_Odm6eucSj_!{Nr-4e-gL3~(a@8TGs} z0abtR*nT_bdfmt18Cr=dhu#a^=oX2tr*w?`K#)`?bPL8?SZ{#<;7Fe#Onv*bwp%Rn z>rfAp#^`5K=amf_25w1Yv&eo%r*J`Q(K_IB84v+-Ao4tv%@^cni>kS(@TX$DLwY4G zm4U-RHdh5016e5%l{^!nkk3|$mPO~KV4x{1GX2$6Lj&&)F+OLJ`&hSz-J%Y}K;B)S z+0|3&fl;mmt3@f_Ff>w;KTp6zR@%xUM@A-tMXMXHP8U=q zO(+=;n0=toFyZ0s7X2g}Eh^wZz9E-=E7;-(ExI`zQV|5{uUJ&+f>&5%bm3}I1K87r z!a&qCKQHNr#1e=zOT^fV>ozjLh@U*E4UxgoX%nG;bi7HOb0y(kB3o^l!~eCYtU@lk z!T_YYj7f54izGi_Y(|S3@^WzAi6gRxucAZz8TX$ovb%7#=y@E^nabt@_|J9-dAbWBf`>oY6s$}N|1Kgd> zqSf#)TNJ?*d_$gjAM=4i)nL&xT>gtib{DP|HF;fohYgShsQ!fq$USwzgJ@sD{cetX zd^)1fS+wEffNEJ})5!T!=@SywYta6$MFYsI50PcKk3J5SiEGL4xd2oRVdh1NWMM ziI3hjAUs6D@KpxrcnRFd$x8sH&BY6R6cqp!m;LyVxYzsf!U=xl_UjnG43+ouo1f9U zl?Ny*3QF8>%Yi5q?y_D)Q1?RV!x^oa?Z!TgxA3Q;0$`RavI103MRga$!I^quhaysd z@I5Lrj=5Ddl+o^p7*DP!K$&);#n^i15x_x=kpj%)6&*$@vd4T6$>#Y~nlyToG(cV+ zb#pwk%h~&IMPfhUHYyrw;k+V2hum2ar@%Z`(Ygbc?@|%-Xhkify%Dj3+xlUl9#m0# z+!{o7^=hTX+C!IzSN%pGg{FF+ZBzs@J5XkY$!sT z1i607p?!p%oQadSXQ_qkR!k)Yzco11riX)HuB^V4EUqo}mXTvM2+$kBeJn)X*+Q zEaKVOSVd$%BWp$X^lw$fk?5%vtr=B9JH&viLZl71R1}b?k$Trf$O0xNCaYur!_z7X z2-I)7v}~q8o1ukF$Hi*PI(0>KTG0jHy`tZqUeTJ7&=cHPQ9-6Ary7B+6-86Lt!rsV zE0VE=Fbc3tXJYxn1qJN)s3_f9k-NE~+$xF)G=|f2BD%FA4NFa^$8#bFSYi)X{|}z} z7}Nm*6s7@D0ma5s5&&5GDh1&?R1{ITRpjAzO%Yl}32w)D-zpN!^g?c^=;WJAJ+_`0 z&`ccL-z{AXU?l*Eg9{%v{t$mW3rKsXq6p3V#;+9_jYuyf z0jcqTPtA5kB{cBAKNN(ZfnwJ8KKeJqU{S`GP9}}N1k3bwjILMAfDUJ}U1@l_r$=U*NG)j{XbA7F_4=z7lVAe=I=*ItbHV#?~pkHM9@g zpnx*J)UR_766XT=*Zj%yBHrl7j~_o3{c4{M2><{97zXuk{S0>#&;htu1UVLgMR2kR uax4Oi;A9cxSOgZq$s)+H2rPn=MUXSsm<_~q&uEYU0000arStore[$sKey] = $obCollection->copy(); - } - - /** - * Get saved element collection - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testSaveMethod() - * @param string $sKey - * @return ElementCollection - */ - public function saved($sKey) - { - if (empty($sKey) || empty($this->arStore) || !isset($this->arStore[$sKey])) { - return null; - } - - return $this->arStore[$sKey]->copy(); - } - - /** - * Remove stored collection from store - * @param string $sKey - */ - public function clear($sKey) - { - if (empty($sKey) || empty($this->arStore) || !isset($this->arStore[$sKey])) { - return; - } - - unset($this->arStore[$sKey]); - } -} diff --git a/plugins/lovata/toolbox/classes/collection/ElementCollection.php b/plugins/lovata/toolbox/classes/collection/ElementCollection.php deleted file mode 100644 index 67ea42b9d..000000000 --- a/plugins/lovata/toolbox/classes/collection/ElementCollection.php +++ /dev/null @@ -1,833 +0,0 @@ -make(static::class); - - if (!empty($arElementIDList) && is_array($arElementIDList)) { - $obCollection->arElementIDList = $arElementIDList; - } - - return $obCollection->returnThis(); - } - - /** - * Return this collection - * @return $this - */ - public function returnThis() - { - return $this; - } - - /** - * Check list is clear - * @return bool - */ - public function isClear(): bool - { - return $this->arElementIDList === null; - } - - /** - * Check list is empty - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#isempty - * @return bool - */ - public function isEmpty(): bool - { - return empty($this->arElementIDList); - } - - /** - * Check list is not empty - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#isnotempty - * @return bool - */ - public function isNotEmpty(): bool - { - return !$this->isEmpty(); - } - - /** - * Get element ID list - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#getidlist - * @return array - */ - public function getIDList(): array - { - return array_values((array) $this->arElementIDList); - } - - /** - * Set new - * @param array $arElementIDList - * @return $this - */ - public function set($arElementIDList) - { - if (!is_array($arElementIDList)) { - return $this->returnThis(); - } - - $this->arElementIDList = $arElementIDList; - - return $this->returnThis(); - } - - /** - * Checking, has collection ID - * @param int $iElementID - * @return bool - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testHasMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#hasielementid - */ - public function has($iElementID) - { - if (empty($iElementID) || $this->isEmpty()) { - return false; - } - - return in_array($iElementID, (array) $this->arElementIDList); - } - - /** - * Get element item with ID - * @param int $iElementID - * @return \Lovata\Toolbox\Classes\Item\ElementItem - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testFindMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#findielementid - */ - public function find($iElementID) - { - if (!$this->has($iElementID)) { - return $this->makeItem(null); - } - - return $this->makeItem($iElementID); - } - - /** - * Set clear array to element list - * @return $this - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#clear - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testClearMethod() - */ - public function clear() - { - $this->arElementIDList = []; - - return $this->returnThis(); - } - - /** - * Get element count - * @return int - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#count - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testCountMethod() - */ - public function count() - { - if ($this->isEmpty()) { - return 0; - } - - return count((array) $this->arElementIDList); - } - - /** - * Apply array_intersect for element array list - * @param array $arElementIDList - * @return $this - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testIntersectMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#intersectarelementidlist - */ - public function intersect($arElementIDList) - { - if (empty($arElementIDList)) { - return $this->clear(); - } - - if ($this->isClear()) { - $this->arElementIDList = $arElementIDList; - - return $this->returnThis(); - } - - $this->arElementIDList = array_combine($this->arElementIDList, $this->arElementIDList); - $arElementIDList = array_combine($arElementIDList, $arElementIDList); - - $this->arElementIDList = array_intersect_key($this->arElementIDList, $arElementIDList); - - return $this->returnThis(); - } - - /** - * Apply sorting for elements of collection - * @param array $arResultIDList - * @return $this - */ - public function applySorting($arResultIDList) - { - if (empty($arResultIDList)) { - return $this->clear(); - } - - if (!$this->isClear() && $this->isEmpty()) { - return $this->returnThis(); - } - - if ($this->isClear()) { - $this->arElementIDList = $arResultIDList; - - return $this->returnThis(); - } - - $this->arElementIDList = array_combine($this->arElementIDList, $this->arElementIDList); - $arResultIDList = array_combine($arResultIDList, $arResultIDList); - - $this->arElementIDList = array_intersect_key($arResultIDList, $this->arElementIDList); - - return $this->returnThis(); - } - - /** - * Apply array_merge for element array list - * @param array $arElementIDList - * @return $this - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testMergeMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#mergearelementidlist - */ - public function merge($arElementIDList) - { - if (empty($arElementIDList)) { - return $this->returnThis(); - } - - if ($this->isClear()) { - $this->arElementIDList = $arElementIDList; - - return $this->returnThis(); - } - - $this->arElementIDList = array_merge($this->arElementIDList, $arElementIDList); - $this->arElementIDList = array_unique($this->arElementIDList); - - return $this->returnThis(); - } - - /** - * Apply array_diff for element array list - * @param array $arExcludeIDList - * @return $this - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testDiffMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#diffarelementidlist - */ - public function diff($arExcludeIDList = []) - { - if (empty($arExcludeIDList) || $this->isEmpty()) { - return $this->returnThis(); - } - - $this->arElementIDList = array_diff($this->arElementIDList, $arExcludeIDList); - - return $this->returnThis(); - } - - /** - * Get element item list - * @return array|\Lovata\Toolbox\Classes\Item\ElementItem[] - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#all - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testAllMethod() - */ - public function all() - { - if ($this->isEmpty()) { - return []; - } - - $arResult = $this->prepareItemList($this->arElementIDList); - - return $arResult; - } - - /** - * Set skip element count - * @param int $iCount - * @return $this - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testTakeMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#skipicount - * Used in "take" method - */ - public function skip($iCount) - { - $this->iSkip = (int) trim($iCount); - - return $this->returnThis(); - } - - /** - * Take array with element items - * @param int $iCount - * @return array|\Lovata\Toolbox\Classes\Item\ElementItem[] - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testTakeMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#takeicount--0 - */ - public function take($iCount = 0) - { - $iCount = (int) trim($iCount); - if ($this->isEmpty()) { - return []; - } - - if (empty($iCount)) { - $iCount = null; - } - - $arResultIDList = array_slice($this->arElementIDList, $this->iSkip, $iCount); - if (empty($arResultIDList)) { - return []; - } - - $arResult = $this->prepareItemList($arResultIDList); - - return $arResult; - } - - /** - * Exclude element id from collection - * @param int $iElementID - * @return $this - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testExcludeMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#excludeielementid - */ - public function exclude($iElementID = null) - { - if (empty($iElementID) || $this->isEmpty()) { - return $this->returnThis(); - } - - $iElementIDKey = array_search($iElementID, $this->arElementIDList); - if ($iElementIDKey === false) { - return $this->returnThis(); - } - - unset($this->arElementIDList[$iElementIDKey]); - - return $this->returnThis(); - } - - /** - * Take array with random element items - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#randomicount - * @param int $iCount - * @return array|\Lovata\Toolbox\Classes\Item\ElementItem[] - */ - public function random($iCount = 1) - { - if ($this->isEmpty()) { - return []; - } - - $iCount = (int) trim($iCount); - if ($iCount < 1) { - $iCount = 1; - } - - if (count($this->arElementIDList) < $iCount) { - $iCount = count($this->arElementIDList); - } - - $obThis = $this->copy(); - - $arResultIDList = $obThis->getIDList(); - $arKeyList = array_rand($arResultIDList, $iCount); - if (!is_array($arKeyList)) { - $arKeyList = [$arKeyList]; - } - - $arKeyList = array_combine($arKeyList, $arKeyList); - $arResultIDList = array_intersect_key($arResultIDList, $arKeyList); - - return $obThis->intersect($arResultIDList)->all(); - } - - /** - * Apply pagination for item collection - * @param int $iPage - * @param int $iElementOnPage - * - * @return array|\Lovata\Toolbox\Classes\Item\ElementItem[]|null - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#pageipage-ielementonpage--10 - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testPageMethod() - */ - public function page($iPage, $iElementOnPage = 10) - { - $iPage = (int) trim($iPage); - - //Check page value - if ($iPage < 1) { - $iPage = 1; - } - - if ($iElementOnPage < 1) { - $iElementOnPage = self::COUNT_PER_PAGE; - } - - return $this->skip(($iPage - 1) * $iElementOnPage)->take($iElementOnPage); - } - - /** - * Get first element item - * @return \Lovata\Toolbox\Classes\Item\ElementItem|null - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#first - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testFirstMethod() - */ - public function first() - { - if ($this->isEmpty()) { - return $this->makeItem(null); - } - - $arResultIDList = $this->arElementIDList; - - $iElementID = array_shift($arResultIDList); - - return $this->makeItem($iElementID); - } - - /** - * Get last element item - * @return \Lovata\Toolbox\Classes\Item\ElementItem|null - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#last - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testLastMethod() - */ - public function last() - { - if ($this->isEmpty()) { - return $this->makeItem(null); - } - - $arResultIDList = $this->arElementIDList; - - $iElementID = array_pop($arResultIDList); - - return $this->makeItem($iElementID); - } - - /** - * Apply array_shift to element ID list and get first element item - * @return \Lovata\Toolbox\Classes\Item\ElementItem|null - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#shift - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testShiftMethod() - */ - public function shift() - { - if (empty($this->arElementIDList)) { - return $this->makeItem(null); - } - - $iElementID = array_shift($this->arElementIDList); - - return $this->makeItem($iElementID); - } - - /** - * Apply array_unshift to element ID - * @param int $iElementID - * @return $this - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#unshiftielementid - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testUnshiftMethod() - */ - public function unshift($iElementID) - { - if (empty($iElementID)) { - return $this->returnThis(); - } - - if ($this->isEmpty()) { - $this->arElementIDList = [$iElementID]; - - return $this->returnThis(); - } - - array_unshift($this->arElementIDList, $iElementID); - - return $this->returnThis(); - } - - /** - * Apply array_pop to element ID list and get first element item - * @return \Lovata\Toolbox\Classes\Item\ElementItem|null - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#pop - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testPopMethod() - */ - public function pop() - { - if ($this->isEmpty()) { - return $this->makeItem(null); - } - - $iElementID = array_pop($this->arElementIDList); - - return $this->makeItem($iElementID); - } - - /** - * Push element ID to end of list - * @param int $iElementID - * @return $this - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#pushielementid - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testUnshiftMethod() - */ - public function push($iElementID) - { - if (empty($iElementID)) { - return $this->returnThis(); - } - - if ($this->isEmpty()) { - $this->arElementIDList = [$iElementID]; - - return $this->returnThis(); - } - - $this->arElementIDList[] = $iElementID; - - return $this->returnThis(); - } - - /** - * Get array with item field value - * @param string $sFieldName - * @return array|null - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testPluckMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#plucksfieldname - */ - public function pluck($sFieldName) - { - if (empty($sFieldName) || $this->isEmpty()) { - return null; - } - - //Get all items - $arItemList = $this->all(); - - $arResult = []; - foreach ($arItemList as $obItem) { - if ($obItem->isEmpty()) { - continue; - } - - $arResult[] = $obItem->$sFieldName; - } - - return $arResult; - } - - /** - * Get implode string with item field value - * @param string $sFieldName - * @param string $sDelimiter - * @return null - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#implodesfieldname-sdelimiter--- - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testImplodeMethod() - */ - public function implode($sFieldName, $sDelimiter = ', ') - { - if (empty($sFieldName) || $this->isEmpty()) { - return null; - } - - //Get field value array - $arFieldValue = $this->pluck($sFieldName); - if (empty($arFieldValue)) { - return null; - } - - $sResult = implode($sDelimiter, $arFieldValue); - - return $sResult; - } - - /** - * Get new collection with next nearest elements - * @param int $iElementID - * @param int $iCount - * @param bool $bCyclic - * @return $this - */ - public function getNearestNext($iElementID, $iCount = 1, $bCyclic = false) - { - $obList = self::make(); - if (empty($iElementID) || empty($iCount) || $iCount < 1) { - return $obList->returnThis(); - } - - //Check current collection - if ($this->isEmpty() || !$this->has($iElementID)) { - return $obList->returnThis(); - } - - $this->arElementIDList = array_values($this->arElementIDList); - - //Search element position - $iElementPosition = array_search($iElementID, $this->arElementIDList); - - //Get next elements - $arResultIDList = array_slice($this->arElementIDList, $iElementPosition + 1); - if ($bCyclic && $iElementPosition >= 1) { - //Get elements from start of array - $arAdditionElementIDList = array_slice($this->arElementIDList, 0, $iElementPosition); - $arResultIDList = array_merge($arResultIDList, $arAdditionElementIDList); - } - - //Get result element ID list - $arResultIDList = array_slice($arResultIDList, 0, $iCount); - $obList->intersect($arResultIDList); - - return $obList->returnThis(); - } - - /** - * Get new collection with prev nearest elements - * @param int $iElementID - * @param int $iCount - * @param bool $bCyclic - * @return $this - */ - public function getNearestPrev($iElementID, $iCount = 1, $bCyclic = false) - { - $obList = self::make(); - if (empty($iElementID) || empty($iCount) || $iCount < 1) { - return $obList->returnThis(); - } - - //Check current collection - if ($this->isEmpty() || !$this->has($iElementID)) { - return $obList->returnThis(); - } - - $this->arElementIDList = array_values($this->arElementIDList); - - //Search element position - $iElementPosition = array_search($iElementID, $this->arElementIDList); - - //Get prev elements - $arResultIDList = (array) array_slice($this->arElementIDList, 0, $iElementPosition); - $arResultIDList = array_reverse($arResultIDList); - - if ($bCyclic && $iElementPosition < count($this->arElementIDList)) { - //Get elements from end of array - $arAdditionElementIDList = (array) array_slice($this->arElementIDList, $iElementPosition); - $arAdditionElementIDList = array_reverse($arAdditionElementIDList); - - $arResultIDList = array_merge($arResultIDList, $arAdditionElementIDList); - } - - //Get result element ID list - $arResultIDList = array_slice($arResultIDList, 0, $iCount); - $obList->intersect($arResultIDList); - - return $obList->returnThis(); - } - - /** - * Save item collection in store - * @param string $sKey - * @return $this - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testSaveMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#saveskeysavedskey - */ - public function save($sKey) - { - if (empty($sKey)) { - return $this; - } - - $sKey = static::class.'@'.$sKey; - CollectionStore::instance()->save($sKey, $this); - - return $this->returnThis(); - } - - /** - * Get saved item collection - * @param string $sKey - * @return $this - * @see \Lovata\Toolbox\Tests\Unit\CollectionTest::testSaveMethod() - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#saveskeysavedskey - */ - public function saved($sKey) - { - if (empty($sKey)) { - return null; - } - - $sKey = static::class.'@'.$sKey; - - $obCollection = CollectionStore::instance()->saved($sKey); - if (empty($obCollection)) { - return null; - } - - return $obCollection; - } - - /** - * Clone collection object - * @return $this - */ - public function copy() - { - return static::make()->intersect($this->getIDList()); - } - - /** - * Helper method for collection debug - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementCollection#debug - * @return $this - */ - public function debug() - { - return $this->returnThis(); - } - - /** - * Get an iterator for the items. - * @return \ArrayIterator - */ - public function getIterator() - { - return new ArrayIterator($this->all()); - } - - /** - * Make element item - * @param int $iElementID - * @param \Model $obElement - * @return \Lovata\Toolbox\Classes\Item\ElementItem - */ - protected function makeItem($iElementID, $obElement = null) - { - $sItemClass = static::ITEM_CLASS; - - return $sItemClass::make($iElementID, $obElement); - } - - /** - * Make element item from cache only - * @param int $iElementID - * @return \Lovata\Toolbox\Classes\Item\ElementItem - */ - protected function makeItemOnlyCache($iElementID) - { - $sItemClass = static::ITEM_CLASS; - - return $sItemClass::makeOnlyCache($iElementID); - } - - /** - * Prepare item list - * @param array $arElementIDList - * @return array - */ - protected function prepareItemList($arElementIDList): array - { - $arResult = []; - if (empty($arElementIDList)) { - return $arResult; - } - - $arEmptyIDList = []; - - foreach ($arElementIDList as $iElementID) { - /** @var \Lovata\Toolbox\Classes\Item\ElementItem $obElementItem */ - $obElementItem = static::makeItemOnlyCache($iElementID); - if ($obElementItem->isEmpty()) { - $arEmptyIDList[] = $iElementID; - $arResult[$iElementID] = null; - } else { - $arResult[$iElementID] = $obElementItem; - } - } - - $arResult = $this->getElementListFromDB($arEmptyIDList, $arResult); - $arResult = array_filter($arResult); - - return $arResult; - } - - /** - * Get element list from DB - * @param array $arElementIDList - * @param array $arResult - * @return array - */ - protected function getElementListFromDB($arElementIDList, $arResult) - { - if (empty($arElementIDList)) { - return $arResult; - } - - $arChunkIDList = array_chunk($arElementIDList, 10000); - $sItemClass = static::ITEM_CLASS; - $sModelClass = $sItemClass::MODEL_CLASS; - - foreach ($arChunkIDList as $arSingleChunk) { - $obQuery = $sModelClass::whereIn($sItemClass::QUERY_FIELD, $arElementIDList); - if (method_exists($sModelClass, 'trashed')) { - $obQuery->withTrashed(); - } - - if (!empty($sItemClass::$arQueryWith)) { - $obQuery->with($sItemClass::$arQueryWith); - } - - $obElementList = $obQuery->get(); - - foreach ($arSingleChunk as $iElementID) { - $obElement = !empty($obElementList) ? $obElementList->find($iElementID) : null; - $obElementItem = static::makeItem($iElementID, $obElement); - if ($obElementItem->isEmpty()) { - continue; - } - - $arResult[$iElementID] = $obElementItem; - } - } - - return $arResult; - } -} diff --git a/plugins/lovata/toolbox/classes/collection/TestCollection.php b/plugins/lovata/toolbox/classes/collection/TestCollection.php deleted file mode 100644 index 3eebe9454..000000000 --- a/plugins/lovata/toolbox/classes/collection/TestCollection.php +++ /dev/null @@ -1,13 +0,0 @@ -sMode = $this->property('mode'); - if (empty($this->sMode)) { - $this->sMode = self::MODE_AJAX; - } - } - - /** - * Get old form data value - * @param string $sField - * @return mixed - */ - public function getOldValue($sField) - { - if (empty($sField)) { - return null; - } - - return Input::old($sField); - } - - /** - * Get all old form fields - * @return array|string - */ - public function getOldFormData() - { - return Input::old(); - } - - /** - * Get error message - * @return mixed - */ - public function getErrorMessage() - { - $arResult = [ - 'message' => Session::get('message'), - 'field' => Session::get('data.field'), - ]; - - return $arResult; - } - - /** - * Get redirect page property list - * @return array - */ - abstract protected function getRedirectPageProperties(); - - /** - * Get component property "mode" - * @return array - */ - protected function getModeProperty() - { - $arResult = [ - self::PROPERTY_MODE => [ - 'title' => 'lovata.toolbox::lang.component.property_mode', - 'type' => 'dropdown', - 'options' => [ - self::MODE_SUBMIT => Lang::get('lovata.toolbox::lang.component.mode_'.self::MODE_SUBMIT), - self::MODE_AJAX => Lang::get('lovata.toolbox::lang.component.mode_'.self::MODE_AJAX), - ], - ], - self::PROPERTY_FLASH_ON => [ - 'title' => 'lovata.toolbox::lang.component.property_flash_on', - 'type' => 'checkbox', - ], - self::PROPERTY_REDIRECT_ON => [ - 'title' => 'lovata.toolbox::lang.component.property_redirect_on', - 'type' => 'checkbox', - ], - ]; - - try { - $arPageList = Page::getNameList(); - } catch (\Exception $obException) { - $arPageList = []; - } - - if (!empty($arPageList)) { - $arResult[self::PROPERTY_REDIRECT_PAGE] = [ - 'title' => 'lovata.toolbox::lang.component.property_redirect_page', - 'type' => 'dropdown', - 'options' => $arPageList, - ]; - } - - return $arResult; - } - - /** - * Get response (mode = form) - * @param string $sRedirectURL - * @return \Illuminate\Http\RedirectResponse|null - */ - protected function getResponseModeForm($sRedirectURL = null) - { - if (!Result::status() && !empty($sRedirectURL)) { - return Redirect::to($sRedirectURL)->withInput()->with(Result::get()); - } elseif (!Result::status()) { - return Redirect::back()->withInput()->with(Result::get()); - } - - $bRedirectOn = $this->property(self::PROPERTY_REDIRECT_ON); - $sRedirectPage = $this->property(self::PROPERTY_REDIRECT_PAGE); - if (!$bRedirectOn) { - return null; - } - - if (!empty($sRedirectURL)) { - return Redirect::to($sRedirectURL); - } - - if (empty($sRedirectPage)) { - return Redirect::to('/'); - } - - $sRedirectURL = Page::url($sRedirectPage, $this->getRedirectPageProperties()); - - return Redirect::to($sRedirectURL); - } - - /** - * Get response (mode = response) - * @param string $sRedirectURL - * @return \Illuminate\Http\RedirectResponse|array - */ - protected function getResponseModeAjax($sRedirectURL = null) - { - $this->sendFlashMessage(); - - if (!Result::status() && !empty($sRedirectURL)) { - return Redirect::to($sRedirectURL); - } elseif (!Result::status()) { - return Result::get(); - } - - $bRedirectOn = $this->property(self::PROPERTY_REDIRECT_ON); - $sRedirectPage = $this->property(self::PROPERTY_REDIRECT_PAGE); - if (!$bRedirectOn) { - return Result::get(); - } - - if (!empty($sRedirectURL)) { - return Redirect::to($sRedirectURL); - } - - if (empty($sRedirectPage)) { - return Redirect::to('/'); - } - - $sRedirectURL = Page::url($sRedirectPage, $this->getRedirectPageProperties()); - - return Redirect::to($sRedirectURL); - } - - /** - * Send flash message - */ - protected function sendFlashMessage() - { - $bFlashOn = $this->property(self::PROPERTY_FLASH_ON); - if (!$bFlashOn) { - return; - } - - $sMessage = Result::message(); - if (empty($sMessage)) { - return; - } - - if (Result::status()) { - Flash::success($sMessage); - } else { - Flash::error($sMessage); - } - } -} diff --git a/plugins/lovata/toolbox/classes/component/ElementData.php b/plugins/lovata/toolbox/classes/component/ElementData.php deleted file mode 100644 index f0272e0ee..000000000 --- a/plugins/lovata/toolbox/classes/component/ElementData.php +++ /dev/null @@ -1,65 +0,0 @@ -makeItem($iElementID); - - return $obElementItem->toArray(); - } - - /** - * Ajax listener - * @return string - */ - public function onGetJSONData() - { - $iElementID = Input::get('element_id'); - $obElementItem = $this->makeItem($iElementID); - - return $obElementItem->toJSON(); - } - - /** - * Ajax listener - * @deprecated - * @return bool - */ - public function onAjaxRequest() - { - return true; - } - - /** - * Get element item - * @param int $iElementID - * @return \Lovata\Toolbox\Classes\Item\ElementItem - */ - public function get($iElementID) - { - $obElementItem = $this->makeItem($iElementID); - - return $obElementItem; - } - - /** - * Male new element item - * @param int $iElementID - * @return \Lovata\Toolbox\Classes\Item\ElementItem - */ - abstract protected function makeItem($iElementID); -} diff --git a/plugins/lovata/toolbox/classes/component/ElementPage.php b/plugins/lovata/toolbox/classes/component/ElementPage.php deleted file mode 100644 index 6b6fc60ec..000000000 --- a/plugins/lovata/toolbox/classes/component/ElementPage.php +++ /dev/null @@ -1,165 +0,0 @@ -arPropertyList = array_merge($this->arPropertyList, $this->getElementPageProperties()); - if ($this->bHasWildCard) { - $this->arPropertyList['has_wildcard'] = [ - 'title' => 'lovata.toolbox::lang.component.has_wildcard', - 'type' => 'checkbox', - 'default' => 0, - ]; - } - - $this->arPropertyList['skip_error'] = [ - 'title' => 'lovata.toolbox::lang.component.skip_error', - 'type' => 'checkbox', - 'default' => 0, - ]; - - return $this->arPropertyList; - } - - /** - * Get element object - * @return \Illuminate\Http\Response|null - * @throws \Exception - */ - public function onRun() - { - //Get element slug - $sElementSlug = $this->property('slug'); - if (empty($sElementSlug) && !$this->property('slug_required')) { - return null; - } - - if (empty($this->obElement) && !$this->property('skip_error')) { - return $this->getErrorResponse(); - } - - return null; - } - - /** - * Init plugin method - */ - public function init() - { - //Get element slug - $sElementSlug = $this->property('slug'); - if (empty($sElementSlug)) { - return; - } - - //Get element by slug - $this->obElement = $this->getElementObject($sElementSlug); - if (empty($this->obElement)) { - return; - } - - //Get element item - $this->obElementItem = $this->makeItem($this->obElement->id, $this->obElement); - if ($this->bNeedSmartURLCheck && $this->property('smart_url_check') && !$this->smartUrlCheck()) { - $this->obElement = null; - $this->obElementItem = null; - } - } - - /** - * Get element item - * @return \Lovata\Toolbox\Classes\Item\ElementItem - */ - public function get() - { - return $this->obElementItem; - } - - /** - * Get element object by slug - * @param string $sElementSlug - * @return \Model - */ - abstract protected function getElementObject($sElementSlug); - - /** - * Male new element item - * @param int $iElementID - * @param \Model $obElement - * @return \Lovata\Toolbox\Classes\Item\ElementItem - */ - abstract protected function makeItem($iElementID, $obElement); - - /** - * Checks trans value, if value is not form active lang, then return false - * @param \Model $obElement - * @param string $sElementSlug - * @return bool - */ - protected function checkTransSlug($obElement, $sElementSlug) - { - if (empty($obElement) || empty($sElementSlug)) { - return false; - } - - $bResult = $obElement->slug == $sElementSlug; - - return $bResult; - } - - /** - * Smart check URL with additional checking - * @return bool - */ - protected function smartUrlCheck() - { - if (empty($this->obElementItem)) { - return false; - } - - $sCurrentURL = $this->currentPageUrl(); - $sValidURL = $this->obElementItem->getPageUrl($this->page->id); - $bResult = preg_match("%^{$sValidURL}%", $sCurrentURL); - - return $bResult; - } - - /** - * Return true, if slug is translatable - * @return bool - */ - protected function isSlugTranslatable() - { - return (bool) Settings::getValue('slug_is_translatable') && PluginManager::instance()->hasPlugin('RainLab.Translate'); - } -} diff --git a/plugins/lovata/toolbox/classes/component/SortingElementList.php b/plugins/lovata/toolbox/classes/component/SortingElementList.php deleted file mode 100644 index ecf527c1e..000000000 --- a/plugins/lovata/toolbox/classes/component/SortingElementList.php +++ /dev/null @@ -1,44 +0,0 @@ -setActiveSorting(); - parent::init(); - } - - /** - * Get active sorting - * @return string - */ - public function getSorting() - { - return $this->sSorting; - } - - /** - * Set active sorting - */ - protected function setActiveSorting() - { - $this->sSorting = Input::get('sort'); - if (empty($this->sSorting)) { - $this->sSorting = $this->property('sorting'); - } - } -} diff --git a/plugins/lovata/toolbox/classes/console/CommonCreateFile.php b/plugins/lovata/toolbox/classes/console/CommonCreateFile.php deleted file mode 100644 index ab6d5e965..000000000 --- a/plugins/lovata/toolbox/classes/console/CommonCreateFile.php +++ /dev/null @@ -1,546 +0,0 @@ - [], - 'enable' => [], - 'disable' => [], - 'addition' => [], - 'lang' => [], - ]; - - /** - * Execute the console command. - */ - public function handle() - { - $this->initData(); - $this->setLogo(); - $this->setDeveloper(); - $this->setAuthor(); - $this->setPlugin(); - - $this->call('toolbox:create.plugin', ['data' => $this->arData]); - } - - /** - * Get the console command arguments. - * @return array - */ - protected function getArguments() - { - return [ - ['data', InputArgument::OPTIONAL], - ]; - } - - /** - * Init data - */ - protected function initData() - { - $this->arInoutData = $this->argument('data'); - - if (!empty($this->arInoutData)) { - $this->arData = $this->arInoutData; - } else { - $this->setDisableList(); - } - } - - /** - * Set logo - */ - protected function setLogo() - { - if ($this->checkAdditionList(self::CODE_LOGO)) { - return; - } - - $this->setAdditionList(self::CODE_LOGO); - $this->logoToolBox(); - } - - /** - * Set developer - */ - protected function setDeveloper() - { - if ($this->checkAdditionList(self::CODE_DEVELOPER)) { - return; - } - - $this->setAdditionList(self::CODE_DEVELOPER); - $sDeveloper = env('DEVELOPER', ''); - - if (empty($sDeveloper)) { - return; - } - - array_set($this->arData, 'replace.developer'.self::CODE_DEVELOPER, $sDeveloper); - } - - /** - * Set author - * @param boolean $bExpansion - */ - protected function setAuthor($bExpansion = false) - { - $this->setAuthorAndPlugin( - $bExpansion, - self::CODE_AUTHOR, - self::CODE_EXPANSION_AUTHOR, - 'Lovata' - ); - } - - /** - * Set plugin - * @param boolean $bExpansion - */ - protected function setPlugin($bExpansion = false) - { - $this->setAuthorAndPlugin( - $bExpansion, - self::CODE_PLUGIN, - self::CODE_EXPANSION_PLUGIN, - 'Shopaholic' - ); - } - - /** - * Set author and plugin - * @param bool $bExpansion - * @param string $sCode - * @param string $sExpansionCode - * @param string $sExample - */ - protected function setAuthorAndPlugin($bExpansion, $sCode, $sExpansionCode, $sExample) - { - if (empty($sCode) || empty($sExpansionCode) || empty($sExample) || !is_bool($bExpansion)) { - return; - } - - $bCheckCreateAll = $this->checkAdditionList(self::CODE_COMMAND_PARENT); - - if (!$this->checkAdditionList($sCode) || !$bCheckCreateAll) { - if (!$bCheckCreateAll && $bExpansion) { - $sCode = $sExpansionCode; - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.set', [ - 'name' => $sCode, - 'example' => $sExample, - ]); - - $sValue = $this->validationAskByName($sMessage); - - if (!$bCheckCreateAll && $bExpansion) { - $this->setRegisterString($sValue, $sExpansionCode); - - return; - } - - $this->setAdditionList($sCode); - $this->setRegisterString($sValue, $sCode); - $this->setRegisterString($sValue, $sExpansionCode); - } - } - - /** - * Set model - */ - protected function setModel() - { - if ($this->checkAdditionList(self::CODE_MODEL)) { - return; - } - - $this->setAdditionList(self::CODE_MODEL); - $sMessage = Lang::get('lovata.toolbox::lang.message.set', [ - 'name' => self::CODE_MODEL, - 'example' => 'Product', - ]); - - $sModel = $this->validationAskByName($sMessage); - $this->setRegisterString($sModel, self::CODE_MODEL); - } - - /** - * Set controller - */ - protected function setController() - { - if ($this->checkAdditionList(self::CODE_CONTROLLER)) { - return; - } - - $this->setAdditionList(self::CODE_CONTROLLER); - $sMessage = Lang::get('lovata.toolbox::lang.message.set', [ - 'name' => self::CODE_CONTROLLER, - 'example' => 'Products', - ]); - - $sController = $this->validationAskByName($sMessage); - $this->setRegisterString($sController, self::CODE_CONTROLLER); - } - - /** - * Set field list - * @param array $arException - * @param array $arOnlyThis - */ - protected function setFieldList($arException = [], $arOnlyThis = []) - { - if ($this->checkAdditionList(self::CODE_FIELDS)) { - return; - } - - $this->setAdditionList(self::CODE_FIELDS); - $sMessage = Lang::get('lovata.toolbox::lang.message.choice_field_list'); - $arChoiceList = [self::CODE_DEFAULT]; - $arChoiceList = array_merge($this->arFieldList, $arChoiceList); - $arChoiceList = $this->exceptionByList($arChoiceList, $arException, $arOnlyThis); - $this->arFieldList = $this->choice($sMessage, $arChoiceList, null, null, true); - - if (empty($this->arFieldList) || in_array(self::CODE_DEFAULT, $this->arFieldList)) { - return; - } - - $bCheckName = in_array(self::CODE_NAME, $this->arFieldList); - $bCheckSlug = in_array(self::CODE_SLUG, $this->arFieldList); - $bCheckPreviewImage = in_array(self::CODE_PREVIEW_IMAGE, $this->arFieldList); - $bCheckImages = in_array(self::CODE_IMAGES, $this->arFieldList); - $bCheckFile = in_array(self::CODE_FILE, $this->arFieldList); - - $this->setEnableList(self::CODE_EMPTY_FIELD); - $this->setEnableList($this->arFieldList); - - if ($bCheckName || $bCheckSlug) { - $this->setEnableList(self::CODE_EMPTY_VALIDATE); - } - - if ($bCheckPreviewImage || $bCheckFile) { - $this->setEnableList(self::CODE_EMPTY_ATTACH_ONE); - } - - if ($bCheckImages) { - $this->setEnableList(self::CODE_EMPTY_ATTACH_MANY); - } - } - - /** - * Set import export csv extends for model - */ - protected function setImportExportCSV() - { - if ($this->checkAdditionList(self::CODE_IMPORT_EXPORT_SVG)) { - return; - } - - $this->setAdditionList(self::CODE_IMPORT_EXPORT_SVG); - $sMessage = Lang::get('lovata.toolbox::lang.message.choice_extend_model'); - $arChoiceList = [ - self::CODE_MODEL, - self::CODE_IMPORT_SVG, - self::CODE_EXPORT_SVG, - ]; - - $sResult = $this->choice($sMessage, $arChoiceList); - - if ($sResult != self::CODE_MODEL) { - $this->setEnableList([self::CODE_EMPTY_IMPORT_EXPORT_SVG, $sResult, self::CODE_EMPTY_ATTACH_ONE]); - } else { - $this->setEnableList(self::CODE_MODEL); - } - } - - /** - * Set sorting - * @param array $arException - * @param array $arOnlyThis - */ - protected function setSorting($arException = [], $arOnlyThis = []) - { - if ($this->checkAdditionList(self::CODE_SORTING)) { - return; - } - - $this->setAdditionList(self::CODE_SORTING); - $sMessage = Lang::get('lovata.toolbox::lang.message.choice_sorting'); - $arChoiceList = [ - self::CODE_NESTED_TREE, - self::CODE_SORTABLE, - self::CODE_DEFAULT_SORTING, - self::CODE_DEFAULT, - ]; - - $arChoiceList = $this->exceptionByList($arChoiceList, $arException, $arOnlyThis); - $sResult = $this->choice($sMessage, $arChoiceList); - - if ($sResult == self::CODE_DEFAULT) { - return; - } elseif ($sResult == self::CODE_NESTED_TREE || $sResult == self::CODE_SORTABLE) { - $this->setEnableList(self::CODE_EMPTY_SORTABLE_NESTED_TREE); - } - - $this->setEnableList($sResult); - } - - /** - * Exception by list - * @param array $arList - * @param array $arException - * @param array $arOnlyThis - * @return array - */ - protected function exceptionByList($arList = [], $arException = [], $arOnlyThis = []) - { - if (empty($arException) && empty($arOnlyThis)) { - return $arList; - } elseif (empty($arException) && !empty($arOnlyThis)) { - return $arOnlyThis; - } - - $arChoiceList = array_diff($arList, $arException); - - return array_values($arChoiceList); - } - /** - * Validation answer to a question by name - * @param string $sMessage - * @return string - */ - protected function validationAskByName($sMessage) - { - $sResult = $this->ask($sMessage); - - if (!preg_match("/^[a-zA-Z]+$/", $sResult)) { - $sResult = $this->validationAskByName($sMessage); - } - - return $sResult; - } - - /** - * Set register string for $arData - * @param string $sString - * @param string $sArrayKey - */ - protected function setRegisterString($sString, $sArrayKey) - { - if (empty($sString) || empty($sArrayKey)) { - return; - } - - $sStringCase = snake_case($sString); - $sStringStudly = studly_case($sStringCase); - $sStringLower = mb_strtolower($sString); - array_set($this->arData, 'replace.'.self::PREFIX_STUDLY.$sArrayKey, $sStringStudly); - array_set($this->arData, 'replace.'.self::PREFIX_LOWER.$sArrayKey, $sStringLower); - } - - /** - * Check enable list - * @param string $sCode - * @return bool - */ - protected function checkEnableList($sCode) - { - $arEnableList = array_get($this->arData, 'enable'); - - if (!empty($sCode) && !empty($arEnableList) && is_array($arEnableList) && in_array($sCode, $arEnableList)) { - return true; - } - - return false; - } - - /** - * Check addition list - * @param string $sCode - * @return bool - */ - protected function checkAdditionList($sCode) - { - $arAdditionList = array_get($this->arData, 'addition'); - - if (!empty($sCode) && !empty($arAdditionList) && is_array($arAdditionList) && in_array($sCode, $arAdditionList)) { - return true; - } - - return false; - } - - /** - * Set disable list - */ - protected function setDisableList() - { - $arDisableList = [ - self::CODE_DEVELOPER, - self::CODE_EMPTY_FIELD, - self::CODE_EMPTY_VALIDATE, - self::CODE_EMPTY_ATTACH_ONE, - self::CODE_EMPTY_ATTACH_MANY, - self::CODE_EMPTY_IMPORT_EXPORT_SVG, - self::CODE_IMPORT_SVG, - self::CODE_EXPORT_SVG, - self::CODE_MODEL, - self::CODE_NESTED_TREE, - self::CODE_SORTABLE, - self::CODE_DEFAULT_SORTING, - self::CODE_EMPTY_SORTABLE_NESTED_TREE, - ]; - - if (!empty($this->arFieldList) && is_array($this->arFieldList)) { - $arDisableList = array_merge($arDisableList, $this->arFieldList); - } - - array_set($this->arData, 'disable', $arDisableList); - } - - /** - * Set addition list - * @param string $sValue - */ - protected function setAdditionList($sValue) - { - if (!empty($sValue)) { - $this->arData['addition'][] = $sValue; - } - } - - /** - * Set enable list - * @param string|array - */ - protected function setEnableList($arData) - { - if (empty($arData)) { - return; - } - - $arResult = []; - - if (!is_array($arData)) { - $arData = [$arData]; - } - - foreach ($arData as $mixData) { - if (is_array($mixData)) { - $arResult = array_merge($arResult, $mixData); - } - $arResult[] = $mixData; - } - - $arResult = array_unique($arResult); - $arDisableList = array_get($this->arData, 'disable'); - - foreach ($arResult as $sValue) { - $mixKey = array_search($sValue, $arDisableList); - if (!$mixKey) { - continue; - } - - $sValue = $arDisableList[$mixKey]; - $this->arData['enable'][] = $sValue; - array_forget($this->arData, 'disable.'.$mixKey); - } - } - - /** - * Create file - * @param string $sClass - */ - protected function createFile($sClass) - { - if (empty($sClass)) { - return; - } - - $obFile = new $sClass($this->arData); - $sFile = $obFile->create(); - if (!empty($sFile)) { - $sMessage = Lang::get('lovata.toolbox::lang.message.force_file', ['file' => $sFile]); - if ($this->confirm($sMessage, true)) { - $obFile->create(true); - } - } - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateAll.php b/plugins/lovata/toolbox/classes/console/CreateAll.php deleted file mode 100644 index 6544607bd..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateAll.php +++ /dev/null @@ -1,92 +0,0 @@ -setModel(); - $this->setController(); - $this->setFieldList(); - $this->setSorting(); - $this->setImportExportCSV(); - $this->setAdditionList(self::CODE_COMMAND_PARENT); - $this->callCommandList(); - } - - /** - * Call command list - */ - protected function callCommandList() - { - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_MODEL]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.model', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_CONTROLLER]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.controller', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_ITEM]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.item', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_STORE]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.store', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_COLLECTION]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.collection', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_COMPONENT_PAGE]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.component.page', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_COMPONENT_DATA]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.component.data', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_COMPONENT_LIST]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.component.list', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_EVENT]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.event.model', ['data' => $this->arData]); - } - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateCollection.php b/plugins/lovata/toolbox/classes/console/CreateCollection.php deleted file mode 100644 index 77bfb3630..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateCollection.php +++ /dev/null @@ -1,29 +0,0 @@ -setModel(); - $this->setFieldList(null, [self::CODE_ACTIVE, self::CODE_DEFAULT]); - $this->setSorting(); - $this->createFile(CollectionCreateFile::class); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateComponentData.php b/plugins/lovata/toolbox/classes/console/CreateComponentData.php deleted file mode 100644 index 5fcc16b75..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateComponentData.php +++ /dev/null @@ -1,38 +0,0 @@ - [ - '{{lower_model}}_data_name' => '{{studly_model}} Data', - '{{lower_model}}_data_description' => 'Get {{lower_model}} by ID', - ], - ]; - - /** - * Execute the console command. - */ - public function handle() - { - parent::handle(); - - $this->setModel(); - $this->createFile(ComponentDataCreateFile::class); - $this->updatePluginLang($this->arLangData); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateComponentList.php b/plugins/lovata/toolbox/classes/console/CreateComponentList.php deleted file mode 100644 index 39a961ee3..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateComponentList.php +++ /dev/null @@ -1,39 +0,0 @@ - [ - '{{lower_model}}_list_name' => '{{studly_model}} List', - '{{lower_model}}_list_description' => 'Get {{lower_model}} list', - ], - ]; - - /** - * Execute the console command. - */ - public function handle() - { - parent::handle(); - - $this->setModel(); - $this->setSorting([self::CODE_NESTED_TREE, self::CODE_SORTABLE]); - $this->createFile(ComponentListCreateFile::class); - $this->updatePluginLang($this->arLangData); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateComponentPage.php b/plugins/lovata/toolbox/classes/console/CreateComponentPage.php deleted file mode 100644 index 02fdd519d..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateComponentPage.php +++ /dev/null @@ -1,39 +0,0 @@ - [ - '{{lower_model}}_page_name' => '{{studly_model}} Page', - '{{lower_model}}_page_description' => 'Get {{lower_model}} page data', - ], - ]; - - /** - * Execute the console command. - */ - public function handle() - { - parent::handle(); - - $this->setModel(); - $this->setFieldList(null, [self::CODE_ACTIVE, self::CODE_VIEW_COUNT, self::CODE_DEFAULT]); - $this->createFile(ComponentPageCreateFile::class); - $this->updatePluginLang($this->arLangData); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateController.php b/plugins/lovata/toolbox/classes/console/CreateController.php deleted file mode 100644 index 4aa2a9ac1..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateController.php +++ /dev/null @@ -1,110 +0,0 @@ - [ - '{{lower_controller}}' => '{{studly_model}} list', - ], - 'permission' => [ - '{{lower_model}}' => 'Manage {{lower_model}}', - ], - '{{lower_model}}' => [ - 'name' => '{{lower_model}}', - 'list_title' => '{{studly_model}} list', - ], - ]; - - /** - * Execute the console command. - */ - public function handle() - { - parent::handle(); - - $this->setModel(); - $this->setController(); - $this->setFieldList(null, [self::CODE_ACTIVE, self::CODE_DEFAULT]); - $this->setImportExportCSV(); - $this->setSorting([self::CODE_DEFAULT_SORTING]); - $this->createAdditionalFile(); - } - - /** - * Create file list - */ - protected function createAdditionalFile() - { - $this->createFile(ControllerCreateFile::class); - $this->createFile(ControllerListToolbarCreateFile::class); - $this->createFile(ControllerConfirmFormCreateFile::class); - $this->createFile(ControllerConfirmListCreateFile::class); - $this->createFile(ControllerCreateCreateFile::class); - $this->createFile(ControllerIndexCreateFile::class); - $this->createFile(ControllerPreviewCreateFile::class); - $this->createFile(ControllerUpdateCreateFile::class); - $this->createFile(ControllerConfirmFilterCreateFile::class); - - if ($this->checkEnableList(self::CODE_IMPORT_SVG)) { - $this->createFile(ControllerImportCreateFile::class); - } - - if ($this->checkEnableList(self::CODE_EXPORT_SVG)) { - $this->createFile(ControllerExportCreateFile::class); - } - - if ($this->checkEnableList(self::CODE_EMPTY_IMPORT_EXPORT_SVG)) { - $this->createFile(ControllerConfigImportExportCreateFile::class); - } - - if ($this->checkEnableList(self::CODE_EMPTY_SORTABLE_NESTED_TREE)) { - $this->createFile(ControllerReorderCreateFile::class); - $this->createFile(ControllerConfigReorderCreateFile::class); - } - - $this->updatePluginYAML(); - $this->updatePluginLang($this->arLangData); - } - - /** - * Update plugin.yaml - */ - protected function updatePluginYAML() - { - $sMessage = Lang::get('lovata.toolbox::lang.message.add_side_menu'); - if ($this->confirm($sMessage, true)) { - $obUpdate = new PluginYAMLUpdateFile($this->arData); - $obUpdate->update(); - } - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateEventModel.php b/plugins/lovata/toolbox/classes/console/CreateEventModel.php deleted file mode 100644 index 1379ade89..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateEventModel.php +++ /dev/null @@ -1,31 +0,0 @@ -setAuthor(true); - $this->setPlugin(true); - $this->setModel(); - $this->setFieldList(null, [self::CODE_ACTIVE, self::CODE_VIEW_COUNT, self::CODE_DEFAULT]); - $this->setSorting(); - $this->createFile(EventModelCreateFile::class); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateExtendBackendMenuHandler.php b/plugins/lovata/toolbox/classes/console/CreateExtendBackendMenuHandler.php deleted file mode 100644 index 26be41efa..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateExtendBackendMenuHandler.php +++ /dev/null @@ -1,26 +0,0 @@ -createFile(ExtendBackendMenuHandlerCreateFile::class); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateExtendModelColumnsHandler.php b/plugins/lovata/toolbox/classes/console/CreateExtendModelColumnsHandler.php deleted file mode 100644 index 75bec56ca..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateExtendModelColumnsHandler.php +++ /dev/null @@ -1,30 +0,0 @@ -setAuthor(true); - $this->setPlugin(true); - $this->setModel(); - $this->setController(); - $this->createFile(ExtendModelColumnsHandlerCreateFile::class); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateExtendModelFieldsHandler.php b/plugins/lovata/toolbox/classes/console/CreateExtendModelFieldsHandler.php deleted file mode 100644 index 55842715e..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateExtendModelFieldsHandler.php +++ /dev/null @@ -1,30 +0,0 @@ -setAuthor(true); - $this->setPlugin(true); - $this->setModel(); - $this->setController(); - $this->createFile(ExtendModelFieldsHandlerCreateFile::class); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateItem.php b/plugins/lovata/toolbox/classes/console/CreateItem.php deleted file mode 100644 index 6949f2abd..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateItem.php +++ /dev/null @@ -1,29 +0,0 @@ -setModel(); - $this->setFieldList(); - $this->setSorting([self::CODE_DEFAULT_SORTING]); - $this->createFile(ItemCreateFile::class); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateMigration.php b/plugins/lovata/toolbox/classes/console/CreateMigration.php deleted file mode 100644 index 81860596b..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateMigration.php +++ /dev/null @@ -1,44 +0,0 @@ -setController(); - $this->setFieldList([self::CODE_PREVIEW_IMAGE, self::CODE_IMAGES, self::CODE_FILE]); - $this->setSorting([self::CODE_DEFAULT_SORTING]); - $this->createFile(MigrationCreateFile::class); - $this->updatePluginVersionYAML(); - } - - /** - * Update version.yaml - */ - protected function updatePluginVersionYAML() - { - $sMessage = Lang::get('lovata.toolbox::lang.message.version_up'); - $bConfirm = $this->confirm($sMessage, false); - array_set($this->arData, 'addition.version_up', $bConfirm); - $obUpdate = new PluginVersionYAMLUpdateFile($this->arData); - $obUpdate->update(); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateModel.php b/plugins/lovata/toolbox/classes/console/CreateModel.php deleted file mode 100644 index 3f4cf19ed..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateModel.php +++ /dev/null @@ -1,58 +0,0 @@ -setModel(); - $this->setController(); - $this->setFieldList(); - $this->setImportExportCSV(); - $this->setSorting([self::CODE_DEFAULT_SORTING]); - $this->setAdditionList(self::CODE_COMMAND_PARENT); - $this->createFile(ModelCreateFile::class); - $this->callCommandList(); - } - - /** - * Call command list - */ - protected function callCommandList() - { - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_CREATION_MIGRATION]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.migration.create', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_CREATION_MODEL_COLUMNS]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.model.columns', ['data' => $this->arData]); - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.create', ['name' => self::CODE_CREATION_MODEL_FIELDS]); - - if ($this->confirm($sMessage, true)) { - $this->call('toolbox:create.model.fields', ['data' => $this->arData]); - } - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateModelColumn.php b/plugins/lovata/toolbox/classes/console/CreateModelColumn.php deleted file mode 100644 index d10bab234..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateModelColumn.php +++ /dev/null @@ -1,29 +0,0 @@ -setModel(); - $this->setFieldList([self::CODE_PREVIEW_IMAGE, self::CODE_IMAGES, self::CODE_FILE]); - $this->setSorting([self::CODE_DEFAULT_SORTING, self::CODE_NESTED_TREE]); - $this->createFile(ModelColumnCreateFile::class); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateModelField.php b/plugins/lovata/toolbox/classes/console/CreateModelField.php deleted file mode 100644 index f4c78d88f..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateModelField.php +++ /dev/null @@ -1,28 +0,0 @@ -setModel(); - $this->setFieldList(); - $this->createFile(ModelFieldCreateFile::class); - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreatePlugin.php b/plugins/lovata/toolbox/classes/console/CreatePlugin.php deleted file mode 100644 index 480fbe09d..000000000 --- a/plugins/lovata/toolbox/classes/console/CreatePlugin.php +++ /dev/null @@ -1,106 +0,0 @@ -initData(); - $this->setLogo(); - $this->setDeveloper(); - - if (!$this->checkAdditionList(self::CODE_AUTHOR) || !$this->checkAdditionList(self::CODE_PLUGIN)) { - $this->setAuthor(); - $this->setPlugin(); - } - - if ($this->checkPluginExist()) { - return; - } - - $this->setLangList(); - $this->createFile(PluginPHPCreateFile::class); - $this->createFile(PluginYAMLCreateFile::class); - $this->createFile(PluginVersionCreateFile::class); - $this->createLangFile(); - } - - /** - * Check plugin exist - * @return bool - */ - protected function checkPluginExist() - { - $bResult = true; - $sAuthor = array_get($this->arData, 'replace.lower_author'); - $sPlugin = array_get($this->arData, 'replace.lower_plugin'); - - if (empty($sAuthor) || empty($sPlugin)) { - return $bResult; - } - - $sPluginPHPPath = plugins_path($sAuthor.'/'.$sPlugin.'/Plugin.php'); - $sPluginYAMLPath = plugins_path($sAuthor.'/'.$sPlugin.'/plugin.yaml'); - - if (!file_exists($sPluginPHPPath) && !file_exists($sPluginYAMLPath)) { - $bResult = false; - } - - return $bResult; - } - - /** - * Set lang list - */ - protected function setLangList() - { - if (empty($this->arLangList)) { - return; - } - - $sMessage = Lang::get('lovata.toolbox::lang.message.choice_lang_list'); - - $this->arLangList = $this->choice($sMessage, $this->arLangList, null, null, true); - } - - /** - * Create lang file - */ - protected function createLangFile() - { - if (empty($this->arLangList)) { - return; - } - - foreach ($this->arLangList as $sLang) { - array_set($this->arData, 'replace.lang', $sLang); - $this->createFile(PluginLangCreateFile::class); - } - } -} diff --git a/plugins/lovata/toolbox/classes/console/CreateStore.php b/plugins/lovata/toolbox/classes/console/CreateStore.php deleted file mode 100644 index 8f7943979..000000000 --- a/plugins/lovata/toolbox/classes/console/CreateStore.php +++ /dev/null @@ -1,46 +0,0 @@ -setAuthor(true); - $this->setPlugin(true); - $this->setModel(); - $this->setFieldList(null, [self::CODE_ACTIVE, self::CODE_VIEW_COUNT, self::CODE_DEFAULT]); - $this->setSorting(); - $this->createFile(ListStoreCreateFile::class); - - if ($this->checkEnableList(self::CODE_ACTIVE)) { - $this->createFile(ActiveListStoreCreateFile::class); - } - - if ($this->checkEnableList(self::CODE_SORTABLE) || $this->checkEnableList(self::CODE_DEFAULT_SORTING)) { - $this->createFile(SortingListStoreCreateFile::class); - } - - if ($this->checkEnableList(self::CODE_NESTED_TREE)) { - $this->createFile(TopLevelListStoreCreateFile::class); - } - } -} diff --git a/plugins/lovata/toolbox/classes/console/ToolBoxHelper.php b/plugins/lovata/toolbox/classes/console/ToolBoxHelper.php deleted file mode 100644 index 82d67133d..000000000 --- a/plugins/lovata/toolbox/classes/console/ToolBoxHelper.php +++ /dev/null @@ -1,110 +0,0 @@ -logoToolBox(); - - $arHeaderList = [self::HEADER_COMMAND_LIST, self::HEADER_DESCRIPTION]; - - $arRowList = [ - [ - 'toolbox:helper', - Lang::get('lovata.toolbox::lang.message.table_toolbox_helper'), - ], - [ - 'toolbox:create.all', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'all pack.']), - ], - [ - 'toolbox:create.plugin', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'plugin.']), - ], - [ - 'toolbox:create.model', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'model.']), - ], - [ - 'toolbox:create.model.columns', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'columns model.']), - ], - [ - 'toolbox:create.model.fields', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'fields model.']), - ], - [ - 'toolbox:create.controller', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'controller.']), - ], - [ - 'toolbox:create.migration', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'migration.']), - ], - [ - 'toolbox:create.component.data', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'component data.']), - ], - [ - 'toolbox:create.component.list', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'component list.']), - ], - [ - 'toolbox:create.component.page', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'component page.']), - ], - [ - 'toolbox:create.item', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'item.']), - ], - [ - 'toolbox:create.collection', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'collection.']), - ], - [ - 'toolbox:create.store', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'store.']), - ], - [ - 'toolbox:create.event.model', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'event model.']), - ], - [ - 'toolbox:create.event.menu', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'extend backend menu.']), - ], - [ - 'toolbox:create.event.fields', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'extend model fields.']), - ], - [ - 'toolbox:create.event.columns', - Lang::get('lovata.toolbox::lang.message.table_toolbox_create', ['description' => 'extend model columns.']), - ], - ]; - - $this->table($arHeaderList, $arRowList); - } -} diff --git a/plugins/lovata/toolbox/classes/event/AbstractBackendColumnHandler.php b/plugins/lovata/toolbox/classes/event/AbstractBackendColumnHandler.php deleted file mode 100644 index 659475b48..000000000 --- a/plugins/lovata/toolbox/classes/event/AbstractBackendColumnHandler.php +++ /dev/null @@ -1,53 +0,0 @@ -listen('backend.list.extendColumns', function ($obWidget) { - - $sControllerClass = $this->getControllerClass(); - $sModelName = $this->getModelClass(); - - /** @var \Backend\Widgets\Lists $obWidget */ - if (!$obWidget->getController() instanceof $sControllerClass) { - return; - } - - if (!$obWidget->model instanceof $sModelName) { - return; - } - - $this->extendColumns($obWidget); - }, $this->iPriority); - } - - /** - * Extend backend columns - * @param \Backend\Widgets\Lists $obWidget - */ - abstract protected function extendColumns($obWidget); - - /** - * Get model class name - * @return string - */ - abstract protected function getModelClass() : string; - - /** - * Get controller class name - * @return string - */ - abstract protected function getControllerClass() : string; -} diff --git a/plugins/lovata/toolbox/classes/event/AbstractBackendFieldHandler.php b/plugins/lovata/toolbox/classes/event/AbstractBackendFieldHandler.php deleted file mode 100644 index a2b85011f..000000000 --- a/plugins/lovata/toolbox/classes/event/AbstractBackendFieldHandler.php +++ /dev/null @@ -1,53 +0,0 @@ -listen('backend.form.extendFields', function ($obWidget) { - - $sControllerClass = $this->getControllerClass(); - $sModelName = $this->getModelClass(); - - /** @var \Backend\Widgets\Form $obWidget */ - if (!$obWidget->getController() instanceof $sControllerClass || $obWidget->isNested || empty($obWidget->context)) { - return; - } - - if (!$obWidget->model instanceof $sModelName) { - return; - } - - $this->extendFields($obWidget); - }, $this->iPriority); - } - - /** - * Extend backend fields - * @param \Backend\Widgets\Form $obWidget - */ - abstract protected function extendFields($obWidget); - - /** - * Get model class name - * @return string - */ - abstract protected function getModelClass() : string; - - /** - * Get controller class name - * @return string - */ - abstract protected function getControllerClass() : string; -} diff --git a/plugins/lovata/toolbox/classes/event/AbstractBackendMenuHandler.php b/plugins/lovata/toolbox/classes/event/AbstractBackendMenuHandler.php deleted file mode 100644 index d990a8bd2..000000000 --- a/plugins/lovata/toolbox/classes/event/AbstractBackendMenuHandler.php +++ /dev/null @@ -1,28 +0,0 @@ -listen('backend.menu.extendItems', function ($obManager) { - $this->addMenuItems($obManager); - }, $this->iPriority); - } - - /** - * Add menu items - * @param \Backend\Classes\NavigationManager $obManager - */ - abstract protected function addMenuItems($obManager); -} diff --git a/plugins/lovata/toolbox/classes/event/AbstractExtendRelationConfigHandler.php b/plugins/lovata/toolbox/classes/event/AbstractExtendRelationConfigHandler.php deleted file mode 100644 index 7947accaa..000000000 --- a/plugins/lovata/toolbox/classes/event/AbstractExtendRelationConfigHandler.php +++ /dev/null @@ -1,58 +0,0 @@ -getControllerClass(); - $sControllerClass::extend(function ($obController) { - /** @var \Backend\Classes\Controller $obController */ - $this->extendConfig($obController); - }); - } - - /** - * Extend controller - * @param \Backend\Classes\Controller $obController - */ - protected function extendConfig($obController) - { - if (empty($obController->implement)) { - $obController->implement = []; - } - - //Extend controller - if (!in_array('Backend.Behaviors.RelationController', $obController->implement) && !in_array('Backend\Behaviors\RelationController', $obController->implement)) { - $obController->implement[] = 'Backend.Behaviors.RelationController'; - } - - if (!isset($obController->relationConfig)) { - $obController->addDynamicProperty('relationConfig'); - } - - $obController->relationConfig = $obController->mergeConfig( - $obController->relationConfig, - $this->getConfigPath() - ); - } - - /** - * Get controller class name - * @return string - */ - abstract protected function getControllerClass() : string; - - /** - * Get path to config file - * @return string - */ - abstract protected function getConfigPath() : string; -} diff --git a/plugins/lovata/toolbox/classes/event/AbstractModelRelationHandler.php b/plugins/lovata/toolbox/classes/event/AbstractModelRelationHandler.php deleted file mode 100644 index d3a81c923..000000000 --- a/plugins/lovata/toolbox/classes/event/AbstractModelRelationHandler.php +++ /dev/null @@ -1,95 +0,0 @@ -getModelClass(); - - $sModelClass::extend(function ($obModel) { - /** @var \Model $obModel */ - $obModel->bindEvent('model.relation.afterAttach', function ($sRelationName, $arAttachedIDList, $arInsertData) use ($obModel) { - if (!$this->checkRelationName($sRelationName)) { - return; - } - - $this->sRelationName = $sRelationName; - $this->afterAttach($obModel, $arAttachedIDList, $arInsertData); - }, $this->iPriority); - - $obModel->bindEvent('model.relation.afterDetach', function ($sRelationName, $arAttachedIDList) use ($obModel) { - if (!$this->checkRelationName($sRelationName)) { - return; - } - - $this->sRelationName = $sRelationName; - $this->afterDetach($obModel, $arAttachedIDList); - }, $this->iPriority); - }); - } - - /** - * After attach event handler - * @param \Model $obModel - * @param array $arAttachedIDList - * @param array $arInsertData - */ - protected function afterAttach($obModel, $arAttachedIDList, $arInsertData) - { - } - - /** - * After detach event handler - * @param \Model $obModel - * @param array $arAttachedIDList - */ - protected function afterDetach($obModel, $arAttachedIDList) - { - } - - /** - * Check relation name - * @param string $sRelationName - * @return bool - */ - protected function checkRelationName($sRelationName) : bool - { - $sCheckedRelationName = $this->getRelationName(); - if (empty($sCheckedRelationName)) { - return true; - } - - if (is_array($sCheckedRelationName) && in_array($sRelationName, $sCheckedRelationName)) { - return true; - } - - $bResult = $sRelationName == $sCheckedRelationName; - - return $bResult; - } - - /** - * Get model class name - * @return string - */ - abstract protected function getModelClass() : string; - - /** - * Get relation name - * @return string|array - */ - abstract protected function getRelationName(); -} diff --git a/plugins/lovata/toolbox/classes/event/ModelHandler.php b/plugins/lovata/toolbox/classes/event/ModelHandler.php deleted file mode 100644 index 5c38c2cf6..000000000 --- a/plugins/lovata/toolbox/classes/event/ModelHandler.php +++ /dev/null @@ -1,236 +0,0 @@ -getModelClass(); - $sModelClass::extend(function ($obElement) { - - /** @var \Model $obElement */ - $obElement->bindEvent('model.afterCreate', function () use ($obElement) { - $this->obElement = $obElement; - $this->init(); - $this->afterCreate(); - }, $this->iPriority); - - /** @var \Model $obElement */ - $obElement->bindEvent('model.afterSave', function () use ($obElement) { - $this->obElement = $obElement; - $this->init(); - $this->afterSave(); - }, $this->iPriority); - - /** @var \Model $obElement */ - $obElement->bindEvent('model.afterDelete', function () use ($obElement) { - $this->obElement = $obElement; - $this->init(); - $this->afterDelete(); - }, $this->iPriority); - - if ($this->bWithRestore) { - /** @var \Model $obElement */ - $obElement->bindEvent('model.afterRestore', function () use ($obElement) { - $this->obElement = $obElement; - $this->init(); - $this->afterRestore(); - }, $this->iPriority); - } - }); - } - - /** - * Get model class name - * @return string - */ - abstract protected function getModelClass(); - - /** - * Get item class name - * @return string - */ - abstract protected function getItemClass(); - - /** - * Init store objects - */ - protected function init() - { - } - - /** - * After create event handler - */ - protected function afterCreate() - { - } - - /** - * After save event handler - */ - protected function afterSave() - { - $this->clearItemCache(); - } - - /** - * After delete event handler - */ - protected function afterDelete() - { - $this->clearItemCache(); - } - - /** - * After restore event handler - */ - protected function afterRestore() - { - } - - /** - * Clear item cache - */ - protected function clearItemCache() - { - $sItemClass = $this->getItemClass(); - $sField = $this->sIdentifierField; - - $sItemClass::clearCache($this->obElement->$sField); - } - - /** - * If field value was changed, then cache clear by value - * @param string $sField - * @param AbstractStoreWithParam|AbstractStoreWithoutParam $obListStore - */ - protected function checkFieldChanges($sField, $obListStore) - { - if (empty($sField) || empty($obListStore) || !$this->isFieldChanged($sField)) { - return; - } - - if ($obListStore instanceof AbstractStoreWithoutParam) { - $obListStore->clear(); - } elseif ($obListStore instanceof AbstractStoreWithParam) { - $obListStore->clear($this->obElement->$sField); - $obListStore->clear($this->obElement->getOriginal($sField)); - } - } - - /** - * If field has not empty value, then cache clear by value - * @param string $sField - * @param AbstractStoreWithParam|AbstractStoreWithoutParam $obListStore - */ - protected function clearCacheNotEmptyValue($sField, $obListStore) - { - if (empty($sField) || empty($obListStore) || empty($this->obElement->$sField)) { - return; - } - - if ($obListStore instanceof AbstractStoreWithoutParam) { - $obListStore->clear(); - } elseif ($obListStore instanceof AbstractStoreWithParam) { - $obListStore->clear($this->obElement->$sField); - } - } - - /** - * If field has empty value, then cache clear by value - * @param string $sField - * @param AbstractStoreWithoutParam $obListStore - */ - protected function clearCacheEmptyValue($sField, $obListStore) - { - if (empty($sField) || empty($obListStore) || !empty($this->obElement->$sField) || ! $obListStore instanceof AbstractStoreWithoutParam) { - return; - } - - $obListStore->clear(); - } - - /** - * If field value was changed, then cache clear by value - * @param $sField - * @param $sAdditionalField - * @param AbstractStoreWithTwoParam $obListStore - */ - protected function clearCacheNotEmptyTwoValue($sField, $sAdditionalField, $obListStore) - { - if (empty($sField) || empty($obListStore) || empty($this->obElement->$sField) || !$obListStore instanceof AbstractStoreWithTwoParam) { - return; - } - - $obListStore->clear($this->obElement->$sField); - if (empty($this->obElement->$sAdditionalField)) { - return; - } - - $obListStore->clear($this->obElement->$sField, $this->obElement->$sAdditionalField); - } - - /** - * @param $sField - * @param $sAdditionalField - * @param AbstractStoreWithTwoParam $obListStore - */ - protected function checkFieldChangesTwoParam($sField, $sAdditionalField, $obListStore) - { - if (empty($sField) || empty($sAdditionalField) || empty($obListStore) || !$obListStore instanceof AbstractStoreWithTwoParam) { - return; - } - - if (!$this->isFieldChanged($sField) && $this->isFieldChanged($sAdditionalField)) { - return; - } - - $obListStore->clear($this->obElement->$sField); - $obListStore->clear($this->obElement->$sField, $this->obElement->$sAdditionalField); - $obListStore->clear($this->obElement->$sField, $this->obElement->getOriginal($sField)); - - $obListStore->clear($this->obElement->getOriginal($sField)); - $obListStore->clear($this->obElement->getOriginal($sField), $this->obElement->$sAdditionalField); - $obListStore->clear($this->obElement->getOriginal($sField), $this->obElement->getOriginal($sField)); - } - - /** - * Check: field value was change - * @param string $sField - * @return bool - */ - protected function isFieldChanged($sField) - { - if (empty($sField)) { - return false; - } - - if ($this->obElement->$sField == $this->obElement->getOriginal($sField)) { - return false; - } - - return true; - } -} diff --git a/plugins/lovata/toolbox/classes/helper/AbstractImportModel.php b/plugins/lovata/toolbox/classes/helper/AbstractImportModel.php deleted file mode 100644 index 8fad80fc5..000000000 --- a/plugins/lovata/toolbox/classes/helper/AbstractImportModel.php +++ /dev/null @@ -1,358 +0,0 @@ -initActiveLang(); - } - - /** - * Deactivate active elements - */ - public function deactivateElements() - { - if (!$this->bDeactivate) { - return; - } - - $arDeactivateIDList = array_diff((array) $this->arExistIDList, (array) $this->arProcessedIDList); - if (empty($arDeactivateIDList)) { - return; - } - - //Get element list - $sModelClass = static::MODEL_CLASS; - $obElementList = $sModelClass::whereIn('external_id', $arDeactivateIDList)->get(); - foreach ($obElementList as $obElement) { - $obElement->active = false; - $obElement->save(); - } - } - - /** - * Create new item - */ - abstract protected function createItem(); - - /** - * Update item - */ - abstract protected function updateItem(); - - /** - * Run import item - */ - protected function run() - { - $this->prepareImportData(); - $this->fireBeforeImportEvent(); - $this->prepareImportDataBeforeSave(); - - $this->findByExternalID(); - if (!empty($this->obModel)) { - $this->updateItem(); - } else { - $this->createItem(); - } - - if (empty($this->obModel)) { - return; - } - - $this->processModelObject(); - Event::fire(self::EVENT_AFTER_IMPORT, [$this->obModel, $this->arImportData]); - } - - /** - * Find item by external ID - */ - protected function findByExternalID() - { - $sModelClass = static::MODEL_CLASS; - if ($this->bWithTrashed) { - $this->obModel = $sModelClass::withTrashed()->getByExternalID($this->sExternalID)->first(); - } else { - $this->obModel = $sModelClass::getByExternalID($this->sExternalID)->first(); - } - } - - /** - * Prepare array of import data - */ - protected function prepareImportData() - { - } - - /** - * Prepare array of import data - */ - protected function prepareImportDataBeforeSave() - { - if (empty($this->arImportData)) { - return; - } - - $arResult = []; - foreach ($this->arImportData as $sKey => $sValue) { - if (is_string($sValue)) { - $sValue = trim($sValue); - } elseif (is_array($sValue)) { - $sValue = array_filter($sValue); - } - - array_set($arResult, $sKey, $sValue); - } - - $this->arImportData = $arResult; - } - - /** - * Process model object after creation/updating - */ - protected function processModelObject() - { - $arActiveLangList = $this->getActiveLangList(); - if (empty($arActiveLangList) || empty($this->obModel)) { - return; - } - - foreach ($arActiveLangList as $sLangCode) { - if (!array_key_exists($sLangCode, $this->arImportData)) { - continue; - } - - foreach ($this->arImportData[$sLangCode] as $sField => $sValue) { - $this->obModel->setAttributeTranslated($sField, $sValue, $sLangCode); - } - } - - $this->obModel->save(); - } - - /** - * Fire beforeImport event and update import data array - */ - protected function fireBeforeImportEvent() - { - $arEventData = [static::MODEL_CLASS, $this->arImportData]; - - $arEventData = Event::fire(self::EVENT_BEFORE_IMPORT, $arEventData); - if (empty($arEventData)) { - return; - } - - foreach ($arEventData as $arModelData) { - if (empty($arModelData)) { - continue; - } - - foreach ($arModelData as $sKey => $sValue) { - $this->arImportData[$sKey] = $sValue; - } - } - } - - /** - * Import obProductModel images - */ - protected function importImageList() - { - if (!$this->bNeedUpdateImageList) { - return; - } - - if (empty($this->arImageList)) { - $this->removeAllImages(); - - return; - } - - //Update old images - $obImageList = $this->obModel->images; - if (!$obImageList->isEmpty()) { - /** @var File $obImage */ - foreach ($obImageList as $obImage) { - $sFilePath = array_shift($this->arImageList); - - //Check image - if (!empty($sFilePath) && (!file_exists($obImage->getLocalPath()) || md5_file($sFilePath) != md5_file($obImage->getLocalPath()))) { - try { - $obImage->deleteThumbs(); - } catch (\Exception $obException) {} - $obImage->fromFile($sFilePath); - $obImage->save(); - } elseif (empty($sFilePath)) { - try { - $obImage->deleteThumbs(); - $obImage->delete(); - } catch (\Exception $obException) {} - } - } - } - - //Create new images - if (!empty($this->arImageList)) { - foreach ($this->arImageList as $sFilePath) { - $obImage = new File(); - $obImage->fromFile($sFilePath); - - $this->obModel->images()->add($obImage); - } - } - } - - /** - * Import preview image - */ - protected function importPreviewImage() - { - if (!$this->bNeedUpdatePreviewImage) { - return; - } - - $obPreviewImage = $this->obModel->preview_image; - if (empty($obPreviewImage) && empty($this->sPreviewImage)) { - return; - } - - if (empty($obPreviewImage) && !empty($this->sPreviewImage)) { - //Create new preview - $obPreviewImage = new File(); - $obPreviewImage->fromFile($this->sPreviewImage); - $this->obModel->preview_image()->add($obPreviewImage); - - return; - } - - if (!file_exists($obPreviewImage->getLocalPath())) { - $obPreviewImage->fromFile($this->sPreviewImage); - $obPreviewImage->save(); - } elseif (!empty($this->sPreviewImage) && file_exists($obPreviewImage->getLocalPath()) && md5_file($this->sPreviewImage) != md5_file($obPreviewImage->getLocalPath())) { - //Update preview image - $obPreviewImage->deleteThumbs(); - $obPreviewImage->fromFile($this->sPreviewImage); - $obPreviewImage->save(); - } elseif (!empty($obPreviewImage) && empty($this->sPreviewImage)) { - try { - $obPreviewImage->deleteThumbs(); - $obPreviewImage->delete(); - } catch (\Exception $obException) {} - } - } - - /** - * Remove all images - */ - protected function removeAllImages() - { - //Delete old images - $obImageList = $this->obModel->images; - if ($obImageList->isEmpty()) { - return; - } - - /** @var \System\Models\File $obFile */ - foreach ($obImageList as $obFile) { - try { - $obFile->deleteThumbs(); - $obFile->delete(); - } catch (\Exception $obException) {} - } - } - - /** - * Set active filed value, if active value is not null - */ - protected function setActiveField() - { - $bActive = array_get($this->arImportData, 'active'); - if ($bActive === null) { - $this->arImportData['active'] = true; - } else { - $this->arImportData['active'] = $this->processBooleanValue($bActive); - } - } - - /** - * @param string $sValue - * @return bool - */ - protected function processBooleanValue($sValue) : bool - { - if (is_string($sValue) && $sValue == 'false') { - return false; - } else { - return (bool) $sValue; - } - } - - /** - * Create queue job with import single item - * @throws \Throwable - */ - protected function createJob() - { - $sQueueName = Settings::getValue('import_queue_name'); - - $arQueueData = [ - 'class' => static::class, - 'data' => $this->arImportData, - ]; - - if (empty($sQueueName)) { - Queue::push(ImportItemQueue::class, $arQueueData); - } else { - Queue::pushOn($sQueueName, ImportItemQueue::class, $arQueueData); - } - } -} diff --git a/plugins/lovata/toolbox/classes/helper/AbstractImportModelFromCSV.php b/plugins/lovata/toolbox/classes/helper/AbstractImportModelFromCSV.php deleted file mode 100644 index a75b70a04..000000000 --- a/plugins/lovata/toolbox/classes/helper/AbstractImportModelFromCSV.php +++ /dev/null @@ -1,270 +0,0 @@ -bDeactivate = (bool) Input::get('ImportOptions.deactivate'); - } - - /** - * Import item - * @param array $arModeData - * @param bool $bWithQueue - * @throws \Throwable - */ - public function import($arModeData, $bWithQueue = true) - { - $this->sResultMethod = null; - $this->sErrorMessage = null; - - if (empty($arModeData)) { - $this->setWarningResult('lovata.toolbox::lang.message.row_is_empty'); - - return; - } - - $this->sExternalID = trim(array_get($arModeData, 'external_id')); - if (empty($this->sExternalID)) { - $this->setWarningResult('lovata.toolbox::lang.message.external_id_is_empty'); - - return; - } - - $this->arImportData = $arModeData; - $this->arProcessedIDList[] = $this->sExternalID; - - $bQueueOn = Settings::getValue('import_queue_on'); - if ($bQueueOn && $bWithQueue) { - $this->createJob(); - $this->setResultMethod(); - - return; - } - - $this->run(); - } - - /** - * Get result method - * @return string - */ - public function getResultMethod() - { - return $this->sResultMethod; - } - - /** - * Get result error message - * @return string - */ - public function getResultError() - { - return $this->sErrorMessage; - } - - /** - * Create new item - */ - protected function createItem() - { - $sModelClass = static::MODEL_CLASS; - try { - $this->obModel = $sModelClass::create($this->arImportData); - } catch (\Exception $obException) { - trace_log($obException); - $this->setErrorResult($obException->getMessage()); - - return; - } - - $this->setCreatedResult(); - } - - /** - * Update item - */ - protected function updateItem() - { - try { - $this->obModel->update($this->arImportData); - } catch (\Exception $obException) { - trace_log($obException); - $this->setErrorResult($obException->getMessage()); - - return; - } - - if ($this->bWithTrashed && $this->obModel->trashed()) { - $this->obModel->restore(); - } - - $this->setUpdatedResult(); - } - - /** - * Init image list - */ - protected function initImageList() - { - if (!array_key_exists('images', $this->arImportData)) { - $this->bNeedUpdateImageList = false; - return; - } - - $this->bNeedUpdateImageList = true; - $this->arImageList = explode(',', array_get($this->arImportData, 'images')); - array_forget($this->arImportData, 'images'); - - if (empty($this->arImageList)) { - return; - } - - foreach ($this->arImageList as $iKey => $sPath) { - $sPath = $this->checkForRemoteFile(trim($sPath)); - if (empty($sPath)) { - unset($this->arImageList[$iKey]); - continue; - } - - $sFilePath = storage_path($sPath); - if (!file_exists($sFilePath)) { - unset($this->arImageList[$iKey]); - } else { - $this->arImageList[$iKey] = $sFilePath; - } - } - } - - /** - * Init preview image path - */ - protected function initPreviewImage() - { - if (!array_key_exists('preview_image', $this->arImportData)) { - $this->bNeedUpdatePreviewImage = false; - - return; - } - - $this->bNeedUpdatePreviewImage = true; - $sTrimmedImage = trim(array_get($this->arImportData, 'preview_image')); - $this->sPreviewImage = $this->checkForRemoteFile($sTrimmedImage); - if (empty($this->sPreviewImage)) { - return; - } - - $this->sPreviewImage = storage_path($this->sPreviewImage); - if (!file_exists($this->sPreviewImage)) { - $this->sPreviewImage = null; - } - } - - /** - * Check for remote file and downloads it if possible - */ - protected function checkForRemoteFile($sPotentialUrl) - { - if (!preg_match('/https?:\/\//', $sPotentialUrl)) { - return $sPotentialUrl; - } - - try { - $obFile = new File; - $obFile->fromUrl($sPotentialUrl); - $obFile->save(); - - $sValue = 'app/' . $obFile->getDiskPath(); - - return $sValue; - } catch(Exception $obException) { - return $sPotentialUrl; - } - } - - /** - * Set create/update result method - */ - protected function setResultMethod() - { - if (!empty($this->arExistIDList) && in_array($this->sExternalID, $this->arExistIDList)) { - $this->setUpdatedResult(); - - return; - } - - $this->setCreatedResult(); - } - - /** - * Set result method name as logCreated() - */ - protected function setCreatedResult() - { - $this->sResultMethod = 'logCreated'; - } - - /** - * Set result method name as logUpdated() - */ - protected function setUpdatedResult() - { - $this->sResultMethod = 'logUpdated'; - } - - /** - * Set result method name as logError() - * @param string $sMessage - */ - protected function setErrorResult($sMessage = null) - { - if (!empty($sMessage)) { - $this->sErrorMessage = Lang::get($sMessage); - } - - $this->sResultMethod = 'logError'; - } - - /** - * Set result method name as logWarning() - * @param string $sMessage - */ - protected function setWarningResult($sMessage = null) - { - if (!empty($sMessage)) { - $this->sErrorMessage = Lang::get($sMessage); - } - - $this->sResultMethod = 'logWarning'; - } - - /** - * Set result method name as logSkipped() - * @param string $sMessage - */ - protected function setSkippedResult($sMessage = null) - { - if (!empty($sMessage)) { - $this->sErrorMessage = Lang::get($sMessage); - } - - $this->sResultMethod = 'logSkipped'; - } -} diff --git a/plugins/lovata/toolbox/classes/helper/AbstractImportModelFromXML.php b/plugins/lovata/toolbox/classes/helper/AbstractImportModelFromXML.php deleted file mode 100644 index 17f5a5d87..000000000 --- a/plugins/lovata/toolbox/classes/helper/AbstractImportModelFromXML.php +++ /dev/null @@ -1,379 +0,0 @@ -arFieldList = $this->extendImportFields($this->arFieldList); - $this->arFieldList = $this->initLangFields($this->arFieldList); - - return $this->arFieldList; - } - - /** - * Get created count - * @return int - */ - public function getCreatedCount() - { - return $this->iCreatedCount; - } - - /** - * Get updated count - * @return int - */ - public function getUpdatedCount() - { - return $this->iUpdatedCount; - } - - /** - * Get skipped count - * @return int - */ - public function getSkippedCount() - { - return $this->iSkippedCount; - } - - /** - * Get processed count - * @return int - */ - public function getProcessedCount() - { - return $this->iProcessedCount; - } - - /** - * Get total count of elements - * @return int - */ - public function getTotalCount() - { - return !empty($this->arElementList) ? count($this->arElementList) : 0; - } - - /** - * Start import - * @param $obProgressBar - * @throws - */ - public function import($obProgressBar = null) - { - $this->openMainFile(); - if (empty($this->arElementList)) { - return; - } - - $sParseNodeClass = static::PARSE_NODE_CLASS; - foreach ($this->arElementList as $obElementNode) { - - /** @var ParseXMLNode $obParseNode */ - $obParseNode = new $sParseNodeClass($obElementNode, $this->arImportSettings, $this->sPrefix, $this->sNamespace); - $arImportData = $obParseNode->get(); - - $arImportData = $this->extendImportData($arImportData, $obParseNode); - - $this->importRow($arImportData); - if (!empty($obProgressBar)) { - $obProgressBar->advance(); - } - } - } - - /** - * Import item - * @param array $arModeData - * @param bool $bWithQueue - * @throws \Throwable - */ - public function importRow($arModeData, $bWithQueue = true) - { - $this->iProcessedCount++; - - if (empty($arModeData)) { - $this->setErrorMessage(Lang::get('lovata.toolbox::lang.message.row_is_empty')); - return; - } - - $this->sExternalID = trim(array_get($arModeData, 'external_id')); - if (empty($this->sExternalID)) { - $this->setErrorMessage(Lang::get('lovata.toolbox::lang.message.external_id_is_empty')); - return; - } - - $this->arImportData = $arModeData; - $this->arProcessedIDList[] = $this->sExternalID; - - $bQueueOn = Settings::getValue('import_queue_on'); - if ($bQueueOn && $bWithQueue) { - $this->createJob(); - - return; - } - - $this->run(); - } - - /** - * Open XML file and read file - */ - public function openMainFile() - { - if (!empty($this->obMainXMLFile)) { - return; - } - - $sFilePath = storage_path($this->sMainFilePath); - if (empty($this->sMainFilePath) || !file_exists($sFilePath)) { - return; - } - - $this->obMainXMLFile = new ImportXMLNode(file_get_contents($sFilePath)); - if (empty($this->obMainXMLFile)) { - return; - } - - $this->arElementList = $this->obMainXMLFile->findListByPath($this->sElementListPath, $this->sPrefix, $this->sNamespace); - } - - /** - * Create new item - */ - protected function createItem() - { - $sModelClass = static::MODEL_CLASS; - try { - $this->obModel = $sModelClass::create($this->arImportData); - } catch (\Exception $obException) { - trace_log($obException); - $this->setErrorMessage($obException->getMessage()); - - return; - } - - $this->iCreatedCount++; - } - - /** - * Update item - */ - protected function updateItem() - { - try { - $this->obModel->update($this->arImportData); - } catch (\Exception $obException) { - trace_log($obException); - $this->setErrorMessage($obException->getMessage()); - - return; - } - - if ($this->bWithTrashed && $this->obModel->trashed()) { - $this->obModel->restore(); - } - - $this->iUpdatedCount++; - } - - /** - * Init image list - */ - protected function initImageList() - { - if (!array_key_exists('images', $this->arImportData)) { - $this->bNeedUpdateImageList = false; - return; - } - - $this->bNeedUpdateImageList = true; - $this->arImageList = array_get($this->arImportData, 'images'); - array_forget($this->arImportData, 'images'); - if (empty($this->arImageList)) { - return; - } - - if (is_string($this->arImageList)) { - $this->arImageList = [$this->arImageList]; - } - - foreach ($this->arImageList as $iKey => $sPath) { - $sPath = trim($sPath); - $sPath = trim($sPath, '/'); - if (empty($sPath)) { - unset($this->arImageList[$iKey]); - continue; - } - - $sFilePath = storage_path(trim($this->sImageFolderPath.'/'.$sPath, '/')); - if (!file_exists($sFilePath)) { - unset($this->arImageList[$iKey]); - } else { - $this->arImageList[$iKey] = $sFilePath; - } - } - } - - /** - * Init preview image path - */ - protected function initPreviewImage() - { - if (!array_key_exists('preview_image', $this->arImportData)) { - $this->bNeedUpdatePreviewImage = false; - - return; - } - - $this->bNeedUpdatePreviewImage = true; - $this->sPreviewImage = array_get($this->arImportData, 'preview_image'); - if (is_array($this->sPreviewImage)) { - $this->sPreviewImage = array_shift($this->sPreviewImage); - } - - $this->sPreviewImage = trim($this->sPreviewImage); - $this->sPreviewImage = trim($this->sPreviewImage, '/'); - array_forget($this->arImportData, 'preview_image'); - if (empty($this->sPreviewImage)) { - return; - } - - $this->sPreviewImage = storage_path(trim($this->sImageFolderPath.'/'.$this->sPreviewImage, '/')); - if (!file_exists($this->sPreviewImage)) { - $this->sPreviewImage = null; - } - } - - /** - * Set error message - * @param string $sMessage - */ - protected function setErrorMessage($sMessage) - { - Log::warning($sMessage); - - Result::setFalse()->setMessage($sMessage); - $this->iSkippedCount++; - } - - /** - * Fire event and extend import fields - * @param array $arFieldList - * @return array - */ - protected function extendImportFields($arFieldList) - { - $arEventData = Event::fire(static::EXTEND_FIELD_LIST, [$arFieldList]); - if (empty($arEventData)) { - return $arFieldList; - } - - foreach ($arEventData as $arAdditionFieldList) { - if (empty($arAdditionFieldList) || !is_array($arAdditionFieldList)) { - continue; - } - - $arFieldList = array_merge($arFieldList, $arAdditionFieldList); - } - - return $arFieldList; - } - - /** - * Fire event and extend import data - * @param array $arImportData - * @param ParseXMLNode $obParseNode - * @return array - */ - protected function extendImportData($arImportData, $obParseNode) - { - $arEventData = Event::fire(static::EXTEND_IMPORT_DATA, [$arImportData, $obParseNode]); - if (empty($arEventData)) { - return $arImportData; - } - - foreach ($arEventData as $arAdditionData) { - if (empty($arAdditionData) || !is_array($arAdditionData)) { - continue; - } - - $arImportData = array_merge($arImportData, $arAdditionData); - } - - return $arImportData; - } - - /** - * Add lang fields - * @param array $arFieldList - * @return array - */ - protected function initLangFields($arFieldList) - { - $arActiveLangList = $this->getActiveLangList(); - if (empty($arActiveLangList)) { - return $arFieldList; - } - - $sModelClass = static::MODEL_CLASS; - $obModel = new $sModelClass(); - $arLangFieldList = $obModel->translatable; - if (empty($arLangFieldList)) { - return $arFieldList; - } - - foreach ($arLangFieldList as $sFieldName) { - if (!array_key_exists($sFieldName, $arFieldList)) { - continue; - } - - foreach ($arActiveLangList as $sLangCode) { - $arFieldList[$sLangCode.'.'.$sFieldName] = $arFieldList[$sFieldName]." ($sLangCode)"; - } - } - - return $arFieldList; - } -} diff --git a/plugins/lovata/toolbox/classes/helper/ImportXMLNode.php b/plugins/lovata/toolbox/classes/helper/ImportXMLNode.php deleted file mode 100644 index dcb5eb272..000000000 --- a/plugins/lovata/toolbox/classes/helper/ImportXMLNode.php +++ /dev/null @@ -1,74 +0,0 @@ -registerXPathNamespace($sPrefix, $sNamespace); - - // Split string to array to add prefix. If there is no separator, array_walk will work anyway. - $arPaths = explode('/', $sPath); - array_walk($arPaths, function (&$sSection) use ($sPrefix) { - $sSection = sprintf("%s:%s", $sPrefix, $sSection); - }); - - $sPath = implode('/', $arPaths); - } - - $arResult = $this->xpath($sPath); - - return $arResult; - } - - /** - * @param \SimpleXMLElement $obNode - * @param string $sFieldPath - * @param string|null $sPrefix - * @param string|null $sNamespace - * @return string|null|array - */ - public function getValueByPath($sFieldPath, $sPrefix = null, $sNamespace = null) - { - if (empty($sFieldPath)) { - return null; - } - - $arValueNodeList = $this->findListByPath($sFieldPath, $sPrefix, $sNamespace); - if (empty($arValueNodeList)) { - return null; - } - - $arResult = []; - foreach ($arValueNodeList as $obValueNode) { - $arResult[] = (string) $obValueNode; - } - - if (count($arResult) == 1) { - return array_shift($arResult); - } elseif (empty($arResult)) { - return null; - } - - return $arResult; - } -} diff --git a/plugins/lovata/toolbox/classes/helper/PageHelper.php b/plugins/lovata/toolbox/classes/helper/PageHelper.php deleted file mode 100644 index 6fe9edfe7..000000000 --- a/plugins/lovata/toolbox/classes/helper/PageHelper.php +++ /dev/null @@ -1,259 +0,0 @@ -hasCache($sCacheKey)) { - return $this->getCachedData($sCacheKey); - } - - $arResult = []; - if (empty($sPageCode) || empty($sParamName)) { - return $arResult; - } - - //Get component list - $arComponentList = $this->getFullComponentList($sPageCode); - if (empty($arComponentList)) { - return $arResult; - } - - foreach ($arComponentList as $sKey => $arPropertyList) { - if (!empty($sComponentName) && !preg_match('%^'.$sComponentName.'%', $sKey)) { - continue; - } - - if (empty($arPropertyList) || !isset($arPropertyList[$sParamName])) { - continue; - } - - /* - * Extract the routing parameter name - * eg: {{ :someRouteParam }} - */ - if (!preg_match('/^\{\{([^\}]+)\}\}$/', $arPropertyList['slug'], $arMatches)) { - continue; - } - - $sValue = trim($arMatches[1]); - $sValue = ltrim($sValue, ':'); - - if ($bFindWildcard && array_get($arPropertyList, 'has_wildcard')) { - $arResult = [$sValue]; - break; - } elseif (!$bFindWildcard) { - $arResult[] = $sValue; - } - } - - $this->setCachedData($sCacheKey, $arResult); - - return $arResult; - } - - /** - * Get array with names of pages - * @return array - */ - public function getPageNameList() - { - if (!empty($this->arPageNameList)) { - return $this->arPageNameList; - } - - $arResult = []; - - //Get page list - $obPageList = $this->getPageList(); - if (empty($obPageList)) { - return $arResult; - } - - //Process page list - foreach ($obPageList as $obPage) { - $arResult[$obPage->id] = $obPage->title; - } - - $this->arPageNameList = $arResult; - - return $arResult; - } - - /** - * Init class data - */ - protected function init() - { - $this->obTheme = Theme::getActiveTheme(); - } - - /** - * Get component list for page - * @param string $sPageCode - * - * @return array - */ - protected function getFullComponentList($sPageCode) - { - if ($this->hasCache($sPageCode)) { - return $this->getCachedData($sPageCode); - } - - //Get page object - $obPage = $this->getPageObject($sPageCode); - if (empty($obPage) || empty($obPage->settings) || !isset($obPage->settings['components'])) { - return []; - } - - //Get component list - $arPageComponentList = $obPage->settings['components']; - $this->setCachedData($sPageCode, $arPageComponentList); - - return $arPageComponentList; - } - - /** - * Get page object - * @param string $sPageCode - * @return CmsPage|null - */ - protected function getPageObject($sPageCode) - { - if (isset($this->arPageList[$sPageCode])) { - return $this->arPageList[$sPageCode]; - } - - if (empty($sPageCode) || empty($this->obTheme)) { - return null; - } - - $this->arPageList[$sPageCode] = CmsPage::loadCached($this->obTheme, $sPageCode); - - return $this->arPageList[$sPageCode]; - } - - /** - * Get cached data - * @param string $sKey - * @return mixed|null - */ - protected function getCachedData($sKey) - { - if (isset($this->arCachedData[$sKey])) { - return $this->arCachedData[$sKey]; - } - - return null; - } - - /** - * Set cached data - * @param string $sKey - * @param mixed $obValue - */ - protected function setCachedData($sKey, $obValue) - { - $this->arCachedData[$sKey] = $obValue; - } - - /** - * @param string $sKey - * @return bool - */ - protected function hasCache($sKey) - { - return isset($this->arCachedData[$sKey]); - } - - /** - * Get page list - * @return array|\Cms\Classes\CmsObjectCollection|CmsPage[]|null - */ - protected function getPageList() - { - //Get CMS page list - $obPageList = $this->getCmsPageList(); - - //Get static page list - $obStaticPageList = $this->getStaticPageList(); - if (!empty($obStaticPageList)) { - if (empty($obPageList)) { - return $obStaticPageList; - } - - $obPageList = $obPageList->merge($obStaticPageList->all()); - } - - return $obPageList; - } - - /** - * @return \Cms\Classes\CmsObjectCollection|\Cms\Classes\Page[]|null - */ - protected function getCmsPageList() - { - if (empty($this->obTheme)) { - return null; - } - - //Get CMS page list - /** @var \Cms\Classes\CmsObjectCollection|\Cms\Classes\Page[] $obPageList */ - $obPageList = CmsPage::listInTheme($this->obTheme, true); - - return $obPageList; - } - - /** - * Get Static page list - * @return array|\Cms\Classes\CmsObjectCollection|CmsPage[]|null - */ - protected function getStaticPageList() - { - if (!PluginManager::instance()->hasPlugin('RainLab.Pages') || empty($this->obTheme)) { - return null; - } - - //Get Static page list - /** @var \Cms\Classes\CmsObjectCollection|\Cms\Classes\Page[] $obStaticPageList */ - $obStaticPage = new \RainLab\Pages\Classes\PageList($this->obTheme); - $obStaticPageList = $obStaticPage->listPages(true); - - return $obStaticPageList; - } -} diff --git a/plugins/lovata/toolbox/classes/helper/ParseXMLNode.php b/plugins/lovata/toolbox/classes/helper/ParseXMLNode.php deleted file mode 100644 index baeff6ee6..000000000 --- a/plugins/lovata/toolbox/classes/helper/ParseXMLNode.php +++ /dev/null @@ -1,97 +0,0 @@ -obElementNode = $obNode; - $this->arImportSettings = $arSettings; - $this->sPrefix = $sPrefix; - $this->sNamespace = $sNamespace; - - $this->parse(); - } - - /** - * @return ImportXMLNode - */ - public function getNode() - { - return $this->obElementNode; - } - - /** - * Get node data - * @return array - */ - public function get() - { - return $this->arImportData; - } - - protected function parse() - { - if (empty($this->arImportSettings)) { - return; - } - - foreach ($this->arImportSettings as $arFieldData) { - $sFieldName = array_get($arFieldData, 'field'); - $sFieldPath = array_get($arFieldData, 'path_to_field'); - if (empty($sFieldName) || empty($sFieldPath)) { - continue; - } - - $sMethodName = 'parse'.studly_case($sFieldName).'Attribute'; - if (method_exists(static::class, $sMethodName)) { - $sValue = $this->$sMethodName($sFieldPath, $this->sPrefix, $this->sNamespace); - } else { - $sValue = $this->obElementNode->getValueByPath($sFieldPath, $this->sPrefix, $this->sNamespace); - } - - if ($sValue === null) { - continue; - } - - $sCurrentValue = array_get($this->arImportData, $sFieldName); - if (!empty($sCurrentValue) && !is_array($sCurrentValue)) { - $sCurrentValue = [$sCurrentValue]; - } - - if (is_array($sCurrentValue) && is_array($sValue)) { - $sCurrentValue = array_merge($sCurrentValue, $sValue); - $sCurrentValue = array_filter($sCurrentValue); - $sCurrentValue = array_unique($sCurrentValue); - } elseif (is_array($sCurrentValue) && !is_array($sValue)) { - $sCurrentValue[] = $sValue; - $sCurrentValue = array_filter($sCurrentValue); - $sCurrentValue = array_unique($sCurrentValue); - } else { - $sCurrentValue = $sValue; - } - - array_set($this->arImportData, $sFieldName, $sCurrentValue); - } - } -} diff --git a/plugins/lovata/toolbox/classes/helper/PriceHelper.php b/plugins/lovata/toolbox/classes/helper/PriceHelper.php deleted file mode 100644 index a5c92a180..000000000 --- a/plugins/lovata/toolbox/classes/helper/PriceHelper.php +++ /dev/null @@ -1,91 +0,0 @@ -iDecimal, $obThis->sDecPoint, $obThis->sThousandsSep); - } - - /** - * Convert price string to float value - * @param string $sValue - * @return float - */ - public static function toFloat($sValue) - { - $sValue = str_replace(',', '.', $sValue); - $fPrice = (float) preg_replace("/[^0-9\.]/", "", $sValue); - - return $fPrice; - } - - /** - * Round float price value - * @param float $fPrice - * - * @return float - */ - public static function round($fPrice) - { - return round($fPrice, 2); - } - - /** - * PriceHelper constructor. - */ - protected function init() - { - //Get options from settings - $iDecimalValue = (int) Settings::getValue('decimals'); - if ($iDecimalValue >= 0) { - $this->iDecimal = $iDecimalValue; - } - - $sDecPointValue = Settings::getValue('dec_point'); - switch ($sDecPointValue) { - case 'comma': - $this->sDecPoint = ','; - break; - default: - $this->sDecPoint = '.'; - } - - $sThousandsSepValue = Settings::getValue('thousands_sep'); - switch ($sThousandsSepValue) { - case 'space': - $this->sThousandsSep = ' '; - break; - default: - $this->sThousandsSep = ''; - } - } -} diff --git a/plugins/lovata/toolbox/classes/helper/SendMailHelper.php b/plugins/lovata/toolbox/classes/helper/SendMailHelper.php deleted file mode 100644 index 4e25ce74e..000000000 --- a/plugins/lovata/toolbox/classes/helper/SendMailHelper.php +++ /dev/null @@ -1,133 +0,0 @@ -sMailTemplate = $sMailTemplate; - if ($bCheckActiveLang) { - $this->sMailTemplate = $this->addActiveLangSuffix($this->sMailTemplate); - } - - //Get template data - $this->arMailData = $this->getMailData($sEmailDataEventName, $arDefaultEmailData); - - //Process email list - if (is_string($mEmailList)) { - $arEmailList = explode(',', $mEmailList); - } else { - $arEmailList = $mEmailList; - } - - foreach ($arEmailList as $sEmail) { - $sEmail = trim($sEmail); - - $this->sendMail($sEmail); - } - } - - /** - * Init settings - */ - protected function init() - { - //Get queue settings - $this->bUseQueue = Settings::getValue('queue_on'); - $this->sQueueName = Settings::getValue('queue_name'); - } - - /** - * @param string $sEmail - */ - protected function sendMail($sEmail) - { - if (empty($this->sMailTemplate) || empty($sEmail)) { - return; - } - - //Send restore mail - if ($this->bUseQueue && empty($this->sQueueName)) { - Mail::queue($this->sMailTemplate, $this->arMailData, function ($obMessage) use ($sEmail) { - $obMessage->to($sEmail); - }); - } elseif ($this->bUseQueue && !empty($this->sQueueName)) { - Mail::queueOn($this->sQueueName, $this->sMailTemplate, $this->arMailData, function ($obMessage) use ($sEmail) { - $obMessage->to($sEmail); - }); - } else { - Mail::send($this->sMailTemplate, $this->arMailData, function ($obMessage) use ($sEmail) { - $obMessage->to($sEmail); - }); - } - } - - /** - * Get mail data - * @param string $sEventName - * @param array $arResult - * @return array - */ - protected function getMailData($sEventName, $arResult = []) - { - if (empty($sEventName)) { - return $arResult; - } - - //Get addition data for template - //Fire event - $arAdditionData = Event::fire($sEventName, $arResult); - if (empty($arAdditionData) || !is_array($arAdditionData)) { - return $arResult; - } - - foreach ($arAdditionData as $arData) { - if (empty($arData) || !is_array($arData)) { - continue; - } - - $arResult = array_merge($arResult, $arData); - } - - return $arResult; - } -} diff --git a/plugins/lovata/toolbox/classes/helper/UserHelper.php b/plugins/lovata/toolbox/classes/helper/UserHelper.php deleted file mode 100644 index 0cee38d5e..000000000 --- a/plugins/lovata/toolbox/classes/helper/UserHelper.php +++ /dev/null @@ -1,147 +0,0 @@ -obHelper)) { - return null; - } - - $sAuthFacadeClass = $this->obHelper->getAuthFacade(); - - return $sAuthFacadeClass::getUser(); - } - - /** - * Get user ID - * @return int|null - */ - public function getUserID() - { - $obUser = $this->getUser(); - if (empty($obUser)) { - return null; - } - - return $obUser->id; - } - - /** - * Create new user - * @param array $arUserData - * @param bool $bActivate - * @return \Lovata\Buddies\Models\User|\RainLab\User\Models\User|null - */ - public function register($arUserData, $bActivate = false) - { - if (empty($this->obHelper)) { - return null; - } - - $sAuthFacadeClass = $this->obHelper->getAuthFacade(); - - return $sAuthFacadeClass::register($arUserData, $bActivate); - } - - /** - * Find user by email - * @param string $sEmail - * - * @return \Lovata\Buddies\Models\User|\RainLab\User\Models\User|null - */ - public function findUserByEmail($sEmail) - { - if (empty($sEmail) || empty($this->obHelper)) { - return null; - } - - return $this->obHelper->findUserByEmail($sEmail); - } - - /** - * Get user model class name - * @return string - */ - public function getUserModel() - { - if (empty($this->obHelper)) { - return null; - } - - return $this->obHelper->getUserModel(); - } - - /** - * Get user controller class name - * @return string - */ - public function getUserController() - { - if (empty($this->obHelper)) { - return null; - } - - return $this->obHelper->getUserController(); - } - - /** - * Get auth facade class name - * @return string - */ - public function getAuthFacade() - { - if (empty($this->obHelper)) { - return null; - } - - return $this->obHelper->getAuthFacade(); - } - - /** - * Get active plugin name - * @return string - */ - public function getPluginName() - { - return $this->sPluginName; - } - - /** - * Init data - */ - protected function init() - { - $obPluginManager = PluginManager::instance(); - if ($obPluginManager->exists('Lovata.Buddies')) { - $this->obHelper = app(BuddiesUserHelper::class); - $this->sPluginName = 'Lovata.Buddies'; - } elseif ($obPluginManager->exists('RainLab.User')) { - $this->obHelper = app(RainLabUserHelper::class); - $this->sPluginName = 'RainLab.User'; - } - } -} diff --git a/plugins/lovata/toolbox/classes/helper/users/AbstractUserHelper.php b/plugins/lovata/toolbox/classes/helper/users/AbstractUserHelper.php deleted file mode 100644 index 37ce468c7..000000000 --- a/plugins/lovata/toolbox/classes/helper/users/AbstractUserHelper.php +++ /dev/null @@ -1,34 +0,0 @@ -first(); - } - - /** - * Get user model class name - * @return string - */ - public function getUserModel() - { - return \Lovata\Buddies\Models\User::class; - } - - /** - * Get user controller class name - * @return string - */ - public function getUserController() - { - return \Lovata\Buddies\Controllers\Users::class; - } - - /** - * Get auth facade class name - * @return string - */ - public function getAuthFacade() - { - return \Lovata\Buddies\Facades\AuthHelper::class; - } -} diff --git a/plugins/lovata/toolbox/classes/helper/users/RainLabUserHelper.php b/plugins/lovata/toolbox/classes/helper/users/RainLabUserHelper.php deleted file mode 100644 index ad831f2d5..000000000 --- a/plugins/lovata/toolbox/classes/helper/users/RainLabUserHelper.php +++ /dev/null @@ -1,51 +0,0 @@ -iElementID = $iElementID; - $this->obElement = $obElement; - - //Check instance of obElement - $sModelClass = static::MODEL_CLASS; - if (!empty($this->obElement) && !$this->obElement instanceof $sModelClass) { - $this->obElement = null; - } - - $this->bootIfNotBooted(); - - $this->initActiveLang(); - $this->extendableConstruct(); - } - - /** - * @param string $sName - * @return string - */ - public function __get($sName) - { - return $this->extendableGet($sName); - } - - /** - * @param string $sName - * @param mixed $obValue - */ - public function __set($sName, $obValue) - { - $this->extendableSet($sName, $obValue); - } - - /** - * @param string $sName - * @param array $arParamList - * @return mixed - */ - public function __call($sName, $arParamList) - { - return $this->extendableCall($sName, $arParamList); - } - - /** - * @param string $sName - * @param array $arParamList - * @return mixed - * @throws \Exception - */ - public static function __callStatic($sName, $arParamList) - { - return self::extendableCallStatic($sName, $arParamList); - } - - - /** - * Serialize item object - * @return array - */ - public function __sleep() - { - return ['iElementID']; - } - - /** - * Unserialize object - */ - public function __wakeup() - { - $this->setCachedData(); - } - - /** - * @return string - */ - public function __toString() - { - return $this->toJSON(); - } - - /** - * @param callable $callback - */ - public static function extend(callable $callback) - { - self::extendableExtendCallback($callback); - } - - /** - * Make new element item - * @param int|string $iElementID - * @param \Model $obElement - * - * @return $this - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementItem#makeielementid-obelement--null - * @see \Lovata\Toolbox\Tests\Unit\ItemTest::testItem() - */ - public static function make($iElementID, $obElement = null) - { - $arParamList = [ - 'iElementID' => $iElementID, - 'obElement' => $obElement, - ]; - - $obItem = ItemStorage::get(static::class, $iElementID); - if (!empty($obItem)) { - return $obItem; - } - - /** @var ElementItem $obItem */ - $obItem = app()->make(static::class, $arParamList); - - //Init cached array model data - $obItem->setCachedData(); - - ItemStorage::set(static::class, $iElementID, $obItem); - - return $obItem; - } - - /** - * Make new element item - * @param int|string $iElementID - * @param Model $obElement - * @return $this - * @throws \Exception - */ - public static function makeOnlyCache($iElementID, $obElement = null) - { - $arParamList = [ - 'iElementID' => $iElementID, - 'obElement' => $obElement, - ]; - - $obItem = ItemStorage::get(static::class, $iElementID); - if (!empty($obItem)) { - return $obItem; - } - - /** @var $this $obItem */ - $obItem = app()->make(static::class, $arParamList); - - //Init cached array model data - $obItem->setCachedData(false); - if ($obItem->isEmpty()) { - return $obItem; - } - - ItemStorage::set(static::class, $iElementID, $obItem); - - return $obItem; - } - - /** - * Make new element item (no cache) - * @param int $iElementID - * @param \Model $obElement - * @return $this - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementItem#makenocacheielementid-obelement--null - * @see \Lovata\Toolbox\Tests\Unit\ItemTest::testItem() - */ - public static function makeNoCache($iElementID, $obElement = null) - { - $arParamList = [ - 'iElementID' => $iElementID, - 'obElement' => $obElement, - ]; - - /** @var $this $obItem */ - $obItem = app()->make(static::class, $arParamList); - - //Init array model data (no cache) - $obItem->setData(); - - return $obItem; - } - - /** - * Remove model data from cache - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementItem#clearcacheielementid - * @param int $iElementID - */ - public static function clearCache($iElementID) - { - if (empty($iElementID)) { - return; - } - - ItemStorage::clear(static::class, $iElementID); - CCache::clear(static::getCacheTag(), $iElementID); - } - - /** - * Check model data is empty - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementItem#isempty - * @return bool - */ - public function isEmpty() - { - return empty($this->arModelData); - } - - /** - * Check model data is not empty - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementItem#isnotempty - * @return bool - */ - public function isNotEmpty() - { - return !$this->isEmpty(); - } - - /** - * Get model data - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementItem#toarray - * @return array - */ - public function toArray() - { - return $this->arModelData; - } - - /** - * Get model data in JSON string - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementItem#tojson - * @return string - */ - public function toJSON() - { - return json_encode($this->arModelData); - } - - /** - * Get model object - * @link https://github.com/lovata/oc-toolbox-plugin/wiki/ElementItem#getobject - * - * @return \Model - */ - public function getObject() - { - $this->initElementObject(); - - return $this->obElement; - } - - /** - * Set data from model object - */ - protected function setData() - { - $this->initElementObject(); - if (empty($this->obElement)) { - return; - } - - //Set default lang (if update cache with non default lang) - if (self::$bLangInit && !empty(self::$sDefaultLang) && $this->obElement->isClassExtendedWith('RainLab.Translate.Behaviors.TranslatableModel')) { - $this->obElement->lang(self::$sDefaultLang); - } - - //Get cached field list from model and add fields to cache array - $this->setCachedFieldList(); - - //Get element data - $arResult = $this->getElementData(); - if (empty($arResult) || !is_array($arResult)) { - $arResult = []; - } - - //Add fields values to cached array - foreach ($arResult as $sField => $sValue) { - $this->setAttribute($sField, $sValue); - } - - //Save lang properties (integration with Translate plugin) - $this->setLangProperties(); - - //Run methods from $arExtendResult array - $this->setExtendData(); - } - - /** - * Get cached field list from model and add fields to cache array - */ - protected function setCachedFieldList() - { - if (!$this->obElement->methodExists('getCachedField')) { - return; - } - - //Get cached field list - $arFieldList = $this->obElement->getCachedField(); - if (empty($arFieldList)) { - return; - } - - foreach ($arFieldList as $sField) { - if (array_key_exists($sField, (array) $this->obElement->attachOne)) { - $arFileData = $this->getUploadFileData($this->obElement->$sField); - $sFieldName = 'attachOne|'.$sField; - $this->setAttribute($sFieldName, $arFileData); - } elseif (array_key_exists($sField, (array) $this->obElement->attachMany)) { - $arFileList = []; - $obFileList = $this->obElement->$sField; - foreach ($obFileList as $obFile) { - $arFileData = $this->getUploadFileData($obFile); - $arFileList[] = $arFileData; - } - - $sFieldName = 'attachMany|'.$sField; - $this->setAttribute($sFieldName, $arFileList); - } else { - $this->setAttribute($sField, $this->obElement->$sField); - } - } - } - - /** - * Run methods from $arExtendResult array - */ - protected function setExtendData() - { - //Check extend result methods - if (empty($this->arExtendResult)) { - return; - } - - //Apply extend methods - foreach ($this->arExtendResult as $sMethodName) { - if (empty($sMethodName) || !(method_exists($this, $sMethodName) || $this->methodExists($sMethodName))) { - continue; - } - - $this->$sMethodName(); - } - } - - /** - * Set cached brand data - * @param bool $bWithQuery - */ - protected function setCachedData($bWithQuery = true) - { - if (empty($this->iElementID)) { - return; - } - - $arCacheTags = static::getCacheTag(); - $sCacheKey = $this->iElementID; - - $this->arModelData = CCache::get($arCacheTags, $sCacheKey); - if (!$this->isEmpty() || !$bWithQuery) { - return; - } - - $this->setData(); - - //Set cache data - CCache::forever($arCacheTags, $sCacheKey, $this->arModelData); - } - - /** - * Set model data from object - * @return mixed - */ - protected function getElementData() - { - return []; - } - - /** - * Check if the model needs to be booted and if so, do it. - * - * @return void - */ - protected function bootIfNotBooted() - { - if (isset(static::$arBooted[static::class])) { - return; - } - - static::boot(); - static::$arBooted[static::class] = true; - } - - /** - * The "booting" method of the model. - * - * @return void - */ - protected static function boot() - { - static::bootTraits(); - } - - /** - * Boot all of the bootable traits on the model. - * - * @return void - */ - protected static function bootTraits() - { - foreach (class_uses_recursive(get_called_class()) as $trait) { - if (method_exists(get_called_class(), $method = 'boot'.class_basename($trait))) { - forward_static_call([get_called_class(), $method]); - } - } - } - - /** - * Init element object - */ - protected function initElementObject() - { - $sModelClass = static::MODEL_CLASS; - if (!empty($this->obElement) && !$this->obElement instanceof $sModelClass) { - $this->obElement = null; - } - - if (!empty($this->obElement) || empty($this->iElementID)) { - return; - } - - $this->setElementObject(); - } - - /** - * Set element object - */ - protected function setElementObject() - { - $sModelClass = static::MODEL_CLASS; - - $obQuery = $sModelClass::where(static::QUERY_FIELD, $this->iElementID); - if (method_exists($sModelClass, 'trashed')) { - $obQuery->withTrashed(); - } - - if (!empty(static::$arQueryWith)) { - $obQuery->with(static::$arQueryWith); - } - - $this->obElement = $obQuery->first(); - } - - /** - * Get cache tag array for model - * @return array - */ - protected static function getCacheTag() - { - return [static::class]; - } - - /** - * Process translatable fields and save values, how 'field_name|lang_code' - */ - private function setLangProperties() - { - if (empty($this->obElement) || !$this->obElement->isClassExtendedWith('RainLab.Translate.Behaviors.TranslatableModel')) { - return; - } - - //Check translate model property - if (empty($this->obElement->translatable) || !is_array($this->obElement->translatable)) { - return; - } - - //Get active lang list from Translate plugin - $arLangList = self::getActiveLangList(); - if (empty($arLangList)) { - return; - } - - //Process translatable fields - foreach ($this->obElement->translatable as $sField) { - //Check field name - if (empty($sField) || (!is_string($sField) && !is_array($sField))) { - continue; - } - - if (is_array($sField)) { - $sField = array_shift($sField); - } - - if (!isset($this->arModelData[$sField]) || array_key_exists($sField, (array) $this->obElement->attachOne) || array_key_exists($sField, (array) $this->obElement->attachMany)) { - continue; - } - - //Save field value with different lang code - foreach ($arLangList as $sLangCode) { - $sLangField = $sField.'|'.$sLangCode; - $sValue = $this->obElement->lang($sLangCode)->$sField; - $this->setAttribute($sLangField, $sValue); - } - } - } - - /** - * Get image data from image object - * @param \System\Models\File $obFile - * @return [] - */ - private function getUploadFileData($obFile) : array - { - if (empty($obFile)) { - return []; - } - - //Set default lang in image object - if (!empty(self::$sDefaultLang) && $obFile->isClassExtendedWith('RainLab.Translate.Behaviors.TranslatableModel')) { - $obFile->lang(self::$sDefaultLang); - } - - //Convert image data to array - $arFileData = $obFile->toArray(); - $arLangList = $this->getActiveLangList(); - if (empty($arLangList) || !$obFile->isClassExtendedWith('RainLab.Translate.Behaviors.TranslatableModel')) { - return $arFileData; - } - - //Add lang fields to array - foreach ($arLangList as $sLangCode) { - $arFileData[$sLangCode] = []; - foreach ($obFile->translatable as $sLangField) { - $arFileData[$sLangCode][$sLangField] = $obFile->lang($sLangCode)->$sLangField; - } - } - - return $arFileData; - } -} diff --git a/plugins/lovata/toolbox/classes/item/ItemStorage.php b/plugins/lovata/toolbox/classes/item/ItemStorage.php deleted file mode 100644 index be0b33be3..000000000 --- a/plugins/lovata/toolbox/classes/item/ItemStorage.php +++ /dev/null @@ -1,70 +0,0 @@ -isEmpty()) { - return; - } - - $sKey = self::getKey($sClassName, $iElementID); - self::$arItemStore[$sKey] = clone $obItem; - } - - /** - * Clear item object in storage - * @param string $sClassName - * @param int $iElementID - */ - public static function clear($sClassName, $iElementID) - { - $sKey = self::getKey($sClassName, $iElementID); - if (!isset(self::$arItemStore[$sKey])) { - return; - } - - unset(self::$arItemStore[$sKey]); - } - - /** - * Get store key for item object - * @param string $sClassName - * @param int $iElementID - * @return string - */ - protected static function getKey($sClassName, $iElementID) - { - return $sClassName.'|'.$iElementID; - } -} diff --git a/plugins/lovata/toolbox/classes/item/MainItem.php b/plugins/lovata/toolbox/classes/item/MainItem.php deleted file mode 100644 index 92effa284..000000000 --- a/plugins/lovata/toolbox/classes/item/MainItem.php +++ /dev/null @@ -1,263 +0,0 @@ -arRelationList) && isset($this->arRelationList[$sName])) { - return $this->getRelationField($sName, $this->arRelationList[$sName]); - } - - $sMethodName = 'get'.studly_case($sName).'Attribute'; - if (method_exists(static::class, $sMethodName) || $this->methodExists($sMethodName)) { - return $this->$sMethodName($this); - } - - $sAttachOneField = 'attachOne|'.$sName; - if (isset($this->arModelData[$sAttachOneField])) { - return $this->getUploadFileField($sName, $sAttachOneField); - } - - $sAttachManyField = 'attachMany|'.$sName; - if (isset($this->arModelData[$sAttachManyField])) { - return $this->getUploadFileListField($sName, $sAttachManyField); - } - - if (!empty(self::$sActiveLang)) { - return $this->getLangAttribute($sName); - } - - return $this->getAttribute($sName); - } - - /** - * Get attribute value - * @param string $sName - * @return mixed|null - */ - public function getAttribute($sName) - { - if (empty($sName)) { - return null; - } - - if (!empty($this->arModelData) && isset($this->arModelData[$sName])) { - return $this->arModelData[$sName]; - } - - return null; - } - - /** - * Get lang attribute value - * @param string $sName - * @param string $sLangCode - * @return mixed|null - */ - public function getLangAttribute($sName, $sLangCode = null) - { - if (empty($sName)) { - return null; - } - - if (empty($sLangCode)) { - $sLangCode = self::$sActiveLang; - } - - if (empty($sLangCode)) { - return $this->getAttribute($sName); - } - - $sLangName = $sName.'|'.$sLangCode; - if (!empty($this->arModelData) && isset($this->arModelData[$sLangName])) { - return $this->arModelData[$sLangName]; - } - - return $this->getAttribute($sName); - } - - /** - * Set attribute value - * @param string $sField - * @param mixed $obValue - */ - public function __set($sField, $obValue) - { - $this->setAttribute($sField, $obValue); - } - - /** - * Set attribute value - * @param string $sField - * @param mixed $obValue - */ - public function setAttribute($sField, $obValue) - { - if (empty($sField)) { - return; - } - - $this->arModelData[$sField] = $obValue; - } - - /** - * @param string $sName - * @param array $arParamList - * @return mixed|null - */ - public function __call($sName, $arParamList) - { - return $this->$sName; - } - - /** - * @param string $sName - * @return bool - */ - public function __isset($sName) - { - $sValue = $this->getAttribute($sName); - - return !empty($sValue); - } - - /** - * Get "Has one" item object or get "Has many" collection object - * @param string $sName - * @param array $arRelationData - * - * @return null|ElementItem|\Lovata\Toolbox\Classes\Collection\ElementCollection - */ - protected function getRelationField($sName, $arRelationData) - { - //Check relation config data - if (empty($sName) || empty($arRelationData) || !is_array($arRelationData)) { - return null; - } - - if (empty($arRelationData['class']) || empty($arRelationData['field'])) { - return null; - } - - $sClassName = $arRelationData['class']; - $sFieldName = $arRelationData['field']; - - //Check class is exist - if (!class_exists($sClassName)) { - return null; - } - - $obValue = $this->getAttribute($sName); - if (!empty($obValue) && $obValue instanceof $sClassName) { - return $obValue; - } - - $obValue = $sClassName::make($this->$sFieldName); - if ($obValue instanceof ElementCollection && empty($this->$sFieldName)) { - $obValue->intersect($this->$sFieldName); - } - - $this->setAttribute($sName, $obValue); - - return $this->getAttribute($sName); - } - - /** - * Get image object form field with image array - * @param string $sField - * @param string $sFakeField - * - * @return File|null - */ - protected function getUploadFileField($sField, $sFakeField) - { - $obFile = $this->getAttribute($sField); - if (!empty($obFile)) { - return $obFile; - } - - $arFileData = $this->getAttribute($sFakeField); - $obFile = $this->initUploadFileObject($arFileData); - $this->setAttribute($sField, $obFile); - - return $obFile; - } - - /** - * Get image object form field with image array - * @param string $sField - * @param string $sFakeField - * @return File[]|null - */ - protected function getUploadFileListField($sField, $sFakeField) - { - $arFileList = $this->getAttribute($sField); - if (!empty($arFileList)) { - return $arFileList; - } - - $arFileList = []; - - $arCachedFileList = (array) $this->getAttribute($sFakeField); - foreach ($arCachedFileList as $arFileData) { - $obFile = $this->initUploadFileObject($arFileData); - if (empty($obFile)) { - continue; - } - - $arFileList[] = $obFile; - } - - $this->setAttribute($sField, $arFileList); - - return $arFileList; - } - - /** - * @param array $arFileData - * @return File|null - */ - protected function initUploadFileObject($arFileData) - { - if (empty($arFileData)) { - return null; - } - - $obFile = File::make($arFileData); - $obFile->disk_name = array_get($arFileData, 'disk_name'); - $obFile->id = array_get($arFileData, 'id'); - if (!empty(self::$sActiveLang) && self::$sActiveLang != self::$sDefaultLang && $obFile->isClassExtendedWith('RainLab.Translate.Behaviors.TranslatableModel')) { - foreach ($obFile->translatable as $sLangField) { - $obFile->$sLangField = array_get($arFileData, self::$sActiveLang.'.'.$sLangField, $obFile->$sLangField); - } - } - - return $obFile; - } -} diff --git a/plugins/lovata/toolbox/classes/item/TestItem.php b/plugins/lovata/toolbox/classes/item/TestItem.php deleted file mode 100644 index 34cebc059..000000000 --- a/plugins/lovata/toolbox/classes/item/TestItem.php +++ /dev/null @@ -1,87 +0,0 @@ - [ - 'class' => self::class, - 'field' => 'test_id', - ], - 'test_null' => null, - 'test_class' => [ - 'class_fail' => self::class, - 'field' => 'test_id', - ], - 'test_field' => [ - 'class' => self::class, - 'field_fail' => 'test_id', - ], - 'test_exist' => [ - 'class' => self::class.'Test', - 'field' => 'test_id', - ], - 'test_list' => [ - 'class' => TestCollection::class, - 'field' => 'test_list_id', - ], - 'test_empty_list' => [ - 'class' => TestCollection::class, - 'field' => 'test_empty_list_id', - ], - ]; - - /** - * Set element object - */ - protected function setElementObject() - { - $obElement = new Model(); - $obElement->id = $this->iElementID; - - $this->obElement = $obElement; - } - - /** - * Set brand data from model object - * - * @return array - */ - protected function getElementData() - { - $arResult = [ - 'id' => $this->obElement->id, - 'test_id' => $this->obElement->id + 1, - 'test_list_id' => [$this->obElement->id, $this->obElement->id + 1], - ]; - - return $arResult; - } - - /** - * Add title - */ - protected function addTitle() - { - $this->setAttribute('title', 'title'.$this->obElement->id); - } -} diff --git a/plugins/lovata/toolbox/classes/parser/create/ActiveListStoreCreateFile.php b/plugins/lovata/toolbox/classes/parser/create/ActiveListStoreCreateFile.php deleted file mode 100644 index 7a6155ada..000000000 --- a/plugins/lovata/toolbox/classes/parser/create/ActiveListStoreCreateFile.php +++ /dev/null @@ -1,16 +0,0 @@ -arReplaceList = array_get($arData, 'replace'); - $this->arEnableList = array_get($arData, 'enable'); - $this->arDisableList = array_get($arData, 'disable'); - - if (empty($this->arReplaceList) || empty($this->sFolderPath) || empty($this->sFile) || empty($this->sTemplatePath)) { - $this->bCreate = false; - - return; - } - - $this->sFolderPath = plugins_path().$this->parseByName($this->arReplaceList, $this->sFolderPath); - $this->sFile = $this->parseByName($this->arReplaceList, $this->sFile); - $this->sFilePath = $this->sFolderPath.$this->sFile; - $this->obFile = new Filesystem(); - - if (!$this->obFile->exists($this->sFolderPath)) { - $this->obFile->makeDirectory($this->sFolderPath, 0777, true, true); - } - - $this->sContent = $this->obFile->get(plugins_path().$this->sTemplatePath); - - if (!$this->obFile->exists($this->sFilePath)) { - $this->bForce = true; - } - } - - /** - * Create file - * @param bool $bForce - * @return null|string - */ - public function create($bForce = false) - { - if (!$this->bForce && !$bForce || !$this->bCreate) { - return $this->sFilePath; - } - - if (!empty($this->arDisableList)) { - $this->sContent = $this->parseByWrapper($this->arDisableList, $this->sContent); - } - - if (!empty($this->arEnableList)) { - $this->sContent = $this->parseByNameWrapper($this->arEnableList, $this->sContent); - } - - if (!empty($this->arReplaceList)) { - $this->sContent = $this->parseByName($this->arReplaceList, $this->sContent); - } - - if ($bForce || $this->bForce) { - $this->obFile->put($this->sFilePath, $this->sContent); - } - - return null; - } -} diff --git a/plugins/lovata/toolbox/classes/parser/create/ComponentDataCreateFile.php b/plugins/lovata/toolbox/classes/parser/create/ComponentDataCreateFile.php deleted file mode 100644 index eba3448b0..000000000 --- a/plugins/lovata/toolbox/classes/parser/create/ComponentDataCreateFile.php +++ /dev/null @@ -1,16 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/collection.stub b/plugins/lovata/toolbox/classes/parser/templates/collection.stub deleted file mode 100644 index 7e57b15ea..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/collection.stub +++ /dev/null @@ -1,83 +0,0 @@ -active->get(); - - return $this->intersect($arResultIDList); - } -[[active]][[sortable]] - /** - * Sort list - * @return $this - */ - public function sort() - { - $arResultIDList = {{studly_model}}ListStore::instance()->sorting->get(); - - return $this->applySorting($arResultIDList); - } -[[sortable]][[default_sorting]] - /** - * Sort list by - * @param string $sSorting - * @return $this - */ - public function sort($sSorting) - { - $arResultIDList = {{studly_model}}ListStore::instance()->sorting->get($sSorting); - - return $this->applySorting($arResultIDList); - } -[[default_sorting]][[nested_tree]] - /** - * Sort list - * @return $this - */ - public function tree() - { - $arResultIDList = {{studly_model}}ListStore::instance()->top_level->get(); - - return $this->applySorting($arResultIDList); - } -[[nested_tree]][[code]] - /** - * Get item by code - * @param string $sCode - * @return {{studly_model}}Item - */ - public function getByCode($sCode) - { - if ($this->isEmpty() || empty($sCode)) { - return {{studly_model}}Item::make(null); - } - - $ar{{studly_model}}List = $this->all(); - - /** @var {{studly_model}}Item $ob{{studly_model}}Item */ - foreach ($ar{{studly_model}}List as $ob{{studly_model}}Item) { - if ($ob{{studly_model}}Item->code == $sCode) { - return $ob{{studly_model}}Item; - } - } - - return {{studly_model}}Item::make(null); - } -[[code]]} diff --git a/plugins/lovata/toolbox/classes/parser/templates/columns.stub b/plugins/lovata/toolbox/classes/parser/templates/columns.stub deleted file mode 100644 index 1ce50c389..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/columns.stub +++ /dev/null @@ -1,47 +0,0 @@ -columns: -[[name]] name: - label: 'lovata.toolbox::lang.field.name' - type: text - searchable: true - sortable: true -[[name]][[active]] active: - label: 'lovata.toolbox::lang.field.active' - type: switch - searchable: false - sortable: true -[[active]][[code]] code: - label: 'lovata.toolbox::lang.field.code' - type: text - searchable: true - sortable: true -[[code]][[external_id]] external_id: - label: 'lovata.toolbox::lang.field.external_id' - type: text - searchable: true - sortable: true -[[external_id]][[sortable]] sort_order: - label: 'lovata.toolbox::lang.field.sort_order' - type: text - searchable: false - sortable: true -[[sortable]][[view_count]] view_count: - label: 'lovata.toolbox::lang.field.view_count' - type: number - searchable: false - sortable: true -[[view_count]] id: - label: 'lovata.toolbox::lang.field.id' - type: number - searchable: true - sortable: true - width: 100px - created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: timetense - sortable: true - invisible: true - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: timetense - sortable: true - invisible: true diff --git a/plugins/lovata/toolbox/classes/parser/templates/component_data.stub b/plugins/lovata/toolbox/classes/parser/templates/component_data.stub deleted file mode 100644 index f1e79ec50..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/component_data.stub +++ /dev/null @@ -1,34 +0,0 @@ - '{{lower_author}}.{{lower_plugin}}::lang.component.{{lower_model}}_data_name', - 'description' => '{{lower_author}}.{{lower_plugin}}::lang.component.{{lower_model}}_data_description', - ]; - } - - /** - * Make new element item - * @param int $iElementID - * @return {{studly_model}}Item - */ - protected function makeItem($iElementID) - { - return {{studly_model}}Item::make($iElementID); - } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/component_list.stub b/plugins/lovata/toolbox/classes/parser/templates/component_list.stub deleted file mode 100644 index 0b63307fd..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/component_list.stub +++ /dev/null @@ -1,43 +0,0 @@ - '{{lower_author}}.{{lower_plugin}}::lang.component.{{lower_model}}_list_name', - 'description' => '{{lower_author}}.{{lower_plugin}}::lang.component.{{lower_model}}_list_description', - ]; - } - - /** - * Make element collection - * @param array $arElementIDList - * @return {{studly_model}}Collection - */ - public function make($arElementIDList = null) - { - return {{studly_model}}Collection::make($arElementIDList); - } - - /** - * Method for ajax request with empty response - * @return bool - */ - public function onAjaxRequest() - { - return true; - } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/component_page.stub b/plugins/lovata/toolbox/classes/parser/templates/component_page.stub deleted file mode 100644 index e0f498a2f..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/component_page.stub +++ /dev/null @@ -1,57 +0,0 @@ - '{{lower_author}}.{{lower_plugin}}::lang.component.{{lower_model}}_page_name', - 'description' => '{{lower_author}}.{{lower_plugin}}::lang.component.{{lower_model}}_page_description', - ]; - } - - /** - * Get element object - * @param string $sElementSlug - * @return {{studly_model}} - */ - protected function getElementObject($sElementSlug) - { - if (empty($sElementSlug)) { - return null; - } - - $obElement = {{studly_model}}::[[active]]active()->[[active]]getBySlug($sElementSlug)->first(); - -[[view_count]] if(!empty($obElement)) { - $obElement->view_count++; - $obElement->save(); - } - -[[view_count]] return $obElement; - } - - /** - * Make new element item - * @param int $iElementID - * @param {{studly_model}} $obElement - * @return {{studly_model}}Item - */ - protected function makeItem($iElementID, $obElement) - { - return {{studly_model}}Item::make($iElementID, $obElement); - } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller.stub b/plugins/lovata/toolbox/classes/parser/templates/controller.stub deleted file mode 100644 index 6491b0d68..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller.stub +++ /dev/null @@ -1,50 +0,0 @@ - true - - active = true -[[active]] created_at: - label: 'lovata.toolbox::lang.field.created_at' - type: daterange - conditions: created_at >= ':after' AND created_at <= ':before' - updated_at: - label: 'lovata.toolbox::lang.field.updated_at' - type: daterange - conditions: updated_at >= ':after' AND updated_at <= ':before' diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_config_form.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_config_form.stub deleted file mode 100644 index 6aa9adc16..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_config_form.stub +++ /dev/null @@ -1,41 +0,0 @@ -# Record name -name: '{{lower_author}}.{{lower_plugin}}::lang.{{lower_model}}.name' - -# Model Form Field configuration -form: $/{{lower_author}}/{{lower_plugin}}/models/{{lower_model}}/fields.yaml - -# Model Class name -modelClass: {{studly_author}}\{{studly_plugin}}\Models\{{studly_model}} - -# Default redirect location -defaultRedirect: {{lower_author}}/{{lower_plugin}}/{{lower_controller}} - -# Create page -create: - title: 'backend::lang.form.create_title' - redirect: {{lower_author}}/{{lower_plugin}}/{{lower_controller}}/update/:id - redirectClose: {{lower_author}}/{{lower_plugin}}/{{lower_controller}} - flashSave: 'lovata.toolbox::lang.message.create_success' - -# Update page -update: - title: 'backend::lang.form.update_title' - redirect: {{lower_author}}/{{lower_plugin}}/{{lower_controller}} - redirectClose: {{lower_author}}/{{lower_plugin}}/{{lower_controller}} - flashSave: 'lovata.toolbox::lang.message.update_success' - flashDelete: 'lovata.toolbox::lang.message.delete_success' -[[import_svg]] -# Import page -import: - title: 'backend::lang.form.update_title' - redirect: {{lower_author}}/{{lower_plugin}}/{{lower_controller}}/import - redirectClose: {{lower_author}}/{{lower_plugin}}/emails -[[import_svg]][[export_svg]] -# Export page -export: - title: 'backend::lang.form.update_title' - redirect: {{lower_author}}/{{lower_plugin}}/emails/export - redirectClose: {{lower_author}}/{{lower_plugin}}/{{lower_controller}} -[[export_svg]] -# Preview page -preview: { } diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_config_import_export.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_config_import_export.stub deleted file mode 100644 index 1290c1817..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_config_import_export.stub +++ /dev/null @@ -1,18 +0,0 @@ -[[import_svg]]import: - title: '{{lower_author}}.toolbox::lang.button.import_from_csv' - list: $/{{lower_author}}/{{lower_plugin}}/models/{{lower_model}}/columns.yaml -# form: $/{{lower_author}}/{{lower_plugin}}/models/{{lower_model}}/fields.yaml -# form: -# fields: - modelClass: {{studly_author}}\{{studly_plugin}}\Models\{{studly_model}} - redirect: {{lower_author}}/{{lower_plugin}}/{{lower_controller}} -[[import_svg]][[export_svg]]export: - title: '{{lower_author}}.toolbox::lang.button.export_in_csv' - list: $/{{lower_author}}/{{lower_plugin}}/models/{{lower_model}}/columns.yaml -# form: $/{{lower_author}}/{{lower_plugin}}/models/{{lower_model}}/fields.yaml -# form: -# fields: - fileName: export.csv - modelClass: {{studly_author}}\{{studly_plugin}}\Models\{{studly_model}} - redirect: {{lower_author}}/{{lower_plugin}}/{{lower_controller}} -[[export_svg]] \ No newline at end of file diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_config_list.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_config_list.stub deleted file mode 100644 index f3ae2bcb0..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_config_list.stub +++ /dev/null @@ -1,46 +0,0 @@ -# Model List Column configuration -list: $/{{lower_author}}/{{lower_plugin}}/models/{{lower_model}}/columns.yaml - -# Model Class name -modelClass: {{studly_author}}\{{studly_plugin}}\Models\{{studly_model}} - -# List Title -title: '{{lower_author}}.{{lower_plugin}}::lang.{{lower_model}}.list_title' - -# Link URL for each record -recordUrl: {{lower_author}}/{{lower_plugin}}/{{lower_controller}}/update/:id - -# Message to display if the list is empty -noRecordsMessage: backend::lang.list.no_records - -# Records to display per page -recordsPerPage: 20 - -# Display page numbers with pagination, disable to improve performance -showPageNumbers: true - -# Displays the list column set up button -showSetup: true - -# Displays the sorting link on each column -showSorting: true - -# Default sorting column -# defaultSort: -# column: created_at -# direction: desc - -# Display checkboxes next to each record -showCheckboxes: true - -# Toolbar widget configuration -toolbar: - # Partial for toolbar buttons - buttons: list_toolbar - - # Search widget configuration - search: - prompt: backend::lang.list.search_prompt - -# Display filter list -filter: _config_filter.yaml diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_config_reorder.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_config_reorder.stub deleted file mode 100644 index 4a7c45644..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_config_reorder.stub +++ /dev/null @@ -1,3 +0,0 @@ -title: 'backend::lang.reorder.default_title' -modelClass: {{studly_author}}\{{studly_plugin}}\Models\{{studly_model}} -nameFrom: name diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_create.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_create.stub deleted file mode 100644 index 417452869..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_create.stub +++ /dev/null @@ -1,51 +0,0 @@ - -

      -
    • - - - -
    • -
    • pageTitle) ?>
    • -
    - -fatalError): ?> - 'layout']) ?> -
    - formRender() ?> -
    -
    -
    - - - - - - - - -
    -
    - - -

    fatalError) ?>

    -

    - - - -

    - diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_export.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_export.stub deleted file mode 100644 index 03313c5d2..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_export.stub +++ /dev/null @@ -1,25 +0,0 @@ - -
      -
    • - - - -
    • -
    • pageTitle) ?>
    • -
    - - 'layout']) ?> -
    - exportRender() ?> -
    -
    - -
    - diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_import.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_import.stub deleted file mode 100644 index d66290f48..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_import.stub +++ /dev/null @@ -1,25 +0,0 @@ - -
      -
    • - - - -
    • -
    • pageTitle) ?>
    • -
    - - 'layout']) ?> -
    - importRender() ?> -
    -
    - -
    - diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_index.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_index.stub deleted file mode 100644 index ea43a3636..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_index.stub +++ /dev/null @@ -1 +0,0 @@ -listRender() ?> diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_list_toolbar.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_list_toolbar.stub deleted file mode 100644 index e0e6b1db3..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_list_toolbar.stub +++ /dev/null @@ -1,27 +0,0 @@ -
    - - - - -[[import_svg]] - - -[[import_svg]][[export_svg]] - - -[[export_svg]][[empty_sortable_nested_tree]] - - -[[empty_sortable_nested_tree]]
    diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_preview.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_preview.stub deleted file mode 100644 index 9a2d91da3..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_preview.stub +++ /dev/null @@ -1,22 +0,0 @@ - -
      -
    • - - - -
    • -
    • pageTitle) ?>
    • -
    - -fatalError): ?> -
    - formRenderPreview() ?> -
    - -

    fatalError) ?>

    -

    - - - -

    - diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_reorder.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_reorder.stub deleted file mode 100644 index 9dd59d7e0..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_reorder.stub +++ /dev/null @@ -1,7 +0,0 @@ - -
      -
    • -
    • pageTitle) ?>
    • -
    - -reorderRender() ?> diff --git a/plugins/lovata/toolbox/classes/parser/templates/controller_update.stub b/plugins/lovata/toolbox/classes/parser/templates/controller_update.stub deleted file mode 100644 index ed2c70c9d..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/controller_update.stub +++ /dev/null @@ -1,59 +0,0 @@ - -
      -
    • - - - -
    • -
    • pageTitle) ?>
    • -
    - -fatalError): ?> - 'layout']) ?> -
    - formRender() ?> -
    -
    -
    - - - - - - - - - -
    -
    - - -

    fatalError) ?>

    -

    - - - -

    - diff --git a/plugins/lovata/toolbox/classes/parser/templates/event_model.stub b/plugins/lovata/toolbox/classes/parser/templates/event_model.stub deleted file mode 100644 index d09db83eb..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/event_model.stub +++ /dev/null @@ -1,130 +0,0 @@ -listen(self::EVENT_UPDATE_SORTING, function () { -[[nested_tree]] {{studly_model}}ListStore::instance()->top_level->clear(); - - //Get category ID list - $ar{{studly_model}}IDList = {{studly_model}}::lists('id'); - if (empty($ar{{studly_model}}IDList)) { - return; - } - - //Clear cache for all - foreach ($ar{{studly_model}}IDList as $i{{studly_model}}ID) { - {{studly_model}}Item::clearCache($i{{studly_model}}ID); - } -[[nested_tree]][[sortable]] {{studly_model}}ListStore::instance()->sorting->clear(); -[[sortable]] }); - } - -[[empty_sortable_nested_tree]] /** - * After create event handler - */ - protected function afterCreate() - { - parent::afterCreate(); -[[default_sorting]] - $this->clearBySortingPublished(); -[[view_count]] $this->clearBySortingViews(); -[[view_count]][[default_sorting]] } - - /** - * After save event handler - */ - protected function afterSave() - { - parent::afterSave(); -[[default_sorting]][[view_count]] - if ($this->isFieldChanged('view_count')) { - $this->clearBySortingViews(); - } -[[view_count]][[default_sorting]][[active]] - $this->checkFieldChanges('active', {{studly_model}}ListStore::instance()->active); -[[active]][[nested_tree]] {{studly_model}}ListStore::instance()->top_level->clear(); -[[nested_tree]] } - - /** - * After delete event handler - */ - protected function afterDelete() - { - parent::afterDelete(); -[[active]] - if ($this->obElement->active) { - {{studly_model}}ListStore::instance()->active->clear(); - } -[[active]][[nested_tree]] - {{studly_model}}ListStore::instance()->top_level->clear(); - - //Clear parent item cache - if (!empty($this->obElement->parent_id)) { - {{studly_model}}Item::clearCache($this->obElement->parent_id); - } -[[nested_tree]][[sortable]] - {{studly_model}}ListStore::instance()->sorting->clear(); -[[sortable]][[default_sorting]] - $this->clearBySortingPublished(); -[[view_count]] $this->clearBySortingViews(); -[[view_count]][[default_sorting]] } -[[default_sorting]] - /** - * Clear cache by created_at - */ - protected function clearBySortingPublished() - { - {{studly_model}}ListStore::instance()->sorting->clear({{studly_model}}ListStore::SORT_CREATED_AT_ASC); - {{studly_model}}ListStore::instance()->sorting->clear({{studly_model}}ListStore::SORT_CREATED_AT_DESC); - } -[[view_count]] - /** - * Clear cache by views - */ - protected function clearBySortingViews() - { - {{studly_model}}ListStore::instance()->sorting->clear({{studly_model}}ListStore::SORT_VIEW_COUNT_ASC); - {{studly_model}}ListStore::instance()->sorting->clear({{studly_model}}ListStore::SORT_VIEW_COUNT_DESC); - } -[[view_count]][[default_sorting]]} diff --git a/plugins/lovata/toolbox/classes/parser/templates/extend_backend_menu_handler.stub b/plugins/lovata/toolbox/classes/parser/templates/extend_backend_menu_handler.stub deleted file mode 100644 index 96788e582..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/extend_backend_menu_handler.stub +++ /dev/null @@ -1,40 +0,0 @@ -removeSideMenuItem('Lovata.Shopaholic', 'shopaholic-menu-main', 'shopaholic-menu-products'); -// $obManager->addSideMenuItem('Lovata.Shopaholic', 'shopaholic-menu-main', 'shopaholic-menu-products', $this->dataMenuProduct()); - } - -// /** -// * Data menu product -// * @return array -// */ -// protected function dataMenuProduct() -// { -// return [ -// 'label' => 'lovata.shopaholic::lang.menu.products', -// 'url' => Backend::url('lovata/shopaholic/products'), -// 'icon' => 'icon-smile-o', -// 'permissions' => ['shopaholic-menu-products'], -// 'order' => 1000, -// ]; -// } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/extend_model_columns_handler.stub b/plugins/lovata/toolbox/classes/parser/templates/extend_model_columns_handler.stub deleted file mode 100644 index b91d7f7fc..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/extend_model_columns_handler.stub +++ /dev/null @@ -1,59 +0,0 @@ -removeColumn($obWidget); - $this->addColumn($obWidget); - } - - /** - * Remove columns model - * @param \Backend\Widgets\Lists $obWidget - */ - protected function removeColumn($obWidget) - { - $obWidget->removeColumn(''); - } - - /** - * Add columns model - * @param \Backend\Widgets\Lists $obWidget - */ - protected function addColumn($obWidget) - { - $obWidget->addColumns([]); - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() : string - { - return {{studly_model}}::class; - } - - /** - * Get controller class name - * @return string - */ - protected function getControllerClass() : string - { - return {{studly_controller}}::class; - } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/extend_model_fields_handler.stub b/plugins/lovata/toolbox/classes/parser/templates/extend_model_fields_handler.stub deleted file mode 100644 index 33468300b..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/extend_model_fields_handler.stub +++ /dev/null @@ -1,59 +0,0 @@ -removeField($obWidget); - $this->addField($obWidget); - } - - /** - * Remove fields model - * @param \Backend\Widgets\Form $obWidget - */ - protected function removeField($obWidget) - { - $obWidget->removeField(''); - } - - /** - * Add fields model - * @param \Backend\Widgets\Form $obWidget - */ - protected function addField($obWidget) - { - $obWidget->addTabFields([]); - } - - /** - * Get model class name - * @return string - */ - protected function getModelClass() : string - { - return {{studly_model}}::class; - } - - /** - * Get controller class name - * @return string - */ - protected function getControllerClass() : string - { - return {{studly_controller}}::class; - } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/fields.stub b/plugins/lovata/toolbox/classes/parser/templates/fields.stub deleted file mode 100644 index 96f9a11f6..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/fields.stub +++ /dev/null @@ -1,75 +0,0 @@ -fields: -[[active]] active: - label: 'lovata.toolbox::lang.field.active' - span: full - default: 0 - type: switch -[[active]][[name]] name: - label: 'lovata.toolbox::lang.field.name' - span: auto - required: 1 - type: text - placeholder: 'lovata.toolbox::lang.field.name' -[[name]][[slug]] slug: - label: 'lovata.toolbox::lang.field.slug' - span: auto - required: 1 - placeholder: 'lovata.toolbox::lang.field.slug' - preset: - field: name - type: slug - type: text -[[slug]]tabs: - fields: -[[code]] code: - label: 'lovata.toolbox::lang.field.code' - span: left - type: text - placeholder: 'lovata.toolbox::lang.field.code' - tab: 'lovata.toolbox::lang.tab.settings' -[[code]][[external_id]] external_id: - label: 'lovata.toolbox::lang.field.external_id' - span: left - type: text - placeholder: 'lovata.toolbox::lang.field.external_id' - tab: 'lovata.toolbox::lang.tab.settings' -[[external_id]][[preview_text]] preview_text: - label: 'lovata.toolbox::lang.field.preview_text' - size: large - span: full - type: textarea - placeholder: 'lovata.toolbox::lang.field.preview_text' - tab: 'lovata.toolbox::lang.tab.description' -[[preview_text]][[description]] description: - label: 'lovata.toolbox::lang.field.description' - size: giant - span: full - type: richeditor - tab: 'lovata.toolbox::lang.tab.description' -[[description]][[preview_image]] preview_image: - label: 'lovata.toolbox::lang.field.preview_image' - mode: image - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' -[[preview_image]][[images]] images: - label: 'lovata.toolbox::lang.field.images' - mode: image - useCaption: true - thumbOptions: - mode: crop - extension: auto - span: left - type: fileupload - tab: 'lovata.toolbox::lang.tab.images' -[[images]][[file]] file: - label: 'lovata.toolbox::lang.field.file' - type: fileupload - span: left - required: 0 - mode: file - tab: 'lovata.toolbox::lang.tab.files'[[file]] diff --git a/plugins/lovata/toolbox/classes/parser/templates/item.stub b/plugins/lovata/toolbox/classes/parser/templates/item.stub deleted file mode 100644 index 4fdcd39e5..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/item.stub +++ /dev/null @@ -1,109 +0,0 @@ - [ - 'class' => {{studly_model}}Item::class, - 'field' => 'parent_id', - ], - 'children' => [ - 'class' => {{studly_model}}Collection::class, - 'field' => 'children_id_list', - ], - ]; -[[nested_tree]] - /** - * Returns URL of a brand page. - * @param string $sPageCode - * @return string - */ - public function getPageUrl($sPageCode = '{{lower_model}}') - { - //Get URL params - $arParamList = $this->getPageParamList($sPageCode); - - //Generate page URL - $sURL = CmsPage::url($sPageCode, $arParamList); - - return $sURL; - } - - /** - * Get URL param list by page code - * @param string $sPageCode - * @return array - */ - public function getPageParamList($sPageCode) : array - { - $arPageParamList = []; - - //Get URL params for page - $arParamList = PageHelper::instance()->getUrlParamList($sPageCode, '{{studly_model}}Page'); - if (!empty($arParamList)) { - $sPageParam = array_shift($arParamList); - $arPageParamList[$sPageParam] = $this->slug; - } - - return $arPageParamList; - } -[[nested_tree]] - /** - * Set element data from model object - * @return array - */ - protected function getElementData() - { - $arResult = [ - 'nest_depth' => $this->obElement->getDepth(), - ]; - - $arResult['children_id_list'] = $this->obElement->children() - ->active() - ->orderBy('nest_left', 'asc') - ->lists('id'); - - return $arResult; - } -[[nested_tree]]} diff --git a/plugins/lovata/toolbox/classes/parser/templates/lang.stub b/plugins/lovata/toolbox/classes/parser/templates/lang.stub deleted file mode 100644 index 35347be66..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/lang.stub +++ /dev/null @@ -1,28 +0,0 @@ - [ - 'name' => '{{studly_plugin}}', - 'description' => '', - ], - 'field' => [], - 'menu' => [ - 'main' => '{{studly_plugin}}', -// 'products' => 'Products', - ], - 'tab' => [ - 'permissions' => '{{studly_plugin}}', - ], - 'comment' => [], - 'message' => [], - 'button' => [], - 'component' => [ -// 'product_list_name' => 'Product List', -// 'product_list_description' => '', - ], - 'permission' => [ -// 'product' => 'Manage products', - ], -// 'product' => [ -// 'name' => 'product', -// 'list_title' => 'Product list', -// ], -]; diff --git a/plugins/lovata/toolbox/classes/parser/templates/list_store.stub b/plugins/lovata/toolbox/classes/parser/templates/list_store.stub deleted file mode 100644 index d827ccdbe..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/list_store.stub +++ /dev/null @@ -1,37 +0,0 @@ -addToStoreList('active', ActiveListStore::class); -[[active]][[default_sorting]] $this->addToStoreList('sorting', SortingListStore::class); -[[default_sorting]][[sortable]] $this->addToStoreList('sorting', SortingListStore::class); -[[sortable]][[nested_tree]] $this->addToStoreList('top_level', TopLevelListStore::class); -[[nested_tree]] } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/migration.stub b/plugins/lovata/toolbox/classes/parser/templates/migration.stub deleted file mode 100644 index b7fcd4ae5..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/migration.stub +++ /dev/null @@ -1,53 +0,0 @@ -engine = 'InnoDB'; - $obTable->increments('id')->unsigned(); -[[empty_fields]][[active]] $obTable->boolean('active')->default(0); -[[active]][[name]] $obTable->string('name')->index(); -[[name]][[slug]] $obTable->string('slug')->unique()->index(); -[[slug]][[code]] $obTable->string('code')->nullable()->index(); -[[code]][[external_id]] $obTable->string('external_id')->nullable()->index(); -[[external_id]][[preview_text]] $obTable->text('preview_text')->nullable(); -[[preview_text]][[description]] $obTable->text('description')->nullable(); -[[description]][[view_count]] $obTable->integer('view_count')->nullable()->default(0); -[[view_count]][[empty_fields]][[nested_tree]] $obTable->integer('parent_id')->nullable()->unsigned(); - $obTable->integer('nest_left')->nullable()->unsigned(); - $obTable->integer('nest_right')->nullable()->unsigned(); - $obTable->integer('nest_depth')->nullable()->unsigned(); -[[nested_tree]][[sortable]] $obTable->integer('sort_order')->nullable()->default(0); -[[sortable]] $obTable->timestamps(); - }); - } - - /** - * Rollback migration - */ - public function down() - { - Schema::dropIfExists(self::TABLE); - } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/model.stub b/plugins/lovata/toolbox/classes/parser/templates/model.stub deleted file mode 100644 index 67b969704..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/model.stub +++ /dev/null @@ -1,205 +0,0 @@ - 'lovata.toolbox::lang.field.name', -[[name]][[slug]] 'slug' => 'lovata.toolbox::lang.field.slug', -[[slug]] [[empty_validate]]]; - /** @var array */ - public $rules = [[[empty_validate]] -[[name]] 'name' => 'required', -[[name]][[slug]] 'slug' => 'required|unique:{{lower_author}}_{{lower_plugin}}_{{lower_controller}}', -[[slug]] [[empty_validate]]]; - /** @var array */ - public $slugs = [[[slug]] - 'slug' => 'name' - [[slug]]]; - /** @var array */ - public $jsonable = []; - /** @var array */ - public $fillable = [[[empty_fields]] -[[active]] 'active', -[[active]][[name]] 'name', -[[name]][[slug]] 'slug', -[[slug]][[code]] 'code', -[[code]][[external_id]] 'external_id', -[[external_id]][[preview_text]] 'preview_text', -[[preview_text]][[description]] 'description', -[[description]] [[empty_fields]]]; - /** @var array */ - public $cached = [[[empty_fields]] - 'id', -[[nested_tree]] 'parent_id', -[[nested_tree]][[active]] 'active', -[[active]][[name]] 'name', -[[name]][[slug]] 'slug', -[[slug]][[code]] 'code', -[[code]][[external_id]] 'external_id', -[[external_id]][[view_count]] 'view_count', -[[view_count]][[preview_text]] 'preview_text', -[[preview_text]][[description]] 'description', -[[description]][[preview_image]] 'preview_image', -[[preview_image]][[file]] 'file', -[[file]][[images]] 'images', -[[images]] [[empty_fields]]]; - /** @var array */ - public $dates = [ - 'created_at', - 'updated_at', - ]; - /** @var array */ - public $casts = []; - /** @var array */ - public $visible = []; - /** @var array */ - public $hidden = []; - /** @var array */ - public $hasOne = []; - /** @var array */ - public $hasMany = []; - /** @var array */ - public $belongsTo = []; - /** @var array */ - public $belongsToMany = []; - /** @var array */ - public $morphTo = []; - /** @var array */ - public $morphOne = []; - /** @var array */ - public $morphMany = []; - /** @var array */ - public $attachOne = [[[empty_attach_one]] - [[preview_image]]'preview_image' => 'System\Models\File', - [[preview_image]][[file]]'file' => 'System\Models\File', - [[file]][[import_svg]]'import_file' => [\System\Models\File::class, 'public' => false], - [[import_svg]][[export_svg]]'import_file' => [\System\Models\File::class, 'public' => false], - [[export_svg]][[empty_attach_one]]]; - /** @var array */ - public $attachMany = [[[empty_attach_many]] - [[images]]'images' => 'System\Models\File'[[images]] - [[empty_attach_many]]]; -[[nested_tree]] - /** - * Get by parent ID - * @param {{studly_model}} $obQuery - * @param string $sData - * @return {{studly_model}} - */ - public function scopeGetByParentID($obQuery, $sData) - { - return $obQuery->where('parent_id', $sData); - } -[[nested_tree]][[import_svg]] - /** - * Parse CSV file - * @param array $arResults - * @param null|string $sSessionKey - */ - public function importData($arResults, $sSessionKey = null) - { - if (empty($arResults)) { - return; - } - - foreach ($arResults as $sRow => $arData) { - try { - $ob{{studly_model}} = new {{studly_model}}(); - $ob{{studly_model}}->fill($arData); - $ob{{studly_model}}->save(); - $this->logCreated(); - } catch (\Exception $obException) { - $this->logError($sRow, $obException->getMessage()); - } - } - } -[[import_svg]][[export_svg]] - /** - * Parse CSV file - * @param array $arColumns - * @param null|string $sSessionKey - * @return array - */ - public function exportData($arColumns, $sSessionKey = null) - { - if (empty($arColumns)) { - return []; - } - - $ob{{studly_model}}List = {{studly_model}}::all(); - $ob{{studly_model}}List->each(function($ob{{studly_model}}List) use ($arColumns) { - $ob{{studly_model}}List->addVisible($arColumns); - }); - - return $ob{{studly_model}}List->toArray(); - } -[[export_svg]]} diff --git a/plugins/lovata/toolbox/classes/parser/templates/plugin_php.stub b/plugins/lovata/toolbox/classes/parser/templates/plugin_php.stub deleted file mode 100644 index 574b94509..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/plugin_php.stub +++ /dev/null @@ -1,12 +0,0 @@ -lists('id'); - - return $arElementIDList; - } -[[sortable]][[default_sorting]] - /** - * Get ID list from database - * @return array - */ - protected function getIDListFromDB() : array - { - switch ($this->sValue) { - case {{studly_model}}ListStore::SORT_CREATED_AT_ASC: - $arElementIDList = $this->getByPublishASC(); - break; - case {{studly_model}}ListStore::SORT_CREATED_AT_DESC: - $arElementIDList = $this->getByPublishDESC(); - break; -[[view_count]] case {{studly_model}}ListStore::SORT_VIEW_COUNT_ASC: - $arElementIDList = $this->getByViewsASC(); - break; - case {{studly_model}}ListStore::SORT_VIEW_COUNT_DESC: - $arElementIDList = $this->getByViewsDESC(); - break; -[[view_count]] default: - $arElementIDList = $this->getDefaultList(); - break; - } - - return $arElementIDList; - } - - /** - * Get default list - * @return array - */ - protected function getDefaultList() : array - { - $arElementIDList = (array) {{studly_model}}::lists('id'); - - return $arElementIDList; - } - - /** - * Get sorting ID list by published (ASC) - * @return array - */ - protected function getByPublishASC() : array - { - $arElementIDList = (array) {{studly_model}}::orderBy('created_at', 'asc')->lists('id'); - - return $arElementIDList; - } - - /** - * Get sorting ID list by published (DESC) - * @return array - */ - protected function getByPublishDESC() : array - { - $arElementIDList = (array) {{studly_model}}::orderBy('created_at', 'desc')->lists('id'); - - return $arElementIDList; - } -[[view_count]] - /** - * Get sorting ID list by views (ASC) - * @return array - */ - protected function getByViewsASC() : array - { - $arElementIDList = (array) {{studly_model}}::orderBy('view_count', 'asc')->lists('id'); - - return $arElementIDList; - } - - /** - * Get sorting ID list by views (DESC) - * @return array - */ - protected function getByViewsDESC() : array - { - $arElementIDList = (array) {{studly_model}}::orderBy('view_count', 'desc')->lists('id'); - - return $arElementIDList; - } -[[view_count]][[default_sorting]]} diff --git a/plugins/lovata/toolbox/classes/parser/templates/sorting_top_level_list_store.stub b/plugins/lovata/toolbox/classes/parser/templates/sorting_top_level_list_store.stub deleted file mode 100644 index 8f0ff56de..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/sorting_top_level_list_store.stub +++ /dev/null @@ -1,27 +0,0 @@ -orderBy('nest_left', 'asc') - ->lists('id'); - - return $arElementIDList; - } -} diff --git a/plugins/lovata/toolbox/classes/parser/templates/version.stub b/plugins/lovata/toolbox/classes/parser/templates/version.stub deleted file mode 100644 index 3d8f8cd8c..000000000 --- a/plugins/lovata/toolbox/classes/parser/templates/version.stub +++ /dev/null @@ -1,2 +0,0 @@ -1.0.0: - - 'Init plugin' diff --git a/plugins/lovata/toolbox/classes/parser/update/CommonUpdateFile.php b/plugins/lovata/toolbox/classes/parser/update/CommonUpdateFile.php deleted file mode 100644 index 7a8913fa0..000000000 --- a/plugins/lovata/toolbox/classes/parser/update/CommonUpdateFile.php +++ /dev/null @@ -1,62 +0,0 @@ -arData = $arData; - $arReplace = array_get($this->arData, 'replace'); - $sClassCreateFile = $this->classCreateFile(); - - if (empty($this->arData) || empty($arReplace) || empty($this->sFilePath) || empty($sClassCreateFile)) { - $this->bUpdate = false; - - return; - } - - $this->obFile = new Filesystem(); - $this->sFilePath = plugins_path($this->sFilePath); - $this->sFilePath = $this->parseByName($arReplace, $this->sFilePath); - - if (!$this->obFile->exists($this->sFilePath)) { - $obFile = new $sClassCreateFile($this->arData); - $obFile->create(true); - } - } - - /** - * Class create file - * @return string - */ - protected function classCreateFile() - { - return ''; - } -} diff --git a/plugins/lovata/toolbox/classes/parser/update/PluginLangUpdateFile.php b/plugins/lovata/toolbox/classes/parser/update/PluginLangUpdateFile.php deleted file mode 100644 index 291f942f9..000000000 --- a/plugins/lovata/toolbox/classes/parser/update/PluginLangUpdateFile.php +++ /dev/null @@ -1,86 +0,0 @@ -arData, 'replace'); - - if (empty($arData) || !is_array($arData) || empty($arReplaceList) || !$this->bUpdate) { - return; - } - - $arLangData = $this->getLangData(); - - foreach ($arData as $sKeyLang => $arValueLang) { - if (!is_array($arValueLang)) { - continue; - } - - $sKeyLang = $this->parseByName($arReplaceList, $sKeyLang); - - foreach ($arValueLang as $sKeyParam => $sValueParam) { - $sKeyParam = $this->parseByName($arReplaceList, $sKeyParam); - $sValueParam = $this->parseByName($arReplaceList, $sValueParam); - - $arCheck = array_get($arLangData, $sKeyLang.'.'.$sKeyParam); - - if (empty($arCheck)) { - array_set($arLangData, $sKeyLang.'.'.$sKeyParam, $sValueParam); - } - } - } - - $this->sContent = $this->arrayToStringFile($arLangData); - $this->save(); - } - - - /** - * Class create file - * @return string - */ - protected function classCreateFile() - { - return PluginLangCreateFile::class; - } - - /** - * Get lang data - * @return array|mixed - */ - protected function getLangData() - { - if (!isset($this->sFilePath) || empty($this->sFilePath)) { - return []; - } - - return require $this->sFilePath; - } - - /** - * Save lang.php - */ - protected function save() - { - if (!isset($this->sContent) || empty($this->sContent)) { - return; - } - - $this->obFile->put($this->sFilePath, $this->sContent); - } -} diff --git a/plugins/lovata/toolbox/classes/parser/update/PluginVersionYAMLUpdateFile.php b/plugins/lovata/toolbox/classes/parser/update/PluginVersionYAMLUpdateFile.php deleted file mode 100644 index d541f3edb..000000000 --- a/plugins/lovata/toolbox/classes/parser/update/PluginVersionYAMLUpdateFile.php +++ /dev/null @@ -1,158 +0,0 @@ -bUpdate || !isset($this->sFilePath) || empty($this->sFilePath)) { - return; - } - - $this->arYAML = Yaml::parseFile($this->sFilePath); - - if (!array_key_exists($this->sVersion, $this->arYAML)) { - return; - } - - $sLowerAuthor = array_get($this->arData, 'replace.lower_author'); - $sLowerPlugin = array_get($this->arData, 'replace.lower_plugin'); - $sLowerController = array_get($this->arData, 'replace.lower_controller'); - - if (!empty($this->arYAML) && count($this->arYAML) > 0) { - $this->arVersion = array_slice($this->arYAML, -1); - $this->setVersion(); - } else { - $this->arVersion[$this->sVersion] = []; - } - - $this->setMigrationList($sLowerAuthor, $sLowerPlugin, $sLowerController); - $this->setYAML(); - $this->save(); - } - - /** - * Set version - */ - protected function setVersion() - { - $bVersionUp = array_get($this->arData, 'addition.version_up'); - - if (is_bool($bVersionUp)) { - $this->bVersionUp = $bVersionUp; - } - - $sCurrentVersion = key($this->arVersion); - - if (empty($sCurrentVersion) || !$this->bSave) { - $this->bSave = false; - - return; - } - - if (!$this->bVersionUp) { - $this->sVersion = $sCurrentVersion; - } else { - $this->sVersion = $this->versionUp($sCurrentVersion); - } - } - - /** - * Version Up - * @param string $sCurrentVersion - * @return string - */ - protected function versionUp($sCurrentVersion) - { - $arValueList = explode('.', $sCurrentVersion); - $iValue = (int) array_pop($arValueList); - $arValueList[] = ++$iValue; - - return implode('.', $arValueList); - } - - /** - * Set migration list - * @param string $sLowerAuthor - * @param string $sLowerPlugin - * @param string $sLowerController - */ - protected function setMigrationList($sLowerAuthor, $sLowerPlugin, $sLowerController) - { - if (empty($sLowerAuthor) || empty($sLowerPlugin) || empty($sLowerController) || empty($this->arVersion) || !$this->bSave) { - $this->bSave = false; - - return; - } - - $sMessage = 'Create tables.'; - $sFile = 'create_table_'.$sLowerController.'.php'; - - if (!$this->bVersionUp) { - $this->arMigrationList = array_pop($this->arVersion); - $this->arMigrationList[] = $sFile; - } else { - $this->arMigrationList[] = $sMessage; - $this->arMigrationList[] = $sFile; - } - } - - /** - * Set YAML - */ - protected function setYAML() - { - if (empty($this->arMigrationList) || empty($this->sVersion) || !$this->bSave) { - $this->bSave = false; - - return; - } - - $this->arYAML[$this->sVersion] = $this->arMigrationList; - } - - /** - * Save version.yaml - */ - protected function save() - { - if (!$this->bSave || empty($this->arYAML) || !isset($this->sFilePath) || empty($this->sFilePath)) { - return; - } - - $sContent = Yaml::render($this->arYAML); - $this->obFile->put($this->sFilePath, $sContent); - } -} diff --git a/plugins/lovata/toolbox/classes/parser/update/PluginYAMLUpdateFile.php b/plugins/lovata/toolbox/classes/parser/update/PluginYAMLUpdateFile.php deleted file mode 100644 index 329f4109a..000000000 --- a/plugins/lovata/toolbox/classes/parser/update/PluginYAMLUpdateFile.php +++ /dev/null @@ -1,174 +0,0 @@ -bUpdate || !isset($this->sFilePath) || empty($this->sFilePath)) { - return; - } - - $this->arYAML = Yaml::parseFile($this->sFilePath); - - $sLowerAuthor = array_get($this->arData, 'replace.lower_author'); - $sLowerPlugin = array_get($this->arData, 'replace.lower_plugin'); - $sLowerController = array_get($this->arData, 'replace.lower_controller'); - $sLowerModel = array_get($this->arData, 'replace.lower_model'); - - $sKeyMainMenu = $sLowerPlugin.'-menu-'.'main'; - $sKeySideMenu = $sLowerPlugin.'-menu-'.$sLowerController; - $sKeyPermission = $sLowerPlugin.'-menu-'.$sLowerController; - - $arNavigation = array_get($this->arYAML, self::PLUGIN_NAVIGATION); - $arPermissions = array_get($this->arYAML, self::PLUGIN_PERMISSIONS); - - $arMainMenuCurrent = array_get($arNavigation, $sKeyMainMenu); - $arSideMenuCurrent = array_get($arMainMenuCurrent, self::PLUGIN_SIDE_MENU.'.'.$sKeySideMenu); - $arPermissionCurrent = array_get($arPermissions, $sKeyPermission); - - if (empty($arNavigation) || count($arNavigation) == 0 || empty($arMainMenuCurrent)) { - $this->setMainMenu($sLowerAuthor, $sLowerPlugin, $sLowerController); - } else { - $this->arMainMenu = $arMainMenuCurrent; - } - - if (empty($arSideMenuCurrent)) { - $this->setSideMenu($sLowerAuthor, $sLowerPlugin, $sLowerController); - } else { - $this->arSideMenu = $arSideMenuCurrent; - } - - if (empty($arPermissionCurrent)) { - $this->setPermission($sLowerAuthor, $sLowerPlugin, $sLowerModel); - } else { - $this->arPermission = $arPermissionCurrent; - } - - $this->setYAML($sKeyMainMenu, $sKeySideMenu, $sKeyPermission); - $this->save(); - } - - /** - * Set main menu - * @param string $sLowerAuthor - * @param string $sLowerPlugin - * @param string $sLowerController - */ - protected function setMainMenu($sLowerAuthor = '', $sLowerPlugin = '', $sLowerController = '') - { - if (empty($sLowerAuthor) || empty($sLowerPlugin) || empty($sLowerController) || !$this->bSave) { - $this->bSave = false; - - return; - } - - array_set($this->arMainMenu, 'label', $sLowerAuthor.'.'.$sLowerPlugin.'::lang.menu.main'); - array_set($this->arMainMenu, 'url', $sLowerAuthor.'/'.$sLowerPlugin.'/'.$sLowerController); - array_set($this->arMainMenu, 'permissions', [$sLowerPlugin.'-menu-'.'*']); - array_set($this->arMainMenu, 'icon', 'icon-paw'); - } - - /** - * Set side menu - * @param string $sLowerAuthor - * @param string $sLowerPlugin - * @param string $sLowerController - */ - protected function setSideMenu($sLowerAuthor, $sLowerPlugin, $sLowerController) - { - if (empty($sLowerAuthor) || empty($sLowerPlugin) || empty($sLowerController) || !$this->bSave) { - $this->bSave = false; - - return; - } - - array_set($this->arSideMenu, 'label', $sLowerAuthor.'.'.$sLowerPlugin.'::lang.menu.' . $sLowerController); - array_set($this->arSideMenu, 'url', $sLowerAuthor.'/'.$sLowerPlugin.'/'.$sLowerController); - array_set($this->arSideMenu, 'permissions', [$sLowerPlugin.'-menu-'.$sLowerController]); - array_set($this->arSideMenu, 'icon', 'icon-paw'); - } - - /** Set permission - * @param string $sLowerAuthor - * @param string $sLowerPlugin - * @param string $sLowerModel - */ - protected function setPermission($sLowerAuthor, $sLowerPlugin, $sLowerModel) - { - if (empty($sLowerAuthor) || empty($sLowerPlugin) || empty($sLowerModel) || !$this->bSave) { - $this->bSave = false; - - return; - } - - array_set($this->arPermission, 'label', $sLowerAuthor.'.'.$sLowerPlugin.'::lang.permission.'.$sLowerModel); - array_set($this->arPermission, 'tab', $sLowerAuthor.'.'.$sLowerPlugin.'::lang.tab.permissions'); - } - - /** - * Set YAML - * @param string $sKeyMainMenu - * @param string $sKeySideMenu - * @param string $sKeyPermission - */ - protected function setYAML($sKeyMainMenu, $sKeySideMenu, $sKeyPermission) - { - if (empty($sKeyMainMenu) || empty($sKeySideMenu) || empty($sKeyPermission) || !$this->bSave) { - $this->bSave = false; - - return; - } - - array_set($this->arMainMenu, self::PLUGIN_SIDE_MENU.'.'.$sKeySideMenu, $this->arSideMenu); - array_set($this->arYAML, self::PLUGIN_NAVIGATION.'.'.$sKeyMainMenu, $this->arMainMenu); - array_set($this->arYAML, self::PLUGIN_PERMISSIONS.'.'.$sKeyPermission, $this->arPermission); - } - - /** - * Save version.yaml - */ - protected function save() - { - if (!$this->bSave || empty($this->arYAML) || !isset($this->sFilePath) || empty($this->sFilePath)) { - return; - } - - $sContent = Yaml::render($this->arYAML); - $this->obFile->put($this->sFilePath, $sContent); - } -} diff --git a/plugins/lovata/toolbox/classes/queue/ImportItemQueue.php b/plugins/lovata/toolbox/classes/queue/ImportItemQueue.php deleted file mode 100644 index ba8e31542..000000000 --- a/plugins/lovata/toolbox/classes/queue/ImportItemQueue.php +++ /dev/null @@ -1,49 +0,0 @@ -import($sImportClass, $arImportData); - - $obJob->delete(); - } - - /** - * Import item - * @param string $sImportClass - * @param array $arImportData - * @throws \Throwable - */ - protected function import($sImportClass, $arImportData) - { - if (empty($sImportClass) || empty($arImportData) || !class_exists($sImportClass)) { - return; - } - - /** @var \Lovata\Toolbox\Classes\Helper\AbstractImportModel $obImport */ - $obImport = new $sImportClass(); - if ($obImport instanceof AbstractImportModelFromCSV) { - $obImport->import($arImportData, false); - } elseif($obImport instanceof AbstractImportModelFromXML) { - $obImport->importRow($arImportData, false); - } - - } -} diff --git a/plugins/lovata/toolbox/classes/storage/AbstractUserStorage.php b/plugins/lovata/toolbox/classes/storage/AbstractUserStorage.php deleted file mode 100644 index a61ecb0da..000000000 --- a/plugins/lovata/toolbox/classes/storage/AbstractUserStorage.php +++ /dev/null @@ -1,96 +0,0 @@ -get($sKey); - if (empty($arValueList) || !is_array($arValueList)) { - $arValueList = []; - } - - return $arValueList; - } - - /** - * Add value to list - * @param string $sKey - * @param string $sValue - */ - public function addToList($sKey, $sValue) - { - if (empty($sKey) || empty($sValue)) { - return; - } - - //Get value from storage - $arValueList = $this->getList($sKey); - - array_unshift($arValueList, $sValue); - $arValueList = array_unique($arValueList); - - $this->put($sKey, $arValueList); - } - - /** - * Remove value from list - * @param string $sKey - * @param string $sValue - */ - public function removeFromList($sKey, $sValue) - { - if (empty($sKey) || empty($sValue)) { - return; - } - - //Get value from storage - $arValueList = $this->getList($sKey); - - $iPosition = array_search($sValue, $arValueList); - if ($iPosition === false) { - return; - } - - unset($arValueList[$iPosition]); - $arValueList = array_values($arValueList); - - $this->put($sKey, $arValueList); - } -} diff --git a/plugins/lovata/toolbox/classes/storage/CookieUserStorage.php b/plugins/lovata/toolbox/classes/storage/CookieUserStorage.php deleted file mode 100644 index 24efa6dad..000000000 --- a/plugins/lovata/toolbox/classes/storage/CookieUserStorage.php +++ /dev/null @@ -1,70 +0,0 @@ -iMinutePeriod); - } - - /** - * Clear value in storage - * @param string $sKey - */ - public function clear($sKey) - { - if (empty($sKey)) { - return; - } - - Cookie::forget($sKey); - } - - /** - * Set minute period - * @param int $iPeriod - */ - public function setMinutePeriod($iPeriod) - { - $this->iMinutePeriod = (int) $iPeriod; - } -} diff --git a/plugins/lovata/toolbox/classes/storage/SessionUserStorage.php b/plugins/lovata/toolbox/classes/storage/SessionUserStorage.php deleted file mode 100644 index b62f416ac..000000000 --- a/plugins/lovata/toolbox/classes/storage/SessionUserStorage.php +++ /dev/null @@ -1,56 +0,0 @@ -obDefaultStorage = app($obUserStorage); - if (!empty($this->obDefaultStorage) && $this->obDefaultStorage instanceof CookieUserStorage) { - $this->obDefaultStorage->setMinutePeriod($iMinutePeriod); - } - } - - /** - * Get value from storage - * @param string $sKey - * @param mixed $sDefaultValue - * - * @return mixed - */ - public function get($sKey, $sDefaultValue = null) - { - if (empty($sKey)) { - return $sDefaultValue; - } - - //Get auth user object - $obUser = UserHelper::instance()->getUser(); - if (empty($obUser)) { - return $this->getDefaultStorageValue($sKey, $sDefaultValue); - } - - //Get value from user object - $obValue = $obUser->$sKey; - if (empty($obValue)) { - return $sDefaultValue; - } - - return $obValue; - } - - /** - * Put value to storage - * @param string $sKey - * @param mixed $obValue - */ - public function put($sKey, $obValue) - { - if (empty($sKey)) { - return; - } - - //Get auth user object - $obUser = UserHelper::instance()->getUser(); - if (empty($obUser)) { - $this->putDefaultStorageValue($sKey, $obValue); - - return; - } - - $obUser->$sKey = $obValue; - $obUser->save(); - } - - /** - * Clear value in storage - * @param string $sKey - */ - public function clear($sKey) - { - if (empty($sKey)) { - return; - } - - $this->clearDefaultStorageValue($sKey); - - //Get auth user object - $obUser = UserHelper::instance()->getUser(); - if (empty($obUser)) { - return; - } - - $obUser->$sKey = null; - $obUser->save(); - } - - /** - * Get list value from storage - * @param string $sKey - * @return array - */ - public function getList($sKey) - { - if (empty($sKey)) { - return []; - } - - $arDefaultStorageValue = $this->getListDefaultStorageValue($sKey); - - //Get auth user object - $obUser = UserHelper::instance()->getUser(); - if (empty($obUser)) { - return $arDefaultStorageValue; - } - - //Get value from user object - $arValueList = $obUser->$sKey; - if (empty($arValueList) || !is_array($arValueList)) { - $arValueList = []; - } - - if (!empty($arDefaultStorageValue)) { - $arValueList = array_merge($arDefaultStorageValue, $arValueList); - $arValueList = array_unique($arValueList); - - $this->put($sKey, $arValueList); - $this->clearDefaultStorageValue($sKey); - } - - return $arValueList; - } - - /** - * Get value from storage - * @param string $sKey - * @param mixed $sDefaultValue - * - * @return mixed - */ - protected function getDefaultStorageValue($sKey, $sDefaultValue = null) - { - if (empty($this->obDefaultStorage)) { - return $sDefaultValue; - } - - return $this->obDefaultStorage->get($sKey, $sDefaultValue); - } - - /** - * Get list value from storage - * @param string $sKey - * - * @return array - */ - protected function getListDefaultStorageValue($sKey) - { - if (empty($this->obDefaultStorage)) { - return []; - } - - return $this->obDefaultStorage->getList($sKey); - } - - /** - * Put value to storage - * @param string $sKey - * @param mixed $obValue - */ - protected function putDefaultStorageValue($sKey, $obValue) - { - if (empty($this->obDefaultStorage)) { - return; - } - - $this->obDefaultStorage->put($sKey, $obValue); - } - - /** - * Clear value in storage - * @param string $sKey - */ - protected function clearDefaultStorageValue($sKey) - { - if (empty($this->obDefaultStorage)) { - return; - } - - $this->obDefaultStorage->clear($sKey); - } -} diff --git a/plugins/lovata/toolbox/classes/store/AbstractListStore.php b/plugins/lovata/toolbox/classes/store/AbstractListStore.php deleted file mode 100644 index 5113dad57..000000000 --- a/plugins/lovata/toolbox/classes/store/AbstractListStore.php +++ /dev/null @@ -1,43 +0,0 @@ -arStoreList[$sFieldName])) { - return $this->arStoreList[$sFieldName]; - } - - return null; - } - - /** - * Add store class to list and get store object - * @param string $sFieldName - * @param string $sClassName - */ - protected function addToStoreList($sFieldName, $sClassName) - { - if (empty($sFieldName) || empty($sClassName) || !class_exists($sClassName)) { - return; - } - - $this->arStoreList[$sFieldName] = $sClassName::instance(); - } -} diff --git a/plugins/lovata/toolbox/classes/store/AbstractStore.php b/plugins/lovata/toolbox/classes/store/AbstractStore.php deleted file mode 100644 index 92ab05610..000000000 --- a/plugins/lovata/toolbox/classes/store/AbstractStore.php +++ /dev/null @@ -1,92 +0,0 @@ -getIDListFromCache(); - if (!empty($arElementIDList) && is_array($arElementIDList)) { - return $arElementIDList; - } - - $arElementIDList = $this->getIDListFromDB(); - $this->saveIDList($arElementIDList); - - return $arElementIDList; - } - - /** - * Get element ID list from array - * @return array|null - */ - protected function getIDListFromCache() : array - { - $arCacheTags = $this->getCacheTagList(); - $sCacheKey = $this->getCacheKey(); - - $arElementIDList = (array) CCache::get($arCacheTags, $sCacheKey); - - return $arElementIDList; - } - - /** - * Save element ID list in cache - * @param array $arElementIDList - */ - protected function saveIDList($arElementIDList) - { - $arCacheTags = $this->getCacheTagList(); - $sCacheKey = $this->getCacheKey(); - - //Set cache data - CCache::forever($arCacheTags, $sCacheKey, $arElementIDList); - } - - /** - * Clear element ID list in cache - */ - protected function clearIDList() - { - $arCacheTags = $this->getCacheTagList(); - $sCacheKey = $this->getCacheKey(); - - CCache::clear($arCacheTags, $sCacheKey); - } - - /** - * Get array with cache tags - * @return array - */ - protected function getCacheTagList() - { - return [static::class]; - } -} diff --git a/plugins/lovata/toolbox/classes/store/AbstractStoreWithParam.php b/plugins/lovata/toolbox/classes/store/AbstractStoreWithParam.php deleted file mode 100644 index 9cbddd1db..000000000 --- a/plugins/lovata/toolbox/classes/store/AbstractStoreWithParam.php +++ /dev/null @@ -1,82 +0,0 @@ -sValue = $sFilterValue; - if (array_key_exists($this->getCacheKey(), $this->arCachedList) && is_array($this->arCachedList[$this->getCacheKey()])) { - return $this->arCachedList[$this->getCacheKey()]; - } - - $arElementIDList = $this->getIDList(); - $this->arCachedList[$this->getCacheKey()] = $arElementIDList; - - return $arElementIDList; - } - - /** - * Get element ID list from database, without cache - * @param mixed $sFilterValue - * @return array|null - */ - public function getNoCache($sFilterValue) : array - { - if (empty($sFilterValue) && $sFilterValue !== 0 && $sFilterValue !== '0') { - return []; - } - - $this->sValue = $sFilterValue; - $arElementIDList = $this->getIDListFromDB(); - - return $arElementIDList; - } - - /** - * Clear element ID list - * @param mixed $sFilterValue - */ - public function clear($sFilterValue) - { - if (empty($sFilterValue) && $sFilterValue !== 0 && $sFilterValue !== '0') { - return; - } - - $this->sValue = $sFilterValue; - - $this->clearIDList(); - - if (array_key_exists($this->getCacheKey(), $this->arCachedList)) { - unset($this->arCachedList[$this->getCacheKey()]); - } - } - - /** - * Get cache key - * @return string - */ - protected function getCacheKey() : string - { - return $this->sValue; - } -} diff --git a/plugins/lovata/toolbox/classes/store/AbstractStoreWithTwoParam.php b/plugins/lovata/toolbox/classes/store/AbstractStoreWithTwoParam.php deleted file mode 100644 index 443b3a0ba..000000000 --- a/plugins/lovata/toolbox/classes/store/AbstractStoreWithTwoParam.php +++ /dev/null @@ -1,92 +0,0 @@ -sValue = $sFilterValue; - $this->sAdditionParam = $sAdditionalParam; - if (array_key_exists($this->getCacheKey(), $this->arCachedList) && is_array($this->arCachedList[$this->getCacheKey()])) { - return $this->arCachedList[$this->getCacheKey()]; - } - - $arElementIDList = $this->getIDList(); - $this->arCachedList[$this->getCacheKey()] = $arElementIDList; - - return $arElementIDList; - } - - /** - * Get element ID list from database, without cache - * @param mixed $sFilterValue - * @param mixed $sAdditionalParam - * @return array|null - */ - public function getNoCache($sFilterValue, $sAdditionalParam = null) : array - { - if (empty($sFilterValue) && $sFilterValue !== 0 && $sFilterValue !== '0') { - return []; - } - - $this->sValue = $sFilterValue; - $this->sAdditionParam = $sAdditionalParam; - - $arElementIDList = $this->getIDListFromDB(); - - return $arElementIDList; - } - - /** - * Clear element ID list - * @param mixed $sFilterValue - * @param mixed $sAdditionalParam - */ - public function clear($sFilterValue, $sAdditionalParam = null) - { - if (empty($sFilterValue) && $sFilterValue !== 0 && $sFilterValue !== '0') { - return; - } - - $this->sValue = $sFilterValue; - $this->sAdditionParam = $sAdditionalParam; - - $this->clearIDList(); - - if (array_key_exists($this->getCacheKey(), $this->arCachedList)) { - unset($this->arCachedList[$this->getCacheKey()]); - } - } - - /** - * Get cache key - * @return string - */ - protected function getCacheKey() : string - { - return $this->sValue.'_'.$this->sAdditionParam; - } -} diff --git a/plugins/lovata/toolbox/classes/store/AbstractStoreWithoutParam.php b/plugins/lovata/toolbox/classes/store/AbstractStoreWithoutParam.php deleted file mode 100644 index 970f9d4a2..000000000 --- a/plugins/lovata/toolbox/classes/store/AbstractStoreWithoutParam.php +++ /dev/null @@ -1,57 +0,0 @@ -arCachedList !== null && is_array($this->arCachedList)) { - return $this->arCachedList; - } - - $arElementIDList = $this->getIDList(); - $this->arCachedList = $arElementIDList; - - return $arElementIDList; - } - - /** - * Get element ID list from database, without cache - * @return array|null - */ - public function getNoCache() : array - { - $arElementIDList = $this->getIDListFromDB(); - - return $arElementIDList; - } - - /** - * Clear element ID list - */ - public function clear() - { - $this->clearIDList(); - $this->arCachedList = null; - } - - /** - * Get cache key - * @return string - */ - protected function getCacheKey() : string - { - return static::class; - } -} diff --git a/plugins/lovata/toolbox/components/Pagination.php b/plugins/lovata/toolbox/components/Pagination.php deleted file mode 100644 index 1d144d48e..000000000 --- a/plugins/lovata/toolbox/components/Pagination.php +++ /dev/null @@ -1,168 +0,0 @@ - [ - 'title' => 'lovata.toolbox::lang.settings.available_count_per_page', - 'description' => 'lovata.toolbox::lang.settings.available_count_per_page_desc', - 'type' => 'string', - ], - ]; - - /** - * @return array - */ - public function componentDetails() - { - return [ - 'name' => 'lovata.toolbox::lang.component.pagination', - 'description' => 'lovata.toolbox::lang.component.pagination_desc', - ]; - } - - /** - * @return array - */ - public function defineProperties() - { - $this->arPropertyList = array_merge($this->arPropertyList, PaginationHelper::getProperties('toolbox')); - - return $this->arPropertyList; - } - - /** - * Init start data - */ - public function init() - { - $arAvailableValue = []; - $sAvailableValue = $this->property('available_count_per_page'); - if (!empty($sAvailableValue)) { - $arAvailableValue = explode(',', $sAvailableValue); - } - - //Get limit from request - $iLimit = (int) Input::get('limit'); - if ($iLimit > 0 && (empty($arAvailableValue) || in_array($iLimit, $arAvailableValue))) { - $this->iElementOnPage = $iLimit; - - return; - } - - $iRequestElementOnPage = (int) $this->property('count_per_page'); - if ($iRequestElementOnPage > 0) { - $this->iElementOnPage = $iRequestElementOnPage; - } - } - - /** - * Get page from request - * @return int - */ - public function getPageFromRequest() - { - $iPage = (int) trim(Input::get('page')); - - //Check page value - if ($iPage < 1) { - $iPage = 1; - } - - return $iPage; - } - - /** - * Get count element per page - * @return int - */ - public function getCountPerPage() - { - return $this->iElementOnPage; - } - - /** - * Get max page value - * @param int $iCount - * @return int - */ - public function getMaxPage($iCount) - { - if ($iCount < 1) { - return 0; - } - - return ceil($iCount / $this->iElementOnPage); - } - - /** - * Get element count for next page - * @param int $iPage - * @param int $iCount - * - * @return int - */ - public function getCountForNextPage($iPage, $iCount) - { - if ($iCount < 1) { - return 0; - } - - $iPage = (int) trim($iPage); - - //Check page value - if ($iPage < 1) { - $iPage = 1; - } - - //Get max page value - $iMaxPage = $this->getMaxPage($iCount); - if ($iMaxPage <= $iPage) { - return 0; - } - - $iNextCount = $iCount - $this->iElementOnPage * $iPage; - if ($iNextCount > $this->iElementOnPage) { - $iNextCount = $this->iElementOnPage; - } - - return $iNextCount; - } - - /** - * Get pagination data - * @param int $iPage - * @param int $iCount - * @return array|null - */ - public function get($iPage, $iCount) - { - if ($iCount < 1) { - return null; - } - - $iPage = (int) trim($iPage); - - //Check page value - if ($iPage < 1) { - $iPage = 1; - } - - $this->properties['count_per_page'] = $this->iElementOnPage; - - return PaginationHelper::get($iPage, $iCount, $this->properties); - } -} diff --git a/plugins/lovata/toolbox/composer.json b/plugins/lovata/toolbox/composer.json deleted file mode 100644 index c04e268a8..000000000 --- a/plugins/lovata/toolbox/composer.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "lovata/toolbox-plugin", - "type": "october-plugin", - "description": "Toolbox plugin for October CMS", - "license": "GPL-3.0-only", - "require": { - "kharanenka/php-result-store": "2.*", - "kharanenka/laravel-scope-active": "1.0.*", - "kharanenka/oc-pagination": "1.0.*", - "kharanenka/laravel-cache-helper": "1.0.*", - "kharanenka/laravel-scope-category-belongs-to": "1.0.*", - "kharanenka/laravel-scope-code": "1.0.*", - "kharanenka/laravel-scope-date": "1.0.*", - "kharanenka/laravel-scope-external-id": "1.0.*", - "kharanenka/laravel-scope-name": "1.0.*", - "kharanenka/laravel-scope-slug": "1.0.*", - "kharanenka/laravel-scope-user-belongs-to": "1.0.*", - "kharanenka/oc-data-file-model": "1.*", - "kharanenka/laravel-scope-moderation": "1.0.*", - "kharanenka/laravel-scope-hidden": "1.0.*", - "kharanenka/laravel-scope-type": "1.0.*", - "composer/installers": "~1.0" - } -} diff --git a/plugins/lovata/toolbox/crowdin.yml b/plugins/lovata/toolbox/crowdin.yml deleted file mode 100644 index 535152bcc..000000000 --- a/plugins/lovata/toolbox/crowdin.yml +++ /dev/null @@ -1,3 +0,0 @@ -files: - - source: /lang/en/*php - translation: /lang/%two_letters_code%/%original_file_name% diff --git a/plugins/lovata/toolbox/lang/ar/lang.php b/plugins/lovata/toolbox/lang/ar/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/ar/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/be/lang.php b/plugins/lovata/toolbox/lang/be/lang.php deleted file mode 100644 index ee6a730d3..000000000 --- a/plugins/lovata/toolbox/lang/be/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'ID бацькоўскай катэгорыі', - 'category_parent' => 'Бацькоўская катэгорыя', - 'children_category' => 'Дзіцячыя катэгорыі', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/bg/lang.php b/plugins/lovata/toolbox/lang/bg/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/bg/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/ca/lang.php b/plugins/lovata/toolbox/lang/ca/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/ca/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/cs/lang.php b/plugins/lovata/toolbox/lang/cs/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/cs/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/da/lang.php b/plugins/lovata/toolbox/lang/da/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/da/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/de/lang.php b/plugins/lovata/toolbox/lang/de/lang.php deleted file mode 100644 index d7a6443fa..000000000 --- a/plugins/lovata/toolbox/lang/de/lang.php +++ /dev/null @@ -1,193 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox ist eine Reihe von Helfern für eine schnellere Entwicklung für Oktober CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Titel', - 'active' => 'Aktiv', - 'hidden' => 'Versteckt', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'Externe ID', - 'preview_text' => 'Vorschau des Textes', - 'preview_image' => 'Vorschau des Bildes', - 'image' => 'Bild', - 'images' => 'Bilder (Galerie)', - 'icon' => 'Icon', - 'description' => 'Beschreibung', - 'category' => 'Kategorie', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Telefon', - 'moderation' => 'Moderation', - 'mode' => 'Modus', - 'status' => 'Status', - 'city' => 'Stadt', - 'address' => 'Adresse', - 'street' => 'Straße', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Typ', - 'avatar' => 'Avatar', - 'property' => 'Eigenschaft', - 'property_list_value' => 'verfügbare Eigenschaftswerte', - 'property_mode' => 'Eigenschaftsmodus', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Eigenschaft ist übersetzbar', - 'key' => 'Schlüssel', - 'value' => 'Wert', - 'label' => 'Label', - 'date' => 'Datum', - 'datetime' => 'Datum und Zeit', - 'time' => 'Zeit', - 'file' => 'Date', - 'decimals' => 'Anzahl der Nachkommastellen', - 'dec_point' => 'Bruchteilstrennung', - 'thousands_sep' => 'Tausendertrennzeichen', - 'dot' => 'Punkt', - 'comma' => 'Komma', - 'together' => 'Zusammenführen', - 'space' => 'Leerzeichen', - 'date_begin' => 'Anfangsdatum', - 'date_end' => 'Enddatum', - 'discount_value' => 'Rabattwert', - 'discount_type' => 'Rabattart', - 'discount_price' => 'Preisnachlass', - 'discount' => 'Rabatt', - 'product' => 'Produkt', - 'priority' => 'Priorität', - 'group' => 'Gruppe', - 'count' => 'Zählen', - 'length' => 'Länge', - 'amount' => 'Betrag', - 'author' => 'Autor', - 'link' => 'Link', - 'view_count' => 'Anzahl anzeigen', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sortierung', - 'created_at' => 'Erstellt', - 'updated_at' => 'Aktualisiert', - 'deleted_at' => 'Gelöscht am', - 'deleted' => 'Gelöscht', - 'empty' => 'Leer', - 'password' => 'Passwort', - - 'site_settings' => 'Anwendungseinstellungen', - 'site_settings_description' => 'Allgemeine Einstellungen der Anwendung', - 'queue_on' => 'Senden von Nachrichten aus der Warteschlange', - 'queue_name' => 'Der Name der Warteschlange für den Versand der E-Mails.', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Elemente deaktivieren', - 'import_deactivate_description' => 'Alle aktiven Elemente, die sich nicht in der CSV-Datei befinden, werden deaktiviert.', - - 'country' => 'Land', - 'state' => 'Staat', - 'house' => 'Hausnummer', - 'flat' => 'Wohnungsnummer', - 'address1' => 'Adresse 1', - 'address2' => 'Adresse 2', - 'postcode' => 'Postleitzahl', - ], - 'tab' => [ - 'preview_content' => 'Inhaltsvorschau', - 'full_content' => 'Inhalt', - 'images' => 'Bilder', - 'files' => 'Dateien', - 'settings' => 'Einstellungen', - 'description' => 'Beschreibung', - 'properties' => 'Eigenschaften', - 'mail' => 'Senden von Emails', - 'import' => 'Importieren', - 'permissions' => 'Seiteneinstellungen verwalten', - 'prices_format' => 'Preisformat', - ], - 'component' => [ - 'property_name_error_404' => '404 Seite anzeigen', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug wird benötigt', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Seitennavigation', - 'pagination_desc' => 'Rendert Button für Seitennavigation', - - 'property_redirect_page' => 'Seite umleiten', - 'property_redirect_success_page' => 'Erfolgsseite umleiten', - 'property_redirect_fail_page' => 'Fehlerseite umleiten', - 'property_redirect_on' => 'Umleitung EIN', - 'property_flash_on' => 'Flash EIN', - 'property_mode' => 'Komponenten-Modus', - 'mode_submit' => 'Formular absenden', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => ':name erstellen war erfolgreich', - 'update_success' => ':name aktualisieren war erfolgreich', - 'delete_success' => ':name löschen war erfolgreich', - 'restore_confirm' => 'Möchten Sie ausgewählte Elemente wiederherstellen?', - 'restore_success' => 'Wiederherstellen von Elementen war erfolgreich!', - 'e_not_correct_request' => 'Anfrage ist nicht korrekt!', - 'row_is_empty' => 'Zeile ist leer.', - 'external_id_is_empty' => 'Die externe ID ist leer.', - 'import_additional_info' => 'Zusätzliche Importinformationen.', - 'import_active_field_info' => 'Der Wert des Feldes "aktiv" wird auf "wahr" gesetzt, wenn es sich nicht in der CSV-Datei befindet.', - 'import_preview_image_field_info' => 'Der Pfad zur Vorschau-Bilddatei muss relativ zum Speicherort Ihres Projekts eingestellt sein. Zum Beispiel: "app/media/image.jpg".', - 'import_images_field_info' => 'Der Pfad zur Bilddatei muss relativ zum Speicherort Ihres Projekts eingestellt werden. Zum Beispiel: "app/media/image.jpg". Pfade zu Bilddateien müssen durch Kommas getrennt werden.', - ], - 'settings' => [ - 'count_per_page' => 'Elemente pro Seite zählen', - 'available_count_per_page' => 'Liste der verfügbaren Werte für "count_per_page".', - 'available_count_per_page_desc' => 'Setzen Sie zulässige Werte, die durch Kommas getrennt sind.', - 'number_validation' => 'Sie müssen die Nummer eingeben.', - 'pagination_limit' => 'Buttons für max count', - 'active_class' => 'Klasse für "Active Button"', - 'button_list' => 'Button Liste', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button Name', - 'button_limit' => 'Button nach Seite anzeigen', - 'button_number' => 'Zeigt den Namen des Buttons an', - 'button_class' => 'CSS class', - 'last_button' => '"Zuletzt" Button', - 'last-more_button' => '"Mehr" (vor "Zuletzt")', - 'next_button' => '"Nächste" Button', - 'next-more_button' => '"Mehr" (vor "Nächste")', - 'prev_button' => '"Vorher" Button', - 'prev-more_button' => '"Mehr" (nach "Vorher")', - 'first_button' => '"Zuerst" Button', - 'first-more_button' => '"Mehr" (nach "Zuerst")', - 'main_button' => '"Haupt" Button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Eigenschaftswert hinzufügen', - 'import_from_csv' => 'Importieren mit CSV', - 'export_in_csv' => 'Exportieren in CSV', - 'import_button' => 'Datensätze importieren', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'Datei', - ], - 'permission' => [ - 'settings' => 'Einstellungen verwalten', - ], -]; diff --git a/plugins/lovata/toolbox/lang/el/lang.php b/plugins/lovata/toolbox/lang/el/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/el/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/en/lang.php b/plugins/lovata/toolbox/lang/en/lang.php deleted file mode 100644 index 0c387989a..000000000 --- a/plugins/lovata/toolbox/lang/en/lang.php +++ /dev/null @@ -1,227 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'view_count' => 'View count', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - 'field' => 'Field', - 'weight' => 'Weight', - 'height' => 'Height', - 'length' => 'Length', - 'width' => 'Width', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - - 'import_file_list' => 'Import file list', - 'import_from_file' => 'Import from file', - 'import_file_path' => 'Relative path from storage folder to file', - 'import_path_prefix' => 'Prefix for fields paths', - 'import_file_namespace' => 'File namespace', - 'import_image_folder' => 'Relative path from storage folder to image folder', - 'import_path_to_list' => 'Path to node with list of elements', - 'import_path_to_list_example' => 'main/elements/element', - 'import_field_list' => 'Field list', - 'import_path_to_field' => 'Path to field node', - 'import_path_to_field_example' => 'fields/field[@code="active"]', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'files' => 'Files', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - 'has_wildcard' => 'URL section is wildcard', - 'skip_error' => 'Skip "Not found" error', - ], - 'message' => [ - 'create_success' => 'Create :name was successful', - 'update_success' => 'Update :name was successful', - 'delete_success' => 'Delete :name was successful', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successful', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - 'import_from_xml_confirm' => 'Start import from XML file?', - 'import_from_xml_report' => 'Import results: created - :created, updated - :updated, skipped - :skipped, processed - :processed.', - - 'table_toolbox_helper' => 'Display command list.', - 'table_toolbox_create' => 'Create :description', - - 'choice_field_list' => 'Choice available fields (Example: 1,2,3,4)', - 'choice_sorting' => 'Choice sorting', - 'choice_lang_list' => 'Choice lang', - 'choice_extend_model' => 'Choice extend model', - 'set' => 'Set :name (Example: :example)', - 'create' => 'Create :name?', - 'force_file' => 'File :file already exists. Create forced?', - 'add_side_menu' => 'Add side menu to plugin.yaml?', - 'version_up' => 'Add new version to version.yaml?', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - 'import_from_xml' => 'Import from XML', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/es/lang.php b/plugins/lovata/toolbox/lang/es/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/es/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/et/lang.php b/plugins/lovata/toolbox/lang/et/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/et/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/fa/lang.php b/plugins/lovata/toolbox/lang/fa/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/fa/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/fi/lang.php b/plugins/lovata/toolbox/lang/fi/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/fi/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/fr/lang.php b/plugins/lovata/toolbox/lang/fr/lang.php deleted file mode 100644 index c7dcdce88..000000000 --- a/plugins/lovata/toolbox/lang/fr/lang.php +++ /dev/null @@ -1,193 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox est un ensemble d\'helpers pour un développement plus rapide avec OctoberCMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Nom', - 'title' => 'Titre', - 'active' => 'Actif', - 'hidden' => 'Caché', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'ID Externe', - 'preview_text' => 'Prévisualiser le texte', - 'preview_image' => 'Prévisualiser l\'image', - 'image' => 'Image', - 'images' => 'Images (galerie)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Catégorie', - 'category_parent_id' => 'Catégorie parentale ID', - 'category_parent' => 'Catégorie parentale', - 'children_category' => 'Catégories enfants', - 'email' => 'Email', - 'phone' => 'Téléphone', - 'moderation' => 'Modération', - 'mode' => 'Mode', - 'status' => 'Statut', - 'city' => 'Ville', - 'address' => 'Adresse', - 'street' => 'Rue', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Propriété', - 'property_list_value' => 'Valeurs de propriété disponibles', - 'property_mode' => 'Mode de propriété', - 'property_tab' => 'Nom de l\'onglet', - 'property_is_translatable' => 'La propriété est traduisible', - 'key' => 'Clé', - 'value' => 'Valeur', - 'label' => 'Étiquette', - 'date' => 'Date', - 'datetime' => 'Date et heure', - 'time' => 'Heure', - 'file' => 'Fichier', - 'decimals' => 'Nombre de décimales', - 'dec_point' => 'Séparateur décimal', - 'thousands_sep' => 'Séparateur de milliers', - 'dot' => 'Point', - 'comma' => 'Virgule', - 'together' => 'Fusionner', - 'space' => 'Espace', - 'date_begin' => 'Date du début', - 'date_end' => 'Date de la fin', - 'discount_value' => 'Valeur de remise', - 'discount_type' => 'Type de remise', - 'discount_price' => 'Prix de la remise', - 'discount' => 'Remise', - 'product' => 'Produit', - 'priority' => 'Priorité', - 'group' => 'Groupe', - 'count' => 'Compter', - 'length' => 'Longueur', - 'amount' => 'Montant', - 'view_count' => 'Nombre de vues', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Tri', - 'created_at' => 'Créé', - 'updated_at' => 'Actualisé', - 'deleted_at' => 'Supprimé', - 'deleted' => 'supprimé', - 'empty' => 'Vide', - 'password' => 'Mot de passe', - - 'site_settings' => 'Paramètres de l\'application', - 'site_settings_description' => 'Paramètres généraux de l\'application', - 'queue_on' => 'Envoi de messages de la file d\'attente (queue)', - 'queue_name' => 'Nom de la queue pour l\'envoi d\'emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Remplir une liste d\'emails séparés par des virgules', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Pays', - 'state' => 'Etat', - 'house' => 'Numéro de maison', - 'flat' => 'Numéro d\'appartement', - 'address1' => 'Adresse 1', - 'address2' => 'Adresse 2', - 'postcode' => 'Code postal', - ], - 'tab' => [ - 'preview_content' => 'Prévisualiser le contenu', - 'full_content' => 'Contenu', - 'images' => 'Images', - 'files' => 'Des dossiers', - 'settings' => 'Paramètres', - 'description' => 'Description', - 'properties' => 'Propriétés', - 'mail' => 'Envoi d\'emails', - 'import' => 'Import', - 'permissions' => 'Gérer les paramètres du site', - 'prices_format' => 'Format de prix', - ], - 'component' => [ - 'property_name_error_404' => 'Voir la page 404', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Le slug est requis', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Afficher le bouton de pagination', - - 'property_redirect_page' => 'Page de redirection', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirection ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Mode du component', - 'mode_submit' => 'Soumission par form', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => ':name créé avec succès', - 'update_success' => ':name mis à jour avec succès', - 'delete_success' => ':name supprimé avec succès', - 'restore_confirm' => 'Voulez-vous restaurer les éléments sélectionnés ?', - 'restore_success' => 'La restauration a été effectuée avec succès', - 'e_not_correct_request' => 'La requête est incorrecte', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Compter les éléments par page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'Vous devez entrer le numéro', - 'pagination_limit' => 'Maximum de boutons', - 'active_class' => 'Classe du bouton actif', - 'button_list' => 'Liste des boutons', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Nom du bouton', - 'button_limit' => 'Afficher le bouton après la page', - 'button_number' => 'Afficher le nombre du bouton', - 'button_class' => 'Classe CSS', - 'last_button' => 'Bouton "Last"', - 'last-more_button' => 'Bouton "More" (avant "Last")', - 'next_button' => 'Bouton "Next"', - 'next-more_button' => 'Bouton "More" (avant "Next")', - 'prev_button' => 'Bouton "Prev"', - 'prev-more_button' => 'Bouton "More" (après "Prev")', - 'first_button' => 'Bouton "First"', - 'first-more_button' => 'Bouton "More" (après "First")', - 'main_button' => 'Bouton "Main"', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Ajouter une valeur de propriété', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Champ de texte (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Champ de texte (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Liste de cases à cocher (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Sélectionner (select)', - 'radio' => 'Radio button', - 'date' => 'Sélecteur de date (datetime)', - 'colorpicker' => 'Sélecteur de couleur (colorpicker)', - 'mediafinder' => 'Fichier', - ], - 'permission' => [ - 'settings' => 'Gérer les paramètres', - ], -]; diff --git a/plugins/lovata/toolbox/lang/hu/lang.php b/plugins/lovata/toolbox/lang/hu/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/hu/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/id/lang.php b/plugins/lovata/toolbox/lang/id/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/id/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/it/lang.php b/plugins/lovata/toolbox/lang/it/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/it/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/ja/lang.php b/plugins/lovata/toolbox/lang/ja/lang.php deleted file mode 100644 index 73e43f71b..000000000 --- a/plugins/lovata/toolbox/lang/ja/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => '開発効率化のためのツールセット', - ], - 'field' => [ - 'id' => 'ID', - 'name' => '名称', - 'title' => 'タイトル', - 'active' => '有効', - 'hidden' => '非表示', - 'code' => 'コード', - 'slug' => 'URL', - 'external_id' => '外部ID', - 'preview_text' => 'プレビューテキスト', - 'preview_image' => 'プレビュー画像', - 'image' => '画像', - 'images' => '画像 (ギャラリー)', - 'icon' => 'Icon', - 'description' => '説明', - 'category' => 'カテゴリ', - 'category_parent_id' => '親カテゴリID', - 'category_parent' => '親カテゴリ', - 'children_category' => '子供のカテゴリー', - 'email' => 'メール', - 'phone' => '電話', - 'moderation' => 'モデレーション', - 'mode' => 'モード', - 'status' => 'ステータス', - 'city' => '市', - 'address' => '住所', - 'street' => '番地', - 'lat' => '緯度', - 'lng' => '経度', - 'type' => 'タイプ', - 'avatar' => 'アバター', - 'property' => 'プロパティ', - 'property_list_value' => 'プロパティ選択肢', - 'property_mode' => 'プロパティモード', - 'property_tab' => 'タブ名', - 'property_is_translatable' => 'プロパティは翻訳可能', - 'key' => 'キー', - 'value' => '値', - 'label' => 'ラベル', - 'date' => '日付', - 'datetime' => '日時', - 'time' => '時間', - 'file' => 'ファイル', - 'decimals' => '小数点以下の桁数', - 'dec_point' => '小数部の区切り文字', - 'thousands_sep' => '千単位の区切り文字', - 'dot' => 'ドット (.)', - 'comma' => 'カンマ (,)', - 'together' => 'マージ', - 'space' => 'スペース', - 'date_begin' => '開始日', - 'date_end' => '終了日', - 'discount_value' => '割引値', - 'discount_type' => '割引タイプ', - 'discount_price' => '割引価格', - 'discount' => '割引', - 'product' => '製品', - 'priority' => '優先度', - 'group' => 'グループ', - 'count' => 'カウント', - 'length' => '長さ', - 'amount' => '量', - 'author' => '作者', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => '並び順', - 'created_at' => '作成日時', - 'updated_at' => '更新日時', - 'deleted_at' => '削除日時', - 'deleted' => '削除済み', - 'empty' => '未設定', - 'password' => 'パスワード', - - 'site_settings' => 'アプリケーション設定', - 'site_settings_description' => 'アプリケーションの共通設定', - 'queue_on' => 'メール送信はキューを使用する', - 'queue_name' => 'メール送信キューの名前', - 'import_queue_on' => 'データインポートにキューを使用する', - 'import_queue_name' => 'データインポートに使用するキューの名称', - 'email_list_description' => '複数のメールアドレスはカンマ区切りで入力してください', - 'import_deactivate' => '要素を無効にする', - 'import_deactivate_description' => 'CSVファイルに含まれないすべての要素は無効化されます', - - 'country' => '国', - 'state' => '都道府県、州、省など', - 'house' => '番地', - 'flat' => '部屋番号', - 'address1' => '住所1', - 'address2' => '住所2', - 'postcode' => '郵便番号', - ], - 'tab' => [ - 'preview_content' => 'プレビュー', - 'full_content' => 'コンテンツ', - 'images' => '画像', - 'settings' => '設定', - 'description' => '説明', - 'properties' => 'プロパティ', - 'mail' => 'メール送信', - 'import' => 'インポート', - 'permissions' => 'サイト設定', - 'prices_format' => '価格書式', - ], - 'component' => [ - 'property_name_error_404' => '404ページ表示', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slugは必須です', - 'property_url_check' => 'Smart url check', - 'pagination' => 'ページネーション', - 'pagination_desc' => 'ページネーションボタン表示', - - 'property_redirect_page' => 'リダイレクト先ページ', - 'property_redirect_success_page' => '成功時リダイレクト先ページ', - 'property_redirect_fail_page' => '失敗時リダイレクト先ページ', - 'property_redirect_on' => 'リダイレクトON', - 'property_flash_on' => 'FlashメッセージON', - 'property_mode' => '動作モード', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => ':name は正常に作成されました', - 'update_success' => ':name は正常に更新されました', - 'delete_success' => ':name は正常に削除されました', - 'restore_confirm' => '選択した項目を復元しますか?', - 'restore_success' => '項目は正常に復元されました', - 'e_not_correct_request' => 'リクエストが不正です', - 'row_is_empty' => 'データがありません', - 'external_id_is_empty' => '外部IDが設定されていません', - 'import_additional_info' => '追加インポート情報', - 'import_active_field_info' => 'CSVファイルに含まれない“active”なフィールドの値は“true”になります', - 'import_preview_image_field_info' => 'プレビュー画像ファイルはストレージディレクトリへの相対パスで入力してください。例)"app/media/image.jpg"', - 'import_images_field_info' => '画像ファイルはストレージディレクトリへの相対パスで入力してください。例)"app/media/image.jpg" 複数指定する場合はカンマ区切りで入力してください', - ], - 'settings' => [ - 'count_per_page' => 'ページあたり表示数', - 'available_count_per_page' => 'ページあたり表示数の選択肢', - 'available_count_per_page_desc' => '選択可能にする数字をカンマ区切りで入力してください', - 'number_validation' => '半角数字を入力してください', - 'pagination_limit' => '最大ページボタン数', - 'active_class' => 'アクティブボタンに設定するクラス', - 'button_list' => '表示するボタン', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-moreからカンマ区切りで入力してください', - 'button_name' => 'ボタンラベル', - 'button_limit' => 'ボタンを表示し始めるページ番号', - 'button_number' => 'ボタンにページ番号を表示', - 'button_class' => 'CSSクラス', - 'last_button' => '"Last"ボタン', - 'last-more_button' => '"More" ("Last"の前)', - 'next_button' => '"Next"ボタン', - 'next-more_button' => '"More" ("Next"の前)', - 'prev_button' => '"Prev"ボタン', - 'prev-more_button' => '"More" ("Prev"の後)', - 'first_button' => '"First"ボタン', - 'first-more_button' => '"More" ("First"の後)', - 'main_button' => '"Main"ボタン', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => '値を追加', - 'import_from_csv' => 'CSVから読込む', - 'export_in_csv' => 'CSVへ書出す', - 'import_button' => 'データの読込み', - ], - 'type' => [ - 'input' => 'テキスト (input)', - 'number' => 'テキスト (number)', - 'textarea' => 'テキスト (textarea)', - 'rich_editor' => 'テキスト (wysiwyg)', - 'single_checkbox' => 'シングル チェックボックス', - 'switch' => 'スイッチ', - 'checkbox' => 'チェックボックス リスト (checkbox)', - 'balloon_selector' => 'バルーン セレクタ', - 'tag_list' => 'タグリスト', - 'select' => 'セレクト', - 'radio' => 'ラジオボタン', - 'date' => '日付ピッカー (datetime)', - 'colorpicker' => 'カラーピッカー (colorpicker)', - 'mediafinder' => 'ファイル', - ], - 'permission' => [ - 'settings' => 'サイト設定管理', - ], -]; diff --git a/plugins/lovata/toolbox/lang/kk/lang.php b/plugins/lovata/toolbox/lang/kk/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/kk/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/ko/lang.php b/plugins/lovata/toolbox/lang/ko/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/ko/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/ky/lang.php b/plugins/lovata/toolbox/lang/ky/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/ky/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/lt/lang.php b/plugins/lovata/toolbox/lang/lt/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/lt/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/lv/lang.php b/plugins/lovata/toolbox/lang/lv/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/lv/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/nb/lang.php b/plugins/lovata/toolbox/lang/nb/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/nb/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/nl/lang.php b/plugins/lovata/toolbox/lang/nl/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/nl/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/pl/lang.php b/plugins/lovata/toolbox/lang/pl/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/pl/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/pt/lang.php b/plugins/lovata/toolbox/lang/pt/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/pt/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/ro/lang.php b/plugins/lovata/toolbox/lang/ro/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/ro/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/ru/lang.php b/plugins/lovata/toolbox/lang/ru/lang.php deleted file mode 100644 index ae7fd3d95..000000000 --- a/plugins/lovata/toolbox/lang/ru/lang.php +++ /dev/null @@ -1,214 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox — это набор хэлперов для ускорения разработки на платформе October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Название', - 'title' => 'Заголовок', - 'active' => 'Активность', - 'hidden' => 'Скрытый', - 'code' => 'Код', - 'slug' => 'URL', - 'external_id' => 'Внешний ID', - 'preview_text' => 'Краткое описание', - 'preview_image' => 'Изображение-превью', - 'image' => 'Изображение', - 'images' => 'Изображения (галерея)', - 'icon' => 'Иконка', - 'description' => 'Описание', - 'category' => 'Категория', - 'category_parent_id' => 'ID родительской категории', - 'category_parent' => 'Родительская категория', - 'children_category' => 'Дочерние категории', - 'email' => 'Email', - 'phone' => 'Контактный телефон', - 'moderation' => 'Модерация', - 'mode' => 'Режим работы', - 'status' => 'Статус', - 'city' => 'Город', - 'address' => 'Адрес', - 'street' => 'Улица', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Тип', - 'avatar' => 'Аватар', - 'property' => 'Свойство', - 'property_list_value' => 'Допустимые значения свойства', - 'property_mode' => 'Вид свойства', - 'property_tab' => 'Название вкладки', - 'property_is_translatable' => 'Свойство доступно для перевода', - 'key' => 'Ключ', - 'value' => 'Значение', - 'label' => 'Метка', - 'date' => 'Дата', - 'datetime' => 'Дата и время', - 'time' => 'Время', - 'file' => 'Файл', - 'decimals' => 'Число знаков после запятой', - 'dec_point' => 'Разделитель дробной части', - 'thousands_sep' => 'Разделитель тысяч', - 'dot' => 'Точка', - 'comma' => 'Запятая', - 'together' => 'Слитно', - 'space' => 'Пробел', - 'date_begin' => 'Дата начала действия', - 'date_end' => 'Дата окончания действия', - 'discount_value' => 'Размер скидки', - 'discount_type' => 'Тип скидки', - 'discount_price' => 'Значение скидки', - 'discount' => 'Скидка', - 'product' => 'Товар', - 'priority' => 'Приоритет', - 'group' => 'Группа', - 'count' => 'Количество', - 'amount' => 'Сумма', - 'author' => 'Автор', - 'link' => 'Ссылка', - 'view_count' => 'Количество просмотров', - 'is_default' => 'По-умолчанию', - 'symbol' => 'Символ', - 'field' => 'Поле', - 'weight' => 'Вес', - 'height' => 'Высота', - 'length' => 'Длина', - 'width' => 'Ширина', - - 'sort_order' => 'Сортировка', - 'created_at' => 'Создано', - 'updated_at' => 'Обновлено', - 'deleted_at' => 'Удалено', - 'deleted' => 'Удаленные', - 'empty' => 'Не выбрано', - 'password' => 'Пароль', - - 'site_settings' => 'Настройки приложения', - 'site_settings_description' => 'Общие настройки приложения', - 'queue_on' => 'Отправка писем используя Queue', - 'queue_name' => 'Название queue для отправки письма', - 'import_queue_on' => 'Использовать queue при обработке импорта', - 'import_queue_name' => 'Название Queue при обработке импорта', - 'email_list_description' => 'Заполните список email адресов, разделенных запятыми', - 'import_deactivate' => 'Деактивировать элементы', - 'import_deactivate_description' => 'Все элементы, которых нет в CSV файле, будут деактивированы.', - - 'country' => 'Страна', - 'state' => 'Регион', - 'house' => 'Номер дома', - 'flat' => 'Номер квартиры', - 'address1' => 'Адрес 1', - 'address2' => 'Адрес 2', - 'postcode' => 'Индекс', - - 'import_file_list' => 'Список файлов импорта', - 'import_from_file' => 'Импорт из файла', - 'import_file_path' => 'Относительный путь из папки "storage" к файлу импорта', - 'import_path_prefix' => 'Префикс полей для этого файла', - 'import_file_namespace' => 'Пространство имен файла', - 'import_image_folder' => 'Относительный путь из папки "storage" к папке с изображениями', - 'import_path_to_list' => 'Путь к узлу со списком элементов', - 'import_path_to_list_example' => 'main/elements/element', - 'import_field_list' => 'Список полей', - 'import_path_to_field' => 'Путь к узлу поля', - 'import_path_to_field_example' => 'fields/field[@code="active"]', - ], - 'tab' => [ - 'preview_content' => 'Превью-контент', - 'full_content' => 'Полный контент', - 'images' => 'Изображения', - 'files' => 'Файлы', - 'settings' => 'Настройки', - 'description' => 'Описание', - 'properties' => 'Свойства', - 'mail' => 'Отправка писем', - 'import' => 'Импорт', - 'permissions' => 'Управление настройками приложения', - 'prices_format' => 'Формат цен', - ], - 'component' => [ - 'property_name_error_404' => 'Отображать 404 страницу', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Параметр Slug обязательный', - 'property_url_check' => 'Умная проверка URL', - 'pagination' => 'Пагинация', - 'pagination_desc' => 'Вывод кнопок пагинации', - - 'property_redirect_page' => 'Страница перенаправления', - 'property_redirect_success_page' => 'Страница перенаправления после успешного выполнения', - 'property_redirect_fail_page' => 'Страница перенаправления после не успешного выполнения', - 'property_redirect_on' => 'Перенаправление вкл.', - 'property_flash_on' => 'Уведомление вкл.', - 'property_mode' => 'Режим работы', - 'mode_submit' => 'Отправка формы', - 'mode_ajax' => 'Ajax', - 'has_wildcard' => 'Часть URL является wildcard параметром', - 'skip_error' => 'Пропустить ошибку "Не найдено"', - ], - 'message' => [ - 'create_success' => 'Создание :name было успешно выполнено', - 'update_success' => 'Редактирование :name было успешно выполнено', - 'delete_success' => 'Удаление :name было успешно выполнено', - 'restore_confirm' => 'Вы действительно хотите восстановить выбранные элементы?', - 'restore_success' => 'Элементы восстановлены', - 'e_not_correct_request' => 'Некорректный запрос', - 'row_is_empty' => 'Пустая строка.', - 'external_id_is_empty' => 'Пустое значение внешнего ID.', - 'import_additional_info' => 'Дополнительная информация о импорте.', - 'import_active_field_info' => 'Значение поля "Активность" будет уставлено в true, если его не передавать в файле CSV.', - 'import_preview_image_field_info' => 'Путь к файлу превью-изображения должен быть указан относительно директории хранилища в вашем проекте. Например: "app/media/image.jpg".', - 'import_images_field_info' => 'Путь к файлам изображениЙ должен быть указан относительно директории хранилища в вашем проекте. Например: "app/media/image.jpg". Пути к файлам должны быть указаны через запятую.', - 'import_from_xml_confirm' => 'Начать импорт из XML файла?', - 'import_from_xml_report' => 'Результаты импорта: создано - :created, обновлено - :updated, пропущено - :skipped, обработано - :processed.', - ], - 'settings' => [ - 'count_per_page' => 'Количество элементов на странице', - 'available_count_per_page' => 'Список допустимых значений для "count_per_page"', - 'available_count_per_page_desc' => 'Укажите список допустимых значений через запятую', - 'number_validation' => 'Необходимо ввести число', - 'pagination_limit' => 'Максимальное количество кнопок пагинации', - 'active_class' => 'Класс активной кнопки', - 'button_list' => 'Список кнопок', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Название кнопки', - 'button_limit' => 'Отображить после страницы', - 'button_number' => 'Отображить имя кнопки как число', - 'button_class' => 'CSS класс', - 'last_button' => '"Последняя"', - 'last-more_button' => '"Еще" (перед "Последняя")', - 'next_button' => '"Следующая"', - 'next-more_button' => '"Еще" (перед "Следующая")', - 'prev_button' => '"Предыдущая"', - 'prev-more_button' => '"Еще" (после "Предыдущая")', - 'first_button' => '"Первая"', - 'first-more_button' => '"Еще" (после "Первая")', - 'main_button' => '"Основная"', - 'slug_is_translatable' => 'URL поддерживает мультиязычность', - ], - 'button' => [ - 'add_property_value' => 'Добавить значение свойства', - 'import_from_csv' => 'Импорт из CSV', - 'export_in_csv' => 'Экспорт в CSV', - 'import_button' => 'Импортировать записи', - 'import_from_xml' => 'Импорт из XML', - ], - 'type' => [ - 'input' => 'Текстовое поле (input)', - 'number' => 'Числовое поле (number)', - 'textarea' => 'Текстовое поле (textarea)', - 'rich_editor' => 'Текстовое поле (wysiwyg)', - 'single_checkbox' => 'Чекбокс', - 'switch' => 'Переключатель', - 'checkbox' => 'Множественный выбор из списка (checkbox)', - 'balloon_selector' => 'Выбор из списка (balloon selector)', - 'tag_list' => 'Множественный выбор из списка (tag list)', - 'select' => 'Выбор из списка (select)', - 'radio' => 'Выбор из списка (radio button)', - 'date' => 'Поле выбора даты и времени (datetime)', - 'colorpicker' => 'Поле выбора цвета (colorpicker)', - 'mediafinder' => 'Файл', - ], - 'permission' => [ - 'settings' => 'Управление настройками', - ], -]; diff --git a/plugins/lovata/toolbox/lang/sk/lang.php b/plugins/lovata/toolbox/lang/sk/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/sk/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/sv/lang.php b/plugins/lovata/toolbox/lang/sv/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/sv/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/tr/lang.php b/plugins/lovata/toolbox/lang/tr/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/tr/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/uk/lang.php b/plugins/lovata/toolbox/lang/uk/lang.php deleted file mode 100644 index d825501b5..000000000 --- a/plugins/lovata/toolbox/lang/uk/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Категорія', - 'category_parent_id' => 'ID батьківської категорії', - 'category_parent' => 'Батьківська категорія', - 'children_category' => 'Категорії дітей', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/vi/lang.php b/plugins/lovata/toolbox/lang/vi/lang.php deleted file mode 100644 index d4743d058..000000000 --- a/plugins/lovata/toolbox/lang/vi/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => 'Toolbox', - 'description' => 'Toolbox is a set of helpers for faster development for October CMS.', - ], - 'field' => [ - 'id' => 'ID', - 'name' => 'Name', - 'title' => 'Title', - 'active' => 'Active', - 'hidden' => 'Hidden', - 'code' => 'Code', - 'slug' => 'URL', - 'external_id' => 'External ID', - 'preview_text' => 'Preview text', - 'preview_image' => 'Preview image', - 'image' => 'Image', - 'images' => 'Images (gallery)', - 'icon' => 'Icon', - 'description' => 'Description', - 'category' => 'Category', - 'category_parent_id' => 'Parent category ID', - 'category_parent' => 'Parent category', - 'children_category' => 'Children categories', - 'email' => 'Email', - 'phone' => 'Phone', - 'moderation' => 'Moderation', - 'mode' => 'Mode', - 'status' => 'Status', - 'city' => 'City', - 'address' => 'Address', - 'street' => 'Street', - 'lat' => 'lat', - 'lng' => 'lng', - 'type' => 'Type', - 'avatar' => 'Avatar', - 'property' => 'Property', - 'property_list_value' => 'Available property values', - 'property_mode' => 'Property mode', - 'property_tab' => 'Tab name', - 'property_is_translatable' => 'Property is translatable', - 'key' => 'Key', - 'value' => 'Value', - 'label' => 'Label', - 'date' => 'Date', - 'datetime' => 'Date and time', - 'time' => 'Time', - 'file' => 'File', - 'decimals' => 'Number of decimal places', - 'dec_point' => 'Fractional part separator', - 'thousands_sep' => 'Thousands separator', - 'dot' => 'Dot', - 'comma' => 'Comma', - 'together' => 'Merge', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => 'Discount value', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/lang/zh/lang.php b/plugins/lovata/toolbox/lang/zh/lang.php deleted file mode 100644 index c410a3f84..000000000 --- a/plugins/lovata/toolbox/lang/zh/lang.php +++ /dev/null @@ -1,191 +0,0 @@ - [ - 'name' => '工具框', - 'description' => '工具箱是一组帮助程序, 用于为 10月 cms 更快地开发。', - ], - 'field' => [ - 'id' => 'ID', - 'name' => '名称', - 'title' => '标题', - 'active' => '活动', - 'hidden' => '隐藏', - 'code' => '代码', - 'slug' => '网址', - 'external_id' => '外部 ID', - 'preview_text' => '预览文本', - 'preview_image' => '预览图片', - 'image' => '图片', - 'images' => '图片库', - 'icon' => 'Icon', - 'description' => '描述', - 'category' => '类别', - 'category_parent_id' => '父类别ID', - 'category_parent' => '父类别', - 'children_category' => '儿童类别', - 'email' => '邮箱', - 'phone' => '手机', - 'moderation' => '调试', - 'mode' => '模式', - 'status' => '状态', - 'city' => '城市', - 'address' => '地址', - 'street' => '街道', - 'lat' => 'Lat', - 'lng' => 'lng', - 'type' => '类型', - 'avatar' => '头像', - 'property' => '属性', - 'property_list_value' => '可用属性', - 'property_mode' => '属性模式', - 'property_tab' => '选项卡名称', - 'property_is_translatable' => '属性是可翻译的', - 'key' => '关键字', - 'value' => '数值', - 'label' => '标签', - 'date' => '日期', - 'datetime' => '日期和时间', - 'time' => '时间', - 'file' => '文件', - 'decimals' => '小数位数:', - 'dec_point' => '小数零件分离器', - 'thousands_sep' => '千位分隔符', - 'dot' => '点', - 'comma' => 'Comma', - 'together' => '合并', - 'space' => 'Space', - 'date_begin' => 'Date of the beginning', - 'date_end' => 'Date of the ending', - 'discount_value' => '折扣价', - 'discount_type' => 'Discount type', - 'discount_price' => 'Discount price', - 'discount' => 'Discount', - 'product' => 'Product', - 'priority' => 'Priority', - 'group' => 'Group', - 'count' => 'Count', - 'length' => 'Length', - 'amount' => 'Amount', - 'author' => 'Author', - 'link' => 'Link', - 'is_default' => 'Is default', - 'symbol' => 'Symbol', - - 'sort_order' => 'Sorting', - 'created_at' => 'Created', - 'updated_at' => 'Updated', - 'deleted_at' => 'Deleted', - 'deleted' => 'deleted', - 'empty' => 'Empty', - 'password' => 'Password', - - 'site_settings' => 'Application settings', - 'site_settings_description' => 'Common settings of application', - 'queue_on' => 'Sending messages from the queue', - 'queue_name' => 'The name of the queue for sending the emails', - 'import_queue_on' => 'Use queue when processing import items', - 'import_queue_name' => 'The name of the queue for processing import items', - 'email_list_description' => 'Fill out list of emails separated by commas', - 'import_deactivate' => 'Deactivate elements', - 'import_deactivate_description' => 'All active elements that are not in CSV file will be deactivated.', - - 'country' => 'Country', - 'state' => 'State', - 'house' => 'House number', - 'flat' => 'Flat number', - 'address1' => 'Address 1', - 'address2' => 'Address 2', - 'postcode' => 'Postcode', - ], - 'tab' => [ - 'preview_content' => 'Preview content', - 'full_content' => 'Content', - 'images' => 'Images', - 'settings' => 'Settings', - 'description' => 'Description', - 'properties' => 'Properties', - 'mail' => 'Sending emails', - 'import' => 'Import', - 'permissions' => 'Manage site settings', - 'prices_format' => 'Price format', - ], - 'component' => [ - 'property_name_error_404' => 'View 404 page', - 'property_slug' => 'Slug', - 'property_slug_required' => 'Slug is required', - 'property_url_check' => 'Smart url check', - 'pagination' => 'Pagination', - 'pagination_desc' => 'Render button of pagination', - - 'property_redirect_page' => 'Redirect page', - 'property_redirect_success_page' => 'Redirect success page', - 'property_redirect_fail_page' => 'Redirect fail page', - 'property_redirect_on' => 'Redirect ON', - 'property_flash_on' => 'Flash ON', - 'property_mode' => 'Component mode', - 'mode_submit' => 'Form submit', - 'mode_ajax' => 'Ajax', - ], - 'message' => [ - 'create_success' => 'Create :name was successfully', - 'update_success' => 'Update :name was successfully', - 'delete_success' => 'Delete :name was successfully', - 'restore_confirm' => 'Do you want to restore selected items?', - 'restore_success' => 'Restore elements was successfully', - 'e_not_correct_request' => 'Request is not correct', - 'row_is_empty' => 'Row is empty.', - 'external_id_is_empty' => 'External ID is empty.', - 'import_additional_info' => 'Additional import information.', - 'import_active_field_info' => 'Value of “active” field will be set to “true”, if it is not in CSV file.', - 'import_preview_image_field_info' => 'Path to preview image file must be set relative to storage directory of your project. For example: "app/media/image.jpg".', - 'import_images_field_info' => 'Path to image file must be set relative to storage directory of your project. For example: "app/media/image.jpg". Paths to image files must be separated by commas.', - ], - 'settings' => [ - 'count_per_page' => 'Count elements per page', - 'available_count_per_page' => 'List of available values for "count_per_page"', - 'available_count_per_page_desc' => 'Set allowed values separated by commas.', - 'number_validation' => 'You must enter the number', - 'pagination_limit' => 'Max count buttons', - 'active_class' => 'Class for active button', - 'button_list' => 'Button list', - 'button_list_description' => 'main,first,first-more,prev,prev-more,next,next-more,last,last-more', - 'button_name' => 'Button name', - 'button_limit' => 'Show button after page', - 'button_number' => 'Show number button name', - 'button_class' => 'CSS class', - 'last_button' => '"Last" button', - 'last-more_button' => '"More" (before "Last")', - 'next_button' => '"Next" button', - 'next-more_button' => '"More" (before "Next")', - 'prev_button' => '"Prev" button', - 'prev-more_button' => '"More" (after "Prev")', - 'first_button' => '"First" button', - 'first-more_button' => '"More" (after "First")', - 'main_button' => '"Main" button', - 'slug_is_translatable' => 'URL is translatable', - ], - 'button' => [ - 'add_property_value' => 'Add property value', - 'import_from_csv' => 'Import from CSV', - 'export_in_csv' => 'Export in CSV', - 'import_button' => 'Import records', - ], - 'type' => [ - 'input' => 'Text field (input)', - 'number' => 'Text field (number)', - 'textarea' => 'Text field (textarea)', - 'rich_editor' => 'Text field (wysiwyg)', - 'single_checkbox' => 'Single checkbox', - 'switch' => 'Switch', - 'checkbox' => 'Checkbox list (checkbox)', - 'balloon_selector' => 'Balloon selector', - 'tag_list' => 'Tag list', - 'select' => 'Select', - 'radio' => 'Radio button', - 'date' => 'Date picker (datetime)', - 'colorpicker' => 'Color picker (colorpicker)', - 'mediafinder' => 'File', - ], - 'permission' => [ - 'settings' => 'Manage settings', - ], -]; diff --git a/plugins/lovata/toolbox/models/CommonProperty.php b/plugins/lovata/toolbox/models/CommonProperty.php deleted file mode 100644 index f473b4b44..000000000 --- a/plugins/lovata/toolbox/models/CommonProperty.php +++ /dev/null @@ -1,497 +0,0 @@ - [\System\Models\File::class, 'public' => false], - ]; - - /** - * Get widget data - * @return array - */ - public function getWidgetData() - { - $arResult = []; - - switch ($this->type) { - case self::TYPE_INPUT: - $arResult = $this->getInputFieldSettings(); - break; - case self::TYPE_NUMBER: - $arResult = $this->getNumberFieldSettings(); - break; - case self::TYPE_TEXT_AREA: - $arResult = $this->getTextareaFieldSettings(); - break; - case self::TYPE_RICH_EDITOR: - $arResult = $this->getRichEditorFieldSettings(); - break; - case self::TYPE_SINGLE_CHECKBOX: - $arResult = $this->getSingleCheckboxFieldSettings(); - break; - case self::TYPE_SWITCH: - $arResult = $this->getSwitchFieldSettings(); - break; - case self::TYPE_CHECKBOX: - $arResult = $this->getCheckboxListSettings(); - break; - case self::TYPE_BALLOON: - $arResult = $this->getBalloonSettings(); - break; - case self::TYPE_TAG_LIST: - $arResult = $this->getTagListSettings(); - break; - case self::TYPE_SELECT: - $arResult = $this->getSelectSettings(); - break; - case self::TYPE_RADIO: - $arResult = $this->getRadioSettings(); - break; - case self::TYPE_DATE: - $arResult = $this->getDateSettings(); - break; - case self::TYPE_COLOR_PICKER: - $arResult = $this->getColorPickerSettings(); - break; - /** FILE FINDER TYPE */ - case self::TYPE_MEDIA_FINDER: - $arResult = $this->getMediaFinderSettings(); - break; - default: - return $arResult; - } - - //Get common widget settings - if (empty($arResult)) { - return $arResult; - } - - $arResult = array_merge($arResult, $this->getDefaultConfigSettings()); - - return $arResult; - } - - /** - * Get property variants from settings - * @return array - */ - public function getPropertyVariants() - { - $arValueList = []; - - //Get and check settings array - $arSettings = $this->settings; - if (empty($arSettings) || !isset($arSettings['list']) || empty($arSettings['list'])) { - return $arValueList; - } - - //Get property value variants - foreach ($arSettings['list'] as $arValue) { - if (!isset($arValue['value']) || empty($arValue['value'])) { - continue; - } - - $arValueList[$arValue['value']] = $arValue['value']; - } - - natsort($arValueList); - - return $arValueList; - } - - /** - * Check, property is translatable flag - * @return bool - */ - public function isTranslatable() - { - return (bool) $this->getSettingValue('is_translatable'); - } - - /** - * Get type list - * @return array - */ - public function getTypeOptions() - { - $sLangPath = 'lovata.toolbox::lang.type.'; - - return [ - self::TYPE_INPUT => Lang::get($sLangPath.self::TYPE_INPUT), - self::TYPE_NUMBER => Lang::get($sLangPath.self::TYPE_NUMBER), - self::TYPE_TEXT_AREA => Lang::get($sLangPath.self::TYPE_TEXT_AREA), - self::TYPE_RICH_EDITOR => Lang::get($sLangPath.self::TYPE_RICH_EDITOR), - self::TYPE_SINGLE_CHECKBOX => Lang::get($sLangPath.self::TYPE_SINGLE_CHECKBOX), - self::TYPE_SWITCH => Lang::get($sLangPath.self::TYPE_SWITCH), - self::TYPE_CHECKBOX => Lang::get($sLangPath.self::TYPE_CHECKBOX), - self::TYPE_TAG_LIST => Lang::get($sLangPath.self::TYPE_TAG_LIST), - self::TYPE_SELECT => Lang::get($sLangPath.self::TYPE_SELECT), - self::TYPE_RADIO => Lang::get($sLangPath.self::TYPE_RADIO), - self::TYPE_BALLOON => Lang::get($sLangPath.self::TYPE_BALLOON), - self::TYPE_DATE => Lang::get($sLangPath.self::TYPE_DATE), - self::TYPE_COLOR_PICKER => Lang::get($sLangPath.self::TYPE_COLOR_PICKER), - self::TYPE_MEDIA_FINDER => Lang::get($sLangPath.self::TYPE_MEDIA_FINDER), - ]; - } - - /** - * Import item list from CSV file - * @param array $arElementList - * @param null $sSessionKey - * @throws \Throwable - */ - public function importData($arElementList, $sSessionKey = null) - { - } - - /** - * Get field setting with type "text" - * @return array - */ - protected function getInputFieldSettings() : array - { - $arResult = [ - 'type' => 'text', - ]; - - if ($this->isTranslatable()) { - $arResult['type'] = 'mltext'; - } - - return $arResult; - } - - /** - * Get field setting with type "number" - * @return array - */ - protected function getNumberFieldSettings() : array - { - $arResult = [ - 'type' => 'number', - ]; - - return $arResult; - } - - /** - * Get field setting with type "textarea" - * @return array - */ - protected function getTextareaFieldSettings() : array - { - $arResult = [ - 'type' => 'textarea', - 'size' => 'large', - ]; - - if ($this->isTranslatable()) { - $arResult['type'] = 'mltextarea'; - } - - return $arResult; - } - - /** - * Get field setting with type "rich editor" - * @return array - */ - protected function getRichEditorFieldSettings() : array - { - $arResult = [ - 'type' => 'richeditor', - 'size' => 'large', - ]; - - if ($this->isTranslatable()) { - $arResult['type'] = 'mlricheditor'; - } - - return $arResult; - } - - /** - * Get field setting with type "checkbox" - * @return array - */ - protected function getSingleCheckboxFieldSettings() : array - { - $arResult = [ - 'type' => 'checkbox', - ]; - - return $arResult; - } - - /** - * Get field setting with type "switch" - * @return array - */ - protected function getSwitchFieldSettings() : array - { - $arResult = [ - 'type' => 'switch', - ]; - - return $arResult; - } - - /** - * Get field setting with type "checkbox list" - * @return array - */ - protected function getCheckboxListSettings() : array - { - //Get property variants - $arValueList = $this->getPropertyVariants(); - if (empty($arValueList)) { - return []; - } - - $arResult = [ - 'type' => 'checkboxlist', - 'options' => $arValueList, - ]; - - return $arResult; - } - - /** - * Get field setting with type "balloon-selector" - * @return array - */ - protected function getBalloonSettings() : array - { - //Get property variants - $arValueList = $this->getPropertyVariants(); - if (empty($arValueList)) { - return []; - } - - $arResult = [ - 'type' => 'balloon-selector', - 'options' => $arValueList, - ]; - - return $arResult; - } - - /** - * Get field setting with type "tag list" - * @return array - */ - protected function getTagListSettings() : array - { - //Get property variants - $arValueList = $this->getPropertyVariants(); - if (empty($arValueList)) { - return []; - } - - $arResult = [ - 'type' => 'taglist', - 'options' => $arValueList, - ]; - - return $arResult; - } - - /** - * Get field setting with type "select" - * @return array - */ - protected function getSelectSettings() : array - { - //Get property variants - $arValueList = $this->getPropertyVariants(); - if (empty($arValueList)) { - return []; - } - - $arResult = [ - 'type' => 'dropdown', - 'emptyOption' => 'lovata.toolbox::lang.field.empty', - 'options' => $arValueList, - ]; - - return $arResult; - } - - /** - * Get field setting with type "radio" - * @return array - */ - protected function getRadioSettings() : array - { - //Get property variants - $arValueList = $this->getPropertyVariants(); - if (empty($arValueList)) { - return []; - } - - $arResult = [ - 'type' => 'radio', - 'options' => $arValueList, - ]; - - return $arResult; - } - - /** - * Get field setting with type "date" - * @return array - */ - protected function getDateSettings() : array - { - $sMode = $this->getSettingValue('datepicker'); - if (!in_array($sMode, ['date', 'time', 'datetime'])) { - return []; - } - - $arResult = [ - 'type' => 'datepicker', - 'mode' => $sMode, - ]; - - return $arResult; - } - - /** - * Get field setting with type "color picker" - * @return array - */ - protected function getColorPickerSettings() : array - { - $arResult = [ - 'type' => self::TYPE_COLOR_PICKER, - ]; - - return $arResult; - } - - /** - * Get field setting with type "media finder" - * @return array - */ - protected function getMediaFinderSettings() : array - { - $sMode = $this->getSettingValue(self::TYPE_MEDIA_FINDER); - if (!in_array($sMode, ['file', 'image'])) { - return []; - } - - $arResult = [ - 'type' => self::TYPE_MEDIA_FINDER, - 'mode' => $sMode, - ]; - - return $arResult; - } - - /** - * Get default config field settings - * @return array - */ - protected function getDefaultConfigSettings() : array - { - $arResult = [ - 'tab' => 'lovata.toolbox::lang.tab.properties', - 'span' => 'left', - 'label' => $this->name, - 'comment' => $this->description, - ]; - - //Get property tab - $sTabName = $this->getSettingValue('tab'); - if (!empty($sTabName)) { - $arResult['tab'] = $sTabName; - } - - return $arResult; - } - /** - * Get property settings value - * @param string $sKey - * @return mixed|null - */ - protected function getSettingValue($sKey) - { - $arSettings = $this->settings; - if (empty($sKey) || empty($arSettings) || !isset($arSettings[$sKey])) { - return null; - } - - return $arSettings[$sKey]; - } -} diff --git a/plugins/lovata/toolbox/models/CommonSettings.php b/plugins/lovata/toolbox/models/CommonSettings.php deleted file mode 100644 index e28796589..000000000 --- a/plugins/lovata/toolbox/models/CommonSettings.php +++ /dev/null @@ -1,61 +0,0 @@ -first(); - if (empty($obSettings)) { - static::$arCacheValue[$sCode] = static::get($sCode, $sDefaultValue); - - return static::$arCacheValue[$sCode]; - } - - $sValue = $obSettings->$sCode; - if ($sValue === null) { - return $sDefaultValue; - } - - static::$arCacheValue[$sCode] = $sValue; - - return $sValue; - } -} diff --git a/plugins/lovata/toolbox/models/Settings.php b/plugins/lovata/toolbox/models/Settings.php deleted file mode 100644 index b14e9b3ac..000000000 --- a/plugins/lovata/toolbox/models/Settings.php +++ /dev/null @@ -1,15 +0,0 @@ - - - - - ./tests/unit - - - -         -            ./classes/collection/CollectionStore.php -            ./classes/collection/ElementCollection.php -            ./classes/item/ElementItem.php -            ./classes/item/MainItem.php -         -     - - - - - - \ No newline at end of file diff --git a/plugins/lovata/toolbox/plugin.yaml b/plugins/lovata/toolbox/plugin.yaml deleted file mode 100644 index 68c23d2aa..000000000 --- a/plugins/lovata/toolbox/plugin.yaml +++ /dev/null @@ -1,11 +0,0 @@ -plugin: - name: 'lovata.toolbox::lang.plugin.name' - description: 'lovata.toolbox::lang.plugin.description' - author: Lovata - icon: oc-icon-star - homepage: 'https://github.com/lovata/oc-toolbox-plugin' -permissions: - toolbox-menu-settings: - tab: 'lovata.toolbox::lang.tab.permissions' - label: 'lovata.toolbox::lang.permission.settings' - order: 100 \ No newline at end of file diff --git a/plugins/lovata/toolbox/tests/CommonTest.php b/plugins/lovata/toolbox/tests/CommonTest.php deleted file mode 100644 index a878dd510..000000000 --- a/plugins/lovata/toolbox/tests/CommonTest.php +++ /dev/null @@ -1,49 +0,0 @@ -getPlugins()); - foreach ($arPluginList as $sPluginKey) { - if(!preg_match('%^lovata.*%i', $sPluginKey)) { - continue; - } - - $obManager->refreshPlugin($sPluginKey); - } - - $obManager->bootAll(true); - $obManager->registerAll(true); - } - - public function tearDown(): void - { - parent::tearDown(); - - // Get the plugin manager - $obManager = PluginManager::instance(); - - // Ensure that plugins are registered again for the next test - $obManager->unregisterAll(); - } -} diff --git a/plugins/lovata/toolbox/tests/unit/CollectionStoreTest.php b/plugins/lovata/toolbox/tests/unit/CollectionStoreTest.php deleted file mode 100644 index 8722a5079..000000000 --- a/plugins/lovata/toolbox/tests/unit/CollectionStoreTest.php +++ /dev/null @@ -1,42 +0,0 @@ -saved('test')); - - CollectionStore::instance()->save('', $obList); - self::assertEquals(null, CollectionStore::instance()->saved('')); - - CollectionStore::instance()->save('test', $obList); - - $obList->merge([2]); - $obSavedList = CollectionStore::instance()->saved('test'); - - self::assertEquals([1], $obSavedList->getIDList()); - - $obSavedList->clear(); - - self::assertEquals([1,2], $obList->getIDList()); - } -} \ No newline at end of file diff --git a/plugins/lovata/toolbox/tests/unit/CollectionTest.php b/plugins/lovata/toolbox/tests/unit/CollectionTest.php deleted file mode 100644 index 4b215a52a..000000000 --- a/plugins/lovata/toolbox/tests/unit/CollectionTest.php +++ /dev/null @@ -1,734 +0,0 @@ -arElementIDList); - self::assertEquals($this->arElementIDList, $obCollection->getIDList(), $sMessage); - - $sMessage = 'Error in "make" collection method'; - self::assertEquals(true, $obCollection->isNotEmpty(), $sMessage); - self::assertEquals(false, $obCollection->isEmpty(), $sMessage); - } - - /** - * Test set method in item collection class - */ - public function testSetMethod() - { - $sMessage = 'Error in "set" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - self::assertEquals($this->arElementIDList, $obCollection->getIDList(), $sMessage); - - $obCollection->set($this->arIntersectIDList); - self::assertEquals($this->arIntersectIDList, $obCollection->getIDList(), $sMessage); - } - - /** - * Test "has" method in item collection class - */ - public function testHasMethod() - { - $sMessage = 'Error in "has" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $iElementID = array_shift($this->arElementIDList); - self::assertEquals(true, $obCollection->has($iElementID), $sMessage); - self::assertEquals(false, $obCollection->has(null), $sMessage); - } - - /** - * Test find method in item collection class - */ - public function testFindMethod() - { - $sMessage = 'Error in "find" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $obItem = $obCollection->find($this->arElementIDList[0]); - self::assertEquals($this->arElementIDList[0], $obItem->id, $sMessage); - } - - /** - * Test clear method in item collection class - */ - public function testClearMethod() - { - $sMessage = 'Error in "clear" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->clear(); - - self::assertEquals([], $obCollection->getIDList(), $sMessage); - } - - /** - * Test count method in item collection class - */ - public function testCountMethod() - { - $sMessage = 'Error in "count" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - self::assertEquals(count($this->arElementIDList), $obCollection->count(), $sMessage); - - $obCollection = TestCollection::make(); - self::assertEquals(0, $obCollection->count(), $sMessage); - } - - /** - * Test intersect method in item collection class - */ - public function testIntersectMethod() - { - $sMessage = 'Error in "intersect" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->intersect($this->arIntersectIDList); - - $arResult = array_intersect($this->arElementIDList, $this->arIntersectIDList); - $arResult = array_values($arResult); - - self::assertEquals($arResult, $obCollection->getIDList(), $sMessage); - - //Test intersect with empty array - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->intersect(null); - - self::assertEquals([], $obCollection->getIDList(), $sMessage); - - //Test intersect with clear collection - $obCollection = TestCollection::make(); - $obCollection->intersect($this->arIntersectIDList); - - self::assertEquals($this->arIntersectIDList, $obCollection->getIDList(), $sMessage); - - $obCollection = TestCollection::make()->intersect(null); - $obCollection->intersect($this->arIntersectIDList); - - self::assertEquals([], $obCollection->getIDList(), $sMessage); - } - - /** - * Test applySorting method in item collection class - */ - public function testApplySortingMethod() - { - $arSortedList = [5,3,4, 12, 20]; - - $sMessage = 'Error in "applySorting" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->applySorting($arSortedList); - - $arResult = array_intersect($arSortedList, $this->arElementIDList); - - self::assertEquals($arResult, $obCollection->getIDList(), $sMessage); - - //Test intersect with empty array - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->applySorting(null); - - self::assertEquals([], $obCollection->getIDList(), $sMessage); - - //Test intersect with clear collection - $obCollection = TestCollection::make(); - $obCollection->applySorting($this->arIntersectIDList); - - self::assertEquals($this->arIntersectIDList, $obCollection->getIDList(), $sMessage); - - $obCollection = TestCollection::make()->intersect(null); - $obCollection->applySorting($arSortedList); - - self::assertEquals([], $obCollection->getIDList(), $sMessage); - } - - /** - * Test merge method in item collection class - */ - public function testMergeMethod() - { - $sMessage = 'Error in "merge" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->merge($this->arIntersectIDList); - - $arResult = array_merge($this->arElementIDList, $this->arIntersectIDList); - $arResult = array_unique($arResult); - $arResult = array_values($arResult); - - self::assertEquals($arResult, $obCollection->getIDList(), $sMessage); - - //test merge with empty array - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->merge(null); - - self::assertEquals($this->arElementIDList, $obCollection->getIDList(), $sMessage); - - //test merge with empty collection - $obCollection = TestCollection::make(); - $obCollection->merge($this->arIntersectIDList); - - self::assertEquals($this->arIntersectIDList, $obCollection->getIDList(), $sMessage); - } - - /** - * Test diff method in item collection class - */ - public function testDiffMethod() - { - $sMessage = 'Error in "diff" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->diff($this->arIntersectIDList); - - $arResult = array_diff($this->arElementIDList, $this->arIntersectIDList); - - self::assertEquals($arResult, $obCollection->getIDList(), $sMessage); - - //Test method with empty array - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->diff(null); - - self::assertEquals($this->arElementIDList, $obCollection->getIDList(), $sMessage); - - //Test method empty diff result - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->diff($this->arElementIDList); - - self::assertEquals([], $obCollection->getIDList(), $sMessage); - } - - /** - * Test all method in item collection class - */ - public function testAllMethod() - { - $sMessage = 'Error in "all" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $arElementIDList = $this->arElementIDList; - $arResult = $obCollection->all(); - foreach ($arResult as $iKey => $obItem) { - self::assertEquals(array_shift($arElementIDList), $obItem->id, $sMessage); - } - - $obCollection = TestCollection::make(); - - $arResult = $obCollection->all(); - self::assertEquals([], $arResult, $sMessage); - } - - /** - * Test take method in item collection class - */ - public function testTakeMethod() - { - $sMessage = 'Error in "take" collection method'; - - $obCollection = TestCollection::make([]); - $arResult = $obCollection->take(2); - self::assertEquals([], $arResult, $sMessage); - - $obCollection = TestCollection::make($this->arElementIDList); - - $arElementIDList = $this->arElementIDList; - $arResult = $obCollection->take(null); - - self::assertEquals(count($arElementIDList), count($arResult), $sMessage); - foreach ($arResult as $iKey => $obItem) { - self::assertEquals(array_shift($arElementIDList), $obItem->id, $sMessage); - } - - $arElementIDList = $this->arElementIDList; - $arResult = $obCollection->take(2); - - self::assertEquals(2, count($arResult), $sMessage); - foreach ($arResult as $iKey => $obItem) { - self::assertEquals(array_shift($arElementIDList), $obItem->id, $sMessage); - } - - $arElementIDList = $this->arElementIDList; - $arResult = $obCollection->skip(1)->take(2); - - array_shift($arElementIDList); - self::assertEquals(2, count($arResult), $sMessage); - foreach ($arResult as $iKey => $obItem) { - self::assertEquals(array_shift($arElementIDList), $obItem->id, $sMessage); - } - - $arResult = $obCollection->skip(10)->take(2); - self::assertEquals([], $arResult, $sMessage); - } - - /** - * Test exclude method in item collection class - */ - public function testExcludeMethod() - { - $sMessage = 'Error in "exclude" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $obItem = $obCollection->find(3); - self::assertEquals(true, $obItem->isNotEmpty(), $sMessage); - - $obCollection->exclude(3); - - $obItem = $obCollection->find(3); - self::assertEquals(true, $obItem->isEmpty(), $sMessage); - - //Exclude from empty collection - $obCollection = TestCollection::make(); - $obCollection->exclude(3); - - self::assertEquals(true, $obItem->isEmpty(), $sMessage); - - //Exclude missing element - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->exclude(15); - - self::assertEquals(count($this->arElementIDList), $obCollection->count(), $sMessage); - } - - /** - * Test random method in item collection class - */ - public function testRandomMethod() - { - $sMessage = 'Error in "random" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $arResult = $obCollection->random(1); - $obItem = array_shift($arResult); - self::assertEquals(true, $obCollection->has($obItem->id), $sMessage); - - $arResult = $obCollection->random(-1); - $obItem = array_shift($arResult); - self::assertEquals(true, $obCollection->has($obItem->id), $sMessage); - - $arResult = $obCollection->random($obCollection->count() + 1); - self::assertEquals($obCollection->count(), count($arResult), $sMessage); - - $obCollection = TestCollection::make(); - - $arResult = $obCollection->random(1); - self::assertEquals([], $arResult, $sMessage); - } - - /** - * Test page method in item collection class - */ - public function testPageMethod() - { - $sMessage = 'Error in "page" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $arElementIDList = $this->arElementIDList; - $arResult = $obCollection->page(2, 1); - - self::assertEquals(1, count($arResult), $sMessage); - - array_shift($arElementIDList); - foreach ($arResult as $iKey => $obItem) { - self::assertEquals(array_shift($arElementIDList), $obItem->id, $sMessage); - } - - $arResult = $obCollection->page(-1, 1); - - self::assertEquals(1, count($arResult), $sMessage); - - $arElementIDList = $this->arElementIDList; - foreach ($arResult as $iKey => $obItem) { - self::assertEquals(array_shift($arElementIDList), $obItem->id, $sMessage); - } - - $arResult = $obCollection->page(1, -1); - self::assertEquals($obCollection->count(), count($arResult), $sMessage); - } - - /** - * Test first method in item collection class - */ - public function testFirstMethod() - { - $sMessage = 'Error in "first" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $obItem = $obCollection->first(); - self::assertEquals($this->arElementIDList[0], $obItem->id, $sMessage); - self::assertEquals(count($this->arElementIDList), $obCollection->count(), $sMessage); - - $obCollection = TestCollection::make(); - - $obItem = $obCollection->first(); - self::assertEquals(true, $obItem->isEmpty(), $sMessage); - } - - /** - * Test last method in item collection class - */ - public function testLastMethod() - { - $sMessage = 'Error in "last" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $obItem = $obCollection->last(); - self::assertEquals($this->arElementIDList[count($this->arElementIDList) -1], $obItem->id, $sMessage); - self::assertEquals(count($this->arElementIDList), $obCollection->count(), $sMessage); - - $obCollection = TestCollection::make(); - - $obItem = $obCollection->last(); - self::assertEquals(true, $obItem->isEmpty(), $sMessage); - } - - /** - * Test shift method in item collection class - */ - public function testShiftMethod() - { - $sMessage = 'Error in "shift" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $obItem = $obCollection->shift(); - self::assertEquals(array_shift($this->arElementIDList), $obItem->id, $sMessage); - self::assertEquals(count($this->arElementIDList), $obCollection->count(), $sMessage); - - $obCollection = TestCollection::make(); - - $obItem = $obCollection->shift(); - self::assertEquals(true, $obItem->isEmpty(), $sMessage); - } - - /** - * Test unshift method in item collection class - */ - public function testUnshiftMethod() - { - $sMessage = 'Error in "unshift" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $obCollection->unshift(null); - self::assertEquals(count($this->arElementIDList), $obCollection->count(), $sMessage); - - $obCollection->unshift(10); - - $obItem = $obCollection->first(); - self::assertEquals(10, $obItem->id, $sMessage); - - $obCollection = TestCollection::make(); - - $obCollection->unshift(10); - $obItem = $obCollection->first(); - self::assertEquals(10, $obItem->id, $sMessage); - self::assertEquals(1, $obCollection->count(), $sMessage); - } - - - /** - * Test push method in item collection class - */ - public function testPushMethod() - { - $sMessage = 'Error in "push" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $obCollection->push(null); - self::assertEquals(count($this->arElementIDList), $obCollection->count(), $sMessage); - - $obCollection->push(10); - - $obItem = $obCollection->last(); - self::assertEquals(10, $obItem->id, $sMessage); - - $obCollection = TestCollection::make(); - - $obCollection->push(10); - $obItem = $obCollection->last(); - self::assertEquals(10, $obItem->id, $sMessage); - self::assertEquals(1, $obCollection->count(), $sMessage); - } - - /** - * Test pop method in item collection class - */ - public function testPopMethod() - { - $sMessage = 'Error in "pop" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $obItem = $obCollection->pop(); - self::assertEquals(array_pop($this->arElementIDList), $obItem->id, $sMessage); - self::assertEquals(count($this->arElementIDList), $obCollection->count(), $sMessage); - - $obCollection = TestCollection::make(); - - $obItem = $obCollection->pop(); - self::assertEquals(true, $obItem->isEmpty(), $sMessage); - } - - /** - * Test pluck method in item collection class - */ - public function testPluckMethod() - { - $sMessage = 'Error in "pluck" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $arResult = $obCollection->pluck('id'); - self::assertEquals($this->arElementIDList, $arResult, $sMessage); - - $obCollection = TestCollection::make(); - - $arResult = $obCollection->pluck('id'); - self::assertEquals(null, $arResult, $sMessage); - } - - /** - * Test implode method in item collection class - */ - public function testImplodeMethod() - { - $sMessage = 'Error in "implode" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - $sResult = $obCollection->implode('id'); - self::assertEquals(implode(', ', $this->arElementIDList), $sResult, $sMessage); - - $sResult = $obCollection->implode('id', '-'); - self::assertEquals(implode('-', $this->arElementIDList), $sResult, $sMessage); - - $obCollection = TestCollection::make(); - - $sResult = $obCollection->implode('id'); - self::assertEquals(null, $sResult, $sMessage); - } - - /** - * Test getNearestNext method in item collection class - */ - public function testGetNearestNextMethod() - { - $sMessage = 'Error in "getNearestNext" collection method'; - - $obCollection = TestCollection::make(); - - //Test method with empty collection - $obResult = $obCollection->getNearestNext(1); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - //Get not empty collection - $obCollection = TestCollection::make($this->arElementIDList); - - //Test method with empty data - $obResult = $obCollection->getNearestNext(null); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - $obResult = $obCollection->getNearestNext(1, 0); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - $obResult = $obCollection->getNearestNext(1, -1); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - $obResult = $obCollection->getNearestNext(100); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - //Get nearest elements #1 - $obResult = $obCollection->getNearestNext(1); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(1, $obResult->count(), $sMessage); - - $obItem = $obResult->first(); - self::assertInstanceOf(TestItem::class, $obItem, $sMessage); - self::assertEquals(2, $obItem->id, $sMessage); - - //Get nearest elements #2 - $obResult = $obCollection->getNearestNext(5); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - //Get nearest elements #3 - $obResult = $obCollection->getNearestNext(4, 2); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(1, $obResult->count(), $sMessage); - - $obItem = $obResult->first(); - self::assertInstanceOf(TestItem::class, $obItem, $sMessage); - self::assertEquals(5, $obItem->id, $sMessage); - - //Get nearest elements #4 - $obResult = $obCollection->getNearestNext(4, 2, true); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(2, $obResult->count(), $sMessage); - - $obItem = $obResult->last(); - self::assertInstanceOf(TestItem::class, $obItem, $sMessage); - self::assertEquals(1, $obItem->id, $sMessage); - - //Get nearest elements #10 - $obResult = $obCollection->getNearestNext(10, 2, true); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(0, $obResult->count(), $sMessage); - } - - /** - * Test getNearestPrev method in item collection class - */ - public function testGetNearestPrevMethod() - { - $sMessage = 'Error in "getNearestPrev" collection method'; - - $obCollection = TestCollection::make(); - - //Test method with empty collection - $obResult = $obCollection->getNearestPrev(1); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - //Get not empty collection - $obCollection = TestCollection::make($this->arElementIDList); - - //Test method with empty data - $obResult = $obCollection->getNearestPrev(null); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - $obResult = $obCollection->getNearestPrev(1, 0); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - $obResult = $obCollection->getNearestPrev(1, -1); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - $obResult = $obCollection->getNearestPrev(100); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - //Get nearest elements #1 - $obResult = $obCollection->getNearestPrev(5); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(1, $obResult->count(), $sMessage); - - $obItem = $obResult->first(); - self::assertInstanceOf(TestItem::class, $obItem, $sMessage); - self::assertEquals(4, $obItem->id, $sMessage); - - //Get nearest elements #2 - $obResult = $obCollection->getNearestPrev(1); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(true, $obResult->isEmpty(), $sMessage); - - //Get nearest elements #3 - $obResult = $obCollection->getNearestPrev(2, 2); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(1, $obResult->count(), $sMessage); - - $obItem = $obResult->first(); - self::assertInstanceOf(TestItem::class, $obItem, $sMessage); - self::assertEquals(1, $obItem->id, $sMessage); - - //Get nearest elements #4 - $obResult = $obCollection->getNearestPrev(2, 2, true); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(2, $obResult->count(), $sMessage); - - $obItem = $obResult->last(); - self::assertInstanceOf(TestItem::class, $obItem, $sMessage); - self::assertEquals(5, $obItem->id, $sMessage); - - //Get nearest elements #10 - $obResult = $obCollection->getNearestPrev(10, 2, true); - - self::assertInstanceOf(TestCollection::class, $obResult, $sMessage); - self::assertEquals(0, $obResult->count(), $sMessage); - } - - /** - * Test save/saved method in item collection class - */ - public function testSaveMethod() - { - $sMessage = 'Error in "save" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - $obCollection->save('test'); - - $obCollection = TestCollection::make()->saved('test'); - self::assertEquals($this->arElementIDList, $obCollection->getIDList(), $sMessage); - - $obCollection->save(null); - - $obCollection = TestCollection::make()->saved(null); - self::assertEquals(null, $obCollection, $sMessage); - } - - /** - * Test debug method in item collection class - */ - public function testDebugMethod() - { - $sMessage = 'Error in "debug" collection method'; - $obCollection = TestCollection::make($this->arElementIDList); - - self::assertEquals($obCollection, $obCollection->debug(), $sMessage); - } - - /** - * Test iterator interface in item collection class - */ - public function testIteratorInterface() - { - $sMessage = 'Error in iteration collection'; - $obCollection = TestCollection::make($this->arElementIDList); - - foreach ($obCollection as $iKey => $obItem) { - self::assertEquals(array_shift($this->arElementIDList), $obItem->id, $sMessage); - } - - $obCollection = TestCollection::make([]); - - foreach ($obCollection as $iKey => $obItem) { - self::assertEquals(array_shift($this->arElementIDList), $obItem->id, $sMessage); - } - } -} \ No newline at end of file diff --git a/plugins/lovata/toolbox/tests/unit/ItemTest.php b/plugins/lovata/toolbox/tests/unit/ItemTest.php deleted file mode 100644 index 031231f6f..000000000 --- a/plugins/lovata/toolbox/tests/unit/ItemTest.php +++ /dev/null @@ -1,82 +0,0 @@ -id, 'Error in "make" item method'); - self::assertEquals(false, empty($obItem->id), 'Error in "__isset" item method'); - - $obItem = TestItem::makeNoCache(1); - self::assertEquals(1, $obItem->id, 'Error in "makeNoCache" item method'); - - $arItemData = [ - 'id' => 1, - 'test_id' => 2, - 'title' => 'title1', - 'test_list_id' => [1,2], - ]; - - self::assertEquals($arItemData, $obItem->toArray(), 'Error in "toArray" item method'); - - self::assertInstanceOf(\Model::class, $obItem->getObject(), 'Error in "getObject" item method'); - } - - /** - * Test item relations - */ - public function testItemRelations() - { - $sMessage = 'Error in relation methods'; - $obItem = TestItem::make(1); - - $obRelationItem = $obItem->test; - self::assertInstanceOf(TestItem::class, $obRelationItem, $sMessage); - self::assertEquals(2, $obRelationItem->id, $sMessage); - - $obRelationItem = $obItem->test; - self::assertInstanceOf(TestItem::class, $obRelationItem, $sMessage); - self::assertEquals(2, $obRelationItem->id, $sMessage); - - $obRelationItem = $obItem->test_null; - self::assertEquals(null, $obRelationItem, $sMessage); - - $obRelationItem = $obItem->test_class; - self::assertEquals(null, $obRelationItem, $sMessage); - - $obRelationItem = $obItem->test_field; - self::assertEquals(null, $obRelationItem, $sMessage); - - $obRelationItem = $obItem->test_exist; - self::assertEquals(null, $obRelationItem, $sMessage); - - /** @var TestCollection $obRelationList */ - $obRelationList = $obItem->test_list; - self::assertInstanceOf(TestCollection::class, $obRelationList, $sMessage); - self::assertEquals(2, $obRelationList->count(), $sMessage); - - /** @var TestCollection $obRelationList */ - $obRelationList = $obItem->test_empty_list; - self::assertInstanceOf(TestCollection::class, $obRelationList, $sMessage); - self::assertEquals(0, $obRelationList->count(), $sMessage); - self::assertEquals([], $obRelationList->getIDList(), $sMessage); - } -} \ No newline at end of file diff --git a/plugins/lovata/toolbox/traits/console/LogoTrait.php b/plugins/lovata/toolbox/traits/console/LogoTrait.php deleted file mode 100644 index bd4e2dc97..000000000 --- a/plugins/lovata/toolbox/traits/console/LogoTrait.php +++ /dev/null @@ -1,38 +0,0 @@ -███──████──████──█────████───████──██─██', - '─█───█──█──█──█──█────█──██──█──█───███', - '─█───█──█──█──█──█────████───█──█────█', - '─█───█──█──█──█──█────█──██──█──█───███', - '─█───████──████──███──████───████──██─██', - ]; - /** @var array */ - protected $arLogoLovata = [ - '█──────████───█───█───████──███████──████', - '█──────█──█───█───█───█──█─────█─────█──█', - '█──────█──█───█───█───████─────█─────████', - '█──────█──█────███────█──█─────█─────█──█', - '█████──████─────█─────█──█─────█─────█──█', - ]; - - /** - * Write logo toolbox - */ - protected function logoToolBox() - { - $this->output->newLine(1); - $this->output->writeln($this->arLogoLovata); - $this->output->newLine(1); - $this->output->writeln($this->arLogoToolBox); - $this->output->newLine(1); - } -} diff --git a/plugins/lovata/toolbox/traits/console/UpdateLangFile.php b/plugins/lovata/toolbox/traits/console/UpdateLangFile.php deleted file mode 100644 index 6039012a2..000000000 --- a/plugins/lovata/toolbox/traits/console/UpdateLangFile.php +++ /dev/null @@ -1,55 +0,0 @@ -arData) || empty($this->arData)) { - return []; - } - - $sLowerAuthor = array_get($this->arData, 'replace.'.self::PREFIX_LOWER.self::CODE_AUTHOR); - $sLowerPlugin = array_get($this->arData, 'replace.'.self::PREFIX_LOWER.self::CODE_PLUGIN); - - $sFolderPath = plugins_path($sLowerAuthor.'/'.$sLowerPlugin.'/lang'); - - if (empty($sLowerAuthor) || empty($sLowerPlugin) || !file_exists($sFolderPath)) { - return []; - } - - $arLangList = scandir($sFolderPath); - array_shift($arLangList); - array_shift($arLangList); - - return $arLangList; - } - - /** - * Update lang file - * @param array $arLangData - */ - protected function updatePluginLang($arLangData) - { - if (empty($arLangData)) { - return; - } - - foreach ($this->getLangList() as $sLang) { - array_set($this->arData, 'replace.lang', $sLang); - - $obUpdate = new PluginLangUpdateFile($this->arData); - $obUpdate->update($arLangData); - } - } -} diff --git a/plugins/lovata/toolbox/traits/helpers/PriceHelperTrait.php b/plugins/lovata/toolbox/traits/helpers/PriceHelperTrait.php deleted file mode 100644 index 76ebe74aa..000000000 --- a/plugins/lovata/toolbox/traits/helpers/PriceHelperTrait.php +++ /dev/null @@ -1,168 +0,0 @@ -arPriceField) || !is_array($obElement->arPriceField)) { - return; - } - - foreach ($obElement->arPriceField as $sFieldName) { - if (empty($sFieldName) || !is_string($sFieldName)) { - continue; - } - - $sFieldConvert = Str::studly($sFieldName); - - self::addGetPriceFieldMethod($obElement, $sFieldName, $sFieldConvert); - - if ($obElement instanceof Model) { - self::addSetPriceFieldMethod($obElement, $sFieldName, $sFieldConvert); - self::addGetPriceValueFieldMethod($obElement, $sFieldName, $sFieldConvert); - - self::addScopePriceFieldMethod($obElement, $sFieldName, $sFieldConvert); - } - } - } - - /** - * Add set{field_name}Attribute methods - * @param \Model|\Eloquent|\Lovata\Toolbox\Classes\Item\ElementItem $obElement $obElement - * @param string $sFieldName - * @param string $sFieldConvert - */ - protected static function addSetPriceFieldMethod($obElement, $sFieldName, $sFieldConvert) - { - $sMethodName = 'set'.$sFieldConvert.'Attribute'; - if (method_exists($obElement, $sMethodName)) { - return; - } - - $obElement->addDynamicMethod($sMethodName, function ($sValue) use ($sFieldName, $obElement) { - - $fPrice = PriceHelper::toFloat($sValue); - $obElement->attributes[$sFieldName] = $fPrice; - }); - } - - /** - * Add get{field_name}ValueAttribute methods - * @param \Model|\Eloquent|\Lovata\Toolbox\Classes\Item\ElementItem $obElement $obElement - * @param string $sFieldName - * @param string $sFieldConvert - */ - protected static function addGetPriceValueFieldMethod($obElement, $sFieldName, $sFieldConvert) - { - $sMethodName = 'get'.$sFieldConvert.'ValueAttribute'; - if (method_exists($obElement, $sMethodName)) { - return; - } - - if ($obElement instanceof ElementItem) { - $obElement->addDynamicMethod($sMethodName, function ($obElement) use ($sFieldName) { - /** @var \Model|\Eloquent|\Lovata\Toolbox\Classes\Item\ElementItem $obElement */ - $fPrice = 0; - if (isset($obElement->attributes[$sFieldName])) { - $fPrice = $obElement->attributes[$sFieldName]; - } - - return $fPrice; - }); - } else { - $obElement->addDynamicMethod($sMethodName, function () use ($sFieldName, $obElement) { - $fPrice = 0; - if (isset($obElement->attributes[$sFieldName])) { - $fPrice = $obElement->attributes[$sFieldName]; - } - - return $fPrice; - }); - } - } - - /** - * Add get{field_name}Attribute methods - * @param \Model|\Eloquent|\Lovata\Toolbox\Classes\Item\ElementItem $obElement $obElement - * @param string $sFieldName - * @param string $sFieldConvert - */ - protected static function addGetPriceFieldMethod($obElement, $sFieldName, $sFieldConvert) - { - $sMethodName = 'get'.$sFieldConvert.'Attribute'; - if (method_exists($obElement, $sMethodName)) { - return; - } - - if ($obElement instanceof ElementItem) { - $obElement->addDynamicMethod($sMethodName, function ($obElement) use ($sFieldName) { - /** @var \Model|\Eloquent|\Lovata\Toolbox\Classes\Item\ElementItem $obElement */ - $sFieldName .= '_value'; - $fPrice = $obElement->$sFieldName; - - $sPrice = PriceHelper::format($fPrice); - - return $sPrice; - }); - } else { - $obElement->addDynamicMethod($sMethodName, function () use ($sFieldName, $obElement) { - $sFieldName .= '_value'; - $fPrice = $obElement->$sFieldName; - - $sPrice = PriceHelper::format($fPrice); - - return $sPrice; - }); - } - } - - /** - * Add scopeGetBy{field_name} methods - * @param \Model|\Eloquent|\Lovata\Toolbox\Classes\Item\ElementItem $obElement $obElement - * @param string $sFieldName - * @param string $sFieldConvert - */ - protected static function addScopePriceFieldMethod($obElement, $sFieldName, $sFieldConvert) - { - $sMethodName = 'scopeGetBy'.$sFieldConvert; - if (method_exists($obElement, $sMethodName)) { - return; - } - - $obElement->addDynamicMethod($sMethodName, function ($obQuery, $sValue, $sCondition = '=') use ($sFieldName, $obElement) { - /** @var \October\Rain\Database\Builder $obQuery */ - $sValue = (float) $sValue; - - if (!empty($sCondition)) { - $obQuery->where($sFieldName, $sCondition, $sValue); - } - - return $obQuery; - }); - } -} diff --git a/plugins/lovata/toolbox/traits/helpers/TraitCached.php b/plugins/lovata/toolbox/traits/helpers/TraitCached.php deleted file mode 100644 index 89fdfc224..000000000 --- a/plugins/lovata/toolbox/traits/helpers/TraitCached.php +++ /dev/null @@ -1,46 +0,0 @@ -cached) || !is_array($this->cached)) { - $this->cached = []; - } - - if (is_string($arFieldList)) { - $arFieldList = [$arFieldList]; - } - - $this->cached = array_merge($this->cached, $arFieldList); - $this->cached = array_unique($this->cached); - } - - /** - * Get cached field list - * @return array - */ - public function getCachedField(): array - { - if (empty($this->cached) || !is_array($this->cached)) { - $this->cached = []; - } - - return $this->cached; - } -} diff --git a/plugins/lovata/toolbox/traits/helpers/TraitComponentNotFoundResponse.php b/plugins/lovata/toolbox/traits/helpers/TraitComponentNotFoundResponse.php deleted file mode 100644 index 86c63f6a2..000000000 --- a/plugins/lovata/toolbox/traits/helpers/TraitComponentNotFoundResponse.php +++ /dev/null @@ -1,59 +0,0 @@ - [ - 'title' => 'lovata.toolbox::lang.component.property_slug', - 'type' => 'string', - 'default' => '{{ :slug }}', - ], - 'slug_required' => [ - 'title' => 'lovata.toolbox::lang.component.property_slug_required', - 'type' => 'checkbox', - 'default' => 1, - ], - ]; - - if ($this->bNeedSmartURLCheck) { - $arResult['smart_url_check'] = [ - 'title' => 'lovata.toolbox::lang.component.property_url_check', - 'type' => 'checkbox', - 'default' => 0, - ]; - } - - return $arResult; - } - - /** - * Get error response for 404 page - * @throws AjaxException - * @return \Illuminate\Http\Response - */ - public function getErrorResponse() - { - if (Request::ajax()) { - throw new AjaxException('Element not found'); - } - - return Response::make($this->controller->run('404')->getContent(), 404); - } -} diff --git a/plugins/lovata/toolbox/traits/helpers/TraitInitActiveLang.php b/plugins/lovata/toolbox/traits/helpers/TraitInitActiveLang.php deleted file mode 100644 index cb502ae04..000000000 --- a/plugins/lovata/toolbox/traits/helpers/TraitInitActiveLang.php +++ /dev/null @@ -1,102 +0,0 @@ -hasPlugin('RainLab.Translate')) { - return self::$arActiveLangList; - } - - self::$arActiveLangList = \RainLab\Translate\Models\Locale::isEnabled()->lists('code'); - if (empty(self::$arActiveLangList)) { - return self::$arActiveLangList; - } - - //Remove default lang from list - foreach (self::$arActiveLangList as $iKey => $sLangCode) { - if ($sLangCode == self::$sDefaultLang) { - unset(self::$arActiveLangList[$iKey]); - break; - } - } - - return self::$arActiveLangList; - } - - /** - * Get and save active lang from Translate plugin - */ - protected function initActiveLang() - { - if (self::$bLangInit || !PluginManager::instance()->hasPlugin('RainLab.Translate')) { - return; - } - - self::$bLangInit = true; - $obTranslate = \RainLab\Translate\Classes\Translator::instance(); - - self::$sDefaultLang = $obTranslate->getDefaultLocale(); - - $sActiveLangCode = $obTranslate->getLocale(); - if (empty($sActiveLangCode) || $obTranslate->getDefaultLocale() == $sActiveLangCode) { - return; - } - - self::$sActiveLang = $sActiveLangCode; - } - - /** - * Add suffix with active lang code - * @param string $sValue - * @param string $sSeparator - * - * @return string - */ - protected function addActiveLangSuffix($sValue, $sSeparator = '_') - { - if (empty(self::$sActiveLang)) { - return $sValue; - } - - return $sValue.$sSeparator.self::$sActiveLang; - } - - /** - * Add prefix with active lang code - * @param string $sValue - * @param string $sSeparator - * - * @return string - */ - protected function addActiveLangPrefix($sValue, $sSeparator = '_') - { - if (empty(self::$sActiveLang)) { - return $sValue; - } - - return self::$sActiveLang.$sSeparator.$sValue; - } -} diff --git a/plugins/lovata/toolbox/traits/helpers/TraitValidationHelper.php b/plugins/lovata/toolbox/traits/helpers/TraitValidationHelper.php deleted file mode 100644 index b06078fbf..000000000 --- a/plugins/lovata/toolbox/traits/helpers/TraitValidationHelper.php +++ /dev/null @@ -1,24 +0,0 @@ -getFields()); - - Result::setFalse(['field' => array_shift($arFiledList)]) - ->setMessage($obException->getMessage()) - ->setCode($obException->getCode()); - } -} diff --git a/plugins/lovata/toolbox/traits/models/SetPropertyAttributeTrait.php b/plugins/lovata/toolbox/traits/models/SetPropertyAttributeTrait.php deleted file mode 100644 index ac723a335..000000000 --- a/plugins/lovata/toolbox/traits/models/SetPropertyAttributeTrait.php +++ /dev/null @@ -1,36 +0,0 @@ -fromJson($arValue); - } - - if (empty($arValue) || !is_array($arValue)) { - return; - } - - $arPropertyList = $this->property; - if (empty($arPropertyList)) { - $arPropertyList = []; - } - - foreach ($arValue as $sKey => $sValue) { - $arPropertyList[$sKey] = $sValue; - } - - $this->attributes['property'] = $this->asJson($arPropertyList); - } -} diff --git a/plugins/lovata/toolbox/traits/parse/ParseByPatternTrait.php b/plugins/lovata/toolbox/traits/parse/ParseByPatternTrait.php deleted file mode 100644 index a01fc5464..000000000 --- a/plugins/lovata/toolbox/traits/parse/ParseByPatternTrait.php +++ /dev/null @@ -1,123 +0,0 @@ - $sName) { - $sPattern = $this->namePattern($sKey); - $sContent = str_replace($sPattern, $sName, $sContent); - } - - return $sContent; - } - - /** - * Parse content by name wrapper - * @param array $arNameList - * @param string $sContent - * @return string - */ - public function parseByNameWrapper($arNameList, $sContent) - { - if (empty($arNameList) || !is_array($arNameList) || empty($sContent)) { - return ''; - } - - foreach ($arNameList as $sName) { - $sPattern = $this->nameWrapperPattern($sName); - $sContent = preg_replace($sPattern, '', $sContent); - } - - return $sContent; - } - - /** - * Parse content by wrapper - * @param array $arNameList - * @param string $sContent - * @return string - */ - public function parseByWrapper($arNameList, $sContent) - { - if (empty($arNameList) || !is_array($arNameList) || empty($sContent)) { - return ''; - } - - foreach ($arNameList as $sName) { - $sPattern = $this->wrapperPattern($sName); - $sContent = preg_replace($sPattern, '', $sContent); - } - - return $sContent; - } - - /** - * Name pattern. Example: {{key}} - * @param string $sKey - * @return string - */ - public function namePattern($sKey) - { - return '{{'.$sKey.'}}'; - } - - /** - * Name wrapper pattern. Example: [[key]] - * @param string $sKey - * @return string - */ - public function nameWrapperPattern($sKey) - { - return '/\[\['.$sKey.'\]\]/'; - } - - /** - * Wrapper pattern. Example: [[key]]...[[key]] - * @param string $sKey - * @return string - */ - public function wrapperPattern($sKey) - { - return "[\[\[".$sKey."\]\][A-Za-z0-9\t\n\r\f\v\x20-\x7E]+?\[\[".$sKey."\]\]]"; - } - - /** - * Parse array to string file - * @param array $arData - * @return string - */ - public function arrayToStringFile($arData) - { - if (empty($arData) || !is_array($arData)) { - return ''; - } - - $sContent = var_export($arData, true); - $sContent = preg_replace("/(\\n[ ]+array[ , \\n]+\(\\n)/", "[\n", $sContent); - $sContent = preg_replace("/(array[ , \\n]+\(\\n)/", "[\n", $sContent); - $sContent = preg_replace("/\)\,/", "],", $sContent); - $sContent = preg_replace("/\)$/", "];", $sContent); - $sContent = 'sModelClass.' model has not correct images config'; - - /** @var \Model $obModel */ - $obModel = new $this->sModelClass(); - self::assertNotEmpty($obModel->attachMany, $sErrorMessage); - self::assertArrayHasKey('images', $obModel->attachMany, $sErrorMessage); - self::assertEquals('System\Models\File', $obModel->attachMany['images'], $sErrorMessage); - } -} diff --git a/plugins/lovata/toolbox/traits/tests/TestModelHasPreviewImage.php b/plugins/lovata/toolbox/traits/tests/TestModelHasPreviewImage.php deleted file mode 100644 index 9d552ad3d..000000000 --- a/plugins/lovata/toolbox/traits/tests/TestModelHasPreviewImage.php +++ /dev/null @@ -1,25 +0,0 @@ -sModelClass.' model has not correct preview image config'; - - /** @var \Model $obModel */ - $obModel = new $this->sModelClass(); - self::assertNotEmpty($obModel->attachOne, $sErrorMessage); - self::assertArrayHasKey('preview_image', $obModel->attachOne, $sErrorMessage); - self::assertEquals('System\Models\File', $obModel->attachOne['preview_image'], $sErrorMessage); - } -} \ No newline at end of file diff --git a/plugins/lovata/toolbox/traits/tests/TestModelValidationNameField.php b/plugins/lovata/toolbox/traits/tests/TestModelValidationNameField.php deleted file mode 100644 index 61b16facf..000000000 --- a/plugins/lovata/toolbox/traits/tests/TestModelValidationNameField.php +++ /dev/null @@ -1,32 +0,0 @@ -sModelClass(); - - //Get validation rules array and check it - $arValidationRules = $obModel->rules; - self::assertNotEmpty($arValidationRules, $this->sModelClass.' model has empty validation rules array'); - - //Check rules for "name" field - self::assertArrayHasKey('name', $arValidationRules, $this->sModelClass.' model not has validation rules for field "name"'); - self::assertNotEmpty($arValidationRules['name'], $this->sModelClass.' model not has validation rules for field "name"'); - - $arValidationCondition = explode('|', $arValidationRules['name']); - self::assertContains('required', $arValidationCondition,$this->sModelClass.' model not has validation rule "required" for field "name"'); - } -} \ No newline at end of file diff --git a/plugins/lovata/toolbox/traits/tests/TestModelValidationSlugField.php b/plugins/lovata/toolbox/traits/tests/TestModelValidationSlugField.php deleted file mode 100644 index 5fdd6a770..000000000 --- a/plugins/lovata/toolbox/traits/tests/TestModelValidationSlugField.php +++ /dev/null @@ -1,33 +0,0 @@ -sModelClass(); - - //Get validation rules array and check it - $arValidationRules = $obModel->rules; - self::assertNotEmpty($arValidationRules, $this->sModelClass.' model has empty validation rules array'); - - //Check rules for "slug" field - self::assertArrayHasKey('slug', $arValidationRules, $this->sModelClass.' model not has validation rules for field "slug"'); - self::assertNotEmpty($arValidationRules['slug'], $this->sModelClass.' model not has validation rules for field "slug"'); - - $arValidationCondition = explode('|', $arValidationRules['slug']); - self::assertContains('required', $arValidationCondition,$this->sModelClass.' model not has validation rule "required" for field "slug"'); - self::assertContains('unique:'.$obModel->table, $arValidationCondition,$this->sModelClass.' model not has validation rule "unique" for field "slug"'); - } -} \ No newline at end of file diff --git a/plugins/lovata/toolbox/updates/version.yaml b/plugins/lovata/toolbox/updates/version.yaml deleted file mode 100644 index 7f65b49f8..000000000 --- a/plugins/lovata/toolbox/updates/version.yaml +++ /dev/null @@ -1,110 +0,0 @@ -1.0.0: - - 'Initialize plugin.' -1.1.0: - - 'Add diff, unshift, push, getNearestNext, getNearestPrev methods to ElementCollection class, add ComponentSubmitForm class' -1.2.0: - - 'Add integration with Translate plugin' -1.3.0: - - 'Adding afterCreate model event handling for additional cache cleaning' -1.3.1: - - 'Restore getOldFormData() method in ComponentSubmitForm class' -1.3.2: - - 'Fix lang path for the default properties tab in CommonProperty class' -1.3.3: - - 'Fix path to field name with error in getErrorMessage() method' -1.4.0: - - 'Add PageHelper class' -1.4.1: - - 'Fix processing of positive results in ComponentSubmitForm::getResponseModeAjax() method, if flash_on enabled' -1.5.0: - - 'Add TraitInitActiveLang trait' -1.6.0: - - 'Add SendMailHelper class, Add CommonSettings model' -1.7.0: - - 'Add UserStorage classes. Add classes for integration with Lovata.Buddies and RainLab.User plugins' -1.8.0: - - 'Added translation into French. Thanks for contribution philmarc.' -1.9.0: - - 'Add TraitCached. Update vendor packages.' -1.9.1: - - 'Remove force boot and register plugins in CommonTest class' -1.10.0: - - 'Add PriceHelperTrait. Move PriceHelper class from Shopaholic plugin. Add set(), applySorting() methods to ElementCollection class. Add abstract store classes.' -1.10.1: - - 'Fix ItemStorage class. Clone item objects form storage.' -1.10.2: - - 'Fix ItemStorage class. Added cloning of *Item object before saving it to storage.' -1.11.0: - - 'Added saving of arrays to class properties of *Store class objects after receiving array from cache.' -1.12.0: - - 'Add PageHelper::getPageNameList() method.' -1.12.1: - - 'Update of vendor packages' -1.12.2: - - 'Update of php-pagination vendor packages' -1.13.0: - - 'Added type returned by methods in AbstractStore * classes' -1.14.0: - - 'Add Countable interface in ElementCollection class' -1.14.1: - - 'Added natsort() for property value variants.' -1.15.0: - - 'Added AbstractBackendColumnHandler, AbstractBackendFieldHandler, AbstractBackendMenuHandler, AbstractExtendRelationConfigHandler, AbstractModelRelationHandler classes.' -1.16.0: - - 'Add package information to composer.json. Thanks for contribution pikanji.' -1.17.0: - - 'Added processing of "limit" parameter for the pagination component.' -1.18.0: - - 'Added AbstractImportModel class.' -1.19.0: - - 'Added supported property types: number, rich editor, single checkbox, switch, balloon selector, tag list, radio.' -1.20.0: - - 'Added Japanese language. Thanks for contribution pikanji.' -1.20.1: - - 'Fixed deletion of old images for improt from CSV file.' -1.21.0: - - 'Added support translatable slug in ElementPage class. Added German language. Thanks for contribution Gerald.' -1.21.1: - - 'Removed Iterator interface from ElementCollection class. Added IteratorAggregate interface to ElementCollection class.' -1.22.0: - - 'Replace array_intersect function with array_intersect_key in ElementCollection class.' -1.23.0: - - 'Added copy() method to ElementCollection class. Added choice twig function.' -1.24.0: - - 'Added caching of uploaded file objects as an array.' -1.24.1: - - 'Fixed copy() method in ElementCollection class.' -1.25.0: - - 'Added classes for import elements from xml file.' -1.25.1: - - 'Fixed openMainFile method in AbstractImportModelFromXML class.' -1.25.2: - - 'Added try->catch section for removing images in AbstractImportModel class.' -1.25.3: - - 'Fixed bug with import through queues.' -1.26.0: - - 'Added support of wildcard params to ElementPage class.' -1.26.1: - - 'Fixed support of wildcard params in ElementPage class.' -1.26.2: - - 'Added validation widget context field in AbstractBackendFieldHandler class.' -1.27.0: - - 'Added redirect to error page, if result status is false and redirect URL is not empty.' -1.28.0: - - 'Added dimension fields to lang files' -1.28.1: - - 'Added passing $this param to get[FieldName]Attribute() method in ElementItem class. It is recommended to use parameter from callback function in the dynamic methods get[FieldName]Attribute in ElementItem class.' -1.29.0: - - 'Improved speed of random method in ElementCollection class.' -1.30.0: - - 'The ability to specify URL for downloading images has been added to the abstract import class. Thanks for contribution Sebastiaan Kloos.' -1.31.0: - - 'Added composer.json to plugin.' -1.32.0: - - 'Reduced count of database queries, if cache is empty.' -1.33.0: - - 'Fixed $sFilterValue condition in AbstractStoreWithParam and AbstractStoreWithTwoParam classes.' -1.33.1: - - 'Fixed error with cache images with same disk_name.' -1.34.0: - - 'Added makeItemOnlyCache method to ElementCollection class.'