The response has been limited to 50k tokens of the smallest files in the repo. You can remove this limitation by removing the max tokens filter.
├── .circleci
    └── config.yml
├── .coveralls.yml
├── .devcontainer
    └── devcontainer.json
├── LICENSE
├── README.md
├── composer.json
├── config
    ├── default.php
    └── shop.php
├── public
    └── mimeicons
    │   ├── application
    │       ├── illustrator.png
    │       ├── javascript.png
    │       ├── msword.png
    │       ├── octet-stream.png
    │       ├── pdf.png
    │       ├── pgp-encrypted.png
    │       ├── pgp-keys.png
    │       ├── pkcs7-mime.png
    │       ├── postscript.png
    │       ├── relaxng.png
    │       ├── rss+xml.png
    │       ├── rtf.png
    │       ├── sxw.png
    │       ├── vnd.ms-access.png
    │       ├── vnd.ms-excel.png
    │       ├── vnd.ms-powerpoint.png
    │       ├── vnd.oasis.opendocument.chart.png
    │       ├── vnd.oasis.opendocument.database.png
    │       ├── vnd.oasis.opendocument.formula.png
    │       ├── vnd.oasis.opendocument.graphics.png
    │       ├── vnd.oasis.opendocument.image.png
    │       ├── vnd.oasis.opendocument.presentation-template.png
    │       ├── vnd.oasis.opendocument.presentation.png
    │       ├── vnd.oasis.opendocument.spreadsheet-template.png
    │       ├── vnd.oasis.opendocument.spreadsheet.png
    │       ├── vnd.oasis.opendocument.text.png
    │       ├── vnd.rn-realmedia.png
    │       ├── vnd.scribus.png
    │       ├── vnd.stardivision.calc.png
    │       ├── vnd.stardivision.draw.png
    │       ├── vnd.sun.xml.calc.png
    │       ├── vnd.sun.xml.calc.template.png
    │       ├── vnd.sun.xml.draw.png
    │       ├── vnd.sun.xml.draw.template.png
    │       ├── x-7z-compressed.png
    │       ├── x-ace.png
    │       ├── x-applix-spreadsheet.png
    │       ├── x-ar.png
    │       ├── x-arc.png
    │       ├── x-archive.png
    │       ├── x-arj.png
    │       ├── x-awk.png
    │       ├── x-bittorrent.png
    │       ├── x-bzdvi.png
    │       ├── x-bzip-compressed-tar.png
    │       ├── x-bzip.png
    │       ├── x-cd-image.png
    │       ├── x-cda.png
    │       ├── x-compress.png
    │       ├── x-compressed-tar.png
    │       ├── x-cpio.png
    │       ├── x-cue.png
    │       ├── x-deb.png
    │       ├── x-designer.png
    │       ├── x-desktop.png
    │       ├── x-egon.png
    │       ├── x-executable-script.png
    │       ├── x-executable.png
    │       ├── x-font-afm.png
    │       ├── x-font-bdf.png
    │       ├── x-font-otf.png
    │       ├── x-font-pcf.png
    │       ├── x-font-snf.png
    │       ├── x-font-ttf.png
    │       ├── x-font-type1.png
    │       ├── x-gnumeric.png
    │       ├── x-gzdvi.png
    │       ├── x-gzip.png
    │       ├── x-gzpostscript.png
    │       ├── x-java-applet.png
    │       ├── x-java-archive.png
    │       ├── x-java.png
    │       ├── x-javascript.png
    │       ├── x-k3b.png
    │       ├── x-kcsrc.png
    │       ├── x-kgetlist.png
    │       ├── x-kontour.png
    │       ├── x-kplato.png
    │       ├── x-krita.png
    │       ├── x-kvtml.png
    │       ├── x-lha.png
    │       ├── x-lyx.png
    │       ├── x-lzma-compressed-tar.png
    │       ├── x-lzop.png
    │       ├── x-m4.png
    │       ├── x-marble.png
    │       ├── x-mimearchive.png
    │       ├── x-mplayer2.png
    │       ├── x-ms-dos-executable.png
    │       ├── x-mswinurl.png
    │       ├── x-mswrite.png
    │       ├── x-nzb.png
    │       ├── x-object.png
    │       ├── x-pak.png
    │       ├── x-pem-key.png
    │       ├── x-perl.png
    │       ├── x-php.png
    │       ├── x-plasma.png
    │       ├── x-python-bytecode.png
    │       ├── x-qet-element.png
    │       ├── x-qet-project.png
    │       ├── x-quattropro.png
    │       ├── x-rar.png
    │       ├── x-rpm.png
    │       ├── x-ruby.png
    │       ├── x-sharedlib.png
    │       ├── x-shellscript.png
    │       ├── x-shockwave-flash.png
    │       ├── x-siag.png
    │       ├── x-smb-server.png
    │       ├── x-smb-workgroup.png
    │       ├── x-subrip.png
    │       ├── x-tar.png
    │       ├── x-tarz.png
    │       ├── x-tgif.png
    │       ├── x-trash.png
    │       ├── x-troff-man.png
    │       ├── x-tzo.png
    │       ├── x-wmf.png
    │       ├── x-zerosize.png
    │       ├── x-zoo.png
    │       ├── xhtml+xml.png
    │       ├── xml.png
    │       ├── xsd.png
    │       ├── xslt+xml.png
    │       └── zip.png
    │   ├── audio
    │       ├── ac3.png
    │       ├── midi.png
    │       ├── prs.sid.png
    │       ├── vnd.rn-realvideo.png
    │       ├── x-adpcm.png
    │       ├── x-aiff.png
    │       ├── x-flac+ogg.png
    │       ├── x-flac.png
    │       ├── x-generic.png
    │       ├── x-monkey.png
    │       ├── x-speex+ogg.png
    │       └── x-wav.png
    │   ├── fonts
    │       └── package.png
    │   ├── image
    │       ├── svg+xml-compressed.png
    │       ├── svg+xml.png
    │       ├── x-eps.png
    │       ├── x-generic.png
    │       ├── x-vnd.trolltech.qpicture.png
    │       └── x-xfig.png
    │   ├── inode
    │       └── directory.png
    │   ├── message
    │       ├── news.png
    │       └── rfc822.png
    │   ├── package
    │       └── x-generic.png
    │   ├── text
    │       ├── calendar.png
    │       ├── css.png
    │       ├── csv.png
    │       ├── directory.png
    │       ├── enriched.png
    │       ├── html.png
    │       ├── mathml.png
    │       ├── plain.png
    │       ├── rdf.png
    │       ├── rtf.png
    │       ├── sgml.png
    │       ├── troff.png
    │       ├── vcalendar.png
    │       ├── vnd.abc.png
    │       ├── vnd.wap.wml.png
    │       ├── x-adasrc.png
    │       ├── x-authors.png
    │       ├── x-bibtex.png
    │       ├── x-c++hdr.png
    │       ├── x-c++src.png
    │       ├── x-changelog.png
    │       ├── x-chdr.png
    │       ├── x-cmake.png
    │       ├── x-copying.png
    │       ├── x-csharp.png
    │       ├── x-csrc.png
    │       ├── x-dtd.png
    │       ├── x-generic.png
    │       ├── x-haskell.png
    │       ├── x-hex.png
    │       ├── x-install.png
    │       ├── x-java.png
    │       ├── x-katefilelist.png
    │       ├── x-ldif.png
    │       ├── x-log.png
    │       ├── x-makefile.png
    │       ├── x-nfo.png
    │       ├── x-objchdr.png
    │       ├── x-objcsrc.png
    │       ├── x-pascal.png
    │       ├── x-patch.png
    │       ├── x-po.png
    │       ├── x-python.png
    │       ├── x-readme.png
    │       ├── x-script.png
    │       ├── x-sql.png
    │       ├── x-tcl.png
    │       ├── x-tex.png
    │       ├── x-texinfo.png
    │       ├── x-vcard.png
    │       ├── x-xslfo.png
    │       ├── xmcd.png
    │       └── xml.png
    │   ├── unknown.png
    │   ├── uri
    │       ├── mms.png
    │       ├── mmst.png
    │       ├── mmsu.png
    │       ├── pnm.png
    │       ├── rtspt.png
    │       └── rtspu.png
    │   └── video
    │       ├── mp4.png
    │       ├── webm.png
    │       ├── x-generic.png
    │       ├── x-mng.png
    │       └── x-wmv.png
├── routes
    └── aimeos.php
├── src
    ├── Base
    │   ├── Aimeos.php
    │   ├── Config.php
    │   ├── Context.php
    │   ├── I18n.php
    │   ├── Locale.php
    │   ├── Shop.php
    │   ├── Support.php
    │   └── View.php
    ├── Command
    │   ├── AbstractCommand.php
    │   ├── AccountCommand.php
    │   ├── ClearCommand.php
    │   ├── JobsCommand.php
    │   └── SetupCommand.php
    ├── Composer.php
    ├── Controller
    │   ├── AccountController.php
    │   ├── AdminController.php
    │   ├── BasketController.php
    │   ├── CatalogController.php
    │   ├── CheckoutController.php
    │   ├── GraphqlController.php
    │   ├── JqadmController.php
    │   ├── JsonadmController.php
    │   ├── JsonapiController.php
    │   ├── PageController.php
    │   ├── ResolveController.php
    │   └── SupplierController.php
    ├── Facades
    │   ├── Attribute.php
    │   ├── Basket.php
    │   ├── Catalog.php
    │   ├── Cms.php
    │   ├── Customer.php
    │   ├── Locale.php
    │   ├── Order.php
    │   ├── Product.php
    │   ├── Service.php
    │   ├── Shop.php
    │   ├── Stock.php
    │   ├── Subscription.php
    │   └── Supplier.php
    ├── ShopServiceProvider.php
    └── helpers.php
└── views
    ├── account
        └── index.blade.php
    ├── admin
        └── index.blade.php
    ├── base.blade.php
    ├── basket
        └── index.blade.php
    ├── catalog
        ├── count.blade.php
        ├── detail.blade.php
        ├── home.blade.php
        ├── list.blade.php
        ├── session.blade.php
        ├── stock.blade.php
        ├── suggest.blade.php
        └── tree.blade.php
    ├── checkout
        ├── confirm.blade.php
        ├── index.blade.php
        └── update.blade.php
    ├── jqadm
        └── index.blade.php
    ├── page
        └── index.blade.php
    └── supplier
        └── detail.blade.php


/.circleci/config.yml:
--------------------------------------------------------------------------------
 1 | # PHP CircleCI 2.0 configuration file
 2 | #
 3 | # Check https://circleci.com/docs/2.0/language-php/ for more details
 4 | #
 5 | version: 2
 6 | 
 7 | jobs:
 8 |   "php82-mysql80":
 9 |     docker:
10 |       - image: aimeos/ci-php:8.2
11 |       - image: cimg/mysql:8.0
12 |         environment:
13 |           MYSQL_ROOT_PASSWORD: rootpw
14 |           MYSQL_DATABASE: laravel
15 |           MYSQL_USER: aimeos
16 |           MYSQL_PASSWORD: aimeos
17 |     steps:
18 |       - checkout
19 |       - run: wget https://getcomposer.org/download/latest-stable/composer.phar -O composer
20 |       - run: php composer req "laravel/framework:~10.0" --no-update
21 |       - run: php composer req "phpunit/phpunit:~10.0" --no-update --dev
22 |       - restore_cache:
23 |           keys:
24 |             - php82-{{ checksum "composer.json" }}
25 |       - run: php composer update -n --prefer-dist
26 |       - save_cache:
27 |           key: php82-{{ checksum "composer.json" }}
28 |           paths: [./vendor]
29 |       - run: for i in `seq 1 10`; do nc -z 127.0.0.1 3306 && echo OK && exit 0; echo -n .; sleep 1; done
30 |       - run: ./vendor/bin/phpunit
31 | 
32 |   "php83-mysql80":
33 |     docker:
34 |       - image: aimeos/ci-php:8.3
35 |       - image: cimg/mysql:8.0
36 |         environment:
37 |           MYSQL_ROOT_PASSWORD: rootpw
38 |           MYSQL_DATABASE: laravel
39 |           MYSQL_USER: aimeos
40 |           MYSQL_PASSWORD: aimeos
41 |     steps:
42 |       - checkout
43 |       - run: wget https://getcomposer.org/download/latest-stable/composer.phar -O composer
44 |       - run: php composer req "laravel/framework:~11.0" --no-update
45 |       - run: php composer req "phpunit/phpunit:~11.0" --no-update --dev
46 |       - restore_cache:
47 |           keys:
48 |             - php83-{{ checksum "composer.json" }}
49 |       - run: php composer update -n --prefer-dist
50 |       - save_cache:
51 |           key: php83-{{ checksum "composer.json" }}
52 |           paths: [./vendor]
53 |       - run: for i in `seq 1 10`; do nc -z 127.0.0.1 3306 && echo OK && exit 0; echo -n .; sleep 1; done
54 |       - run: ./vendor/bin/phpunit
55 | 
56 |   "php84-mysql80":
57 |     docker:
58 |       - image: aimeos/ci-php:8.4
59 |       - image: cimg/mysql:8.0
60 |         environment:
61 |           MYSQL_ROOT_PASSWORD: rootpw
62 |           MYSQL_DATABASE: laravel
63 |           MYSQL_USER: aimeos
64 |           MYSQL_PASSWORD: aimeos
65 |     steps:
66 |       - checkout
67 |       - run: wget https://getcomposer.org/download/latest-stable/composer.phar -O composer
68 |       - run: php composer req "laravel/framework:~12.0" --no-update
69 |       - run: php composer req "phpunit/phpunit:~11.0" --no-update --dev
70 |       - restore_cache:
71 |           keys:
72 |             - php84-{{ checksum "composer.json" }}
73 |       - run: php composer update -n --prefer-dist
74 |       - save_cache:
75 |           key: php84-{{ checksum "composer.json" }}
76 |           paths: [./vendor]
77 |       - run: for i in `seq 1 10`; do nc -z 127.0.0.1 3306 && echo OK && exit 0; echo -n .; sleep 1; done
78 |       - run: ./vendor/bin/phpunit --coverage-clover coverage.xml
79 | 
80 | workflows:
81 |   version: 2
82 |   unittest:
83 |     jobs:
84 |       - "php82-mysql80"
85 |       - "php83-mysql80"
86 |       - "php84-mysql80"
87 | 


--------------------------------------------------------------------------------
/.coveralls.yml:
--------------------------------------------------------------------------------
1 | src_dir: ./
2 | json_path: coveralls.json
3 | coverage_clover: coverage.xml
4 | 


--------------------------------------------------------------------------------
/.devcontainer/devcontainer.json:
--------------------------------------------------------------------------------
1 | {
2 |   "image": "mcr.microsoft.com/devcontainers/universal:2",
3 |   "features": {
4 |   }
5 | }
6 | 


--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
 1 | The MIT License (MIT)
 2 | 
 3 | Copyright (c) 2015 Aimeos
 4 | 
 5 | Permission is hereby granted, free of charge, to any person obtaining a copy
 6 | of this software and associated documentation files (the "Software"), to deal
 7 | in the Software without restriction, including without limitation the rights
 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 | 
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 | 
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 | 
23 | 


--------------------------------------------------------------------------------
/composer.json:
--------------------------------------------------------------------------------
 1 | {
 2 |     "name": "aimeos/aimeos-laravel",
 3 |     "description": "Cloud native, API first Laravel eCommerce package with integrated AI for ultra-fast online shops, marketplaces and complex B2B projects",
 4 |     "homepage": "https://aimeos.org/Laravel",
 5 |     "type": "laravel-bundle",
 6 |     "license": "MIT",
 7 |     "keywords": ["aimeos", "laravel", "e-commerce", "ecommerce", "B2B", "shop", "portal", "marketplace", "API", "JSON", "GraphQL"],
 8 |     "support": {
 9 |         "source": "https://github.com/Aimeos/aimeos-laravel",
10 |         "issues": "https://github.com/Aimeos/aimeos-laravel/issues",
11 |         "forum": "https://aimeos.org/help",
12 |         "wiki": "https://aimeos.org/docs"
13 |     },
14 |     "prefer-stable": true,
15 |     "minimum-stability": "dev",
16 |     "require": {
17 |         "composer-runtime-api": "^2.1",
18 |         "laravel/framework": "^10.0||^11.0||^12.0",
19 |         "symfony/psr-http-message-bridge": "~6.0||~7.0",
20 |         "laminas/laminas-diactoros": "~2.5||~3.0",
21 |         "nyholm/psr7": "~1.2",
22 |         "aimeos/aimeos-core": "dev-master",
23 |         "aimeos/ai-laravel": "dev-master",
24 |         "aimeos/ai-admin-graphql": "dev-master",
25 |         "aimeos/ai-admin-jqadm": "dev-master",
26 |         "aimeos/ai-admin-jsonadm": "dev-master",
27 |         "aimeos/ai-client-html": "dev-master",
28 |         "aimeos/ai-client-jsonapi": "dev-master",
29 |         "aimeos/ai-cms-grapesjs": "dev-master",
30 |         "aimeos/ai-controller-jobs": "dev-master",
31 |         "aimeos/ai-controller-frontend": "dev-master"
32 |     },
33 |     "require-dev": {
34 |         "phpunit/phpunit": "^10.0||^11.0",
35 |         "orchestra/testbench": "~8.0||~9.0||~10.0",
36 |         "orchestra/testbench-browser-kit": "~8.0||~9.0||~10.0",
37 |         "php-coveralls/php-coveralls": "~2.0"
38 |     },
39 |     "autoload": {
40 |         "psr-4": {
41 |             "Aimeos\\Shop\\": "src/"
42 |         },
43 |         "files": [
44 |             "src/helpers.php"
45 |         ]
46 |     },
47 |     "autoload-dev": {
48 |         "classmap": [
49 |             "tests/AimeosTestAbstract.php",
50 |             "tests/HelpersTest.php"
51 |         ]
52 |     },
53 |     "extra": {
54 |         "laravel": {
55 |             "providers": [
56 |                 "Aimeos\\Shop\\ShopServiceProvider"
57 |             ]
58 |         }
59 |     }
60 | }
61 | 


--------------------------------------------------------------------------------
/config/default.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | switch( config( 'database.default', 'mysql' ) ) {
  4 | 	case 'pgsql': $aimeosIndexManagerName = 'PgSQL'; break;
  5 | 	case 'sqlsrv': $aimeosIndexManagerName = 'SQLSrv'; break;
  6 | 	default: $aimeosIndexManagerName = 'MySQL';
  7 | }
  8 | 
  9 | 
 10 | return [
 11 | 
 12 | 	'apc_enabled' => false,
 13 | 	'apc_prefix' => 'laravel:',
 14 | 	'pcntl_max' => 4,
 15 | 	'pcntl_priority' => 19,
 16 | 
 17 | 	'page' => [
 18 | 		'account-index' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'account/profile', 'account/review', 'account/subscription', 'account/basket', 'account/history', 'account/favorite', 'account/watch', 'catalog/session'],
 19 | 		'basket-index' => ['locale/select', 'catalog/tree', 'catalog/search', 'basket/standard', 'basket/bulk', 'basket/related'],
 20 | 		'catalog-count' => ['catalog/count'],
 21 | 		'catalog-detail' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/stage', 'catalog/detail', 'catalog/session'],
 22 | 		'catalog-home' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/home'],
 23 | 		'catalog-list' => ['locale/select', 'basket/mini', 'catalog/filter', 'catalog/tree', 'catalog/search', 'catalog/price', 'catalog/supplier', 'catalog/attribute', 'catalog/session', 'catalog/stage', 'catalog/lists'],
 24 | 		'catalog-session' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/session'],
 25 | 		'catalog-stock' => ['catalog/stock'],
 26 | 		'catalog-suggest' => ['catalog/suggest'],
 27 | 		'catalog-tree' => ['locale/select', 'basket/mini', 'catalog/filter', 'catalog/tree', 'catalog/search', 'catalog/price', 'catalog/supplier', 'catalog/attribute', 'catalog/session', 'catalog/stage', 'catalog/lists'],
 28 | 		'checkout-confirm' => ['catalog/tree', 'catalog/search', 'checkout/confirm'],
 29 | 		'checkout-index' => ['locale/select', 'catalog/tree', 'catalog/search', 'checkout/standard'],
 30 | 		'checkout-update' => ['checkout/update'],
 31 | 		'supplier-detail' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'supplier/detail', 'catalog/lists'],
 32 | 	],
 33 | 
 34 | 	'admin' => [
 35 | 		'graphql' => [
 36 | 			'url' => [
 37 | 				'target' => 'aimeos_shop_graphql_post',
 38 | 				'config' => [
 39 | 					'absoluteUri' => true,
 40 | 				],
 41 | 			],
 42 | 		],
 43 | 		'jqadm' => [
 44 | 			'url' => [
 45 | 				'batch' => [
 46 | 					'target' => 'aimeos_shop_jqadm_batch'
 47 | 				],
 48 | 				'copy' => [
 49 | 					'target' => 'aimeos_shop_jqadm_copy'
 50 | 				],
 51 | 				'create' => [
 52 | 					'target' => 'aimeos_shop_jqadm_create'
 53 | 				],
 54 | 				'delete' => [
 55 | 					'target' => 'aimeos_shop_jqadm_delete'
 56 | 				],
 57 | 				'export' => [
 58 | 					'target' => 'aimeos_shop_jqadm_export'
 59 | 				],
 60 | 				'get' => [
 61 | 					'target' => 'aimeos_shop_jqadm_get'
 62 | 				],
 63 | 				'import' => [
 64 | 					'target' => 'aimeos_shop_jqadm_import'
 65 | 				],
 66 | 				'save' => [
 67 | 					'target' => 'aimeos_shop_jqadm_save'
 68 | 				],
 69 | 				'search' => [
 70 | 					'target' => 'aimeos_shop_jqadm_search'
 71 | 				],
 72 | 			],
 73 | 		],
 74 | 		'jsonadm' => [
 75 | 			'url' => [
 76 | 				'target' => 'aimeos_shop_jsonadm_get',
 77 | 				'config' => [
 78 | 					'absoluteUri' => true,
 79 | 				],
 80 | 				'options' => [
 81 | 					'target' => 'aimeos_shop_jsonadm_options',
 82 | 					'config' => [
 83 | 						'absoluteUri' => true,
 84 | 					],
 85 | 				],
 86 | 			],
 87 | 		],
 88 | 	],
 89 | 	'client' => [
 90 | 		'html' => [
 91 | 			'account' => [
 92 | 				'index' => [
 93 | 					'url' => [
 94 | 						'target' => 'aimeos_shop_account',
 95 | 					],
 96 | 				],
 97 | 				'basket' => [
 98 | 					'url' => [
 99 | 						'target' => 'aimeos_shop_account',
100 | 					],
101 | 				],
102 | 				'review' => [
103 | 					'url' => [
104 | 						'target' => 'aimeos_shop_account',
105 | 					],
106 | 				],
107 | 				'profile' => [
108 | 					'url' => [
109 | 						'target' => 'aimeos_shop_account',
110 | 					],
111 | 				],
112 | 				'subscription' => [
113 | 					'url' => [
114 | 						'target' => 'aimeos_shop_account',
115 | 					],
116 | 				],
117 | 				'history' => [
118 | 					'url' => [
119 | 						'target' => 'aimeos_shop_account',
120 | 					],
121 | 				],
122 | 				'favorite' => [
123 | 					'url' => [
124 | 						'target' => 'aimeos_shop_account_favorite',
125 | 					],
126 | 				],
127 | 				'watch' => [
128 | 					'url' => [
129 | 						'target' => 'aimeos_shop_account_watch',
130 | 					],
131 | 				],
132 | 				'download' => [
133 | 					'url' => [
134 | 						'target' => 'aimeos_shop_account_download',
135 | 					],
136 | 					'error' => [
137 | 						'url' => [
138 | 							'target' => 'aimeos_shop_account',
139 | 						],
140 | 					],
141 | 				],
142 | 			],
143 | 			'cms' => [
144 | 				'page' => [
145 | 					'url' => [
146 | 						'target' => 'aimeos_page',
147 | 					],
148 | 				],
149 | 			],
150 | 			'catalog' => [
151 | 				'count' => [
152 | 					'url' => [
153 | 						'target' => 'aimeos_shop_count',
154 | 					],
155 | 				],
156 | 				'detail' => [
157 | 					'url' => [
158 | 						'target' => 'aimeos_shop_detail',
159 | 						'filter' => ['path', 'd_prodid'],
160 | 					],
161 | 				],
162 | 				'home' => [
163 | 					'url' => [
164 | 						'target' => 'aimeos_home',
165 | 					],
166 | 				],
167 | 				'lists' => [
168 | 					'url' => [
169 | 						'target' => 'aimeos_shop_list',
170 | 					],
171 | 				],
172 | 				'session' => [
173 | 					'pinned' => [
174 | 						'url' => [
175 | 							'target' => 'aimeos_shop_session_pinned',
176 | 						],
177 | 					],
178 | 				],
179 | 				'stock' => [
180 | 					'url' => [
181 | 						'target' => 'aimeos_shop_stock',
182 | 					],
183 | 				],
184 | 				'suggest' => [
185 | 					'url' => [
186 | 						'target' => 'aimeos_shop_suggest',
187 | 					],
188 | 				],
189 | 				'tree' => [
190 | 					'url' => [
191 | 						'target' => 'aimeos_shop_tree',
192 | 						'filter' => ['path'],
193 | 					],
194 | 				],
195 | 			],
196 | 			'common' => [
197 | 				'template' => [
198 | 					'baseurl' => public_path( 'vendor/shop/themes/default' ),
199 | 				],
200 | 			],
201 | 			'basket' => [
202 | 				'standard' => [
203 | 					'url' => [
204 | 						'target' => 'aimeos_shop_basket',
205 | 					],
206 | 				],
207 | 			],
208 | 			'checkout' => [
209 | 				'confirm' => [
210 | 					'url' => [
211 | 						'target' => 'aimeos_shop_confirm',
212 | 					],
213 | 				],
214 | 				'standard' => [
215 | 					'url' => [
216 | 						'target' => 'aimeos_shop_checkout',
217 | 					],
218 | 					'summary' => [
219 | 						'option' => [
220 | 							'terms' => [
221 | 								'url' => [
222 | 									'target' => 'aimeos_page',
223 | 								],
224 | 								'privacy' => [
225 | 									'url' => [
226 | 										'target' => 'aimeos_page',
227 | 									],
228 | 								],
229 | 								'cancel' => [
230 | 									'url' => [
231 | 										'target' => 'aimeos_page',
232 | 									],
233 | 								],
234 | 							],
235 | 						],
236 | 					],
237 | 				],
238 | 				'update' => [
239 | 					'url' => [
240 | 						'target' => 'aimeos_shop_update',
241 | 					],
242 | 				],
243 | 			],
244 | 			'locale' => [
245 | 				'select' => [
246 | 					'currency' => [
247 | 						'param-name' => 'currency',
248 | 					],
249 | 					'language' => [
250 | 						'param-name' => 'locale',
251 | 					],
252 | 				],
253 | 			],
254 | 			'supplier' => [
255 | 				'detail' => [
256 | 					'url' => [
257 | 						'target' => 'aimeos_shop_supplier',
258 | 					],
259 | 				],
260 | 			]
261 | 		],
262 | 		'jsonapi' => [
263 | 			'url' => [
264 | 				'target' => 'aimeos_shop_jsonapi_options',
265 | 				'config' => [
266 | 					'absoluteUri' => true,
267 | 				],
268 | 			],
269 | 		],
270 | 	],
271 | 
272 | 	'controller' => [
273 | 		'jobs' => [
274 | 			'to-email' => config( 'mail.from.address' ),
275 | 		]
276 | 	],
277 | 
278 | 	'mshop' => [
279 | 		'customer' => [
280 | 			'manager' => [
281 | 				'name' => 'Laravel',
282 | 				'password' => [
283 | 					'name' => 'Bcrypt',
284 | 				],
285 | 			],
286 | 		],
287 | 		'index' => [
288 | 			'manager' => [
289 | 				'name' => $aimeosIndexManagerName,
290 | 			],
291 | 		],
292 | 	],
293 | ];
294 | 


--------------------------------------------------------------------------------
/config/shop.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | return [
  4 | 
  5 | 	'apc_enabled' => false, // enable for maximum performance if APCu is available
  6 | 	'apc_prefix' => 'laravel:', // prefix for caching config and translation in APCu
  7 | 	'num_formatter' => 'Locale', // locale based number formatter (alternative: "Standard")
  8 | 	'pcntl_max' => 4, // maximum number of parallel command line processes when starting jobs
  9 | 	'version' => env( 'APP_VERSION', 1 ), // shop CSS/JS file version
 10 | 	'roles' => ['admin', 'editor'], // user groups allowed to access the admin backend
 11 | 	'panel' => 'dashboard', // panel shown in admin backend after login
 12 | 
 13 | 	'routes' => [
 14 | 		// Docs: https://aimeos.org/docs/latest/laravel/extend/#custom-routes
 15 | 		// Multi-sites: https://aimeos.org/docs/latest/laravel/customize/#multiple-shops
 16 | 		// 'admin' => ['prefix' => 'admin', 'middleware' => ['web']],
 17 | 		// 'jqadm' => ['prefix' => 'admin/{site}/jqadm', 'middleware' => ['web', 'auth']],
 18 | 		// 'graphql' => ['prefix' => 'admin/{site}/graphql', 'middleware' => ['web', 'auth']],
 19 | 		// 'jsonadm' => ['prefix' => 'admin/{site}/jsonadm', 'middleware' => ['web', 'auth']],
 20 | 		// 'jsonapi' => ['prefix' => 'jsonapi', 'middleware' => ['web', 'api']],
 21 | 		// 'account' => ['prefix' => 'profile', 'middleware' => ['web', 'auth']],
 22 | 		// 'default' => ['prefix' => 'shop', 'middleware' => ['web']],
 23 | 		// 'basket' => ['prefix' => 'shop', 'middleware' => ['web']],
 24 | 		// 'checkout' => ['prefix' => 'shop', 'middleware' => ['web']],
 25 | 		// 'confirm' => ['prefix' => 'shop', 'middleware' => ['web']],
 26 | 		// 'supplier' => ['prefix' => 's', 'middleware' => ['web']],
 27 | 		// 'page' => ['prefix' => 'p', 'middleware' => ['web']],
 28 | 		// 'home' => ['middleware' => ['web']],
 29 | 		// 'update' => [],
 30 | 	],
 31 | 
 32 | 	'page' => [
 33 | 		'account-index' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'account/profile', 'account/review', 'account/subscription', 'account/basket', 'account/history', 'account/favorite', 'account/watch', 'catalog/session'],
 34 | 		'basket-index' => ['locale/select', 'catalog/tree', 'catalog/search', 'basket/standard', 'basket/bulk', 'basket/related'],
 35 | 		'catalog-count' => ['catalog/count'],
 36 | 		'catalog-detail' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/stage', 'catalog/detail', 'catalog/session'],
 37 | 		'catalog-home' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/home'],
 38 | 		'catalog-list' => ['locale/select', 'basket/mini', 'catalog/filter', 'catalog/tree', 'catalog/search', 'catalog/price', 'catalog/supplier', 'catalog/attribute', 'catalog/session', 'catalog/stage', 'catalog/lists'],
 39 | 		'catalog-session' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/session'],
 40 | 		'catalog-stock' => ['catalog/stock'],
 41 | 		'catalog-suggest' => ['catalog/suggest'],
 42 | 		'catalog-tree' => ['locale/select', 'basket/mini', 'catalog/filter', 'catalog/tree', 'catalog/search', 'catalog/price', 'catalog/supplier', 'catalog/attribute', 'catalog/session', 'catalog/stage', 'catalog/lists'],
 43 | 		'checkout-confirm' => ['catalog/tree', 'catalog/search', 'checkout/confirm'],
 44 | 		'checkout-index' => ['locale/select', 'catalog/tree', 'catalog/search', 'checkout/standard'],
 45 | 		'checkout-update' => ['checkout/update'],
 46 | 		'supplier-detail' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'supplier/detail', 'catalog/lists'],
 47 | 		'cms' => ['cms/page', 'catalog/tree', 'basket/mini'],
 48 | 	],
 49 | 
 50 | 	'resource' => [
 51 | 		'db' => [
 52 | 			'adapter' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.driver', 'mysql' ),
 53 | 			'host' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.host', '127.0.0.1' ),
 54 | 			'port' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.port', '3306' ),
 55 | 			'socket' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.unix_socket', '' ),
 56 | 			'database' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.database', 'forge' ),
 57 | 			'username' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.username', 'forge' ),
 58 | 			'password' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.password', '' ),
 59 | 			'stmt' => config( 'database.default', 'mysql' ) === 'mysql' ? ["SET SESSION sort_buffer_size=2097144; SET NAMES 'utf8mb4'; SET SESSION sql_mode='ANSI'"] : [],
 60 | 			'limit' => 3, // maximum number of concurrent database connections
 61 | 			'defaultTableOptions' => [
 62 | 				'charset' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.charset' ),
 63 | 				'collate' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.collation' ),
 64 | 			],
 65 | 			'driverOptions' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.options' ),
 66 | 		],
 67 | 		'fs' => [
 68 | 			'adapter' => 'Standard',
 69 | 			'tempdir' => storage_path( 'tmp' ),
 70 | 			'basedir' => public_path(),
 71 | 			'baseurl' => rtrim(env('ASSET_URL', PHP_SAPI == 'cli' ? env('APP_URL') : ''), '/'),
 72 | 		],
 73 | 		'fs-media' => [
 74 | 			'adapter' => 'Standard',
 75 | 			'tempdir' => storage_path( 'tmp' ),
 76 | 			'basedir' => public_path( 'aimeos' ),
 77 | 			'baseurl' => rtrim(env('ASSET_URL', PHP_SAPI == 'cli' ? env('APP_URL') : ''), '/') . '/aimeos',
 78 | 		],
 79 | 		'fs-mimeicon' => [
 80 | 			'adapter' => 'Standard',
 81 | 			'tempdir' => storage_path( 'tmp' ),
 82 | 			'basedir' => public_path( 'vendor/shop/mimeicons' ),
 83 | 			'baseurl' => rtrim(env('ASSET_URL', PHP_SAPI == 'cli' ? env('APP_URL') : ''), '/') . '/vendor/shop/mimeicons',
 84 | 		],
 85 | 		'fs-theme' => [
 86 | 			'adapter' => 'Standard',
 87 | 			'tempdir' => storage_path( 'tmp' ),
 88 | 			'basedir' => public_path( 'vendor/shop/themes' ),
 89 | 			'baseurl' => rtrim(env('ASSET_URL', PHP_SAPI == 'cli' ? env('APP_URL') : ''), '/') . '/vendor/shop/themes',
 90 | 		],
 91 | 		'fs-admin' => [
 92 | 			'adapter' => 'Standard',
 93 | 			'tempdir' => storage_path( 'tmp' ),
 94 | 			'basedir' => storage_path( 'admin' ),
 95 | 		],
 96 | 		'fs-export' => [
 97 | 			'adapter' => 'Standard',
 98 | 			'tempdir' => storage_path( 'tmp' ),
 99 | 			'basedir' => storage_path( 'export' ),
100 | 		],
101 | 		'fs-import' => [
102 | 			'adapter' => 'Standard',
103 | 			'tempdir' => storage_path( 'tmp' ),
104 | 			'basedir' => storage_path( 'import' ),
105 | 		],
106 | 		'fs-secure' => [
107 | 			'adapter' => 'Standard',
108 | 			'tempdir' => storage_path( 'tmp' ),
109 | 			'basedir' => storage_path( 'secure' ),
110 | 		],
111 | 		'mq' => [
112 | 			'adapter' => 'Standard',
113 | 			'db' => 'db',
114 | 		],
115 | 		'email' => [
116 | 			'from-email' => config( 'mail.from.address' ),
117 | 			'from-name' => config( 'mail.from.name' ),
118 | 		],
119 | 	],
120 | 
121 | 	'admin' => [],
122 | 
123 | 	'client' => [
124 | 		'html' => [
125 | 			'basket' => [
126 | 				'cache' => [
127 | 					// 'enable' => false, // Disable basket content caching for development
128 | 				],
129 | 			],
130 | 			'common' => [
131 | 				'cache' => [
132 | 					// 'force' => true // enforce caching for logged in users
133 | 				],
134 | 			],
135 | 			'catalog' => [
136 | 				'lists' => [
137 | 					'basket-add' => true, // shows add to basket in list views
138 | 					// 'infinite-scroll' => true, // load more products in list view
139 | 					// 'size' => 48, // number of products per page
140 | 				],
141 | 				'selection' => [
142 | 					'type' => [// how variant attributes are displayed
143 | 						'color' => 'radio',
144 | 						'length' => 'radio',
145 | 						'width' => 'radio',
146 | 					],
147 | 				],
148 | 			],
149 | 		],
150 | 	],
151 | 
152 | 	'controller' => [
153 | 		'frontend' => [
154 | 			'catalog' => [
155 | 				'levels-always' => 3 // number of category levels for mega menu
156 | 			]
157 | 		]
158 | 	],
159 | 
160 | 	'i18n' => [
161 | 	],
162 | 
163 | 	'madmin' => [
164 | 		'cache' => [
165 | 			'manager' => [
166 | 				// 'name' => 'None', // Disable caching for development
167 | 			],
168 | 		],
169 | 		'log' => [
170 | 			'manager' => [
171 | 				// 'loglevel' => 7, // Enable debug logging into madmin_log table
172 | 			],
173 | 		],
174 | 	],
175 | 
176 | 	'mshop' => [
177 | 		'locale' => [
178 | 			// 'site' => '<custom site code>', // used instead of "default"
179 | 		]
180 | 	],
181 | 
182 | 
183 | 	'command' => [
184 | 	],
185 | 
186 | 	'frontend' => [
187 | 	],
188 | 
189 | 	'backend' => [
190 | 	],
191 | 
192 | ];
193 | 


--------------------------------------------------------------------------------
/public/mimeicons/application/illustrator.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/illustrator.png


--------------------------------------------------------------------------------
/public/mimeicons/application/javascript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/javascript.png


--------------------------------------------------------------------------------
/public/mimeicons/application/msword.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/msword.png


--------------------------------------------------------------------------------
/public/mimeicons/application/octet-stream.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/octet-stream.png


--------------------------------------------------------------------------------
/public/mimeicons/application/pdf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/pdf.png


--------------------------------------------------------------------------------
/public/mimeicons/application/pgp-encrypted.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/pgp-encrypted.png


--------------------------------------------------------------------------------
/public/mimeicons/application/pgp-keys.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/pgp-keys.png


--------------------------------------------------------------------------------
/public/mimeicons/application/pkcs7-mime.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/pkcs7-mime.png


--------------------------------------------------------------------------------
/public/mimeicons/application/postscript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/postscript.png


--------------------------------------------------------------------------------
/public/mimeicons/application/relaxng.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/relaxng.png


--------------------------------------------------------------------------------
/public/mimeicons/application/rss+xml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/rss+xml.png


--------------------------------------------------------------------------------
/public/mimeicons/application/rtf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/rtf.png


--------------------------------------------------------------------------------
/public/mimeicons/application/sxw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/sxw.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.ms-access.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.ms-access.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.ms-excel.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.ms-excel.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.ms-powerpoint.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.ms-powerpoint.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.chart.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.chart.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.database.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.database.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.formula.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.formula.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.graphics.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.graphics.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.image.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.presentation-template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.presentation-template.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.presentation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.presentation.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.spreadsheet-template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.spreadsheet-template.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.spreadsheet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.spreadsheet.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.oasis.opendocument.text.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.oasis.opendocument.text.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.rn-realmedia.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.rn-realmedia.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.scribus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.scribus.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.stardivision.calc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.stardivision.calc.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.stardivision.draw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.stardivision.draw.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.sun.xml.calc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.sun.xml.calc.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.sun.xml.calc.template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.sun.xml.calc.template.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.sun.xml.draw.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.sun.xml.draw.png


--------------------------------------------------------------------------------
/public/mimeicons/application/vnd.sun.xml.draw.template.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/vnd.sun.xml.draw.template.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-7z-compressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-7z-compressed.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-ace.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-ace.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-applix-spreadsheet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-applix-spreadsheet.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-ar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-ar.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-arc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-arc.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-archive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-archive.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-arj.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-arj.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-awk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-awk.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-bittorrent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-bittorrent.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-bzdvi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-bzdvi.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-bzip-compressed-tar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-bzip-compressed-tar.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-bzip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-bzip.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-cd-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-cd-image.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-cda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-cda.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-compress.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-compress.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-compressed-tar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-compressed-tar.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-cpio.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-cpio.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-cue.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-cue.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-deb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-deb.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-designer.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-designer.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-desktop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-desktop.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-egon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-egon.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-executable-script.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-executable-script.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-executable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-executable.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-font-afm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-font-afm.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-font-bdf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-font-bdf.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-font-otf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-font-otf.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-font-pcf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-font-pcf.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-font-snf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-font-snf.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-font-ttf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-font-ttf.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-font-type1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-font-type1.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-gnumeric.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-gnumeric.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-gzdvi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-gzdvi.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-gzip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-gzip.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-gzpostscript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-gzpostscript.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-java-applet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-java-applet.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-java-archive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-java-archive.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-java.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-java.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-javascript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-javascript.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-k3b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-k3b.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-kcsrc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-kcsrc.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-kgetlist.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-kgetlist.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-kontour.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-kontour.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-kplato.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-kplato.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-krita.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-krita.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-kvtml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-kvtml.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-lha.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-lha.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-lyx.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-lyx.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-lzma-compressed-tar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-lzma-compressed-tar.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-lzop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-lzop.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-m4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-m4.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-marble.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-marble.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-mimearchive.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-mimearchive.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-mplayer2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-mplayer2.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-ms-dos-executable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-ms-dos-executable.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-mswinurl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-mswinurl.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-mswrite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-mswrite.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-nzb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-nzb.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-object.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-object.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-pak.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-pak.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-pem-key.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-pem-key.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-perl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-perl.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-php.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-php.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-plasma.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-plasma.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-python-bytecode.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-python-bytecode.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-qet-element.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-qet-element.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-qet-project.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-qet-project.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-quattropro.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-quattropro.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-rar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-rar.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-rpm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-rpm.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-ruby.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-ruby.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-sharedlib.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-sharedlib.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-shellscript.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-shellscript.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-shockwave-flash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-shockwave-flash.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-siag.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-siag.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-smb-server.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-smb-server.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-smb-workgroup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-smb-workgroup.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-subrip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-subrip.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-tar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-tar.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-tarz.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-tarz.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-tgif.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-tgif.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-trash.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-trash.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-troff-man.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-troff-man.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-tzo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-tzo.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-wmf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-wmf.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-zerosize.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-zerosize.png


--------------------------------------------------------------------------------
/public/mimeicons/application/x-zoo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/x-zoo.png


--------------------------------------------------------------------------------
/public/mimeicons/application/xhtml+xml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/xhtml+xml.png


--------------------------------------------------------------------------------
/public/mimeicons/application/xml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/xml.png


--------------------------------------------------------------------------------
/public/mimeicons/application/xsd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/xsd.png


--------------------------------------------------------------------------------
/public/mimeicons/application/xslt+xml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/xslt+xml.png


--------------------------------------------------------------------------------
/public/mimeicons/application/zip.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/application/zip.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/ac3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/ac3.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/midi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/midi.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/prs.sid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/prs.sid.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/vnd.rn-realvideo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/vnd.rn-realvideo.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/x-adpcm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/x-adpcm.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/x-aiff.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/x-aiff.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/x-flac+ogg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/x-flac+ogg.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/x-flac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/x-flac.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/x-generic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/x-generic.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/x-monkey.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/x-monkey.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/x-speex+ogg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/x-speex+ogg.png


--------------------------------------------------------------------------------
/public/mimeicons/audio/x-wav.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/audio/x-wav.png


--------------------------------------------------------------------------------
/public/mimeicons/fonts/package.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/fonts/package.png


--------------------------------------------------------------------------------
/public/mimeicons/image/svg+xml-compressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/image/svg+xml-compressed.png


--------------------------------------------------------------------------------
/public/mimeicons/image/svg+xml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/image/svg+xml.png


--------------------------------------------------------------------------------
/public/mimeicons/image/x-eps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/image/x-eps.png


--------------------------------------------------------------------------------
/public/mimeicons/image/x-generic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/image/x-generic.png


--------------------------------------------------------------------------------
/public/mimeicons/image/x-vnd.trolltech.qpicture.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/image/x-vnd.trolltech.qpicture.png


--------------------------------------------------------------------------------
/public/mimeicons/image/x-xfig.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/image/x-xfig.png


--------------------------------------------------------------------------------
/public/mimeicons/inode/directory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/inode/directory.png


--------------------------------------------------------------------------------
/public/mimeicons/message/news.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/message/news.png


--------------------------------------------------------------------------------
/public/mimeicons/message/rfc822.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/message/rfc822.png


--------------------------------------------------------------------------------
/public/mimeicons/package/x-generic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/package/x-generic.png


--------------------------------------------------------------------------------
/public/mimeicons/text/calendar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/calendar.png


--------------------------------------------------------------------------------
/public/mimeicons/text/css.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/css.png


--------------------------------------------------------------------------------
/public/mimeicons/text/csv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/csv.png


--------------------------------------------------------------------------------
/public/mimeicons/text/directory.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/directory.png


--------------------------------------------------------------------------------
/public/mimeicons/text/enriched.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/enriched.png


--------------------------------------------------------------------------------
/public/mimeicons/text/html.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/html.png


--------------------------------------------------------------------------------
/public/mimeicons/text/mathml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/mathml.png


--------------------------------------------------------------------------------
/public/mimeicons/text/plain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/plain.png


--------------------------------------------------------------------------------
/public/mimeicons/text/rdf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/rdf.png


--------------------------------------------------------------------------------
/public/mimeicons/text/rtf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/rtf.png


--------------------------------------------------------------------------------
/public/mimeicons/text/sgml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/sgml.png


--------------------------------------------------------------------------------
/public/mimeicons/text/troff.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/troff.png


--------------------------------------------------------------------------------
/public/mimeicons/text/vcalendar.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/vcalendar.png


--------------------------------------------------------------------------------
/public/mimeicons/text/vnd.abc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/vnd.abc.png


--------------------------------------------------------------------------------
/public/mimeicons/text/vnd.wap.wml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/vnd.wap.wml.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-adasrc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-adasrc.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-authors.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-authors.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-bibtex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-bibtex.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-c++hdr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-c++hdr.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-c++src.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-c++src.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-changelog.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-changelog.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-chdr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-chdr.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-cmake.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-cmake.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-copying.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-copying.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-csharp.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-csharp.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-csrc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-csrc.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-dtd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-dtd.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-generic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-generic.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-haskell.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-haskell.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-hex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-hex.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-install.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-install.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-java.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-java.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-katefilelist.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-katefilelist.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-ldif.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-ldif.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-log.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-log.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-makefile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-makefile.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-nfo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-nfo.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-objchdr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-objchdr.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-objcsrc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-objcsrc.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-pascal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-pascal.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-patch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-patch.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-po.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-po.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-python.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-python.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-readme.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-readme.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-script.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-script.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-sql.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-sql.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-tcl.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-tcl.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-tex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-tex.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-texinfo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-texinfo.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-vcard.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-vcard.png


--------------------------------------------------------------------------------
/public/mimeicons/text/x-xslfo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/x-xslfo.png


--------------------------------------------------------------------------------
/public/mimeicons/text/xmcd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/xmcd.png


--------------------------------------------------------------------------------
/public/mimeicons/text/xml.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/text/xml.png


--------------------------------------------------------------------------------
/public/mimeicons/unknown.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/unknown.png


--------------------------------------------------------------------------------
/public/mimeicons/uri/mms.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/uri/mms.png


--------------------------------------------------------------------------------
/public/mimeicons/uri/mmst.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/uri/mmst.png


--------------------------------------------------------------------------------
/public/mimeicons/uri/mmsu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/uri/mmsu.png


--------------------------------------------------------------------------------
/public/mimeicons/uri/pnm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/uri/pnm.png


--------------------------------------------------------------------------------
/public/mimeicons/uri/rtspt.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/uri/rtspt.png


--------------------------------------------------------------------------------
/public/mimeicons/uri/rtspu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/uri/rtspu.png


--------------------------------------------------------------------------------
/public/mimeicons/video/mp4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/video/mp4.png


--------------------------------------------------------------------------------
/public/mimeicons/video/webm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/video/webm.png


--------------------------------------------------------------------------------
/public/mimeicons/video/x-generic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/video/x-generic.png


--------------------------------------------------------------------------------
/public/mimeicons/video/x-mng.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/video/x-mng.png


--------------------------------------------------------------------------------
/public/mimeicons/video/x-wmv.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aimeos/aimeos-laravel/e31727f98cb1adc46848f5be8973a710e2a62ecb/public/mimeicons/video/x-wmv.png


--------------------------------------------------------------------------------
/src/Base/Aimeos.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | namespace Aimeos\Shop\Base;
 9 | 
10 | 
11 | /**
12 |  * Service providing the Aimeos object
13 |  */
14 | class Aimeos
15 | {
16 | 	/**
17 | 	 * @var \Illuminate\Contracts\Config\Repository
18 | 	 */
19 | 	private $config;
20 | 
21 | 	/**
22 | 	 * @var \Aimeos\Bootstrap
23 | 	 */
24 | 	private $object;
25 | 
26 | 
27 | 	/**
28 | 	 * Initializes the object
29 | 	 *
30 | 	 * @param \Illuminate\Contracts\Config\Repository $config Configuration object
31 | 	 */
32 | 	public function __construct( \Illuminate\Contracts\Config\Repository $config )
33 | 	{
34 | 		$this->config = $config;
35 | 	}
36 | 
37 | 
38 | 	/**
39 | 	 * Returns the Aimeos object.
40 | 	 *
41 | 	 * @return \Aimeos\Bootstrap Aimeos bootstrap object
42 | 	 */
43 | 	public function get() : \Aimeos\Bootstrap
44 | 	{
45 | 		if( $this->object === null )
46 | 		{
47 | 			$dir = base_path( 'ext' );
48 | 
49 | 			if( !is_dir( $dir ) ) {
50 | 				$dir = dirname( __DIR__, 4 ) . DIRECTORY_SEPARATOR . 'ext';
51 | 			}
52 | 
53 | 			$extDirs = (array) $this->config->get( 'shop.extdir', $dir );
54 | 			$this->object = new \Aimeos\Bootstrap( $extDirs, false );
55 | 		}
56 | 
57 | 		return $this->object;
58 | 	}
59 | 
60 | 
61 | 	/**
62 | 	 * Returns the version of the Aimeos package
63 | 	 *
64 | 	 * @return string Version string
65 | 	 */
66 | 	public function getVersion() : string
67 | 	{
68 | 		if( ( $content = @file_get_contents( base_path( 'composer.lock' ) ) ) !== false
69 | 			&& ( $content = json_decode( $content, true ) ) !== null && isset( $content['packages'] )
70 | 		) {
71 | 			foreach( (array) $content['packages'] as $item )
72 | 			{
73 | 				if( $item['name'] === 'aimeos/aimeos-laravel' ) {
74 | 					return $item['version'];
75 | 				}
76 | 			}
77 | 		}
78 | 
79 | 		return '';
80 | 	}
81 | }


--------------------------------------------------------------------------------
/src/Base/Config.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | namespace Aimeos\Shop\Base;
 9 | 
10 | 
11 | /**
12 |  * Service providing the config object
13 |  */
14 | class Config
15 | {
16 | 	/**
17 | 	 * @var \Aimeos\Shop\Base\Config[]
18 | 	 */
19 | 	private $objects = [];
20 | 
21 | 	/**
22 | 	 * @var \Aimeos\Shop\Base\Aimeos
23 | 	 */
24 | 	private $aimeos;
25 | 
26 | 	/**
27 | 	 * @var \Illuminate\Contracts\Config\Repository
28 | 	 */
29 | 	private $config;
30 | 
31 | 
32 | 	/**
33 | 	 * Initializes the object
34 | 	 *
35 | 	 * @param \Illuminate\Contracts\Config\Repository $config Configuration object
36 | 	 * @param \Aimeos\Shop\Base\Aimeos $aimeos Aimeos object
37 | 	 */
38 | 	public function __construct( \Illuminate\Contracts\Config\Repository $config, \Aimeos\Shop\Base\Aimeos $aimeos )
39 | 	{
40 | 		$this->aimeos = $aimeos;
41 | 		$this->config = $config;
42 | 	}
43 | 
44 | 
45 | 	/**
46 | 	 * Creates a new configuration object.
47 | 	 *
48 | 	 * @param string $type Configuration type ("frontend" or "backend")
49 | 	 * @return \Aimeos\Base\Config\Iface Configuration object
50 | 	 */
51 | 	public function get( string $type = 'frontend' ) : \Aimeos\Base\Config\Iface
52 | 	{
53 | 		if( !isset( $this->objects[$type] ) )
54 | 		{
55 | 			$configPaths = $this->aimeos->get()->getConfigPaths();
56 | 			$cfgfile = dirname( dirname( __DIR__ ) ) . '/config/default.php';
57 | 
58 | 			$config = new \Aimeos\Base\Config\PHPArray( require $cfgfile, $configPaths );
59 | 
60 | 			if( $this->config->get( 'shop.apc_enabled', false ) == true ) {
61 | 				$config = new \Aimeos\Base\Config\Decorator\APC( $config, $this->config->get( 'shop.apc_prefix', 'laravel:' ) );
62 | 			}
63 | 
64 | 			$config = new \Aimeos\Base\Config\Decorator\Memory( $config, $this->config->get( 'shop' ) );
65 | 
66 | 			if( ( $conf = $this->config->get( 'shop.' . $type, [] ) ) !== [] ) {
67 | 				$config = new \Aimeos\Base\Config\Decorator\Memory( $config, $conf );
68 | 			}
69 | 
70 | 			$this->objects[$type] = $config;
71 | 		}
72 | 
73 | 		return $this->objects[$type];
74 | 	}
75 | }
76 | 


--------------------------------------------------------------------------------
/src/Base/Context.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | /**
  4 |  * @license MIT, http://opensource.org/licenses/MIT
  5 |  * @copyright Aimeos (aimeos.org), 2015-2023
  6 |  */
  7 | 
  8 | namespace Aimeos\Shop\Base;
  9 | 
 10 | 
 11 | use Illuminate\Support\Facades\Auth;
 12 | use Illuminate\Support\Facades\Route;
 13 | use Illuminate\Support\Facades\Session;
 14 | 
 15 | 
 16 | /**
 17 |  * Service providing the context objects
 18 |  */
 19 | class Context
 20 | {
 21 | 	/**
 22 | 	 * @var \Aimeos\MShop\ContextIface
 23 | 	 */
 24 | 	private $context;
 25 | 
 26 | 	/**
 27 | 	 * @var \Aimeos\Shop\Base\Config
 28 | 	 */
 29 | 	private $config;
 30 | 
 31 | 	/**
 32 | 	 * @var \Aimeos\Shop\Base\I18n
 33 | 	 */
 34 | 	private $i18n;
 35 | 
 36 | 	/**
 37 | 	 * @var \Aimeos\Shop\Base\Locale
 38 | 	 */
 39 | 	private $locale;
 40 | 
 41 | 	/**
 42 | 	 * @var \Illuminate\Session\Store
 43 | 	 */
 44 | 	private $session;
 45 | 
 46 | 
 47 | 	/**
 48 | 	 * Initializes the object
 49 | 	 *
 50 | 	 * @param \Illuminate\Session\Store $session Laravel session object
 51 | 	 * @param \Aimeos\Shop\Base\Config $config Configuration object
 52 | 	 * @param \Aimeos\Shop\Base\Locale $locale Locale object
 53 | 	 * @param \Aimeos\Shop\Base\I18n $i18n Internationalisation object
 54 | 	 */
 55 | 	public function __construct( \Illuminate\Session\Store $session, \Aimeos\Shop\Base\Config $config, \Aimeos\Shop\Base\Locale $locale, \Aimeos\Shop\Base\I18n $i18n )
 56 | 	{
 57 | 		$this->session = $session;
 58 | 		$this->config = $config;
 59 | 		$this->locale = $locale;
 60 | 		$this->i18n = $i18n;
 61 | 	}
 62 | 
 63 | 
 64 | 	/**
 65 | 	 * Returns the current context
 66 | 	 *
 67 | 	 * @param bool $locale True to add locale object to context, false if not (deprecated, use \Aimeos\Shop\Base\Locale)
 68 | 	 * @param string $type Configuration type, i.e. "frontend" or "backend" (deprecated, use \Aimeos\Shop\Base\Config)
 69 | 	 * @return \Aimeos\MShop\ContextIface Context object
 70 | 	 */
 71 | 	public function get( bool $locale = true, string $type = 'frontend' ) : \Aimeos\MShop\ContextIface
 72 | 	{
 73 | 		$config = $this->config->get( $type );
 74 | 
 75 | 		if( $this->context === null )
 76 | 		{
 77 | 			$context = new \Aimeos\MShop\Context();
 78 | 			$context->setConfig( $config );
 79 | 
 80 | 			$this->addDataBaseManager( $context );
 81 | 			$this->addFilesystemManager( $context );
 82 | 			$this->addMessageQueueManager( $context );
 83 | 			$this->addLogger( $context );
 84 | 			$this->addCache( $context );
 85 | 			$this->addMailer( $context );
 86 | 			$this->addNonce( $context );
 87 | 			$this->addPassword( $context );
 88 | 			$this->addProcess( $context );
 89 | 			$this->addSession( $context );
 90 | 			$this->addToken( $context );
 91 | 			$this->addUserGroups( $context );
 92 | 
 93 | 			$this->context = $context;
 94 | 		}
 95 | 
 96 | 		$this->context->setConfig( $config );
 97 | 
 98 | 		if( $locale === true )
 99 | 		{
100 | 			$localeItem = $this->locale->get( $this->context );
101 | 			$this->context->setLocale( $localeItem );
102 | 			$this->context->setI18n( $this->i18n->get( array( $localeItem->getLanguageId() ) ) );
103 | 
104 | 			$config->apply( $localeItem->getSiteItem()->getConfig() );
105 | 		}
106 | 
107 | 		return $this->context;
108 | 	}
109 | 
110 | 
111 | 	/**
112 | 	 * Adds the cache object to the context
113 | 	 *
114 | 	 * @param \Aimeos\MShop\ContextIface $context Context object including config
115 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
116 | 	 */
117 | 	protected function addCache( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
118 | 	{
119 | 		$cache = \Aimeos\MAdmin::create( $context, 'cache' )->getCache();
120 | 
121 | 		return $context->setCache( $cache );
122 | 	}
123 | 
124 | 
125 | 	/**
126 | 	 * Adds the database manager object to the context
127 | 	 *
128 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
129 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
130 | 	 */
131 | 	protected function addDatabaseManager( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
132 | 	{
133 | 		$dbm = new \Aimeos\Base\DB\Manager\Standard( $context->config()->get( 'resource' ), 'DBAL' );
134 | 
135 | 		return $context->setDatabaseManager( $dbm );
136 | 	}
137 | 
138 | 
139 | 	/**
140 | 	 * Adds the filesystem manager object to the context
141 | 	 *
142 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
143 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
144 | 	 */
145 | 	protected function addFilesystemManager( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
146 | 	{
147 | 		$config = $context->config()->get( 'resource' );
148 | 		$fs = new \Aimeos\Base\Filesystem\Manager\Laravel( app( 'filesystem' ), $config, storage_path( 'aimeos' ) );
149 | 
150 | 		return $context->setFilesystemManager( $fs );
151 | 	}
152 | 
153 | 
154 | 	/**
155 | 	 * Adds the logger object to the context
156 | 	 *
157 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
158 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
159 | 	 */
160 | 	protected function addLogger( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
161 | 	{
162 | 		$logger = \Aimeos\MAdmin::create( $context, 'log' );
163 | 
164 | 		return $context->setLogger( $logger );
165 | 	}
166 | 
167 | 
168 | 
169 | 	/**
170 | 	 * Adds the mailer object to the context
171 | 	 *
172 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
173 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
174 | 	 */
175 | 	protected function addMailer( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
176 | 	{
177 | 		$mail = new \Aimeos\Base\Mail\Manager\Laravel( app( 'mail.manager' ) );
178 | 
179 | 		return $context->setMail( $mail );
180 | 	}
181 | 
182 | 
183 | 	/**
184 | 	 * Adds the message queue manager object to the context
185 | 	 *
186 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
187 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
188 | 	 */
189 | 	protected function addMessageQueueManager( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
190 | 	{
191 | 		$mq = new \Aimeos\Base\MQueue\Manager\Standard( $context->config()->get( 'resource' ) );
192 | 
193 | 		return $context->setMessageQueueManager( $mq );
194 | 	}
195 | 
196 | 
197 | 	/**
198 | 	 * Adds the nonce value for inline JS to the context
199 | 	 *
200 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
201 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
202 | 	 */
203 | 	protected function addNonce( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
204 | 	{
205 | 		return $context->setNonce( base64_encode( random_bytes( 16 ) ) );
206 | 	}
207 | 
208 | 
209 | 	/**
210 | 	 * Adds the password hasher object to the context
211 | 	 *
212 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
213 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
214 | 	 */
215 | 	protected function addPassword( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
216 | 	{
217 | 		return $context->setPassword( new \Aimeos\Base\Password\Standard() );
218 | 	}
219 | 
220 | 
221 | 	/**
222 | 	 * Adds the process object to the context
223 | 	 *
224 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
225 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
226 | 	 */
227 | 	protected function addProcess( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
228 | 	{
229 | 		$config = $context->config();
230 | 		$max = $config->get( 'pcntl_max', 4 );
231 | 		$prio = $config->get( 'pcntl_priority', 19 );
232 | 
233 | 		$process = new \Aimeos\Base\Process\Pcntl( $max, $prio );
234 | 		$process = new \Aimeos\Base\Process\Decorator\Check( $process );
235 | 
236 | 		return $context->setProcess( $process );
237 | 	}
238 | 
239 | 
240 | 	/**
241 | 	 * Adds the session object to the context
242 | 	 *
243 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
244 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
245 | 	 */
246 | 	protected function addSession( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
247 | 	{
248 | 		$session = new \Aimeos\Base\Session\Laravel( $this->session );
249 | 
250 | 		return $context->setSession( $session );
251 | 	}
252 | 
253 | 
254 | 	/**
255 | 	 * Adds the session token to the context
256 | 	 *
257 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
258 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
259 | 	 */
260 | 	protected function addToken( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
261 | 	{
262 | 		if( ( $token = Session::get( 'token' ) ) === null ) {
263 | 			Session::put( 'token', $token = Session::getId() );
264 | 		}
265 | 
266 | 		return $context->setToken( $token );
267 | 	}
268 | 
269 | 
270 | 	/**
271 | 	 * Adds the user and groups if available
272 | 	 *
273 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
274 | 	 * @return \Aimeos\MShop\ContextIface Modified context object
275 | 	 */
276 | 	protected function addUserGroups( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\ContextIface
277 | 	{
278 | 		$key = collect( config( 'shop.routes' ) )
279 | 			->where( 'prefix', optional( Route::getCurrentRoute() )->getPrefix() )
280 | 			->keys()->first();
281 | 		$gname = data_get( config( 'shop.guards' ), $key, Auth::getDefaultDriver() );
282 | 
283 | 		if( ( $guard = Auth::guard( $gname ) ) && ( $userid = $guard->id() ) )
284 | 		{
285 | 			$context->setUser( function() use ( $context, $userid ) {
286 | 				try {
287 | 					return \Aimeos\MShop::create( $context, 'customer' )->get( $userid, ['group'] );
288 | 				} catch( \Aimeos\MShop\Exception $e ) { // avoid errors if user is assigned to another site
289 | 					return null;
290 | 				}
291 | 			} );
292 | 
293 | 			$context->setGroups( function() use ( $context ) {
294 | 				return $context->user()?->getGroups() ?? [];
295 | 			} );
296 | 
297 | 			$context->setEditor( $guard->user()?->email ?: \Request::ip() );
298 | 		}
299 | 		elseif( $ip = \Request::ip() )
300 | 		{
301 | 			$context->setEditor( $ip );
302 | 		}
303 | 
304 | 		return $context;
305 | 	}
306 | }
307 | 


--------------------------------------------------------------------------------
/src/Base/I18n.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | namespace Aimeos\Shop\Base;
 9 | 
10 | 
11 | /**
12 |  * Service providing the internationalization objects
13 |  */
14 | class I18n
15 | {
16 | 	/**
17 | 	 * @var \Aimeos\Shop\Base\Aimeos
18 | 	 */
19 | 	private $aimeos;
20 | 
21 | 	/**
22 | 	 * @var \Illuminate\Contracts\Config\Repository
23 | 	 */
24 | 	private $config;
25 | 
26 | 	/**
27 | 	 * @var array
28 | 	 */
29 | 	private $i18n = [];
30 | 
31 | 
32 | 	/**
33 | 	 * Initializes the object
34 | 	 *
35 | 	 * @param \Illuminate\Contracts\Config\Repository $config Configuration object
36 | 	 * @param \Aimeos\Shop\Base\Aimeos $aimeos Aimeos object
37 | 	 */
38 | 	public function __construct( \Illuminate\Contracts\Config\Repository $config, \Aimeos\Shop\Base\Aimeos $aimeos )
39 | 	{
40 | 		$this->aimeos = $aimeos;
41 | 		$this->config = $config;
42 | 	}
43 | 
44 | 
45 | 	/**
46 | 	 * Creates new translation objects.
47 | 	 *
48 | 	 * @param array $languageIds List of two letter ISO language IDs
49 | 	 * @return \Aimeos\Base\Translation\Iface[] List of translation objects
50 | 	 */
51 | 	public function get( array $languageIds ) : array
52 | 	{
53 | 		$i18nPaths = $this->aimeos->get()->getI18nPaths();
54 | 
55 | 		foreach( $languageIds as $langid )
56 | 		{
57 | 			if( !isset( $this->i18n[$langid] ) )
58 | 			{
59 | 				$i18n = new \Aimeos\Base\Translation\Gettext( $i18nPaths, $langid );
60 | 
61 | 				if( $this->config->get( 'shop.apc_enabled', false ) == true ) {
62 | 					$i18n = new \Aimeos\Base\Translation\Decorator\APC( $i18n, $this->config->get( 'shop.apc_prefix', 'laravel:' ) );
63 | 				}
64 | 
65 | 				if( $this->config->has( 'shop.i18n.' . $langid ) ) {
66 | 					$i18n = new \Aimeos\Base\Translation\Decorator\Memory( $i18n, $this->config->get( 'shop.i18n.' . $langid ) );
67 | 				}
68 | 
69 | 				$this->i18n[$langid] = $i18n;
70 | 			}
71 | 		}
72 | 
73 | 		return $this->i18n;
74 | 	}
75 | }


--------------------------------------------------------------------------------
/src/Base/Locale.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | namespace Aimeos\Shop\Base;
 9 | 
10 | 
11 | use Illuminate\Support\Facades\Request;
12 | use Illuminate\Support\Facades\Route;
13 | 
14 | 
15 | /**
16 |  * Service providing the context objects
17 |  */
18 | class Locale
19 | {
20 | 	/**
21 | 	 * @var \Illuminate\Contracts\Config\Repository
22 | 	 */
23 | 	private $config;
24 | 
25 | 	/**
26 | 	 * @var \Aimeos\MShop\Locale\Item\Iface
27 | 	 */
28 | 	private $locale;
29 | 
30 | 
31 | 	/**
32 | 	 * Initializes the object
33 | 	 *
34 | 	 * @param \Illuminate\Contracts\Config\Repository $config Configuration object
35 | 	 */
36 | 	public function __construct( \Illuminate\Contracts\Config\Repository $config )
37 | 	{
38 | 		$this->config = $config;
39 | 	}
40 | 
41 | 
42 | 	/**
43 | 	 * Returns the locale item for the current request
44 | 	 *
45 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
46 | 	 * @return \Aimeos\MShop\Locale\Item\Iface Locale item object
47 | 	 */
48 | 	public function get( \Aimeos\MShop\ContextIface $context ) : \Aimeos\MShop\Locale\Item\Iface
49 | 	{
50 | 		if( $this->locale === null )
51 | 		{
52 | 			$site = config( 'shop.mshop.locale.site', 'default' );
53 | 			$lang = app()->getLocale();
54 | 			$currency = '';
55 | 
56 | 			if( Route::current() )
57 | 			{
58 | 				$site = Request::route( 'site', $site );
59 | 				$lang = Request::route( 'locale', $lang );
60 | 				$currency = Request::route( 'currency', $currency );
61 | 			}
62 | 
63 | 			$site = Request::input( 'site', $site );
64 | 			$lang = Request::input( 'locale', $lang );
65 | 			$currency = Request::input( 'currency', $currency );
66 | 
67 | 			$localeManager = \Aimeos\MShop::create( $context, 'locale' );
68 | 			$disableSites = $this->config->get( 'shop.disableSites', true );
69 | 
70 | 			$this->locale = $localeManager->bootstrap( $site, $lang, $currency, $disableSites );
71 | 		}
72 | 
73 | 		return $this->locale;
74 | 	}
75 | 
76 | 
77 | 	/**
78 | 	 * Returns the locale item for the current request
79 | 	 *
80 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
81 | 	 * @param string $site Unique site code
82 | 	 * @return \Aimeos\MShop\Locale\Item\Iface Locale item object
83 | 	 */
84 | 	public function getBackend( \Aimeos\MShop\ContextIface $context, string $site ) : \Aimeos\MShop\Locale\Item\Iface
85 | 	{
86 | 		$localeManager = \Aimeos\MShop::create( $context, 'locale' );
87 | 
88 | 		try {
89 | 			$localeItem = $localeManager->bootstrap( $site, '', '', false, null, true );
90 | 		} catch( \Aimeos\MShop\Exception $e ) {
91 | 			$localeItem = $localeManager->create();
92 | 		}
93 | 
94 | 		return $localeItem->setCurrencyId( null )->setLanguageId( null );
95 | 	}
96 | }
97 | 


--------------------------------------------------------------------------------
/src/Base/Shop.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | namespace Aimeos\Shop\Base;
 9 | 
10 | 
11 | /**
12 |  * Service providing the shop object
13 |  */
14 | class Shop
15 | {
16 | 	/**
17 | 	 * @var \Aimeos\MShop\ContextIface
18 | 	 */
19 | 	private $context;
20 | 
21 | 	/**
22 | 	 * @var \Aimeos\Base\View\Iface
23 | 	 */
24 | 	private $view;
25 | 
26 | 	/**
27 | 	 * @var array
28 | 	 */
29 | 	private $objects = [];
30 | 
31 | 
32 | 	/**
33 | 	 * Initializes the object
34 | 	 *
35 | 	 * @param \Aimeos\Shop\Base\Aimeos $aimeos Aimeos object
36 | 	 * @param \Aimeos\Shop\Base\Context $context Context object
37 | 	 * @param \Aimeos\Shop\Base\View $view View object
38 | 	 */
39 | 	public function __construct( \Aimeos\Shop\Base\Aimeos $aimeos,
40 | 		\Aimeos\Shop\Base\Context $context, \Aimeos\Shop\Base\View $view )
41 | 	{
42 | 		$this->context = $context->get();
43 | 		$locale = $this->context->locale();
44 | 
45 | 		$tmplPaths = $aimeos->get()->getTemplatePaths( 'client/html/templates', $locale->getSiteItem()->getTheme() );
46 | 		$langid = $locale->getLanguageId();
47 | 
48 | 		$this->view = $view->create( $this->context, $tmplPaths, $langid );
49 | 		$this->context->setView( $this->view );
50 | 	}
51 | 
52 | 
53 | 	/**
54 | 	 * Returns the HTML client for the given name
55 | 	 *
56 | 	 * @param string $name Name of the shop component
57 | 	 * @return \Aimeos\Client\Html\Iface HTML client
58 | 	 */
59 | 	public function get( string $name ) : \Aimeos\Client\Html\Iface
60 | 	{
61 | 		if( !isset( $this->objects[$name] ) )
62 | 		{
63 | 			$client = \Aimeos\Client\Html::create( $this->context, $name );
64 | 			$client->setView( clone $this->view );
65 | 			$client->init();
66 | 
67 | 			$this->objects[$name] = $client;
68 | 		}
69 | 
70 | 		return $this->objects[$name];
71 | 	}
72 | 
73 | 
74 | 	/** Returns the view template for the given name
75 | 	 *
76 | 	 * @param string $name View name, e.g. "account.index"
77 | 	 * @return string Template name, e.g. "shop::account.indx"
78 | 	 */
79 | 	public function template( string $name ) : string
80 | 	{
81 | 		$theme = $this->context->locale()->getSiteItem()->getTheme();
82 | 		return \Illuminate\Support\Facades\View::exists( $theme . '::' . $name ) ? $theme . '::' . $name : 'shop::' . $name;
83 | 	}
84 | 
85 | 
86 | 	/**
87 | 	 * Returns the used view object
88 | 	 *
89 | 	 * @return \Aimeos\Base\View\Iface View object
90 | 	 */
91 | 	public function view() : \Aimeos\Base\View\Iface
92 | 	{
93 | 		return $this->view;
94 | 	}
95 | }
96 | 


--------------------------------------------------------------------------------
/src/Base/Support.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | /**
  4 |  * @license MIT, http://opensource.org/licenses/MIT
  5 |  * @copyright Aimeos (aimeos.org), 2015-2023
  6 |  */
  7 | 
  8 | namespace Aimeos\Shop\Base;
  9 | 
 10 | 
 11 | use Illuminate\Support\Facades\Request;
 12 | use Illuminate\Support\Facades\Route;
 13 | 
 14 | 
 15 | /**
 16 |  * Service providing the supporting functionality
 17 |  */
 18 | class Support
 19 | {
 20 | 	/**
 21 | 	 * @var \Aimeos\Shop\Base\Context
 22 | 	 */
 23 | 	private $context;
 24 | 
 25 | 	/**
 26 | 	 * @var \Aimeos\Shop\Base\Locale
 27 | 	 */
 28 | 	private $locale;
 29 | 
 30 | 	/**
 31 | 	 * @var array
 32 | 	 */
 33 | 	private $access = [];
 34 | 
 35 | 
 36 | 	/**
 37 | 	 * Initializes the object
 38 | 	 *
 39 | 	 * @param \Aimeos\Shop\Base\Context $context Context provider
 40 | 	 * @param \Aimeos\Shop\Base\Locale $locale Locale provider
 41 | 	 */
 42 | 	public function __construct( \Aimeos\Shop\Base\Context $context, \Aimeos\Shop\Base\Locale $locale )
 43 | 	{
 44 | 		$this->context = $context;
 45 | 		$this->locale = $locale;
 46 | 	}
 47 | 
 48 | 
 49 | 	/**
 50 | 	 * Checks if the user is in the specified group and associatied to the site
 51 | 	 *
 52 | 	 * @param \Illuminate\Foundation\Auth\User $user Authenticated user
 53 | 	 * @param string|array $groupcodes Unique user/customer group codes that are allowed
 54 | 	 * @return bool True if user is part of the group, false if not
 55 | 	 */
 56 | 	public function checkUserGroup( \Illuminate\Foundation\Auth\User $user, $groupcodes ) : bool
 57 | 	{
 58 | 		$groups = ( is_array( $groupcodes ) ? implode( ',', $groupcodes ) : $groupcodes );
 59 | 
 60 | 		if( isset( $this->access[$user->id][$groups] ) ) {
 61 | 			return $this->access[$user->id][$groups];
 62 | 		}
 63 | 
 64 | 		$this->access[$user->id][$groups] = false;
 65 | 
 66 | 		$context = $this->context->get( false );
 67 | 		$siteid = current( array_reverse( explode( '.', trim( $user->siteid, '.' ) ) ) );
 68 | 
 69 | 		if( $siteid ) {
 70 | 			$site = \Aimeos\MShop::create( $context, 'locale/site' )->get( $siteid )->getCode();
 71 | 		} else {
 72 | 			$site = config( 'shop.mshop.locale.site', 'default' );
 73 | 		}
 74 | 
 75 | 		$site = ( Route::current() ? Route::input( 'site', Request::get( 'site', $site ) ) : $site );
 76 | 		$context->setLocale( $this->locale->getBackend( $context, $site ) );
 77 | 
 78 | 		foreach( array_reverse( $context->locale()->getSitePath() ) as $siteid )
 79 | 		{
 80 | 			if( $user->siteid === '' || $user->siteid === $siteid ) {
 81 | 				$this->access[$user->id][$groups] = $this->checkGroups( $context, $user->id, $groupcodes );
 82 | 			}
 83 | 		}
 84 | 
 85 | 		return $this->access[$user->id][$groups];
 86 | 	}
 87 | 
 88 | 
 89 | 	/**
 90 | 	 * Checks if one of the groups is associated to the given user ID
 91 | 	 *
 92 | 	 * @param \Aimeos\MShop\ContextIface $context Context item
 93 | 	 * @param string $userid ID of the logged in user
 94 | 	 * @param string[]|string $groupcodes List of group codes to check against
 95 | 	 * @return bool True if the user is in one of the groups, false if not
 96 | 	 */
 97 | 	protected function checkGroups( \Aimeos\MShop\ContextIface $context, string $userid, $groupcodes ) : bool
 98 | 	{
 99 | 		$manager = \Aimeos\MShop::create( $context, 'group' );
100 | 
101 | 		$search = $manager->filter();
102 | 		$search->setConditions( $search->compare( '==', 'group.code', (array) $groupcodes ) );
103 | 		$groupIds = $manager->search( $search )->keys()->toArray();
104 | 
105 | 		$manager = \Aimeos\MShop::create( $context, 'customer/lists' );
106 | 
107 | 		$search = $manager->filter()->slice( 0, 1 );
108 | 		$expr = array(
109 | 			$search->compare( '==', 'customer.lists.parentid', $userid ),
110 | 			$search->compare( '==', 'customer.lists.refid', $groupIds ),
111 | 			$search->compare( '==', 'customer.lists.domain', 'group' ),
112 | 		);
113 | 		$search->setConditions( $search->combine( '&&', $expr ) );
114 | 
115 | 		return !$manager->search( $search )->isEmpty();
116 | 	}
117 | }
118 | 


--------------------------------------------------------------------------------
/src/Command/AbstractCommand.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Command;
10 | 
11 | use Illuminate\Console\Command;
12 | 
13 | 
14 | /**
15 |  * Common base class for all commands
16 |  */
17 | abstract class AbstractCommand extends Command
18 | {
19 | 	/**
20 | 	 * Adds the configuration options from the input object to the given context
21 | 	 *
22 | 	 * @param \Aimeos\MShop\ContextIface $ctx Context object
23 | 	 */
24 | 	protected function addConfig( \Aimeos\MShop\ContextIface $ctx ) : \Aimeos\MShop\ContextIface
25 | 	{
26 | 		$config = $ctx->config();
27 | 
28 | 		foreach( (array) $this->option( 'option' ) as $option )
29 | 		{
30 | 			list( $name, $value ) = explode( ':', $option );
31 | 			$config->set( $name, $value );
32 | 		}
33 | 
34 | 		return $ctx;
35 | 	}
36 | 
37 | 
38 | 	/**
39 | 	 * Executes the function for all given sites
40 | 	 *
41 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
42 | 	 * @param \Closure $fcn Function to execute
43 | 	 * @param array|string|null $sites Site codes
44 | 	 */
45 | 	protected function exec( \Aimeos\MShop\ContextIface $context, \Closure $fcn, $sites )
46 | 	{
47 | 		$process = $context->process();
48 | 		$aimeos = $this->getLaravel()->make( 'aimeos' )->get();
49 | 
50 | 		$siteManager = \Aimeos\MShop::create( $context, 'locale/site' );
51 | 		$localeManager = \Aimeos\MShop::create( $context, 'locale' );
52 | 		$filter = $siteManager->filter();
53 | 		$start = 0;
54 | 
55 | 		if( !empty( $sites ) ) {
56 | 			$filter->add( ['locale.site.code' => !is_array( $sites ) ? explode( ' ', (string) $sites ) : $sites] );
57 | 		}
58 | 
59 | 		do
60 | 		{
61 | 			$siteItems = $siteManager->search( $filter->slice( $start ) );
62 | 
63 | 			foreach( $siteItems as $siteItem )
64 | 			{
65 | 				\Aimeos\MShop::cache( true );
66 | 				\Aimeos\MAdmin::cache( true );
67 | 
68 | 				$localeItem = $localeManager->bootstrap( $siteItem->getCode(), '', '', false );
69 | 				$localeItem->setLanguageId( null );
70 | 				$localeItem->setCurrencyId( null );
71 | 
72 | 				$lcontext = clone $context;
73 | 				$lcontext->setLocale( $localeItem );
74 | 
75 | 				$tmplPaths = $aimeos->getTemplatePaths( 'controller/jobs/templates', $siteItem->getTheme() );
76 | 				$view = $this->getLaravel()->make( 'aimeos.view' )->create( $lcontext, $tmplPaths );
77 | 				$lcontext->setView( $view );
78 | 
79 | 				$config = $lcontext->config();
80 | 				$config->apply( $siteItem->getConfig() );
81 | 
82 | 				$process->start( $fcn, [$lcontext, $aimeos], false );
83 | 			}
84 | 
85 | 			$count = count( $siteItems );
86 | 			$start += $count;
87 | 		}
88 | 		while( $count === $filter->getLimit() );
89 | 
90 | 		$process->wait();
91 | 	}
92 | }


--------------------------------------------------------------------------------
/src/Command/AccountCommand.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | /**
  4 |  * @license MIT, http://opensource.org/licenses/MIT
  5 |  * @copyright Aimeos (aimeos.org), 2015-2023
  6 |  */
  7 | 
  8 | 
  9 | namespace Aimeos\Shop\Command;
 10 | 
 11 | use Symfony\Component\Console\Input\InputOption;
 12 | use Symfony\Component\Console\Input\InputArgument;
 13 | 
 14 | 
 15 | /**
 16 |  * Creates new accounts or resets their passwords
 17 |  */
 18 | class AccountCommand extends AbstractCommand
 19 | {
 20 | 	/**
 21 | 	 * The name and signature of the console command.
 22 | 	 *
 23 | 	 * @var string
 24 | 	 */
 25 | 	protected $signature = 'aimeos:account
 26 | 		{email? : E-Mail adress of the (admin) user (will ask for if not given)}
 27 | 		{site? : Site to create account for (will use default value if not given}
 28 | 		{--password= : Secret password for the account (will ask for if not given)}
 29 | 		{--super : If account should have super user privileges for all sites}
 30 | 		{--admin : If account should have site administrator privileges}
 31 | 		{--editor : If account should have limited editor privileges}
 32 | 	';
 33 | 
 34 | 	/**
 35 | 	 * The console command description.
 36 | 	 *
 37 | 	 * @var string
 38 | 	 */
 39 | 	protected $description = 'Creates new (admin) accounts';
 40 | 
 41 | 
 42 | 	/**
 43 | 	 * Execute the console command.
 44 | 	 *
 45 | 	 * @return mixed
 46 | 	 */
 47 | 	public function handle()
 48 | 	{
 49 | 		$site = $this->argument( 'site' ) ?: config( 'shop.mshop.locale.site', 'default' );
 50 | 
 51 | 		if( ( $email = $this->argument( 'email' ) ) === null ) {
 52 | 			$email = $this->ask( 'E-Mail' );
 53 | 		}
 54 | 
 55 | 		if( ( $password = $this->option( 'password' ) ) === null ) {
 56 | 			$password = $this->secret( 'Password' );
 57 | 		}
 58 | 
 59 | 		$context = $this->getLaravel()->make( 'aimeos.context' )->get( false, 'command' );
 60 | 		$context->setEditor( 'aimeos:account' );
 61 | 
 62 | 		$localeManager = \Aimeos\MShop::create( $context, 'locale' );
 63 | 		$localeItem = $localeManager->bootstrap( $site, '', '', false, null, true );
 64 | 		$context->setLocale( $localeItem );
 65 | 
 66 | 		$manager = \Aimeos\MShop::create( $context, 'customer' );
 67 | 
 68 | 		try {
 69 | 			$item = $manager->find( $email );
 70 | 		} catch( \Aimeos\MShop\Exception $e ) {
 71 | 			$item = $manager->create();
 72 | 		}
 73 | 
 74 | 		$item = $item->setCode( $email )->setLabel( $email )->setPassword( $password )->setStatus( 1 );
 75 | 		$item->getPaymentAddress()->setEmail( $email );
 76 | 
 77 | 		$item = $manager->save( $this->addGroups( $context, $item ) );
 78 | 
 79 | 		\Illuminate\Foundation\Auth\User::findOrFail( $item->getId() )
 80 | 			->forceFill( [
 81 | 				'siteid' => $this->option( 'super' ) ? '' : $item->getSiteId(),
 82 | 				'superuser' => ( $this->option( 'super' ) ? 1 : 0 ),
 83 | 				'email_verified_at' => now(),
 84 | 			] )->save();
 85 | 	}
 86 | 
 87 | 
 88 | 	/**
 89 | 	 * Adds the group to the given user
 90 | 	 *
 91 | 	 * @param \Aimeos\MShop\ContextIface $context Aimeos context object
 92 | 	 * @param \Aimeos\MShop\Customer\Item\Iface $user Aimeos customer object
 93 | 	 * @return \Aimeos\MShop\Customer\Item\Iface Updated customer object
 94 | 	 */
 95 | 	protected function addGroups( \Aimeos\MShop\ContextIface $context,
 96 | 		\Aimeos\MShop\Customer\Item\Iface $user ) : \Aimeos\MShop\Customer\Item\Iface
 97 | 	{
 98 | 		if( $this->option( 'admin' ) ) {
 99 | 			$user = $this->addGroup( $context, $user, 'admin' );
100 | 		}
101 | 
102 | 		if( $this->option( 'editor' ) ) {
103 | 			$user = $this->addGroup( $context, $user, 'editor' );
104 | 		}
105 | 
106 | 		return $user;
107 | 	}
108 | 
109 | 
110 | 	/**
111 | 	 * Adds the group to the given user
112 | 	 *
113 | 	 * @param \Aimeos\MShop\ContextIface $context Aimeos context object
114 | 	 * @param \Aimeos\MShop\Customer\Item\Iface $user Aimeos customer object
115 | 	 * @param string $group Unique customer group code
116 | 	 */
117 | 	protected function addGroup( \Aimeos\MShop\ContextIface $context, \Aimeos\MShop\Customer\Item\Iface $user,
118 | 		string $group ) : \Aimeos\MShop\Customer\Item\Iface
119 | 	{
120 | 		$msg = 'Add "%1$s" group to user "%2$s" for site "%3$s"';
121 | 		$site = $this->argument( 'site' ) ?: config( 'shop.mshop.locale.site', 'default' );
122 | 		$this->info( sprintf( $msg, $group, $user->getCode(), $site ) );
123 | 
124 | 		$item = $this->getGroupItem( $context, $group );
125 | 		return $user->setGroups( array_merge( $user->getGroups(), [$item->getId()] ) );
126 | 	}
127 | 
128 | 
129 | 	/**
130 | 	 * Returns the customer group item for the given code
131 | 	 *
132 | 	 * @param \Aimeos\MShop\ContextIface $context Aimeos context object
133 | 	 * @param string $code Unique customer group code
134 | 	 * @return \Aimeos\MShop\Group\Item\Iface Aimeos customer group item object
135 | 	 */
136 | 	protected function getGroupItem( \Aimeos\MShop\ContextIface $context, string $code ) : \Aimeos\MShop\Group\Item\Iface
137 | 	{
138 | 		$manager = \Aimeos\MShop::create( $context, 'group' );
139 | 
140 | 		try
141 | 		{
142 | 			$item = $manager->find( $code );
143 | 		}
144 | 		catch( \Aimeos\MShop\Exception $e )
145 | 		{
146 | 			$item = $manager->create();
147 | 			$item->setLabel( $code );
148 | 			$item->setCode( $code );
149 | 
150 | 			$manager->save( $item );
151 | 		}
152 | 
153 | 		return $item;
154 | 	}
155 | }
156 | 


--------------------------------------------------------------------------------
/src/Command/ClearCommand.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Command;
10 | 
11 | 
12 | /**
13 |  * Command for clearing the content cache
14 |  */
15 | class ClearCommand extends AbstractCommand
16 | {
17 | 	/**
18 | 	 * The name and signature of the console command.
19 | 	 *
20 | 	 * @var string
21 | 	 */
22 | 	protected $signature = 'aimeos:clear';
23 | 
24 | 	/**
25 | 	 * The console command description.
26 | 	 *
27 | 	 * @var string
28 | 	 */
29 | 	protected $description = 'Clears the content cache';
30 | 
31 | 
32 | 	/**
33 | 	 * Execute the console command.
34 | 	 *
35 | 	 * @return mixed
36 | 	 */
37 | 	public function handle()
38 | 	{
39 | 		$this->info( 'Clearing Aimeos cache', 'v' );
40 | 
41 | 		$context = $this->getLaravel()->make( 'aimeos.context' )->get( false, 'command' );
42 | 		$context->setEditor( 'aimeos:clear' );
43 | 
44 | 		\Aimeos\MAdmin::create( $context, 'cache' )->getCache()->clear();
45 | 	}
46 | }
47 | 


--------------------------------------------------------------------------------
/src/Command/JobsCommand.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Command;
10 | 
11 | use Illuminate\Console\Command;
12 | 
13 | 
14 | /**
15 |  * Command for executing the Aimeos job controllers
16 |  */
17 | class JobsCommand extends AbstractCommand
18 | {
19 | 	/**
20 | 	 * The name and signature of the console command.
21 | 	 *
22 | 	 * @var string
23 | 	 */
24 | 	protected $signature = 'aimeos:jobs
25 | 		{jobs : One or more job controller names like "admin/job customer/email/watch"}
26 | 		{site? : Site codes to execute the jobs for like "default unittest" (none for all)}
27 | 		{--option= : Setup configuration, name and value are separated by colon like "setup/default/demo:1"}
28 | 	';
29 | 
30 | 	/**
31 | 	 * The console command description.
32 | 	 *
33 | 	 * @var string
34 | 	 */
35 | 	protected $description = 'Executes the job controllers';
36 | 
37 | 
38 | 	/**
39 | 	 * Execute the console command.
40 | 	 *
41 | 	 * @return mixed
42 | 	 */
43 | 	public function handle()
44 | 	{
45 | 		$jobs = $this->argument( 'jobs' );
46 | 		$jobs = !is_array( $jobs ) ? explode( ' ', (string) $jobs ) : $jobs;
47 | 
48 | 		$fcn = function( \Aimeos\MShop\ContextIface $lcontext, \Aimeos\Bootstrap $aimeos ) use ( $jobs )
49 | 		{
50 | 			$jobfcn = function( $context, $aimeos, $jobname ) {
51 | 				\Aimeos\Controller\Jobs::create( $context, $aimeos, $jobname )->run();
52 | 			};
53 | 
54 | 			$process = $lcontext->process();
55 | 			$site = $lcontext->locale()->getSiteItem()->getCode();
56 | 
57 | 			foreach( $jobs as $jobname )
58 | 			{
59 | 				$this->info( sprintf( 'Executing Aimeos jobs "%s" for "%s"', $jobname, $site ), 'v' );
60 | 				$process->start( $jobfcn, [$lcontext, $aimeos, $jobname], false );
61 | 			}
62 | 
63 | 			$process->wait();
64 | 		};
65 | 
66 | 		$this->exec( $this->context(), $fcn, $this->argument( 'site' ) );
67 | 	}
68 | 
69 | 
70 | 	/**
71 | 	 * Returns a context object
72 | 	 *
73 | 	 * @return \Aimeos\MShop\ContextIface Context object
74 | 	 */
75 | 	protected function context() : \Aimeos\MShop\ContextIface
76 | 	{
77 | 		$lv = $this->getLaravel();
78 | 		$aimeos = $lv->make( 'aimeos' )->get();
79 | 		$context = $lv->make( 'aimeos.context' )->get( false, 'command' );
80 | 
81 | 		$tmplPaths = $aimeos->getTemplatePaths( 'controller/jobs/templates' );
82 | 		$view = $lv->make( 'aimeos.view' )->create( $context, $tmplPaths );
83 | 
84 | 		$langManager = \Aimeos\MShop::create( $context, 'locale/language' );
85 | 		$langids = $langManager->search( $langManager->filter( true ) )->keys()->toArray();
86 | 		$i18n = $lv->make( 'aimeos.i18n' )->get( $langids );
87 | 
88 | 		$context->setSession( new \Aimeos\Base\Session\None() );
89 | 		$context->setCache( new \Aimeos\Base\Cache\None() );
90 | 
91 | 		$context->setEditor( 'aimeos:jobs' );
92 | 		$context->setView( $view );
93 | 		$context->setI18n( $i18n );
94 | 
95 | 		return $this->addConfig( $context );
96 | 	}
97 | }
98 | 


--------------------------------------------------------------------------------
/src/Command/SetupCommand.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Command;
10 | 
11 | use Symfony\Component\Console\Input\InputOption;
12 | use Symfony\Component\Console\Input\InputArgument;
13 | 
14 | 
15 | /**
16 |  * Command for initializing or updating the Aimeos database tables
17 |  */
18 | class SetupCommand extends AbstractCommand
19 | {
20 | 	/**
21 | 	 * The name and signature of the console command.
22 | 	 *
23 | 	 * @var string
24 | 	 */
25 | 	protected $signature = 'aimeos:setup
26 | 		{site? : Site for updating database entries}
27 | 		{tplsite=default : Site used as template for creating the new one}
28 | 		{--q : Quiet}
29 | 		{--v=v : Verbosity level}
30 | 		{--option=* : Setup configuration, name and value are separated by colon like "setup/default/demo:1"}
31 | 	';
32 | 
33 | 	/**
34 | 	 * The console command description.
35 | 	 *
36 | 	 * @var string
37 | 	 */
38 | 	protected $description = 'Initialize or update the Aimeos database tables';
39 | 
40 | 
41 | 	/**
42 | 	 * Execute the console command.
43 | 	 *
44 | 	 * @return mixed
45 | 	 */
46 | 	public function handle()
47 | 	{
48 | 		\Aimeos\MShop::cache( false );
49 | 		\Aimeos\MAdmin::cache( false );
50 | 
51 | 		$template = $this->argument( 'tplsite' );
52 | 
53 | 		if( ( $site = $this->argument( 'site' ) ) === null ) {
54 | 			$site = config( 'shop.mshop.locale.site', 'default' );
55 | 		}
56 | 
57 | 		$boostrap = $this->getLaravel()->make( 'aimeos' )->get();
58 | 		$ctx = $this->getLaravel()->make( 'aimeos.context' )->get( false, 'command' );
59 | 
60 | 		$this->info( sprintf( 'Initializing or updating the Aimeos database tables for site "%1$s"', $site ) );
61 | 
62 | 		\Aimeos\Setup::use( $boostrap )
63 | 			->verbose( $this->option( 'q' ) ? '' : $this->option( 'v' ) )
64 | 			->context( $this->addConfig( $ctx->setEditor( 'aimeos:setup' ) ) )
65 | 			->up( $site, $template );
66 | 	}
67 | }
68 | 


--------------------------------------------------------------------------------
/src/Composer.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2020-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop;
10 | 
11 | 
12 | /**
13 |  * Performs setup during composer installs
14 |  */
15 | class Composer
16 | {
17 | 	/**
18 | 	 * @param \Composer\Script\Event $event Event instance
19 | 	 * @throws \RuntimeException If an error occured
20 | 	 */
21 | 	public static function join( \Composer\Script\Event $event )
22 | 	{
23 | 		try
24 | 		{
25 | 			$options = [
26 | 				'http' => [
27 | 					'method' => 'POST',
28 | 					'header' => ['Content-Type: application/json'],
29 | 					'content' => json_encode( ['query' => 'mutation{
30 |                         _1: addStar(input:{clientMutationId:"_1",starrableId:"R_kgDOBiPing"}){clientMutationId}
31 |                         _2: addStar(input:{clientMutationId:"_2",starrableId:"R_kgDOAeFH2g"}){clientMutationId}
32 |                         _3: addStar(input:{clientMutationId:"_3",starrableId:"R_kgDOAZou5Q"}){clientMutationId}
33 |                         _4: addStar(input:{clientMutationId:"_4",starrableId:"R_kgDODUDlmg"}){clientMutationId}
34 |                         _5: addStar(input:{clientMutationId:"_5",starrableId:"R_kgDODqs9PA"}){clientMutationId}
35 |                         _6: addStar(input:{clientMutationId:"_6",starrableId:"R_kgDOGcKL7A"}){clientMutationId}
36 |                         _7: addStar(input:{clientMutationId:"_7",starrableId:"R_kgDOGeAkvw"}){clientMutationId}
37 |                         _8: addStar(input:{clientMutationId:"_8",starrableId:"R_kgDOG1PAJw"}){clientMutationId}
38 |                         _9: addStar(input:{clientMutationId:"_9",starrableId:"MDEwOlJlcG9zaXRvcnkyNDU0MjQyNw=="}){clientMutationId}
39 |                         _10: addStar(input:{clientMutationId:"_10",starrableId:"MDEwOlJlcG9zaXRvcnkyODc0MzEyNg=="}){clientMutationId}
40 |                         _11: addStar(input:{clientMutationId:"_11",starrableId:"MDEwOlJlcG9zaXRvcnkyNDE2MjI1Ng=="}){clientMutationId}
41 | 						}'
42 | 					] )
43 | 				]
44 | 			];
45 | 			$config = $event->getComposer()->getConfig();
46 | 
47 | 			if( method_exists( '\Composer\Factory', 'createHttpDownloader' ) )
48 | 			{
49 | 				\Composer\Factory::createHttpDownloader( $event->getIO(), $config )
50 | 					->get( 'https://api.github.com/graphql', $options );
51 | 			}
52 | 			else
53 | 			{
54 | 				\Composer\Factory::createRemoteFilesystem( $event->getIO(), $config )
55 | 					->getContents( 'github.com', 'https://api.github.com/graphql', false, $options );
56 | 			}
57 | 		}
58 | 		catch( \Exception $e ) {}
59 | 	}
60 | }
61 | 


--------------------------------------------------------------------------------
/src/Controller/AccountController.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Controller;
10 | 
11 | use Aimeos\Shop\Facades\Shop;
12 | use Illuminate\Routing\Controller;
13 | use Illuminate\Support\Facades\Response;
14 | 
15 | 
16 | /**
17 |  * Aimeos controller for account related functionality.
18 |  */
19 | class AccountController extends Controller
20 | {
21 | 	/**
22 | 	 * Returns the html for the "My account" page.
23 | 	 *
24 | 	 * @return \Illuminate\Http\Response Response object with output and headers
25 | 	 */
26 | 	public function indexAction()
27 | 	{
28 | 		$params = ['page' => 'page-account-index'];
29 | 
30 | 		foreach( app( 'config' )->get( 'shop.page.account-index' ) as $name )
31 | 		{
32 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
33 | 			$params['aibody'][$name] = Shop::get( $name )->body();
34 | 		}
35 | 
36 | 		return Response::view( Shop::template( 'account.index' ), $params )
37 | 			->header( 'Cache-Control', 'no-store, max-age=0' );
38 | 	}
39 | 
40 | 
41 | 	/**
42 | 	 * Returns the html for the "My account" download page.
43 | 	 *
44 | 	 * @return \Illuminate\Contracts\View\View View for rendering the output
45 | 	 */
46 | 	public function downloadAction()
47 | 	{
48 | 		$response = Shop::get( 'account/download' )->response();
49 | 		return Response::make( (string) $response->getBody(), $response->getStatusCode(), $response->getHeaders() );
50 | 	}
51 | }


--------------------------------------------------------------------------------
/src/Controller/AdminController.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2014-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Controller;
10 | 
11 | use Illuminate\Routing\Controller;
12 | use Illuminate\Support\Facades\Auth;
13 | use Illuminate\Support\Facades\Request;
14 | use Illuminate\Support\Facades\Route;
15 | use Illuminate\Support\Facades\View;
16 | use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
17 | 
18 | 
19 | /**
20 |  * Controller providing the administration interface
21 |  */
22 | class AdminController extends Controller
23 | {
24 | 	use AuthorizesRequests;
25 | 
26 | 
27 | 	/**
28 | 	 * Returns the initial HTML view for the admin interface.
29 | 	 *
30 | 	 * @param \Illuminate\Http\Request $request Laravel request object
31 | 	 * @return \Illuminate\Contracts\View\View View for rendering the output
32 | 	 */
33 | 	public function indexAction( \Illuminate\Http\Request $request )
34 | 	{
35 | 		if( Auth::check() === false
36 | 			|| $request->user()->can( 'admin', [AdminController::class, config( 'shop.roles', ['admin', 'editor'] )] ) === false
37 | 		) {
38 | 			return redirect()->guest( airoute( 'login', ['locale' => app()->getLocale()] ) );
39 | 		}
40 | 
41 | 		$context = app( 'aimeos.context' )->get( false );
42 | 		$siteManager = \Aimeos\MShop::create( $context, 'locale/site' );
43 | 		$siteId = current( array_reverse( explode( '.', trim( $request->user()->siteid, '.' ) ) ) );
44 | 		$siteCode = ( $siteId ? $siteManager->get( $siteId )->getCode() : config( 'shop.mshop.locale.site', 'default' ) );
45 | 		$locale = $request->user()->langid ?: config( 'app.locale', 'en' );
46 | 
47 | 		$param = array(
48 | 			'resource' => config( 'shop.panel', 'dashboard' ),
49 | 			'site' => Route::input( 'site', Request::get( 'site', $siteCode ) ),
50 | 			'locale' => Route::input( 'locale', Request::get( 'locale', $locale ) )
51 | 		);
52 | 
53 | 		return redirect()->route( 'aimeos_shop_jqadm_search', $param );
54 | 	}
55 | }
56 | 


--------------------------------------------------------------------------------
/src/Controller/BasketController.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Controller;
10 | 
11 | use Aimeos\Shop\Facades\Shop;
12 | use Illuminate\Routing\Controller;
13 | use Illuminate\Support\Facades\Response;
14 | 
15 | 
16 | /**
17 |  * Aimeos controller for basket related functionality.
18 |  */
19 | class BasketController extends Controller
20 | {
21 | 	/**
22 | 	 * Returns the html for the standard basket page.
23 | 	 *
24 | 	 * @return \Illuminate\Http\Response Response object with output and headers
25 | 	 */
26 | 	public function indexAction()
27 | 	{
28 | 		$params = ['page' => 'page-basket-index'];
29 | 
30 | 		foreach( app( 'config' )->get( 'shop.page.basket-index' ) as $name )
31 | 		{
32 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
33 | 			$params['aibody'][$name] = Shop::get( $name )->body();
34 | 		}
35 | 
36 | 		return Response::view( Shop::template( 'basket.index' ), $params )
37 | 			->header( 'Cache-Control', 'no-store, , max-age=0' );
38 | 	}
39 | }


--------------------------------------------------------------------------------
/src/Controller/CatalogController.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | /**
  4 |  * @license MIT, http://opensource.org/licenses/MIT
  5 |  * @copyright Aimeos (aimeos.org), 2015-2023
  6 |  */
  7 | 
  8 | 
  9 | namespace Aimeos\Shop\Controller;
 10 | 
 11 | use Aimeos\Shop\Facades\Shop;
 12 | use Illuminate\Routing\Controller;
 13 | use Illuminate\Support\Facades\Response;
 14 | 
 15 | 
 16 | /**
 17 |  * Aimeos controller for catalog related functionality.
 18 |  */
 19 | class CatalogController extends Controller
 20 | {
 21 | 	/**
 22 | 	 * Returns the view for the XHR response with the counts for the facetted search.
 23 | 	 *
 24 | 	 * @return \Illuminate\Http\Response Response object with output and headers
 25 | 	 */
 26 | 	public function countAction()
 27 | 	{
 28 | 		$params = ['page' => 'page-catalog-count'];
 29 | 
 30 | 		foreach( app( 'config' )->get( 'shop.page.catalog-count' ) as $name )
 31 | 		{
 32 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
 33 | 			$params['aibody'][$name] = Shop::get( $name )->body();
 34 | 		}
 35 | 
 36 | 		return Response::view( Shop::template( 'catalog.count' ), $params )
 37 | 			->header( 'Content-Type', 'application/javascript' )
 38 | 			->header( 'Cache-Control', 'public, max-age=300' );
 39 | 	}
 40 | 
 41 | 
 42 | 	/**
 43 | 	 * Returns the html for the catalog detail page.
 44 | 	 *
 45 | 	 * @return \Illuminate\Http\Response Response object with output and headers
 46 | 	 */
 47 | 	public function detailAction()
 48 | 	{
 49 | 		try
 50 | 		{
 51 | 			$params = ['page' => 'page-catalog-detail'];
 52 | 
 53 | 			foreach( app( 'config' )->get( 'shop.page.catalog-detail' ) as $name )
 54 | 			{
 55 | 				$params['aiheader'][$name] = Shop::get( $name )->header();
 56 | 				$params['aibody'][$name] = Shop::get( $name )->body();
 57 | 			}
 58 | 
 59 | 			return Response::view( Shop::template( 'catalog.detail' ), $params )
 60 | 				->header( 'Cache-Control', 'private, max-age=' . config( 'shop.cache_maxage', 30 ) );
 61 | 		}
 62 | 		catch( \Exception $e )
 63 | 		{
 64 | 			if( $e->getCode() >= 400 && $e->getCode() < 600 ) { abort( $e->getCode() ); }
 65 | 			throw $e;
 66 | 		}
 67 | 	}
 68 | 
 69 | 
 70 | 	/**
 71 | 	 * Returns the html for the catalog home page.
 72 | 	 *
 73 | 	 * @return \Illuminate\Http\Response Response object with output and headers
 74 | 	 */
 75 | 	public function homeAction()
 76 | 	{
 77 | 		$params = ['page' => 'page-catalog-home'];
 78 | 
 79 | 		foreach( app( 'config' )->get( 'shop.page.catalog-home' ) as $name )
 80 | 		{
 81 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
 82 | 			$params['aibody'][$name] = Shop::get( $name )->body();
 83 | 		}
 84 | 
 85 | 		return Response::view( Shop::template( 'catalog.home' ), $params )
 86 | 			->header( 'Cache-Control', 'private, max-age=' . config( 'shop.cache_maxage', 30 ) );
 87 | 	}
 88 | 
 89 | 
 90 | 	/**
 91 | 	 * Returns the html for the catalog list page.
 92 | 	 *
 93 | 	 * @return \Illuminate\Http\Response Response object with output and headers
 94 | 	 */
 95 | 	public function listAction()
 96 | 	{
 97 | 		$params = ['page' => 'page-catalog-list'];
 98 | 
 99 | 		foreach( app( 'config' )->get( 'shop.page.catalog-list' ) as $name )
100 | 		{
101 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
102 | 			$params['aibody'][$name] = Shop::get( $name )->body();
103 | 		}
104 | 
105 | 		return Response::view( Shop::template( 'catalog.list' ), $params )
106 | 			->header( 'Cache-Control', 'private, max-age=' . config( 'shop.cache_maxage', 30 ) );
107 | 	}
108 | 
109 | 
110 | 	/**
111 | 	 * Returns the html for the catalog session page.
112 | 	 *
113 | 	 * @return \Illuminate\Http\Response Response object with output and headers
114 | 	 */
115 | 	public function sessionAction()
116 | 	{
117 | 		$params = ['page' => 'page-catalog-session'];
118 | 
119 | 		foreach( app( 'config' )->get( 'shop.page.catalog-session' ) as $name )
120 | 		{
121 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
122 | 			$params['aibody'][$name] = Shop::get( $name )->body();
123 | 		}
124 | 
125 | 		return Response::view( Shop::template( 'catalog.session' ), $params )
126 | 			->header( 'Cache-Control', 'no-cache' );
127 | 	}
128 | 
129 | 
130 | 	/**
131 | 	 * Returns the html body part for the catalog stock page.
132 | 	 *
133 | 	 * @return \Illuminate\Http\Response Response object with output and headers
134 | 	 */
135 | 	public function stockAction()
136 | 	{
137 | 		$params = ['page' => 'page-catalog-stock'];
138 | 
139 | 		foreach( app( 'config' )->get( 'shop.page.catalog-stock' ) as $name )
140 | 		{
141 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
142 | 			$params['aibody'][$name] = Shop::get( $name )->body();
143 | 		}
144 | 
145 | 		return Response::view( Shop::template( 'catalog.stock' ), $params )
146 | 			->header( 'Content-Type', 'application/javascript' )
147 | 			->header( 'Cache-Control', 'public, max-age=30' );
148 | 	}
149 | 
150 | 
151 | 	/**
152 | 	 * Returns the view for the XHR response with the product information for the search suggestion.
153 | 	 *
154 | 	 * @return \Illuminate\Http\Response Response object with output and headers
155 | 	 */
156 | 	public function suggestAction()
157 | 	{
158 | 		$params = ['page' => 'page-catalog-suggest'];
159 | 
160 | 		foreach( app( 'config' )->get( 'shop.page.catalog-suggest' ) as $name )
161 | 		{
162 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
163 | 			$params['aibody'][$name] = Shop::get( $name )->body();
164 | 		}
165 | 
166 | 		return Response::view( Shop::template( 'catalog.suggest' ), $params )
167 | 			->header( 'Cache-Control', 'private, max-age=' . config( 'shop.cache_maxage', 30 ) )
168 | 			->header( 'Content-Type', 'application/json' );
169 | 	}
170 | 
171 | 
172 | 	/**
173 | 	 * Returns the html for the catalog tree page.
174 | 	 *
175 | 	 * @return \Illuminate\Http\Response Response object with output and headers
176 | 	 */
177 | 	public function treeAction()
178 | 	{
179 | 		try
180 | 		{
181 | 			$params = ['page' => 'page-catalog-tree'];
182 | 
183 | 			foreach( app( 'config' )->get( 'shop.page.catalog-tree' ) as $name )
184 | 			{
185 | 				$params['aiheader'][$name] = Shop::get( $name )->header();
186 | 				$params['aibody'][$name] = Shop::get( $name )->body();
187 | 			}
188 | 
189 | 			return Response::view( Shop::template( 'catalog.tree' ), $params )
190 | 				->header( 'Cache-Control', 'private, max-age=' . config( 'shop.cache_maxage', 30 ) );
191 | 		}
192 | 		catch( \Exception $e )
193 | 		{
194 | 			if( $e->getCode() >= 400 && $e->getCode() < 600 ) { abort( $e->getCode() ); }
195 | 			throw $e;
196 | 		}
197 | 	}
198 | }
199 | 


--------------------------------------------------------------------------------
/src/Controller/CheckoutController.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Controller;
10 | 
11 | use Aimeos\Shop\Facades\Shop;
12 | use Illuminate\Routing\Controller;
13 | use Illuminate\Support\Facades\Response;
14 | 
15 | 
16 | /**
17 |  * Aimeos controller for checkout related functionality.
18 |  */
19 | class CheckoutController extends Controller
20 | {
21 | 	/**
22 | 	 * Returns the html for the checkout confirmation page.
23 | 	 *
24 | 	 * @return \Illuminate\Http\Response Response object with output and headers
25 | 	 */
26 | 	public function confirmAction()
27 | 	{
28 | 		$params = ['page' => 'page-checkout-confirm'];
29 | 
30 | 		foreach( app( 'config' )->get( 'shop.page.checkout-confirm' ) as $name )
31 | 		{
32 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
33 | 			$params['aibody'][$name] = Shop::get( $name )->body();
34 | 		}
35 | 
36 | 		return Response::view( Shop::template( 'checkout.confirm' ), $params )
37 | 			->header( 'Cache-Control', 'no-store, max-age=0' );
38 | 	}
39 | 
40 | 
41 | 	/**
42 | 	 * Returns the html for the standard checkout page.
43 | 	 *
44 | 	 * @return \Illuminate\Http\Response Response object with output and headers
45 | 	 */
46 | 	public function indexAction()
47 | 	{
48 | 		$params = ['page' => 'page-checkout-index'];
49 | 
50 | 		foreach( app( 'config' )->get( 'shop.page.checkout-index' ) as $name )
51 | 		{
52 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
53 | 			$params['aibody'][$name] = Shop::get( $name )->body();
54 | 		}
55 | 
56 | 		return Response::view( Shop::template( 'checkout.index' ), $params )
57 | 			->header( 'Cache-Control', 'no-store, max-age=0' );
58 | 	}
59 | 
60 | 
61 | 	/**
62 | 	 * Returns the view for the order update page.
63 | 	 *
64 | 	 * @return \Illuminate\Http\Response Response object with output and headers
65 | 	 */
66 | 	public function updateAction()
67 | 	{
68 | 		$params = ['page' => 'page-checkout-update'];
69 | 
70 | 		foreach( app( 'config' )->get( 'shop.page.checkout-update' ) as $name )
71 | 		{
72 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
73 | 			$params['aibody'][$name] = Shop::get( $name )->body();
74 | 		}
75 | 
76 | 		return Response::view( Shop::template( 'checkout.update' ), $params )
77 | 			->header( 'Cache-Control', 'no-store, max-age=0' );
78 | 	}
79 | }


--------------------------------------------------------------------------------
/src/Controller/GraphqlController.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2022-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Controller;
10 | 
11 | use Illuminate\Routing\Controller;
12 | use Illuminate\Support\Facades\Route;
13 | use Illuminate\Support\Facades\Request;
14 | use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
15 | use Psr\Http\Message\ServerRequestInterface;
16 | 
17 | 
18 | /**
19 |  * Aimeos controller for the GraphQL Admin API
20 |  */
21 | class GraphqlController extends Controller
22 | {
23 | 	use AuthorizesRequests;
24 | 
25 | 
26 | 	/**
27 | 	 * Creates a new resource object or a list of resource objects
28 | 	 *
29 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
30 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
31 | 	 */
32 | 	public function indexAction( ServerRequestInterface $request )
33 | 	{
34 | 		if( config( 'shop.authorize', true ) ) {
35 | 			$this->authorize( 'admin', [GraphqlController::class, array_merge( config( 'shop.roles', ['admin', 'editor'] ), ['api'] )] );
36 | 		}
37 | 
38 | 		$site = Route::input( 'site', Request::get( 'site', config( 'shop.mshop.locale.site', 'default' ) ) );
39 | 		$lang = Request::get( 'locale', config( 'app.locale', 'en' ) );
40 | 
41 | 		$context = app( 'aimeos.context' )->get( false, 'backend' );
42 | 		$context->setI18n( app( 'aimeos.i18n' )->get( array( $lang, 'en' ) ) );
43 | 		$context->setLocale( app( 'aimeos.locale' )->getBackend( $context, $site ) );
44 | 		$context->setView( app( 'aimeos.view' )->create( $context, [], $lang ) );
45 | 
46 | 		return \Aimeos\Admin\Graphql::execute( $context, $request );
47 | 	}
48 | }
49 | 


--------------------------------------------------------------------------------
/src/Controller/JqadmController.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | /**
  4 |  * @license MIT, http://opensource.org/licenses/MIT
  5 |  * @copyright Aimeos (aimeos.org), 2015-2023
  6 |  */
  7 | 
  8 | 
  9 | namespace Aimeos\Shop\Controller;
 10 | 
 11 | use Illuminate\Support\Facades\View;
 12 | use Illuminate\Support\Facades\Route;
 13 | use Illuminate\Support\Facades\Request;
 14 | use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
 15 | 
 16 | 
 17 | /**
 18 |  * Aimeos controller for the JQuery admin interface
 19 |  */
 20 | class JqadmController extends AdminController
 21 | {
 22 | 	use AuthorizesRequests;
 23 | 
 24 | 
 25 | 	/**
 26 | 	 * Returns the JS file content
 27 | 	 *
 28 | 	 * @return \Illuminate\Http\Response Response object containing the generated output
 29 | 	 */
 30 | 	public function fileAction()
 31 | 	{
 32 | 		if( config( 'shop.authorize', true ) ) {
 33 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
 34 | 		}
 35 | 
 36 | 		$files = [];
 37 | 		$aimeos = app( 'aimeos' )->get();
 38 | 		$name = Route::input( 'name', Request::get( 'name' ) );
 39 | 
 40 | 		foreach( $aimeos->getCustomPaths( 'admin/jqadm' ) as $base => $paths )
 41 | 		{
 42 | 			foreach( $paths as $path ) {
 43 | 				$files[] = $base . '/' . $path;
 44 | 			}
 45 | 		}
 46 | 
 47 | 		$response = response( \Aimeos\Admin\JQAdm\Bundle::get( $files, $name ) );
 48 | 
 49 | 		if( str_ends_with( $name, 'js' ) ) {
 50 | 			$response->header( 'Content-Type', 'application/javascript' );
 51 | 		} elseif( str_ends_with( $name, 'css' ) ) {
 52 | 			$response->header( 'Content-Type', 'text/css' );
 53 | 		}
 54 | 
 55 | 		return $response->header( 'Cache-Control', 'public, max-age=3600' );
 56 | 	}
 57 | 
 58 | 
 59 | 	/**
 60 | 	 * Returns the HTML code for batch operations on a resource object
 61 | 	 *
 62 | 	 * @return string Generated output
 63 | 	 */
 64 | 	public function batchAction()
 65 | 	{
 66 | 		if( config( 'shop.authorize', true ) ) {
 67 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
 68 | 		}
 69 | 
 70 | 		$cntl = $this->createAdmin();
 71 | 
 72 | 		if( ( $html = $cntl->batch() ) == '' ) {
 73 | 			return $cntl->response();
 74 | 		}
 75 | 
 76 | 		return $this->getHtml( (string) $html );
 77 | 	}
 78 | 
 79 | 
 80 | 	/**
 81 | 	 * Returns the HTML code for a copy of a resource object
 82 | 	 *
 83 | 	 * @return string Generated output
 84 | 	 */
 85 | 	public function copyAction()
 86 | 	{
 87 | 		if( config( 'shop.authorize', true ) ) {
 88 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
 89 | 		}
 90 | 
 91 | 		$cntl = $this->createAdmin();
 92 | 
 93 | 		if( ( $html = $cntl->copy() ) == '' ) {
 94 | 			return $cntl->response();
 95 | 		}
 96 | 
 97 | 		return $this->getHtml( (string) $html );
 98 | 	}
 99 | 
100 | 
101 | 	/**
102 | 	 * Returns the HTML code for a new resource object
103 | 	 *
104 | 	 * @return string Generated output
105 | 	 */
106 | 	public function createAction()
107 | 	{
108 | 		if( config( 'shop.authorize', true ) ) {
109 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
110 | 		}
111 | 
112 | 		$cntl = $this->createAdmin();
113 | 
114 | 		if( ( $html = $cntl->create() ) == '' ) {
115 | 			return $cntl->response();
116 | 		}
117 | 
118 | 		return $this->getHtml( (string) $html );
119 | 	}
120 | 
121 | 
122 | 	/**
123 | 	 * Deletes the resource object or a list of resource objects
124 | 	 *
125 | 	 * @return string Generated output
126 | 	 */
127 | 	public function deleteAction()
128 | 	{
129 | 		if( config( 'shop.authorize', true ) ) {
130 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
131 | 		}
132 | 
133 | 		$cntl = $this->createAdmin();
134 | 
135 | 		if( ( $html = $cntl->delete() ) == '' ) {
136 | 			return $cntl->response();
137 | 		}
138 | 
139 | 		return $this->getHtml( (string) $html );
140 | 	}
141 | 
142 | 
143 | 	/**
144 | 	 * Exports the data for a resource object
145 | 	 *
146 | 	 * @return string Generated output
147 | 	 */
148 | 	public function exportAction()
149 | 	{
150 | 		if( config( 'shop.authorize', true ) ) {
151 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
152 | 		}
153 | 
154 | 		$cntl = $this->createAdmin();
155 | 
156 | 		if( ( $html = $cntl->export() ) == '' ) {
157 | 			return $cntl->response();
158 | 		}
159 | 
160 | 		return $this->getHtml( (string) $html );
161 | 	}
162 | 
163 | 
164 | 	/**
165 | 	 * Returns the HTML code for the requested resource object
166 | 	 *
167 | 	 * @return string Generated output
168 | 	 */
169 | 	public function getAction()
170 | 	{
171 | 		if( config( 'shop.authorize', true ) ) {
172 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
173 | 		}
174 | 
175 | 		$cntl = $this->createAdmin();
176 | 
177 | 		if( ( $html = $cntl->get() ) == '' ) {
178 | 			return $cntl->response();
179 | 		}
180 | 
181 | 		return $this->getHtml( (string) $html );
182 | 	}
183 | 
184 | 
185 | 	/**
186 | 	 * Imports the data for a resource object
187 | 	 *
188 | 	 * @return string Generated output
189 | 	 */
190 | 	public function importAction()
191 | 	{
192 | 		if( config( 'shop.authorize', true ) ) {
193 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
194 | 		}
195 | 
196 | 		$cntl = $this->createAdmin();
197 | 
198 | 		if( ( $html = $cntl->import() ) == '' ) {
199 | 			return $cntl->response();
200 | 		}
201 | 
202 | 		return $this->getHtml( (string) $html );
203 | 	}
204 | 
205 | 
206 | 	/**
207 | 	 * Saves a new resource object
208 | 	 *
209 | 	 * @return string Generated output
210 | 	 */
211 | 	public function saveAction()
212 | 	{
213 | 		if( config( 'shop.authorize', true ) ) {
214 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
215 | 		}
216 | 
217 | 		$cntl = $this->createAdmin();
218 | 
219 | 		if( ( $html = $cntl->save() ) == '' ) {
220 | 			return $cntl->response();
221 | 		}
222 | 
223 | 		return $this->getHtml( (string) $html );
224 | 	}
225 | 
226 | 
227 | 	/**
228 | 	 * Returns the HTML code for a list of resource objects
229 | 	 *
230 | 	 * @return string Generated output
231 | 	 */
232 | 	public function searchAction()
233 | 	{
234 | 		if( config( 'shop.authorize', true ) ) {
235 | 			$this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] );
236 | 		}
237 | 
238 | 		$cntl = $this->createAdmin();
239 | 
240 | 		if( ( $html = $cntl->search() ) == '' ) {
241 | 			return $cntl->response();
242 | 		}
243 | 
244 | 		return $this->getHtml( (string) $html );
245 | 	}
246 | 
247 | 
248 | 	/**
249 | 	 * Returns the resource controller
250 | 	 *
251 | 	 * @return \Aimeos\Admin\JQAdm\Iface JQAdm client
252 | 	 */
253 | 	protected function createAdmin() : \Aimeos\Admin\JQAdm\Iface
254 | 	{
255 | 		$site = Route::input( 'site', Request::get( 'site', config( 'shop.mshop.locale.site', 'default' ) ) );
256 | 		$lang = Request::get( 'locale', config( 'app.locale', 'en' ) );
257 | 		$resource = Route::input( 'resource' );
258 | 
259 | 		$aimeos = app( 'aimeos' )->get();
260 | 
261 | 		$context = app( 'aimeos.context' )->get( false, 'backend' );
262 | 		$context->setI18n( app( 'aimeos.i18n' )->get( array( $lang, 'en' ) ) );
263 | 		$context->setLocale( app( 'aimeos.locale' )->getBackend( $context, $site )->setLanguageId( $lang ) );
264 | 
265 | 		$siteManager = \Aimeos\MShop::create( $context, 'locale/site' );
266 | 		$context->config()->apply( $siteManager->find( $site )->getConfig() );
267 | 
268 | 		$paths = $aimeos->getTemplatePaths( 'admin/jqadm/templates', $context->locale()->getSiteItem()->getTheme() );
269 | 		$view = app( 'aimeos.view' )->create( $context, $paths, $lang );
270 | 
271 | 		$view->aimeosType = 'Laravel';
272 | 		$view->aimeosVersion = app( 'aimeos' )->getVersion();
273 | 		$view->aimeosExtensions = implode( ',', $aimeos->getExtensions() );
274 | 
275 | 		$context->setView( $view );
276 | 
277 | 		return \Aimeos\Admin\JQAdm::create( $context, $aimeos, $resource );
278 | 	}
279 | 
280 | 
281 | 	/**
282 | 	 * Returns the generated HTML code
283 | 	 *
284 | 	 * @param string $content Content from admin client
285 | 	 * @return \Illuminate\Contracts\View\View View for rendering the output
286 | 	 */
287 | 	protected function getHtml( string $content )
288 | 	{
289 | 		$site = Route::input( 'site', Request::get( 'site', config( 'shop.mshop.locale.site', 'default' ) ) );
290 | 		$lang = Request::get( 'locale', config( 'app.locale', 'en' ) );
291 | 
292 | 		return View::make( 'shop::jqadm.index', [
293 | 			'content' => $content,
294 | 			'site' => $site,
295 | 			'locale' => $lang,
296 | 			'localeDir' => in_array( $lang, ['ar', 'az', 'dv', 'fa', 'he', 'ku', 'ur'] ) ? 'rtl' : 'ltr',
297 | 			'theme' => ( $_COOKIE['aimeos_backend_theme'] ?? '' ) == 'dark' ? 'dark' : 'light'
298 | 		] );
299 | 	}
300 | }
301 | 


--------------------------------------------------------------------------------
/src/Controller/JsonadmController.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | /**
  4 |  * @license MIT, http://opensource.org/licenses/MIT
  5 |  * @copyright Aimeos (aimeos.org), 2015-2023
  6 |  */
  7 | 
  8 | 
  9 | namespace Aimeos\Shop\Controller;
 10 | 
 11 | use Illuminate\Routing\Controller;
 12 | use Illuminate\Support\Facades\Route;
 13 | use Illuminate\Support\Facades\Request;
 14 | use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
 15 | use Psr\Http\Message\ServerRequestInterface;
 16 | use Nyholm\Psr7\Factory\Psr17Factory;
 17 | 
 18 | 
 19 | /**
 20 |  * Aimeos controller for the JSON REST API
 21 |  */
 22 | class JsonadmController extends Controller
 23 | {
 24 | 	use AuthorizesRequests;
 25 | 
 26 | 
 27 | 	/**
 28 | 	 * Deletes the resource object or a list of resource objects
 29 | 	 *
 30 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 31 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 32 | 	 */
 33 | 	public function deleteAction( ServerRequestInterface $request )
 34 | 	{
 35 | 		if( config( 'shop.authorize', true ) ) {
 36 | 			$this->authorize( 'admin', [JsonadmController::class, array_merge( config( 'shop.roles', ['admin', 'editor'] ), ['api'] )] );
 37 | 		}
 38 | 
 39 | 		return $this->createAdmin()->delete( $request, ( new Psr17Factory )->createResponse() );
 40 | 	}
 41 | 
 42 | 
 43 | 	/**
 44 | 	 * Returns the requested resource object or list of resource objects
 45 | 	 *
 46 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 47 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 48 | 	 */
 49 | 	public function getAction( ServerRequestInterface $request )
 50 | 	{
 51 | 		if( config( 'shop.authorize', true ) ) {
 52 | 			$this->authorize( 'admin', [JsonadmController::class, array_merge( config( 'shop.roles', ['admin', 'editor'] ), ['api'] )] );
 53 | 		}
 54 | 
 55 | 		return $this->createAdmin()->get( $request, ( new Psr17Factory )->createResponse() );
 56 | 	}
 57 | 
 58 | 
 59 | 	/**
 60 | 	 * Updates a resource object or a list of resource objects
 61 | 	 *
 62 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 63 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 64 | 	 */
 65 | 	public function patchAction( ServerRequestInterface $request )
 66 | 	{
 67 | 		if( config( 'shop.authorize', true ) ) {
 68 | 			$this->authorize( 'admin', [JsonadmController::class, array_merge( config( 'shop.roles', ['admin', 'editor'] ), ['api'] )] );
 69 | 		}
 70 | 
 71 | 		return $this->createAdmin()->patch( $request, ( new Psr17Factory )->createResponse() );
 72 | 	}
 73 | 
 74 | 
 75 | 	/**
 76 | 	 * Creates a new resource object or a list of resource objects
 77 | 	 *
 78 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 79 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 80 | 	 */
 81 | 	public function postAction( ServerRequestInterface $request )
 82 | 	{
 83 | 		if( config( 'shop.authorize', true ) ) {
 84 | 			$this->authorize( 'admin', [JsonadmController::class, array_merge( config( 'shop.roles', ['admin', 'editor'] ), ['api'] )] );
 85 | 		}
 86 | 
 87 | 		return $this->createAdmin()->post( $request, ( new Psr17Factory )->createResponse() );
 88 | 	}
 89 | 
 90 | 
 91 | 	/**
 92 | 	 * Creates or updates a single resource object
 93 | 	 *
 94 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 95 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 96 | 	 */
 97 | 	public function putAction( ServerRequestInterface $request )
 98 | 	{
 99 | 		if( config( 'shop.authorize', true ) ) {
100 | 			$this->authorize( 'admin', [JsonadmController::class, array_merge( config( 'shop.roles', ['admin', 'editor'] ), ['api'] )] );
101 | 		}
102 | 
103 | 		return $this->createAdmin()->put( $request, ( new Psr17Factory )->createResponse() );
104 | 	}
105 | 
106 | 
107 | 	/**
108 | 	 * Returns the available HTTP verbs and the resource URLs
109 | 	 *
110 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
111 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
112 | 	 */
113 | 	public function optionsAction( ServerRequestInterface $request )
114 | 	{
115 | 		if( config( 'shop.authorize', true ) ) {
116 | 			$this->authorize( 'admin', [JsonadmController::class, array_merge( config( 'shop.roles', ['admin', 'editor'] ), ['api'] )] );
117 | 		}
118 | 
119 | 		return $this->createAdmin()->options( $request, ( new Psr17Factory )->createResponse() );
120 | 	}
121 | 
122 | 
123 | 	/**
124 | 	 * Returns the JsonAdm client
125 | 	 *
126 | 	 * @return \Aimeos\Admin\JsonAdm\Iface JsonAdm client
127 | 	 */
128 | 	protected function createAdmin() : \Aimeos\Admin\JsonAdm\Iface
129 | 	{
130 | 		$site = Route::input( 'site', Request::get( 'site', config( 'shop.mshop.locale.site', 'default' ) ) );
131 | 		$lang = Request::get( 'locale', config( 'app.locale', 'en' ) );
132 | 		$resource = Route::input( 'resource', '' );
133 | 
134 | 		$aimeos = app( 'aimeos' )->get();
135 | 		$templatePaths = $aimeos->getTemplatePaths( 'admin/jsonadm/templates' );
136 | 
137 | 		$context = app( 'aimeos.context' )->get( false, 'backend' );
138 | 		$context->setI18n( app( 'aimeos.i18n' )->get( array( $lang, 'en' ) ) );
139 | 		$context->setLocale( app( 'aimeos.locale' )->getBackend( $context, $site ) );
140 | 		$context->setView( app( 'aimeos.view' )->create( $context, $templatePaths, $lang ) );
141 | 
142 | 		return \Aimeos\Admin\JsonAdm::create( $context, $aimeos, $resource );
143 | 	}
144 | }
145 | 


--------------------------------------------------------------------------------
/src/Controller/JsonapiController.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | /**
  4 |  * @license MIT, http://opensource.org/licenses/MIT
  5 |  * @copyright Aimeos (aimeos.org), 2017-2023
  6 |  */
  7 | 
  8 | 
  9 | namespace Aimeos\Shop\Controller;
 10 | 
 11 | use Illuminate\Routing\Controller;
 12 | use Illuminate\Support\Facades\Route;
 13 | use Illuminate\Support\Facades\Request;
 14 | use Psr\Http\Message\ServerRequestInterface;
 15 | use Nyholm\Psr7\Factory\Psr17Factory;
 16 | 
 17 | 
 18 | /**
 19 |  * Aimeos controller for the JSON REST API
 20 |  */
 21 | class JsonapiController extends Controller
 22 | {
 23 | 	/**
 24 | 	 * Deletes the resource object or a list of resource objects
 25 | 	 *
 26 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 27 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 28 | 	 */
 29 | 	public function deleteAction( ServerRequestInterface $request )
 30 | 	{
 31 | 		return $this->createClient()->delete( $request, ( new Psr17Factory )->createResponse() );
 32 | 	}
 33 | 
 34 | 
 35 | 	/**
 36 | 	 * Returns the requested resource object or list of resource objects
 37 | 	 *
 38 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 39 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 40 | 	 */
 41 | 	public function getAction( ServerRequestInterface $request )
 42 | 	{
 43 | 		return $this->createClient()->get( $request, ( new Psr17Factory )->createResponse() );
 44 | 	}
 45 | 
 46 | 
 47 | 	/**
 48 | 	 * Updates a resource object or a list of resource objects
 49 | 	 *
 50 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 51 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 52 | 	 */
 53 | 	public function patchAction( ServerRequestInterface $request )
 54 | 	{
 55 | 		return $this->createClient()->patch( $request, ( new Psr17Factory )->createResponse() );
 56 | 	}
 57 | 
 58 | 
 59 | 	/**
 60 | 	 * Creates a new resource object or a list of resource objects
 61 | 	 *
 62 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 63 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 64 | 	 */
 65 | 	public function postAction( ServerRequestInterface $request )
 66 | 	{
 67 | 		return $this->createClient()->post( $request, ( new Psr17Factory )->createResponse() );
 68 | 	}
 69 | 
 70 | 
 71 | 	/**
 72 | 	 * Creates or updates a single resource object
 73 | 	 *
 74 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 75 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 76 | 	 */
 77 | 	public function putAction( ServerRequestInterface $request )
 78 | 	{
 79 | 		return $this->createClient()->put( $request, ( new Psr17Factory )->createResponse() );
 80 | 	}
 81 | 
 82 | 
 83 | 	/**
 84 | 	 * Returns the available HTTP verbs and the resource URLs
 85 | 	 *
 86 | 	 * @param \Psr\Http\Message\ServerRequestInterface $request Request object
 87 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
 88 | 	 */
 89 | 	public function optionsAction( ServerRequestInterface $request )
 90 | 	{
 91 | 		return $this->createClient()->options( $request, ( new Psr17Factory )->createResponse() )
 92 | 			->withHeader( 'access-control-allow-headers', 'authorization,content-type' )
 93 | 			->withHeader( 'access-control-allow-methods', 'DELETE, GET, OPTIONS, PATCH, POST, PUT' )
 94 | 			->withHeader( 'access-control-allow-origin', $request->getHeaderLine( 'origin' ) );
 95 | 	}
 96 | 
 97 | 
 98 | 	/**
 99 | 	 * Returns the JsonAdm client
100 | 	 *
101 | 	 * @return \Aimeos\Client\JsonApi\Iface JsonApi client
102 | 	 */
103 | 	protected function createClient() : \Aimeos\Client\JsonApi\Iface
104 | 	{
105 | 		$resource = Route::input( 'resource' );
106 | 		$related = Route::input( 'related', Request::get( 'related' ) );
107 | 
108 | 		$aimeos = app( 'aimeos' )->get();
109 | 		$context = app( 'aimeos.context' )->get();
110 | 		$tmplPaths = $aimeos->getTemplatePaths( 'client/jsonapi/templates', $context->locale()->getSiteItem()->getTheme() );
111 | 
112 | 		$langid = $context->locale()->getLanguageId();
113 | 
114 | 		$context->setView( app( 'aimeos.view' )->create( $context, $tmplPaths, $langid ) );
115 | 
116 | 		return \Aimeos\Client\JsonApi::create( $context, $resource . '/' . $related );
117 | 	}
118 | }
119 | 


--------------------------------------------------------------------------------
/src/Controller/PageController.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Controller;
10 | 
11 | use Aimeos\Shop\Facades\Shop;
12 | use Illuminate\Routing\Controller;
13 | use Illuminate\Support\Facades\View;
14 | use Illuminate\Support\Facades\Response;
15 | 
16 | 
17 | /**
18 |  * Aimeos controller for support page request.
19 |  */
20 | class PageController extends Controller
21 | {
22 | 	/**
23 | 	 * Returns the html for the content pages.
24 | 	 *
25 | 	 * @return \Psr\Http\Message\ResponseInterface Response object containing the generated output
26 | 	 */
27 | 	public function indexAction()
28 | 	{
29 | 		$params = ['page' => 'page-index'];
30 | 
31 | 		foreach( app( 'config' )->get( 'shop.page.cms', ['cms/page', 'catalog/tree', 'basket/mini'] ) as $name )
32 | 		{
33 | 			$params['aiheader'][$name] = Shop::get( $name )->header();
34 | 			$params['aibody'][$name] = Shop::get( $name )->body();
35 | 		}
36 | 
37 | 		if( empty( $params['aibody']['cms/page'] ) ) {
38 | 			abort( 404 );
39 | 		}
40 | 
41 | 		return Response::view( Shop::template( 'page.index' ), $params )
42 | 			->header( 'Cache-Control', 'private, max-age=10' );
43 | 	}
44 | }
45 | 


--------------------------------------------------------------------------------
/src/Controller/ResolveController.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | /**
  4 |  * @license MIT, http://opensource.org/licenses/MIT
  5 |  * @copyright Aimeos (aimeos.org), 2023
  6 |  */
  7 | 
  8 | 
  9 | namespace Aimeos\Shop\Controller;
 10 | 
 11 | use Aimeos\Shop\Facades\Shop;
 12 | use Illuminate\Routing\Controller;
 13 | use Illuminate\Support\Facades\Request;
 14 | use Illuminate\Support\Facades\Response;
 15 | use Illuminate\Support\Facades\Route;
 16 | use Illuminate\Support\Facades\View;
 17 | 
 18 | 
 19 | /**
 20 |  * Aimeos controller for dispatching requests.
 21 |  */
 22 | class ResolveController extends Controller
 23 | {
 24 | 	private static $fcn = [];
 25 | 
 26 | 
 27 | 	/**
 28 | 	 * Register a new resolver function.
 29 | 	 *
 30 | 	 * @param string $name Name of the resolver function
 31 | 	 * @param \Closure $fcn Resolver function
 32 | 	 */
 33 | 	public static function register( string $name, \Closure $fcn )
 34 | 	{
 35 | 		self::$fcn[$name] = $fcn;
 36 | 	}
 37 | 
 38 | 
 39 | 	/**
 40 | 	 * Initializes the object.
 41 | 	 */
 42 | 	public function __construct()
 43 | 	{
 44 | 		self::$fcn['product'] = function( \Aimeos\MShop\ContextIface $context, string $path ) {
 45 | 			return $this->product( $context, $path );
 46 | 		};
 47 | 
 48 | 		self::$fcn['catalog'] = function( \Aimeos\MShop\ContextIface $context, string $path ) {
 49 | 			return $this->catalog( $context, $path );
 50 | 		};
 51 | 	}
 52 | 
 53 | 
 54 | 	/**
 55 | 	 * Returns the html of the resolved URLs.
 56 | 	 *
 57 | 	 * @param \Illuminate\Http\Request $request Laravel request object
 58 | 	 * @return \Illuminate\Http\Response Laravel response object containing the generated output
 59 | 	 */
 60 | 	public function indexAction( \Illuminate\Http\Request $request )
 61 | 	{
 62 | 		if( ( $path = $request->route( 'path', $request->input( 'path' ) ) ) === null ) {
 63 | 			abort( 404 );
 64 | 		}
 65 | 
 66 | 		$context = app( 'aimeos.context' )->get( true );
 67 | 
 68 | 		foreach( array_reverse( self::$fcn ) as $name => $fcn )
 69 | 		{
 70 | 			try {
 71 | 				return call_user_func_array( $fcn->bindTo( $this, static::class ), [$context, $path] );
 72 | 			} catch( \Exception $e ) {
 73 | 				if( $e->getCode() !== 404 ) throw $e;
 74 | 			}
 75 | 		}
 76 | 
 77 | 		abort( 404 );
 78 | 	}
 79 | 
 80 | 
 81 | 	/**
 82 | 	 * Returns the category page if the give path can be resolved to a category.
 83 | 	 *
 84 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
 85 | 	 * @param string $path URL path to resolve
 86 | 	 * @return Response Response object
 87 | 	 */
 88 | 	protected function catalog( \Aimeos\MShop\ContextIface $context, string $path ) : ?\Illuminate\Http\Response
 89 | 	{
 90 | 		$item = \Aimeos\Controller\Frontend::create( $context, 'catalog' )->resolve( $path );
 91 | 		$view = Shop::view();
 92 | 
 93 | 		$params = ( Route::current() ? Route::current()->parameters() : [] ) + Request::all();
 94 | 		$params += ['path' => $path, 'f_name' => $path, 'f_catid' => $item->getId(), 'page' => 'page-catalog-tree'];
 95 | 
 96 | 		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $view, $params );
 97 | 		$view->addHelper( 'param', $helper );
 98 | 
 99 | 		foreach( app( 'config' )->get( 'shop.page.catalog-tree' ) as $name )
100 | 		{
101 | 			$client = Shop::get( $name );
102 | 
103 | 			$params['aiheader'][$name] = $client->header();
104 | 			$params['aibody'][$name] = $client->body();
105 | 		}
106 | 
107 | 		return Response::view( Shop::template( 'catalog.tree' ), $params )
108 | 			->header( 'Cache-Control', 'private, max-age=' . config( 'shop.cache_maxage', 30 ) );
109 | 	}
110 | 
111 | 
112 | 	/**
113 | 	 * Returns the CMS page if the give path can be resolved to a CMS page.
114 | 	 *
115 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
116 | 	 * @param string $path URL path to resolve
117 | 	 * @return Response Response object
118 | 	 */
119 | 	protected function cms( \Aimeos\MShop\ContextIface $context, string $path ) : ?\Illuminate\Http\Response
120 | 	{
121 | 		\Aimeos\Controller\Frontend::create( $context, 'cms' )->resolve( $path );
122 | 		$view = Shop::view();
123 | 
124 | 		$params = ( Route::current() ? Route::current()->parameters() : [] ) + Request::all();
125 | 		$params += ['path' => $path, 'page' => 'page-index'];
126 | 
127 | 		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $view, $params );
128 | 		$view->addHelper( 'param', $helper );
129 | 
130 | 		foreach( app( 'config' )->get( 'shop.page.cms' ) as $name )
131 | 		{
132 | 			$client = Shop::get( $name );
133 | 
134 | 			$params['aiheader'][$name] = $client->header();
135 | 			$params['aibody'][$name] = $client->body();
136 | 		}
137 | 
138 | 		return Response::view( Shop::template( 'page.index' ), $params )
139 | 			->header( 'Cache-Control', 'private, max-age=' . config( 'shop.cache_maxage', 30 ) );
140 | 	}
141 | 
142 | 
143 | 	/**
144 | 	 * Returns the product page if the give path can be resolved to a product.
145 | 	 *
146 | 	 * @param \Aimeos\MShop\ContextIface $context Context object
147 | 	 * @param string $path URL path to resolve
148 | 	 * @return Response Response object
149 | 	 */
150 | 	protected function product( \Aimeos\MShop\ContextIface $context, string $path ) : ?\Illuminate\Http\Response
151 | 	{
152 | 		$item = \Aimeos\Controller\Frontend::create( $context, 'product' )->resolve( $path );
153 | 		$view = Shop::view();
154 | 
155 | 		$params = ( Route::current() ? Route::current()->parameters() : [] ) + Request::all();
156 | 		$params += ['path' => $path, 'd_name' => $path, 'd_prodid' => $item->getId(), 'page' => 'page-catalog-detail'];
157 | 
158 | 		$helper = new \Aimeos\Base\View\Helper\Param\Standard( $view, $params );
159 | 		$view->addHelper( 'param', $helper );
160 | 
161 | 		foreach( app( 'config' )->get( 'shop.page.catalog-detail' ) as $name )
162 | 		{
163 | 			$client = Shop::get( $name );
164 | 
165 | 			$params['aiheader'][$name] = $client->header();
166 | 			$params['aibody'][$name] = $client->body();
167 | 		}
168 | 
169 | 		return Response::view( Shop::template( 'catalog.detail' ), $params )
170 | 			->header( 'Cache-Control', 'private, max-age=' . config( 'shop.cache_maxage', 30 ) );
171 | 	}
172 | }


--------------------------------------------------------------------------------
/src/Controller/SupplierController.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2015-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Controller;
10 | 
11 | use Aimeos\Shop\Facades\Shop;
12 | use Illuminate\Routing\Controller;
13 | use Illuminate\Support\Facades\Response;
14 | 
15 | 
16 | /**
17 |  * Aimeos controller for supplier related functionality.
18 |  */
19 | class SupplierController extends Controller
20 | {
21 | 	/**
22 | 	 * Returns the html for the supplier detail page.
23 | 	 *
24 | 	 * @return \Illuminate\Http\Response Response object with output and headers
25 | 	 */
26 | 	public function detailAction()
27 | 	{
28 | 		try
29 | 		{
30 | 			$params = ['page' => 'page-supplier-detail'];
31 | 
32 | 			foreach( app( 'config' )->get( 'shop.page.supplier-detail' ) as $name )
33 | 			{
34 | 				$params['aiheader'][$name] = Shop::get( $name )->header();
35 | 				$params['aibody'][$name] = Shop::get( $name )->body();
36 | 			}
37 | 
38 | 			return Response::view( Shop::template( 'supplier.detail' ), $params )
39 | 				->header( 'Cache-Control', 'private, max-age=10' );
40 | 		}
41 | 		catch( \Exception $e )
42 | 		{
43 | 			if( $e->getCode() >= 400 && $e->getCode() < 600 ) { abort( $e->getCode() ); }
44 | 			throw $e;
45 | 		}
46 | 	}
47 | }


--------------------------------------------------------------------------------
/src/Facades/Attribute.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the attribute frontend controller
14 |  */
15 | class Attribute extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new attribute frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Attribute\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.attribute';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Basket.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the basket frontend controller
14 |  */
15 | class Basket extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new basket frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Basket\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.basket';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Catalog.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the catalog frontend controller
14 |  */
15 | class Catalog extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new catalog frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Catalog\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.catalog';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Cms.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the CMS frontend controller
14 |  */
15 | class Cms extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new CMS frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Product\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.cms';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Customer.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the customer frontend controller
14 |  */
15 | class Customer extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new customer frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Customer\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.customer';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Locale.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the locale frontend controller
14 |  */
15 | class Locale extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new locale frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Locale\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.locale';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Order.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the order frontend controller
14 |  */
15 | class Order extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new order frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Order\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.order';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Product.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the product frontend controller
14 |  */
15 | class Product extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new product frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Product\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.product';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Service.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the service frontend controller
14 |  */
15 | class Service extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new service frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Service\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.service';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Shop.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the HTML clients
14 |  *
15 |  * @method static \Aimeos\Client\Html\Iface get()
16 |  */
17 | class Shop extends \Illuminate\Support\Facades\Facade
18 | {
19 | 	/**
20 | 	 * Get the registered name of the component.
21 | 	 *
22 | 	 * @return string
23 | 	 */
24 | 	protected static function getFacadeAccessor()
25 | 	{
26 | 		return 'aimeos.shop';
27 | 	}
28 | }
29 | 


--------------------------------------------------------------------------------
/src/Facades/Stock.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the stock frontend controller
14 |  */
15 | class Stock extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new stock frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Stock\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.stock';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Subscription.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the subscription frontend controller
14 |  */
15 | class Subscription extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new subscription frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Subscription\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.subscription';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/Facades/Supplier.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2019-2023
 6 |  */
 7 | 
 8 | 
 9 | namespace Aimeos\Shop\Facades;
10 | 
11 | 
12 | /**
13 |  * Returns the supplier frontend controller
14 |  */
15 | class Supplier extends \Illuminate\Support\Facades\Facade
16 | {
17 | 	/**
18 | 	 * Returns a new supplier frontend controller object
19 | 	 *
20 | 	 * @return \Aimeos\Controller\Frontend\Supplier\Iface
21 | 	 */
22 | 	protected static function getFacadeAccessor()
23 | 	{
24 | 		return 'aimeos.frontend.supplier';
25 | 	}
26 | }
27 | 


--------------------------------------------------------------------------------
/src/ShopServiceProvider.php:
--------------------------------------------------------------------------------
  1 | <?php
  2 | 
  3 | /**
  4 |  * @license MIT, http://opensource.org/licenses/MIT
  5 |  * @copyright Aimeos (aimeos.org), 2015-2023
  6 |  */
  7 | 
  8 | 
  9 | namespace Aimeos\Shop;
 10 | 
 11 | use Illuminate\Support\ServiceProvider;
 12 | use Illuminate\Support\Facades\Blade;
 13 | use Illuminate\Support\Facades\Route;
 14 | 
 15 | 
 16 | /**
 17 |  * Aimeos shop service provider for Laravel
 18 |  */
 19 | class ShopServiceProvider extends ServiceProvider {
 20 | 
 21 | 	/**
 22 | 	 * Indicates if loading of the provider is deferred.
 23 | 	 *
 24 | 	 * @var bool
 25 | 	 */
 26 | 	protected $defer = false;
 27 | 
 28 | 
 29 | 	/**
 30 | 	 * Bootstrap the application events.
 31 | 	 *
 32 | 	 * @return void
 33 | 	 */
 34 | 	public function boot()
 35 | 	{
 36 | 		$this->loadViewsFrom( dirname( __DIR__ ) . '/views', 'shop' );
 37 | 		$this->loadRoutesFrom( dirname( __DIR__ ) . '/routes/aimeos.php' );
 38 | 
 39 | 		$this->publishes( [dirname( __DIR__ ) . '/config/shop.php' => config_path( 'shop.php' )], 'config' );
 40 | 		$this->publishes( [dirname( __DIR__ ) . '/public' => public_path( 'vendor/shop' )], 'public' );
 41 | 
 42 | 		$class = '\Composer\InstalledVersions';
 43 | 
 44 | 		if( class_exists( $class ) && method_exists( $class, 'getInstalledPackagesByType' ) )
 45 | 		{
 46 | 			foreach( \Composer\InstalledVersions::getInstalledPackagesByType( 'aimeos-extension' ) as $package )
 47 | 			{
 48 | 				$path = realpath( \Composer\InstalledVersions::getInstallPath( $package ) );
 49 | 
 50 | 				if( file_exists( $path . '/themes/client/html' ) ) {
 51 | 					$this->publishes( [$path . '/themes/client/html' => public_path( 'vendor/shop/themes' )], 'public' );
 52 | 				}
 53 | 			}
 54 | 		}
 55 | 	}
 56 | 
 57 | 
 58 | 	/**
 59 | 	 * Register the service provider.
 60 | 	 *
 61 | 	 * @return void
 62 | 	 */
 63 | 	public function register()
 64 | 	{
 65 | 		$this->mergeConfigFrom( dirname( __DIR__ ) . '/config/default.php', 'shop' );
 66 | 
 67 | 		$this->app->scoped( 'aimeos', function( $app ) {
 68 | 			return new \Aimeos\Shop\Base\Aimeos( $app['config'] );
 69 | 		});
 70 | 
 71 | 		$this->app->scoped( 'aimeos.config', function( $app ) {
 72 | 			return new \Aimeos\Shop\Base\Config( $app['config'], $app['aimeos'] );
 73 | 		});
 74 | 
 75 | 		$this->app->scoped( 'aimeos.i18n', function( $app ) {
 76 | 			return new \Aimeos\Shop\Base\I18n( $this->app['config'], $app['aimeos'] );
 77 | 		});
 78 | 
 79 | 		$this->app->scoped( 'aimeos.locale', function( $app ) {
 80 | 			return new \Aimeos\Shop\Base\Locale( $app['config'] );
 81 | 		});
 82 | 
 83 | 		$this->app->scoped( 'aimeos.context', function( $app ) {
 84 | 			return new \Aimeos\Shop\Base\Context( $app['session.store'], $app['aimeos.config'], $app['aimeos.locale'], $app['aimeos.i18n'] );
 85 | 		});
 86 | 
 87 | 		$this->app->scoped( 'aimeos.support', function( $app ) {
 88 | 			return new \Aimeos\Shop\Base\Support( $app['aimeos.context'], $app['aimeos.locale'] );
 89 | 		});
 90 | 
 91 | 		$this->app->scoped( 'aimeos.view', function( $app ) {
 92 | 			return new \Aimeos\Shop\Base\View( $app['config'], $app['aimeos.i18n'], $app['aimeos.support'] );
 93 | 		});
 94 | 
 95 | 		$this->app->scoped( 'aimeos.shop', function( $app ) {
 96 | 			return new \Aimeos\Shop\Base\Shop( $app['aimeos'], $app['aimeos.context'], $app['aimeos.view'] );
 97 | 		});
 98 | 
 99 | 
100 | 		$this->app->bind( 'aimeos.frontend.attribute', function( $app ) {
101 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'attribute' );
102 | 		});
103 | 
104 | 		$this->app->bind( 'aimeos.frontend.basket', function( $app ) {
105 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'basket' );
106 | 		});
107 | 
108 | 		$this->app->bind( 'aimeos.frontend.catalog', function( $app ) {
109 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'catalog' );
110 | 		});
111 | 
112 | 		$this->app->bind( 'aimeos.frontend.cms', function( $app ) {
113 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'cms' );
114 | 		});
115 | 
116 | 		$this->app->bind( 'aimeos.frontend.customer', function( $app ) {
117 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'customer' );
118 | 		});
119 | 
120 | 		$this->app->bind( 'aimeos.frontend.locale', function( $app ) {
121 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'locale' );
122 | 		});
123 | 
124 | 		$this->app->bind( 'aimeos.frontend.order', function( $app ) {
125 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'order' );
126 | 		});
127 | 
128 | 		$this->app->bind( 'aimeos.frontend.product', function( $app ) {
129 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'product' );
130 | 		});
131 | 
132 | 		$this->app->bind( 'aimeos.frontend.service', function( $app ) {
133 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'service' );
134 | 		});
135 | 
136 | 		$this->app->bind( 'aimeos.frontend.stock', function( $app ) {
137 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'stock' );
138 | 		});
139 | 
140 | 		$this->app->bind( 'aimeos.frontend.subscription', function( $app ) {
141 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'subscription' );
142 | 		});
143 | 
144 | 		$this->app->bind( 'aimeos.frontend.supplier', function( $app ) {
145 | 			return \Aimeos\Controller\Frontend::create( $app['aimeos.context'], 'supplier' );
146 | 		});
147 | 
148 | 
149 | 		$this->commands( array(
150 | 			'Aimeos\Shop\Command\AccountCommand',
151 | 			'Aimeos\Shop\Command\ClearCommand',
152 | 			'Aimeos\Shop\Command\SetupCommand',
153 | 			'Aimeos\Shop\Command\JobsCommand',
154 | 		) );
155 | 	}
156 | 
157 | 
158 | 	/**
159 | 	 * Get the services provided by the provider.
160 | 	 *
161 | 	 * @return array
162 | 	 */
163 | 	public function provides()
164 | 	{
165 | 		return array(
166 | 			'Aimeos\Shop\Base\Aimeos', 'Aimeos\Shop\Base\I18n', 'Aimeos\Shop\Base\Context',
167 | 			'Aimeos\Shop\Base\Config', 'Aimeos\Shop\Base\Locale', 'Aimeos\Shop\Base\View',
168 | 			'Aimeos\Shop\Base\Support', 'Aimeos\Shop\Base\Shop',
169 | 			'Aimeos\Shop\Command\AccountCommand', 'Aimeos\Shop\Command\ClearCommand',
170 | 			'Aimeos\Shop\Command\SetupCommand', 'Aimeos\Shop\Command\JobsCommand',
171 | 		);
172 | 	}
173 | 
174 | }


--------------------------------------------------------------------------------
/src/helpers.php:
--------------------------------------------------------------------------------
 1 | <?php
 2 | 
 3 | /**
 4 |  * @license MIT, http://opensource.org/licenses/MIT
 5 |  * @copyright Aimeos (aimeos.org), 2017-2023
 6 |  */
 7 | 
 8 | 
 9 | if( !function_exists( 'airoute' ) )
10 | {
11 | 	/**
12 | 	 * Generate the URL to a named route.
13 | 	 *
14 | 	 * @param  array|string  $name
15 | 	 * @param  mixed  $parameters
16 | 	 * @param  bool  $absolute
17 | 	 * @return string
18 | 	 */
19 | 	function airoute( $name, $parameters = [], $absolute = true )
20 | 	{
21 | 		if( $current = Route::current() )
22 | 		{
23 | 			$site = config( 'app.shop_multishop' ) ? config( 'shop.mshop.locale.site', 'default' ) : null;
24 | 
25 | 			$parameters['site'] ??= $current->parameter( 'site', Request::get( 'site', $site ) );
26 | 			$parameters['locale'] ??= $current->parameter( 'locale', Request::get( 'locale' ) );
27 | 			$parameters['currency'] ??= $current->parameter( 'currency', Request::get( 'currency' ) );
28 | 		}
29 | 
30 | 		return app( 'url' )->route( $name, array_filter( $parameters ), $absolute );
31 | 	}
32 | }
33 | 
34 | 
35 | if( !function_exists( 'aiconfig' ) )
36 | {
37 | 	/**
38 | 	 * Returns the configuration setting for the given key
39 | 	 *
40 | 	 * @param string $key Configuration key
41 | 	 * @param mixed $default Default value if the configuration key isn't found
42 | 	 * @return mixed Configuration value
43 | 	 */
44 | 	function aiconfig( $key, $default = null )
45 | 	{
46 | 		return app( 'aimeos.config' )->get()->get( $key, $default );
47 | 	}
48 | }
49 | 
50 | 
51 | if( !function_exists( 'aitrans' ) )
52 | {
53 | 	/**
54 | 	 * Translates the given message
55 | 	 *
56 | 	 * @param string $singular Message to translate
57 | 	 * @param array $params List of paramters for replacing the placeholders in that order
58 | 	 * @param string $domain Translation domain
59 | 	 * @param string $locale ISO language code, maybe combine with ISO currency code, e.g. "en_US"
60 | 	 * @return string Translated string
61 | 	 */
62 | 	function aitrans( $singular, array $params = array(), $domain = 'client', $locale = null )
63 | 	{
64 | 		$i18n = app( 'aimeos.context' )->get()->i18n( $locale );
65 | 
66 | 		return vsprintf( $i18n->dt( $domain, $singular ), $params );
67 | 	}
68 | }
69 | 
70 | 
71 | if( !function_exists( 'aitransplural' ) )
72 | {
73 | 	/**
74 | 	 * Translates the given messages based on the number
75 | 	 *
76 | 	 * @param string $singular Message to translate
77 | 	 * @param string $plural Message for plural translations
78 | 	 * @param integer $number Count of items to chose the correct plural translation
79 | 	 * @param array $params List of paramters for replacing the placeholders in that order
80 | 	 * @param string $domain Translation domain
81 | 	 * @param string $locale ISO language code, maybe combine with ISO currency code, e.g. "en_US"
82 | 	 * @return string Translated string
83 | 	 */
84 | 	function aitransplural( $singular, $plural, $number, array $params = array(), $domain = 'client', $locale = null )
85 | 	{
86 | 		$i18n = app( 'aimeos.context' )->get()->i18n( $locale );
87 | 
88 | 		return vsprintf( $i18n->dn( $domain, $singular, $plural, $number ), $params );
89 | 	}
90 | }
91 | 


--------------------------------------------------------------------------------
/views/account/index.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<title>{{ __( 'Profile') }}</title>
 5 | 	<?= $aiheader['locale/select'] ?? '' ?>
 6 | 	<?= $aiheader['basket/mini'] ?? '' ?>
 7 | 	<?= $aiheader['account/profile'] ?? '' ?>
 8 | 	<?= $aiheader['account/review'] ?? '' ?>
 9 | 	<?= $aiheader['account/subscription'] ?? '' ?>
10 | 	<?= $aiheader['account/basket'] ?? '' ?>
11 | 	<?= $aiheader['account/history'] ?? '' ?>
12 | 	<?= $aiheader['account/favorite'] ?? '' ?>
13 | 	<?= $aiheader['account/watch'] ?? '' ?>
14 | 	<?= $aiheader['catalog/search'] ?? '' ?>
15 | 	<?= $aiheader['catalog/session'] ?? '' ?>
16 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
17 | @stop
18 | 
19 | @section('aimeos_head_basket')
20 | 	<?= $aibody['basket/mini'] ?? '' ?>
21 | @stop
22 | 
23 | @section('aimeos_head_nav')
24 | 	<?= $aibody['catalog/tree'] ?? '' ?>
25 | @stop
26 | 
27 | @section('aimeos_head_locale')
28 | 	<?= $aibody['locale/select'] ?? '' ?>
29 | @stop
30 | 
31 | @section('aimeos_head_search')
32 | 	<?= $aibody['catalog/search'] ?? '' ?>
33 | @stop
34 | 
35 | @section('aimeos_body')
36 | 	<div class="container-fluid">
37 | 		<?= $aibody['account/profile'] ?? '' ?>
38 | 		<?= $aibody['account/review'] ?? '' ?>
39 | 		<?= $aibody['account/subscription'] ?? '' ?>
40 | 		<?= $aibody['account/basket'] ?? '' ?>
41 | 		<?= $aibody['account/history'] ?? '' ?>
42 | 		<?= $aibody['account/favorite'] ?? '' ?>
43 | 		<?= $aibody['account/watch'] ?? '' ?>
44 | 	</div>
45 | @stop
46 | 
47 | @section('aimeos_aside')
48 | 	<?= $aibody['catalog/session'] ?? '' ?>
49 | @stop
50 | 


--------------------------------------------------------------------------------
/views/admin/index.blade.php:
--------------------------------------------------------------------------------
 1 | <!DOCTYPE html>
 2 | <html lang="en">
 3 | 	<head>
 4 | 		<meta charset="utf-8">
 5 | 		<meta http-equiv="X-UA-Compatible" content="IE=edge">
 6 | 		<meta name="viewport" content="width=device-width, initial-scale=1">
 7 | 		<title>Aimeos administration interface</title>
 8 | 
 9 | 		<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/font-awesome@4/css/font-awesome.min.css">
10 | 		<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4/dist/css/bootstrap.min.css">
11 | 
12 | 		<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
13 | 		<!--[if lt IE 9]>
14 | 		<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
15 | 		<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
16 | 		<![endif]-->
17 | 
18 | 		<style type="text/css">
19 | 			form.login {
20 | 				position: absolute;
21 | 				left: 50%;
22 | 				top: 50%;
23 | 				width: 20rem;
24 | 				margin: -6rem -10rem;
25 | 			}
26 | 
27 | 			form.login .input-group-addon {
28 | 				font-size: 1.25rem;
29 | 				min-width: 3.65rem;
30 | 			}
31 | 		</style>
32 | 	</head>
33 | 	<body>
34 | 
35 | 		<form class="login" method="POST" action="{{ url('login') }}" >
36 | 			{!! csrf_field() !!}
37 | 			<div class="form-group input-group input-group-lg">
38 | 				<span class="input-group-addon fa fa-at" id="email-addon"></span>
39 | 				<input class="form-control" type="email" name="email" required="required" placeholder="Email" value="{{ old('email') }}" aria-describedby="email-addon">
40 | 			</div>
41 | 			<div class="form-group input-group input-group-lg">
42 | 				<span class="input-group-addon fa fa-lock" id="password-addon"></span>
43 | 				<input class="form-control" type="password" name="password" required="required" placeholder="Password" aria-describedby="password-addon">
44 | 			</div>
45 | 			<hr>
46 | 			<button class="btn btn-block btn-lg btn-primary" type="submit">Login</button>
47 | 		</form>
48 | 		<script src="https://cdn.jsdelivr.net/npm/jquery@3/dist/jquery.min.js"></script>
49 | 		<script src="https://cdn.jsdelivr.net/npm/bootstrap@4/dist/js/bootstrap.bundle.min.js"></script>
50 | 	</body>
51 | </html>
52 | 


--------------------------------------------------------------------------------
/views/base.blade.php:
--------------------------------------------------------------------------------
  1 | <!DOCTYPE html>
  2 | <html class="no-js" lang="{{ str_replace('_', '-', app()->getLocale()) }}" dir="{{ in_array(app()->getLocale(), ['ar', 'az', 'dv', 'fa', 'he', 'ku', 'ur']) ? 'rtl' : 'ltr' }}">
  3 | 	<head>
  4 | 		<meta charset="utf-8">
  5 | 		<meta http-equiv="X-UA-Compatible" content="IE=edge">
  6 | 		<meta name="viewport" content="width=device-width, initial-scale=1">
  7 | 		<meta name="csrf-token" content="{{ csrf_token() }}">
  8 | 
  9 | 		@if( config('app.debug') !== true )
 10 | 			<meta http-equiv="Content-Security-Policy" content="base-uri 'self'; default-src 'self' 'nonce-{{ app( 'aimeos.context' )->get()->nonce() }}'; {{ config( 'shop.csp.frontend', 'style-src \'unsafe-inline\' \'self\'; img-src \'self\' data: https://aimeos.org; frame-src https://www.youtube.com https://player.vimeo.com' ) }}">
 11 | 		@endif
 12 | 
 13 | 		@if( in_array(app()->getLocale(), ['ar', 'az', 'dv', 'fa', 'he', 'ku', 'ur']) )
 14 | 			<link type="text/css" rel="stylesheet" href="{{ asset('vendor/shop/themes/default/app.rtl.css?v=' . config( 'shop.version', 1 ) ) }}">
 15 | 		@else
 16 | 			<link type="text/css" rel="stylesheet" href="{{ asset('vendor/shop/themes/default/app.css?v=' . config( 'shop.version', 1 ) ) }}">
 17 | 		@endif
 18 | 		<link type="text/css" rel="stylesheet" href="{{ asset('vendor/shop/themes/default/aimeos.css?v=' . config( 'shop.version', 1 ) ) }}">
 19 | 
 20 | 		@yield('aimeos_header')
 21 | 
 22 | 		<style nonce="{{ app( 'aimeos.context' )->get()->nonce() }}">
 23 | 			:root {
 24 | 				@foreach( app( 'aimeos.context' )->get()->locale()->getSiteItem()->getConfigValue( 'theme/default', [] ) as $key => $value )
 25 | 					{{ $key }}: {{ $value }};
 26 | 				@endforeach
 27 | 			}
 28 | 		</style>
 29 | 
 30 | 		<link rel="icon" href="{{ asset( app( 'aimeos.context' )->get()->config()->get( 'resource/fs-media/baseurl' ) . '/' . ( app( 'aimeos.context' )->get()->locale()->getSiteItem()->getIcon() ?: '../vendor/shop/themes/default/assets/icon.png' ) ) }}">
 31 | 
 32 | 		<link rel="preload" href="{{ asset('vendor/shop/themes/default/assets/roboto-condensed-v19-latin-regular.woff2') }}" as="font" type="font/woff2" crossorigin>
 33 | 		<link rel="preload" href="{{ asset('vendor/shop/themes/default/assets/roboto-condensed-v19-latin-700.woff2') }}" as="font" type="font/woff2" crossorigin>
 34 | 		<link rel="preload" href="{{ asset('vendor/shop/themes/default/assets/bootstrap-icons.woff2') }}" as="font" type="font/woff2" crossorigin>
 35 | 	</head>
 36 | 	<body class="{{ $page ?? '' }}">
 37 | 		<nav class="navbar navbar-expand-md navbar-top">
 38 | 			<a class="navbar-brand" href="/" title="{{ __('To the home page') }}">
 39 | 				<img src="{{ asset( app( 'aimeos.context' )->get()->config()->get( 'resource/fs-media/baseurl' ) . '/' . ( app( 'aimeos.context' )->get()->locale()->getSiteItem()->getLogo() ?: '../vendor/shop/themes/default/assets/logo.png' ) ) }}" height="40" alt="{{ __('To the home page') }}">
 40 | 			</a>
 41 | 
 42 | 			<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbar-top" aria-controls="navbar-top" aria-expanded="false" aria-label="Toggle navigation">
 43 | 				<span class="navbar-toggler-icon"></span>
 44 | 			</button>
 45 | 			<div class="collapse navbar-collapse" id="navbar-top">
 46 | 				@yield('aimeos_head_nav')
 47 | 			</div>
 48 | 
 49 | 			@yield('aimeos_head_locale')
 50 | 			@yield('aimeos_head_search')
 51 | 
 52 | 			<ul class="navbar-nav">
 53 | 				@if (Auth::guest() && config('app.shop_registration'))
 54 | 					<li class="nav-item register"><a class="nav-link" href="{{ airoute( 'register' ) }}" title="{{ __( 'Register' ) }}"><span class="name">{{ __('Register') }}</span></a></li>
 55 | 				@endif
 56 | 				@if (Auth::guest())
 57 | 					<li class="nav-item login"><a class="nav-link" href="{{ airoute( 'login' ) }}" title="{{ __( 'Login' ) }}"><span class="name">{{ __( 'Login' ) }}</span></a></li>
 58 | 				@else
 59 | 					<li class="nav-item login profile dropdown">
 60 | 						<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown" role="button" aria-expanded="false" title="{{ __( 'Account' ) }}"><span class="name">{{ __( 'Account' ) }}</span> <span class="caret"></span></a>
 61 | 						<ul class="dropdown-menu dropdown-menu-end" role="menu">
 62 | 							<li class="dropdown-item"><a class="nav-link" href="{{ airoute( 'aimeos_shop_account' ) }}"><span class="name">{{ __( 'Profile' ) }}</span></a></li>
 63 | 							<li class="dropdown-item"><form id="logout" action="{{ airoute( 'logout' ) }}" method="POST">{{ csrf_field() }}<button class="nav-link"><span class="name">{{ __( 'Logout' ) }}</span></button></form></li>
 64 | 						</ul>
 65 | 					</li>
 66 | 				@endif
 67 | 			</ul>
 68 | 
 69 | 			@yield('aimeos_head_basket')
 70 | 		</nav>
 71 | 
 72 | 		<div class="content">
 73 | 			@yield('aimeos_stage')
 74 | 			<main>
 75 | 				@yield('aimeos_body')
 76 | 				@yield('content')
 77 | 			</main>
 78 | 		</div>
 79 | 
 80 | 
 81 | 		<footer>
 82 | 			<div class="container-fluid">
 83 | 				<div class="row">
 84 | 					<div class="col-md-8">
 85 | 						<div class="row">
 86 | 							<div class="col-sm-6 footer-left">
 87 | 								<div class="footer-block">
 88 | 									<h2 class="pb-3" aria-label="{{ __('Legal information') }}">{{ __( 'LEGAL' ) }}</h2>
 89 | 									<p><a href="{{ airoute(config('shop.client.html.cms.page.url.target', 'aimeos_page'), ['path' => 'terms']) }}">{{ __( 'Terms & Conditions' ) }}</a></p>
 90 | 									<p><a href="{{ airoute(config('shop.client.html.cms.page.url.target', 'aimeos_page'), ['path' => 'privacy']) }}">{{ __( 'Privacy Notice' ) }}</a></p>
 91 | 									<p><a href="{{ airoute(config('shop.client.html.cms.page.url.target', 'aimeos_page'), ['path' => 'cancel']) }}">{{ __( 'Cancellation' ) }}</a></p>
 92 | 								</div>
 93 | 							</div>
 94 | 							<div class="col-sm-6 footer-center">
 95 | 								<div class="footer-block">
 96 | 									<h2 class="pb-3" aria-label="{{ __('About the company') }}">{{ __( 'ABOUT US' ) }}</h2>
 97 | 									<p><a href="{{ airoute(config('shop.client.html.cms.page.url.target', 'aimeos_page'), ['path' => 'contact']) }}">{{ __( 'Contact us' ) }}</a></p>
 98 | 									<p><a href="{{ airoute(config('shop.client.html.cms.page.url.target', 'aimeos_page'), ['path' => 'about']) }}">{{ __( 'Company' ) }}</a></p>
 99 | 								</div>
100 | 							</div>
101 | 						</div>
102 | 					</div>
103 | 					<div class="col-md-4 footer-right">
104 | 						<div class="footer-block">
105 | 							<a class="logo" href="/" title="{{ __('To the home page') }}">
106 | 								<img src="{{ asset( app( 'aimeos.context' )->get()->config()->get( 'resource/fs-media/baseurl' ) . '/' . ( app( 'aimeos.context' )->get()->locale()->getSiteItem()->getLogo() ?: '../vendor/shop/themes/default/assets/logo.png' ) ) }}" height="40" alt="{{ __('To the home page') }}">
107 | 							</a>
108 | 							<div class="social" aria-label="{{ __('Social media links') }}">
109 | 								<p><a href="#" class="sm facebook" title="Facebook" rel="noopener">Facebook</a></p>
110 | 								<p><a href="#" class="sm twitter" title="Twitter" rel="noopener">Twitter</a></p>
111 | 								<p><a href="#" class="sm instagram" title="Instagram" rel="noopener">Instagram</a></p>
112 | 								<p><a href="#" class="sm youtube" title="Youtube" rel="noopener">Youtube</a></p>
113 | 							</div>
114 | 						</div>
115 | 					</div>
116 | 				</div>
117 | 			</div>
118 | 		</footer>
119 | 
120 | 
121 | 
122 | 		<a id="toTop" class="back-to-top" href="#" title="{{ __( 'Back to top' ) }}">
123 | 			<div class="top-icon"></div>
124 | 		</a>
125 | 
126 | 		<!-- Scripts -->
127 | 		<script src="{{ asset('vendor/shop/themes/default/app.js?v=' . config( 'shop.version', 1 ) ) }}"></script>
128 | 		<script src="{{ asset('vendor/shop/themes/default/aimeos.js?v=' . config( 'shop.version', 1 ) ) }}"></script>
129 | 		@yield('aimeos_scripts')
130 | 	</body>
131 | </html>
132 | 


--------------------------------------------------------------------------------
/views/basket/index.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<title>{{ __( 'Basket') }}</title>
 5 | 	<meta name="robots" content="noindex">
 6 | 
 7 | 	<?= $aiheader['locale/select'] ?? '' ?>
 8 | 	<?= $aiheader['catalog/search'] ?? '' ?>
 9 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
10 | 	<?= $aiheader['basket/bulk'] ?? '' ?>
11 | 	<?= $aiheader['basket/standard'] ?? '' ?>
12 | 	<?= $aiheader['basket/related'] ?? '' ?>
13 | @stop
14 | 
15 | @section('aimeos_head_nav')
16 | 	<?= $aibody['catalog/tree'] ?? '' ?>
17 | @stop
18 | 
19 | @section('aimeos_head_locale')
20 | 	<?= $aibody['locale/select'] ?? '' ?>
21 | @stop
22 | 
23 | @section('aimeos_head_search')
24 | 	<?= $aibody['catalog/search'] ?? '' ?>
25 | @stop
26 | 
27 | @section('aimeos_body')
28 | 	<div class="container-fluid">
29 | 		<?= $aibody['basket/standard'] ?? '' ?>
30 | 		<?= $aibody['basket/related'] ?? '' ?>
31 | 		<?= $aibody['basket/bulk'] ?? '' ?>
32 | 	</div>
33 | @stop
34 | 


--------------------------------------------------------------------------------
/views/catalog/count.blade.php:
--------------------------------------------------------------------------------
1 | <?php echo $aibody['catalog/count']; ?>
2 | 


--------------------------------------------------------------------------------
/views/catalog/detail.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<?= $aiheader['locale/select'] ?? '' ?>
 5 | 	<?= $aiheader['basket/mini'] ?? '' ?>
 6 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
 7 | 	<?= $aiheader['catalog/search'] ?? '' ?>
 8 | 	<?= $aiheader['catalog/stage'] ?? '' ?>
 9 | 	<?= $aiheader['catalog/detail'] ?? '' ?>
10 | 	<?= $aiheader['catalog/session'] ?? '' ?>
11 | @stop
12 | 
13 | @section('aimeos_head_basket')
14 | 	<?= $aibody['basket/mini'] ?? '' ?>
15 | @stop
16 | 
17 | @section('aimeos_head_nav')
18 | 	<?= $aibody['catalog/tree'] ?? '' ?>
19 | @stop
20 | 
21 | @section('aimeos_head_locale')
22 | 	<?= $aibody['locale/select'] ?? '' ?>
23 | @stop
24 | 
25 | @section('aimeos_head_search')
26 | 	<?= $aibody['catalog/search'] ?? '' ?>
27 | @stop
28 | 
29 | @section('aimeos_stage')
30 | 	<?= $aibody['catalog/stage'] ?? '' ?>
31 | @stop
32 | 
33 | @section('aimeos_body')
34 | 	<?= $aibody['catalog/detail'] ?? '' ?>
35 | 	<?= $aibody['cms/page'] ?? '' ?>
36 | @stop
37 | 
38 | @section('aimeos_aside')
39 | 	<?= $aibody['catalog/session'] ?? '' ?>
40 | @stop
41 | 


--------------------------------------------------------------------------------
/views/catalog/home.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<?= $aiheader['locale/select'] ?? '' ?>
 5 | 	<?= $aiheader['basket/mini'] ?? '' ?>
 6 | 	<?= $aiheader['catalog/search'] ?? '' ?>
 7 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
 8 | 	<?= $aiheader['catalog/home'] ?? '' ?>
 9 | 	<?= $aiheader['cms/page'] ?? '' ?>
10 | @stop
11 | 
12 | @section('aimeos_head_basket')
13 | 	<?= $aibody['basket/mini'] ?? '' ?>
14 | @stop
15 | 
16 | @section('aimeos_head_nav')
17 | 	<?= $aibody['catalog/tree'] ?? '' ?>
18 | @stop
19 | 
20 | @section('aimeos_head_locale')
21 | 	<?= $aibody['locale/select'] ?? '' ?>
22 | @stop
23 | 
24 | @section('aimeos_head_search')
25 | 	<?= $aibody['catalog/search'] ?? '' ?>
26 | @stop
27 | 
28 | @section('aimeos_body')
29 | 	<?= $aibody['catalog/home'] ?? '' ?>
30 | 	<?= $aibody['cms/page'] ?? '' ?>
31 | @stop
32 | 


--------------------------------------------------------------------------------
/views/catalog/list.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<?= $aiheader['locale/select'] ?? '' ?>
 5 | 	<?= $aiheader['basket/mini'] ?? '' ?>
 6 | 	<?= $aiheader['catalog/search'] ?? '' ?>
 7 | 	<?= $aiheader['catalog/filter'] ?? '' ?>
 8 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
 9 | 	<?= $aiheader['catalog/stage'] ?? '' ?>
10 | 	<?= $aiheader['catalog/session'] ?? '' ?>
11 | 	<?= $aiheader['catalog/lists'] ?? '' ?>
12 | @stop
13 | 
14 | @section('aimeos_head_basket')
15 | 	<?= $aibody['basket/mini'] ?? '' ?>
16 | @stop
17 | 
18 | @section('aimeos_head_nav')
19 | 	<?= $aibody['catalog/tree'] ?? '' ?>
20 | @stop
21 | 
22 | @section('aimeos_head_locale')
23 | 	<?= $aibody['locale/select'] ?? '' ?>
24 | @stop
25 | 
26 | @section('aimeos_head_search')
27 | 	<?= $aibody['catalog/search'] ?? '' ?>
28 | @stop
29 | 
30 | @section('aimeos_body')
31 | 	<?= $aibody['catalog/stage'] ?? '' ?>
32 | 	<div class="container-fluid">
33 | 		<div class="row">
34 | 			<aside class="col-lg-3">
35 | 				<?= $aibody['catalog/filter'] ?? '' ?>
36 | 				<?= $aibody['catalog/session'] ?? '' ?>
37 | 			</aside>
38 | 			<div class="col-lg-9">
39 | 				<?= $aibody['catalog/lists'] ?>
40 | 			</div>
41 | 		</div>
42 | 	</div>
43 | @stop
44 | 


--------------------------------------------------------------------------------
/views/catalog/session.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<meta name="robots" content="noindex">
 5 | 
 6 | 	<?= $aiheader['locale/select'] ?? '' ?>
 7 | 	<?= $aiheader['basket/mini'] ?? '' ?>
 8 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
 9 | 	<?= $aiheader['catalog/search'] ?? '' ?>
10 | 	<?= $aiheader['catalog/session'] ?? '' ?>
11 | @stop
12 | 
13 | @section('aimeos_head_basket')
14 | 	<?= $aibody['basket/mini'] ?? '' ?>
15 | @stop
16 | 
17 | @section('aimeos_head_nav')
18 | 	<?= $aibody['catalog/tree'] ?? '' ?>
19 | @stop
20 | 
21 | @section('aimeos_head_locale')
22 | 	<?= $aibody['locale/select'] ?? '' ?>
23 | @stop
24 | 
25 | @section('aimeos_head_search')
26 | 	<?= $aibody['catalog/search'] ?? '' ?>
27 | @stop
28 | 
29 | @section('aimeos_body')
30 | 	<?= $aibody['catalog/session'] ?? '' ?>
31 | @stop
32 | 


--------------------------------------------------------------------------------
/views/catalog/stock.blade.php:
--------------------------------------------------------------------------------
1 | <?= $aibody['catalog/stock'] ?>


--------------------------------------------------------------------------------
/views/catalog/suggest.blade.php:
--------------------------------------------------------------------------------
1 | <?= $aibody['catalog/suggest'] ?>


--------------------------------------------------------------------------------
/views/catalog/tree.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<?= $aiheader['locale/select'] ?? '' ?>
 5 | 	<?= $aiheader['basket/mini'] ?? '' ?>
 6 | 	<?= $aiheader['catalog/search'] ?? '' ?>
 7 | 	<?= $aiheader['catalog/filter'] ?? '' ?>
 8 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
 9 | 	<?= $aiheader['catalog/session'] ?? '' ?>
10 | 	<?= $aiheader['catalog/stage'] ?? '' ?>
11 | 	<?= $aiheader['catalog/lists'] ?? '' ?>
12 | @stop
13 | 
14 | @section('aimeos_head_basket')
15 | 	<?= $aibody['basket/mini'] ?? '' ?>
16 | @stop
17 | 
18 | @section('aimeos_head_nav')
19 | 	<?= $aibody['catalog/tree'] ?? '' ?>
20 | @stop
21 | 
22 | @section('aimeos_head_locale')
23 | 	<?= $aibody['locale/select'] ?? '' ?>
24 | @stop
25 | 
26 | @section('aimeos_head_search')
27 | 	<?= $aibody['catalog/search'] ?? '' ?>
28 | @stop
29 | 
30 | @section('aimeos_stage')
31 | 	<?= $aibody['catalog/stage'] ?? '' ?>
32 | @stop
33 | 
34 | @section('aimeos_body')
35 | 	<div class="container-fluid">
36 | 		<div class="row">
37 | 			<aside class="col-lg-3">
38 | 				<?= $aibody['catalog/filter'] ?? '' ?>
39 | 				<?= $aibody['catalog/session'] ?? '' ?>
40 | 			</aside>
41 | 			<div class="col-lg-9">
42 | 				<?= $aibody['catalog/lists'] ?? '' ?>
43 | 				<?= $aibody['cms/page'] ?? '' ?>
44 | 			</div>
45 | 		</div>
46 | 	</div>
47 | @stop
48 | 


--------------------------------------------------------------------------------
/views/checkout/confirm.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<title>{{ __( 'Thank you') }}</title>
 5 | 	<?= $aiheader['checkout/confirm'] ?>
 6 | 	<?= $aiheader['catalog/search'] ?? '' ?>
 7 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
 8 | @stop
 9 | 
10 | @section('aimeos_head_nav')
11 | 	<?= $aibody['catalog/tree'] ?? '' ?>
12 | @stop
13 | 
14 | @section('aimeos_head_search')
15 | 	<?= $aibody['catalog/search'] ?? '' ?>
16 | @stop
17 | 
18 | @section('aimeos_body')
19 | 	<div class="container-fluid">
20 | 		<?= $aibody['checkout/confirm'] ?>
21 | 	</div>
22 | @stop
23 | 


--------------------------------------------------------------------------------
/views/checkout/index.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<title>{{ __( 'Checkout') }}</title>
 5 | 	<meta name="robots" content="noindex">
 6 | 
 7 | 	<?= $aiheader['checkout/standard'] ?>
 8 | 	<?= $aiheader['catalog/search'] ?? '' ?>
 9 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
10 | @stop
11 | 
12 | @section('aimeos_nav')
13 | 	<?= $aibody['catalog/tree'] ?? '' ?>
14 | 	<?= $aibody['catalog/search'] ?? '' ?>
15 | @stop
16 | 
17 | @section('aimeos_body')
18 | 	<div class="container-fluid">
19 | 		<?= $aibody['checkout/standard'] ?>
20 | 	</div>
21 | @stop
22 | 


--------------------------------------------------------------------------------
/views/checkout/update.blade.php:
--------------------------------------------------------------------------------
1 | <?php echo $aibody['checkout/update']; ?>
2 | 


--------------------------------------------------------------------------------
/views/jqadm/index.blade.php:
--------------------------------------------------------------------------------
 1 | <!DOCTYPE html>
 2 | <html lang="{{ $locale }}" dir="{{ $localeDir }}">
 3 | 	<head>
 4 | 		<meta charset="utf-8">
 5 | 		<meta http-equiv="X-UA-Compatible" content="IE=edge">
 6 | 		<meta name="viewport" content="width=device-width, initial-scale=1">
 7 | 		<meta name="csrf-token" content="{{ csrf_token() }}" />
 8 | 
 9 | 		@if( config('app.debug') !== true )
10 | 			<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: blob:; {{ config( 'shop.csp.backend', 'style-src \'unsafe-inline\' \'self\' https://cdnjs.cloudflare.com; script-src \'unsafe-eval\' \'self\'; connect-src \'self\' https://*.deepl.com https://api.openai.com; img-src \'self\' data: blob: https://*.tile.openstreetmap.org https://aimeos.org; frame-src https://www.youtube.com https://player.vimeo.com' ) }}">
11 | 		@endif
12 | 
13 | 		<title>Aimeos administration interface</title>
14 | 
15 | 		<link rel="stylesheet" href="<?= airoute( 'aimeos_shop_jqadm_file', ['site' => $site, 'locale' => 'en', 'name' => 'vendor-css'] ) ?>">
16 | 		@if( $localeDir == 'rtl' )
17 | 			<link rel="stylesheet" href="<?= airoute( 'aimeos_shop_jqadm_file', ['site' => $site, 'locale' => 'en', 'name' => 'index-rtl-css'] ) ?>">
18 | 		@else
19 | 			<link rel="stylesheet" href="<?= airoute( 'aimeos_shop_jqadm_file', ['site' => $site, 'locale' => 'en', 'name' => 'index-ltr-css'] ) ?>">
20 | 		@endif
21 | 		<link rel="stylesheet" href="<?= airoute( 'aimeos_shop_jqadm_file', ['site' => $site, 'locale' => 'en', 'name' => 'index-css'] ) ?>">
22 | 
23 | 		<style nonce="{{ app( 'aimeos.context' )->get( false )->nonce() }}">
24 | 			body.dark .btn-theme.dark-mode {display:none}
25 | 			body.light .btn-theme.light-mode {display:none}
26 | 			.app-menu .icon {cursor: pointer; padding: 0.75rem; height: 2.5rem; width: 2.5rem; margin: 0 0.25rem;}
27 | 			.app-menu button {border: none; color: var(--ai-bg); background-color: transparent; padding: 0}
28 | 			#logout-form {display: inline-block}
29 | 		</style>
30 | 	</head>
31 | 	<body class="{{ $theme }}">
32 | 		<div class="app-menu">
33 | 			<span class="menu"></span>
34 | 			<div class="app-menu-end">
35 | 				<form id="logout-form" action="{{ airoute( 'logout', ['locale' => Request::get( 'locale', app()->getLocale() )] ) }}" method="POST">
36 | 					{{ csrf_field() }}
37 | 					<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-sun icon btn-theme light-mode" viewBox="0 0 16 16"><path d="M8 11a3 3 0 1 1 0-6 3 3 0 0 1 0 6m0 1a4 4 0 1 0 0-8 4 4 0 0 0 0 8M8 0a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 0m0 13a.5.5 0 0 1 .5.5v2a.5.5 0 0 1-1 0v-2A.5.5 0 0 1 8 13m8-5a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2a.5.5 0 0 1 .5.5M3 8a.5.5 0 0 1-.5.5h-2a.5.5 0 0 1 0-1h2A.5.5 0 0 1 3 8m10.657-5.657a.5.5 0 0 1 0 .707l-1.414 1.415a.5.5 0 1 1-.707-.708l1.414-1.414a.5.5 0 0 1 .707 0m-9.193 9.193a.5.5 0 0 1 0 .707L3.05 13.657a.5.5 0 0 1-.707-.707l1.414-1.414a.5.5 0 0 1 .707 0m9.193 2.121a.5.5 0 0 1-.707 0l-1.414-1.414a.5.5 0 0 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .707M4.464 4.465a.5.5 0 0 1-.707 0L2.343 3.05a.5.5 0 1 1 .707-.707l1.414 1.414a.5.5 0 0 1 0 .708"/></svg>
38 | 					<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-moon icon btn-theme dark-mode" viewBox="0 0 16 16"><path d="M6 .278a.77.77 0 0 1 .08.858 7.2 7.2 0 0 0-.878 3.46c0 4.021 3.278 7.277 7.318 7.277q.792-.001 1.533-.16a.79.79 0 0 1 .81.316.73.73 0 0 1-.031.893A8.35 8.35 0 0 1 8.344 16C3.734 16 0 12.286 0 7.71 0 4.266 2.114 1.312 5.124.06A.75.75 0 0 1 6 .278M4.858 1.311A7.27 7.27 0 0 0 1.025 7.71c0 4.02 3.279 7.276 7.319 7.276a7.32 7.32 0 0 0 5.205-2.162q-.506.063-1.029.063c-4.61 0-8.343-3.714-8.343-8.29 0-1.167.242-2.278.681-3.286"/></svg>
39 | 					<button><svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-right icon logout" viewBox="0 0 16 16"><path fill-rule="evenodd" d="M10 12.5a.5.5 0 0 1-.5.5h-8a.5.5 0 0 1-.5-.5v-9a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 .5.5v2a.5.5 0 0 0 1 0v-2A1.5 1.5 0 0 0 9.5 2h-8A1.5 1.5 0 0 0 0 3.5v9A1.5 1.5 0 0 0 1.5 14h8a1.5 1.5 0 0 0 1.5-1.5v-2a.5.5 0 0 0-1 0z"/><path fill-rule="evenodd" d="M15.854 8.354a.5.5 0 0 0 0-.708l-3-3a.5.5 0 0 0-.708.708L14.293 7.5H5.5a.5.5 0 0 0 0 1h8.793l-2.147 2.146a.5.5 0 0 0 .708.708z"/></svg></button>
40 | 				</form>
41 | 			</div>
42 | 		</div>
43 | 
44 | <?= $content ?>
45 | 
46 | 		<script src="<?= airoute( 'aimeos_shop_jqadm_file', array( 'site' => $site, 'locale' => 'en', 'name' => 'vendor-js' ) ) ?>"></script>
47 | 		<script src="<?= airoute( 'aimeos_shop_jqadm_file', array( 'site' => $site, 'locale' => 'en', 'name' => 'index-js' ) ) ?>"></script>
48 | 	</body>
49 | </html>
50 | 


--------------------------------------------------------------------------------
/views/page/index.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
 5 | 	<?= $aiheader['basket/mini'] ?? '' ?>
 6 | 	<?= $aiheader['cms/page'] ?? '' ?>
 7 | @stop
 8 | 
 9 | @section('aimeos_nav')
10 | 	<?= $aibody['catalog/tree'] ?? '' ?>
11 | @stop
12 | 
13 | @section('aimeos_head')
14 | 	<?= $aibody['basket/mini'] ?? '' ?>
15 | @stop
16 | 
17 | @section('aimeos_body')
18 | 	<div class="container-fluid">
19 | 		<?= $aibody['cms/page'] ?? '' ?>
20 | 	</div>
21 | @stop
22 | 


--------------------------------------------------------------------------------
/views/supplier/detail.blade.php:
--------------------------------------------------------------------------------
 1 | @extends('shop::base')
 2 | 
 3 | @section('aimeos_header')
 4 | 	<?= $aiheader['supplier/detail'] ?>
 5 | 	<?= $aiheader['locale/select'] ?? '' ?>
 6 | 	<?= $aiheader['basket/mini'] ?? '' ?>
 7 | 	<?= $aiheader['catalog/tree'] ?? '' ?>
 8 | 	<?= $aiheader['catalog/search'] ?? '' ?>
 9 | 	<?= $aiheader['catalog/lists'] ?? '' ?>
10 | @stop
11 | 
12 | @section('aimeos_head_basket')
13 | 	<?= $aibody['basket/mini'] ?? '' ?>
14 | @stop
15 | 
16 | @section('aimeos_head_nav')
17 | 	<?= $aibody['catalog/tree'] ?? '' ?>
18 | @stop
19 | 
20 | @section('aimeos_head_locale')
21 | 	<?= $aibody['locale/select'] ?? '' ?>
22 | @stop
23 | 
24 | @section('aimeos_head_search')
25 | 	<?= $aibody['catalog/search'] ?? '' ?>
26 | @stop
27 | 
28 | @section('aimeos_body')
29 | 	<div class="container-fluid">
30 | 		<?= $aibody['supplier/detail'] ?>
31 | 		<?= $aibody['catalog/lists'] ?? '' ?>
32 | 	</div>
33 | @stop
34 | 


--------------------------------------------------------------------------------