├── .circleci └── config.yml ├── .coveralls.yml ├── 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 │ └── 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 | "php-8.0 / mysql-8.0": 9 | docker: 10 | - image: aimeos/ci-php:8.0 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:~9.0" --no-update 21 | - run: php composer req "phpunit/phpunit:~9.0" --no-update --dev 22 | - restore_cache: 23 | keys: 24 | - php80-{{ checksum "composer.json" }} 25 | - run: php composer update -n --prefer-dist 26 | - save_cache: 27 | key: php80-{{ 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 --coverage-clover coverage.xml 31 | 32 | "php-8.1 / mysql-8.0": 33 | docker: 34 | - image: aimeos/ci-php:8.1 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:~9.0" --no-update 45 | - run: php composer req "phpunit/phpunit:~9.0" --no-update --dev 46 | - restore_cache: 47 | keys: 48 | - php81-{{ checksum "composer.json" }} 49 | - run: php composer update -n --prefer-dist 50 | - save_cache: 51 | key: php81-{{ 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 --coverage-clover coverage.xml 55 | 56 | "php-8.2 / mysql-8.0": 57 | docker: 58 | - image: aimeos/ci-php:8.2 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:~10.0" --no-update 69 | - run: php composer req "phpunit/phpunit:~9.0" --no-update --dev 70 | - restore_cache: 71 | keys: 72 | - php82-{{ checksum "composer.json" }} 73 | - run: php composer update -n --prefer-dist 74 | - save_cache: 75 | key: php82-{{ 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 | - "php-8.0 / mysql-8.0" 85 | - "php-8.1 / mysql-8.0" 86 | - "php-8.2 / mysql-8.0" 87 | -------------------------------------------------------------------------------- /.coveralls.yml: -------------------------------------------------------------------------------- 1 | src_dir: ./ 2 | json_path: coveralls.json 3 | coverage_clover: coverage.xml 4 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | Build Status 5 | Total Downloads 6 | Latest Stable Version 7 | License 8 |

9 | 10 | ## Features 11 | 12 | This marketplace is a full-featured e-commerce package: 13 | 14 | * Multi vendor, multi channel and multi warehouse 15 | * From one to 1,000,000,000+ items 16 | * Extremly fast down to 20ms 17 | * For multi-tentant e-commerce SaaS solutions with unlimited vendors 18 | * Bundles, vouchers, virtual, configurable, custom and event products 19 | * Subscriptions with recurring payments 20 | * 100+ payment gateways 21 | * Full RTL support (frontend and backend) 22 | * Block/tier pricing out of the box 23 | * Extension for customer/group based prices 24 | * Discount and voucher support 25 | * Flexible basket rule system 26 | * Full-featured admin backend 27 | * Beautiful admin dashboard 28 | * Configurable product data sets 29 | * JSON REST API based on jsonapi.org 30 | * GraphQL API for administration 31 | * Completly modular structure 32 | * Extremely configurable and extensible 33 | * Extension for market places with millions of vendors 34 | * Fully SEO optimized including rich snippets 35 | * Translated to 30+ languages 36 | * AI-based text translation 37 | * Optimized for smart phones and tablets 38 | * Secure and reviewed implementation 39 | * High quality source code 40 | 41 | Check out the demos: 42 | 43 | * [Frontend demo](https://laravel.demo.aimeos.org) 44 | * [Admin demo](https://admin.demo.aimeos.org) 45 | 46 | 47 | ## Installation 48 | 49 | The Aimeos Laravel online shop package is a composer based library. It can be 50 | installed easiest by using [Composer 2.1+](https://getcomposer.org) in the root 51 | directory of your existing Laravel application: 52 | 53 | ``` 54 | wget https://getcomposer.org/download/latest-stable/composer.phar -O composer 55 | php composer require aimeos/aimeos-laravel:~2023.04 56 | ``` 57 | 58 | Then, add these lines to the composer.json of the **Laravel skeleton application**: 59 | 60 | ```json 61 | "prefer-stable": true, 62 | "minimum-stability": "dev", 63 | "require": { 64 | "aimeos/aimeos-laravel": "~2023.04", 65 | ... 66 | }, 67 | "scripts": { 68 | "post-update-cmd": [ 69 | "@php artisan migrate", 70 | "@php artisan vendor:publish --tag=public --force", 71 | "\\Aimeos\\Shop\\Composer::join" 72 | ], 73 | ... 74 | } 75 | ``` 76 | 77 | Afterwards, install the Aimeos shop package using 78 | 79 | `composer update` 80 | 81 | In the last step you must now execute these artisan commands to get a working 82 | or updated Aimeos installation: 83 | 84 | ```bash 85 | php artisan vendor:publish --provider="Aimeos\Shop\ShopServiceProvider" 86 | php artisan migrate 87 | php artisan aimeos:setup --option=setup/default/demo:1 88 | ``` 89 | 90 | In a production environment or if you don't want that the demo data gets 91 | installed, leave out the `--option=setup/default/demo:1` option. 92 | 93 | ## Authentication 94 | 95 | You have to set up one of Laravel's authentication starter kits. Laravel Breeze 96 | is the easiest one but you can also use Jetstream. 97 | 98 | ### Laravel 9 & 10 99 | 100 | ```bash 101 | composer require laravel/breeze 102 | php artisan breeze:install 103 | npm install && npm run build 104 | ``` 105 | 106 | Laravel Breeze adds a route for `/profile` to `./routes/web.php` which may overwrite the 107 | `aimeos_shop_account` route. To avoid an exception about a missing `aimeos_shop_account` 108 | route, change the URL for these lines from `./routes/web.php` file from `/profile` to 109 | `/profile/me`: 110 | 111 | ```php 112 | Route::middleware('auth')->group(function () { 113 | Route::get('/profile/me', [ProfileController::class, 'edit'])->name('profile.edit'); 114 | Route::patch('/profile/me', [ProfileController::class, 'update'])->name('profile.update'); 115 | Route::delete('/profile/me', [ProfileController::class, 'destroy'])->name('profile.destroy'); 116 | }); 117 | ``` 118 | 119 | For more information, please follow the Laravel documentation: 120 | * [Laravel 10.x](https://laravel.com/docs/10.x/authentication) 121 | * [Laravel 9.x](https://laravel.com/docs/9.x/authentication) 122 | 123 | ### Configure authentication 124 | 125 | As a last step, you need to extend the `boot()` method of your 126 | `App\Providers\AuthServiceProvider` class and add the lines to define how 127 | authorization for "admin" is checked in `app/Providers/AuthServiceProvider.php`: 128 | 129 | ```php 130 | public function boot() 131 | { 132 | // Keep the lines before 133 | 134 | \Illuminate\Support\Facades\Gate::define('admin', function($user, $class, $roles) { 135 | if( isset( $user->superuser ) && $user->superuser ) { 136 | return true; 137 | } 138 | return app( '\Aimeos\Shop\Base\Support' )->checkUserGroup( $user, $roles ); 139 | }); 140 | } 141 | ``` 142 | 143 | ### Create account 144 | 145 | Test if your authentication setup works before you continue. Create an admin account 146 | for your Laravel application so you will be able to log into the Aimeos admin interface: 147 | 148 | ```bash 149 | php artisan aimeos:account --super 150 | ``` 151 | 152 | The e-mail address is the user name for login and the account will work for the 153 | frontend too. To protect the new account, the command will ask you for a password. 154 | The same command can create limited accounts by using `--admin`, `--editor` or `--api` 155 | instead of `--super` (access to everything). 156 | 157 | ## Setup 158 | 159 | To reference images correctly, you have to adapt your `.env` file and set the `APP_URL` 160 | to your real URL, e.g. 161 | 162 | ``` 163 | APP_URL=http://127.0.0.1:8000 164 | ``` 165 | 166 | **Caution:** Make sure, Laravel uses the `file` session driver in your `.env` file! 167 | Otherwise, the shopping basket content won't get stored correctly! 168 | 169 | ``` 170 | SESSION_DRIVER=file 171 | ``` 172 | 173 | If your `./public` directory isn't writable by your web server, you have to create these 174 | directories: 175 | 176 | ``` 177 | mkdir public/aimeos public/vendor 178 | chmod 777 public/aimeos public/vendor 179 | ``` 180 | 181 | In a production environment, you should be more specific about the granted permissions! 182 | 183 | ## Test 184 | 185 | Then, you should be able to call the catalog list page in your browser. For a 186 | quick start, you can use the integrated web server. Simply execute this command 187 | in the base directory of your application: 188 | 189 | ``` 190 | php artisan serve 191 | ``` 192 | 193 | ### Frontend 194 | 195 | Point your browser to the list page of the shop using: 196 | 197 | http://127.0.0.1:8000/shop 198 | 199 | **Note:** Integrating the Aimeos package adds some routes like `/shop` or `/admin` to your 200 | Laravel installation but the **home page stays untouched!** If you want to add Aimeos to 201 | the home page as well, replace the route for "/" in `./routes/web.php` by this line: 202 | 203 | ```php 204 | Route::group(['middleware' => ['web']], function () { 205 | Route::get('/', '\Aimeos\Shop\Controller\CatalogController@homeAction')->name('aimeos_home'); 206 | }); 207 | ``` 208 | 209 | For multi-vendor setups, read the article about [multiple shops](https://aimeos.org/docs/latest/laravel/customize/#multiple-shops). 210 | 211 | This will display the Aimeos catalog home component on the home page you you get a 212 | nice looking shop home page which will look like this: 213 | 214 | [![Aimeos frontend](https://aimeos.org/fileadmin/aimeos.org/images/aimeos-frontend.jpg?2021.07)](http://127.0.0.1:8000/shop) 215 | 216 | ### Backend 217 | 218 | If you've still started the internal PHP web server (`php artisan serve`) 219 | you should now open this URL in your browser: 220 | 221 | http://127.0.0.1:8000/admin 222 | 223 | Enter the e-mail address and the password of the newly created user and press "Login". 224 | If you don't get redirected to the admin interface (that depends on the authentication 225 | code you've created according to the Laravel documentation), point your browser to the 226 | `/admin` URL again. 227 | 228 | **Caution:** Make sure that you aren't already logged in as a non-admin user! In this 229 | case, login won't work because Laravel requires you to log out first. 230 | 231 | [![Aimeos backend](https://aimeos.org/fileadmin/aimeos.org/images/aimeos-backend.png)](http://127.0.0.1:8000/admin) 232 | 233 | ## Hints 234 | 235 | To simplify development, you should configure to use no content cache. You can 236 | do this in the `config/shop.php` file of your Laravel application by adding 237 | these lines at the bottom: 238 | 239 | ```php 240 | 'madmin' => [ 241 | 'cache' => [ 242 | 'manager' => [ 243 | 'name' => 'None', 244 | ], 245 | ], 246 | ], 247 | ``` 248 | 249 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aimeos/aimeos-laravel", 3 | "description": "Professional, full-featured and high performance Laravel e-commerce package for online shops 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 | "doctrine/dbal": "~2.9||~3.0", 19 | "laravel/framework": "^9.0||^10.0", 20 | "nyholm/psr7": "~1.2", 21 | "laminas/laminas-diactoros": "~2.5||~3.0", 22 | "symfony/psr-http-message-bridge": "~2.0", 23 | "aimeos/aimeos-core": "dev-master", 24 | "aimeos/ai-laravel": "dev-master", 25 | "aimeos/ai-admin-graphql": "dev-master", 26 | "aimeos/ai-admin-jqadm": "dev-master", 27 | "aimeos/ai-admin-jsonadm": "dev-master", 28 | "aimeos/ai-client-html": "dev-master", 29 | "aimeos/ai-client-jsonapi": "dev-master", 30 | "aimeos/ai-cms-grapesjs": "dev-master", 31 | "aimeos/ai-controller-jobs": "dev-master", 32 | "aimeos/ai-controller-frontend": "dev-master" 33 | }, 34 | "require-dev": { 35 | "phpunit/phpunit": "^9.0||^10.0", 36 | "orchestra/testbench": "~7.0||~8.0", 37 | "orchestra/testbench-browser-kit": "~7.0||~8.0", 38 | "php-coveralls/php-coveralls": "~2.0" 39 | }, 40 | "autoload": { 41 | "psr-4": { 42 | "Aimeos\\Shop\\": "src/" 43 | }, 44 | "files": [ 45 | "src/helpers.php" 46 | ] 47 | }, 48 | "autoload-dev": { 49 | "classmap": [ 50 | "tests/AimeosTestAbstract.php", 51 | "tests/HelpersTest.php" 52 | ] 53 | }, 54 | "extra": { 55 | "laravel": { 56 | "providers": [ 57 | "Aimeos\\Shop\\ShopServiceProvider" 58 | ] 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /config/default.php: -------------------------------------------------------------------------------- 1 | false, 13 | 'apc_prefix' => 'laravel:', 14 | 'extdir' => base_path( 'ext' ), 15 | 'pcntl_max' => 4, 16 | 'pcntl_priority' => 19, 17 | 'uploaddir' => '/', 18 | 19 | 'page' => [ 20 | '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'], 21 | 'basket-index' => ['locale/select', 'catalog/tree', 'catalog/search', 'basket/standard', 'basket/bulk', 'basket/related'], 22 | 'catalog-count' => ['catalog/count'], 23 | 'catalog-detail' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/stage', 'catalog/detail', 'catalog/session'], 24 | 'catalog-home' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/home'], 25 | 'catalog-list' => ['locale/select', 'basket/mini', 'catalog/filter', 'catalog/tree', 'catalog/search', 'catalog/price', 'catalog/supplier', 'catalog/attribute', 'catalog/session', 'catalog/stage', 'catalog/lists'], 26 | 'catalog-session' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/session'], 27 | 'catalog-stock' => ['catalog/stock'], 28 | 'catalog-suggest' => ['catalog/suggest'], 29 | 'catalog-tree' => ['locale/select', 'basket/mini', 'catalog/filter', 'catalog/tree', 'catalog/search', 'catalog/price', 'catalog/supplier', 'catalog/attribute', 'catalog/session', 'catalog/stage', 'catalog/lists'], 30 | 'checkout-confirm' => ['catalog/tree', 'catalog/search', 'checkout/confirm'], 31 | 'checkout-index' => ['locale/select', 'catalog/tree', 'catalog/search', 'checkout/standard'], 32 | 'checkout-update' => ['checkout/update'], 33 | 'supplier-detail' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'supplier/detail', 'catalog/lists'], 34 | ], 35 | 36 | 'admin' => [ 37 | 'graphql' => [ 38 | 'url' => [ 39 | 'target' => 'aimeos_shop_graphql_post', 40 | 'config' => [ 41 | 'absoluteUri' => true, 42 | ], 43 | ], 44 | ], 45 | 'jqadm' => [ 46 | 'url' => [ 47 | 'batch' => [ 48 | 'target' => 'aimeos_shop_jqadm_batch' 49 | ], 50 | 'copy' => [ 51 | 'target' => 'aimeos_shop_jqadm_copy' 52 | ], 53 | 'create' => [ 54 | 'target' => 'aimeos_shop_jqadm_create' 55 | ], 56 | 'delete' => [ 57 | 'target' => 'aimeos_shop_jqadm_delete' 58 | ], 59 | 'export' => [ 60 | 'target' => 'aimeos_shop_jqadm_export' 61 | ], 62 | 'get' => [ 63 | 'target' => 'aimeos_shop_jqadm_get' 64 | ], 65 | 'import' => [ 66 | 'target' => 'aimeos_shop_jqadm_import' 67 | ], 68 | 'save' => [ 69 | 'target' => 'aimeos_shop_jqadm_save' 70 | ], 71 | 'search' => [ 72 | 'target' => 'aimeos_shop_jqadm_search' 73 | ], 74 | ], 75 | ], 76 | 'jsonadm' => [ 77 | 'url' => [ 78 | 'target' => 'aimeos_shop_jsonadm_get', 79 | 'config' => [ 80 | 'absoluteUri' => true, 81 | ], 82 | 'options' => [ 83 | 'target' => 'aimeos_shop_jsonadm_options', 84 | 'config' => [ 85 | 'absoluteUri' => true, 86 | ], 87 | ], 88 | ], 89 | ], 90 | ], 91 | 'client' => [ 92 | 'html' => [ 93 | 'account' => [ 94 | 'index' => [ 95 | 'url' => [ 96 | 'target' => 'aimeos_shop_account', 97 | ], 98 | ], 99 | 'basket' => [ 100 | 'url' => [ 101 | 'target' => 'aimeos_shop_account', 102 | ], 103 | ], 104 | 'review' => [ 105 | 'url' => [ 106 | 'target' => 'aimeos_shop_account', 107 | ], 108 | ], 109 | 'profile' => [ 110 | 'url' => [ 111 | 'target' => 'aimeos_shop_account', 112 | ], 113 | ], 114 | 'subscription' => [ 115 | 'url' => [ 116 | 'target' => 'aimeos_shop_account', 117 | ], 118 | ], 119 | 'history' => [ 120 | 'url' => [ 121 | 'target' => 'aimeos_shop_account', 122 | ], 123 | ], 124 | 'favorite' => [ 125 | 'url' => [ 126 | 'target' => 'aimeos_shop_account_favorite', 127 | ], 128 | ], 129 | 'watch' => [ 130 | 'url' => [ 131 | 'target' => 'aimeos_shop_account_watch', 132 | ], 133 | ], 134 | 'download' => [ 135 | 'url' => [ 136 | 'target' => 'aimeos_shop_account_download', 137 | ], 138 | 'error' => [ 139 | 'url' => [ 140 | 'target' => 'aimeos_shop_account', 141 | ], 142 | ], 143 | ], 144 | ], 145 | 'cms' => [ 146 | 'page' => [ 147 | 'url' => [ 148 | 'target' => 'aimeos_page', 149 | ], 150 | ], 151 | ], 152 | 'catalog' => [ 153 | 'count' => [ 154 | 'url' => [ 155 | 'target' => 'aimeos_shop_count', 156 | ], 157 | ], 158 | 'detail' => [ 159 | 'url' => [ 160 | 'target' => 'aimeos_shop_detail', 161 | ], 162 | ], 163 | 'home' => [ 164 | 'url' => [ 165 | 'target' => 'aimeos_home', 166 | ], 167 | ], 168 | 'lists' => [ 169 | 'url' => [ 170 | 'target' => 'aimeos_shop_list', 171 | ], 172 | ], 173 | 'session' => [ 174 | 'pinned' => [ 175 | 'url' => [ 176 | 'target' => 'aimeos_shop_session_pinned', 177 | ], 178 | ], 179 | ], 180 | 'stock' => [ 181 | 'url' => [ 182 | 'target' => 'aimeos_shop_stock', 183 | ], 184 | ], 185 | 'suggest' => [ 186 | 'url' => [ 187 | 'target' => 'aimeos_shop_suggest', 188 | ], 189 | ], 190 | 'tree' => [ 191 | 'url' => [ 192 | 'target' => 'aimeos_shop_tree', 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 | 'attribute' => [ 291 | 'name' => $aimeosIndexManagerName, 292 | ], 293 | 'catalog' => [ 294 | 'name' => $aimeosIndexManagerName, 295 | ], 296 | 'price' => [ 297 | 'name' => $aimeosIndexManagerName, 298 | ], 299 | 'supplier' => [ 300 | 'name' => $aimeosIndexManagerName, 301 | ], 302 | 'text' => [ 303 | 'name' => $aimeosIndexManagerName, 304 | ], 305 | ], 306 | ], 307 | ], 308 | ]; 309 | -------------------------------------------------------------------------------- /config/shop.php: -------------------------------------------------------------------------------- 1 | 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 | 11 | 'routes' => [ 12 | // Docs: https://aimeos.org/docs/latest/laravel/extend/#custom-routes 13 | // Multi-sites: https://aimeos.org/docs/latest/laravel/customize/#multiple-shops 14 | // 'admin' => ['prefix' => 'admin', 'middleware' => ['web']], 15 | // 'jqadm' => ['prefix' => 'admin/{site}/jqadm', 'middleware' => ['web', 'auth']], 16 | // 'graphql' => ['prefix' => 'admin/{site}/graphql', 'middleware' => ['web', 'auth']], 17 | // 'jsonadm' => ['prefix' => 'admin/{site}/jsonadm', 'middleware' => ['web', 'auth']], 18 | // 'jsonapi' => ['prefix' => 'jsonapi', 'middleware' => ['web', 'api']], 19 | // 'account' => ['prefix' => 'profile', 'middleware' => ['web', 'auth']], 20 | // 'default' => ['prefix' => 'shop', 'middleware' => ['web']], 21 | // 'confirm' => ['prefix' => 'shop', 'middleware' => ['web']], 22 | // 'supplier' => ['prefix' => 's', 'middleware' => ['web']], 23 | // 'page' => ['prefix' => 'p', 'middleware' => ['web']], 24 | // 'home' => ['middleware' => ['web']], 25 | // 'update' => [], 26 | ], 27 | 28 | 'page' => [ 29 | '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'], 30 | 'basket-index' => ['locale/select', 'catalog/tree', 'catalog/search', 'basket/standard', 'basket/bulk', 'basket/related'], 31 | 'catalog-count' => ['catalog/count'], 32 | 'catalog-detail' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/stage', 'catalog/detail', 'catalog/session'], 33 | 'catalog-home' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/home'], 34 | 'catalog-list' => ['locale/select', 'basket/mini', 'catalog/filter', 'catalog/tree', 'catalog/search', 'catalog/price', 'catalog/supplier', 'catalog/attribute', 'catalog/session', 'catalog/stage', 'catalog/lists'], 35 | 'catalog-session' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'catalog/session'], 36 | 'catalog-stock' => ['catalog/stock'], 37 | 'catalog-suggest' => ['catalog/suggest'], 38 | 'catalog-tree' => ['locale/select', 'basket/mini', 'catalog/filter', 'catalog/tree', 'catalog/search', 'catalog/price', 'catalog/supplier', 'catalog/attribute', 'catalog/session', 'catalog/stage', 'catalog/lists'], 39 | 'checkout-confirm' => ['catalog/tree', 'catalog/search', 'checkout/confirm'], 40 | 'checkout-index' => ['locale/select', 'catalog/tree', 'catalog/search', 'checkout/standard'], 41 | 'checkout-update' => ['checkout/update'], 42 | 'supplier-detail' => ['locale/select', 'basket/mini', 'catalog/tree', 'catalog/search', 'supplier/detail', 'catalog/lists'], 43 | 'cms' => ['cms/page', 'catalog/tree', 'basket/mini'], 44 | ], 45 | 46 | 'resource' => [ 47 | 'db' => [ 48 | 'adapter' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.driver', 'mysql' ), 49 | 'host' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.host', '127.0.0.1' ), 50 | 'port' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.port', '3306' ), 51 | 'socket' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.unix_socket', '' ), 52 | 'database' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.database', 'forge' ), 53 | 'username' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.username', 'forge' ), 54 | 'password' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.password', '' ), 55 | 'stmt' => config( 'database.default', 'mysql' ) === 'mysql' ? ["SET SESSION sort_buffer_size=2097144; SET NAMES 'utf8mb4'; SET SESSION sql_mode='ANSI'"] : [], 56 | 'limit' => 3, // maximum number of concurrent database connections 57 | 'defaultTableOptions' => [ 58 | 'charset' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.charset' ), 59 | 'collate' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.collation' ), 60 | ], 61 | 'driverOptions' => config( 'database.connections.' . config( 'database.default', 'mysql' ) . '.options' ), 62 | ], 63 | 'fs' => [ 64 | 'adapter' => 'Standard', 65 | 'tempdir' => storage_path( 'tmp' ), 66 | 'basedir' => public_path(), 67 | 'baseurl' => rtrim(env('ASSET_URL', PHP_SAPI == 'cli' ? env('APP_URL') : ''), '/'), 68 | ], 69 | 'fs-media' => [ 70 | 'adapter' => 'Standard', 71 | 'tempdir' => storage_path( 'tmp' ), 72 | 'basedir' => public_path( 'aimeos' ), 73 | 'baseurl' => rtrim(env('ASSET_URL', PHP_SAPI == 'cli' ? env('APP_URL') : ''), '/') . '/aimeos', 74 | ], 75 | 'fs-mimeicon' => [ 76 | 'adapter' => 'Standard', 77 | 'tempdir' => storage_path( 'tmp' ), 78 | 'basedir' => public_path( 'vendor/shop/mimeicons' ), 79 | 'baseurl' => rtrim(env('ASSET_URL', PHP_SAPI == 'cli' ? env('APP_URL') : ''), '/') . '/vendor/shop/mimeicons', 80 | ], 81 | 'fs-theme' => [ 82 | 'adapter' => 'Standard', 83 | 'tempdir' => storage_path( 'tmp' ), 84 | 'basedir' => public_path( 'vendor/shop/themes' ), 85 | 'baseurl' => rtrim(env('ASSET_URL', PHP_SAPI == 'cli' ? env('APP_URL') : ''), '/') . '/vendor/shop/themes', 86 | ], 87 | 'fs-admin' => [ 88 | 'adapter' => 'Standard', 89 | 'tempdir' => storage_path( 'tmp' ), 90 | 'basedir' => storage_path( 'admin' ), 91 | ], 92 | 'fs-export' => [ 93 | 'adapter' => 'Standard', 94 | 'tempdir' => storage_path( 'tmp' ), 95 | 'basedir' => storage_path( 'export' ), 96 | ], 97 | 'fs-import' => [ 98 | 'adapter' => 'Standard', 99 | 'tempdir' => storage_path( 'tmp' ), 100 | 'basedir' => storage_path( 'import' ), 101 | ], 102 | 'fs-secure' => [ 103 | 'adapter' => 'Standard', 104 | 'tempdir' => storage_path( 'tmp' ), 105 | 'basedir' => storage_path( 'secure' ), 106 | ], 107 | 'mq' => [ 108 | 'adapter' => 'Standard', 109 | 'db' => 'db', 110 | ], 111 | 'email' => [ 112 | 'from-email' => config( 'mail.from.address' ), 113 | 'from-name' => config( 'mail.from.name' ), 114 | ], 115 | ], 116 | 117 | 'admin' => [], 118 | 119 | 'client' => [ 120 | 'html' => [ 121 | 'basket' => [ 122 | 'cache' => [ 123 | // 'enable' => false, // Disable basket content caching for development 124 | ], 125 | ], 126 | 'common' => [ 127 | 'cache' => [ 128 | // 'force' => true // enforce caching for logged in users 129 | ], 130 | ], 131 | 'catalog' => [ 132 | 'lists' => [ 133 | 'basket-add' => true, // shows add to basket in list views 134 | // 'infinite-scroll' => true, // load more products in list view 135 | // 'size' => 48, // number of products per page 136 | ], 137 | 'selection' => [ 138 | 'type' => [// how variant attributes are displayed 139 | 'color' => 'radio', 140 | 'length' => 'radio', 141 | 'width' => 'radio', 142 | ], 143 | ], 144 | ], 145 | ], 146 | ], 147 | 148 | 'controller' => [ 149 | 'frontend' => [ 150 | 'catalog' => [ 151 | 'levels-always' => 3 // number of category levels for mega menu 152 | ] 153 | ] 154 | ], 155 | 156 | 'i18n' => [ 157 | ], 158 | 159 | 'madmin' => [ 160 | 'cache' => [ 161 | 'manager' => [ 162 | // 'name' => 'None', // Disable caching for development 163 | ], 164 | ], 165 | 'log' => [ 166 | 'manager' => [ 167 | // 'loglevel' => 7, // Enable debug logging into madmin_log table 168 | ], 169 | ], 170 | ], 171 | 172 | 'mshop' => [ 173 | 'locale' => [ 174 | // 'site' => '', // used instead of "default" 175 | ] 176 | ], 177 | 178 | 179 | 'command' => [ 180 | ], 181 | 182 | 'frontend' => [ 183 | ], 184 | 185 | 'backend' => [ 186 | ], 187 | 188 | ]; 189 | -------------------------------------------------------------------------------- /public/mimeicons/application/illustrator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/illustrator.png -------------------------------------------------------------------------------- /public/mimeicons/application/javascript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/javascript.png -------------------------------------------------------------------------------- /public/mimeicons/application/msword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/msword.png -------------------------------------------------------------------------------- /public/mimeicons/application/octet-stream.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/octet-stream.png -------------------------------------------------------------------------------- /public/mimeicons/application/pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/pdf.png -------------------------------------------------------------------------------- /public/mimeicons/application/pgp-encrypted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/pgp-encrypted.png -------------------------------------------------------------------------------- /public/mimeicons/application/pgp-keys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/pgp-keys.png -------------------------------------------------------------------------------- /public/mimeicons/application/pkcs7-mime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/pkcs7-mime.png -------------------------------------------------------------------------------- /public/mimeicons/application/postscript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/postscript.png -------------------------------------------------------------------------------- /public/mimeicons/application/relaxng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/relaxng.png -------------------------------------------------------------------------------- /public/mimeicons/application/rss+xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/rss+xml.png -------------------------------------------------------------------------------- /public/mimeicons/application/rtf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/rtf.png -------------------------------------------------------------------------------- /public/mimeicons/application/sxw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/sxw.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.ms-access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.ms-access.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.ms-excel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.ms-excel.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.ms-powerpoint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.ms-powerpoint.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.chart.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.database.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.database.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.formula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.formula.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.graphics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.graphics.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.image.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.presentation-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.presentation-template.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.presentation.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.spreadsheet-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.spreadsheet-template.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.spreadsheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.spreadsheet.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.oasis.opendocument.text.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.rn-realmedia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.rn-realmedia.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.scribus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.scribus.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.stardivision.calc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.stardivision.calc.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.stardivision.draw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.stardivision.draw.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.sun.xml.calc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.sun.xml.calc.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.sun.xml.calc.template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.sun.xml.calc.template.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.sun.xml.draw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.sun.xml.draw.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.sun.xml.draw.template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/vnd.sun.xml.draw.template.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-7z-compressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-7z-compressed.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-ace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-ace.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-applix-spreadsheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-applix-spreadsheet.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-ar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-arc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-arc.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-archive.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-arj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-arj.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-awk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-awk.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-bittorrent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-bittorrent.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-bzdvi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-bzdvi.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-bzip-compressed-tar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-bzip-compressed-tar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-bzip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-bzip.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-cd-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-cd-image.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-cda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-cda.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-compress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-compress.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-compressed-tar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-compressed-tar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-cpio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-cpio.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-cue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-cue.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-deb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-deb.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-designer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-designer.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-desktop.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-egon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-egon.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-executable-script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-executable-script.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-executable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-executable.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-afm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-font-afm.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-bdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-font-bdf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-otf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-font-otf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-pcf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-font-pcf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-snf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-font-snf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-ttf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-font-ttf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-type1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-font-type1.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-gnumeric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-gnumeric.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-gzdvi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-gzdvi.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-gzip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-gzip.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-gzpostscript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-gzpostscript.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-java-applet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-java-applet.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-java-archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-java-archive.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-java.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-javascript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-javascript.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-k3b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-k3b.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kcsrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-kcsrc.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kgetlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-kgetlist.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kontour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-kontour.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kplato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-kplato.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-krita.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-krita.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kvtml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-kvtml.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-lha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-lha.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-lyx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-lyx.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-lzma-compressed-tar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-lzma-compressed-tar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-lzop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-lzop.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-m4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-m4.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-marble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-marble.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-mimearchive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-mimearchive.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-mplayer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-mplayer2.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-ms-dos-executable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-ms-dos-executable.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-mswinurl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-mswinurl.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-mswrite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-mswrite.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-nzb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-nzb.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-object.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-object.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-pak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-pak.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-pem-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-pem-key.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-perl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-perl.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-php.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-php.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-plasma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-plasma.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-python-bytecode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-python-bytecode.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-qet-element.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-qet-element.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-qet-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-qet-project.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-quattropro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-quattropro.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-rar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-rar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-rpm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-rpm.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-ruby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-ruby.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-sharedlib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-sharedlib.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-shellscript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-shellscript.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-shockwave-flash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-shockwave-flash.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-siag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-siag.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-smb-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-smb-server.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-smb-workgroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-smb-workgroup.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-subrip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-subrip.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-tar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-tar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-tarz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-tarz.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-tgif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-tgif.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-trash.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-troff-man.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-troff-man.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-tzo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-tzo.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-wmf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-wmf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-zerosize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-zerosize.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-zoo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/x-zoo.png -------------------------------------------------------------------------------- /public/mimeicons/application/xhtml+xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/xhtml+xml.png -------------------------------------------------------------------------------- /public/mimeicons/application/xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/xml.png -------------------------------------------------------------------------------- /public/mimeicons/application/xsd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/xsd.png -------------------------------------------------------------------------------- /public/mimeicons/application/xslt+xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/xslt+xml.png -------------------------------------------------------------------------------- /public/mimeicons/application/zip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/application/zip.png -------------------------------------------------------------------------------- /public/mimeicons/audio/ac3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/ac3.png -------------------------------------------------------------------------------- /public/mimeicons/audio/midi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/midi.png -------------------------------------------------------------------------------- /public/mimeicons/audio/prs.sid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/prs.sid.png -------------------------------------------------------------------------------- /public/mimeicons/audio/vnd.rn-realvideo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/vnd.rn-realvideo.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-adpcm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/x-adpcm.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-aiff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/x-aiff.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-flac+ogg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/x-flac+ogg.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-flac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/x-flac.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/x-generic.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-monkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/x-monkey.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-speex+ogg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/x-speex+ogg.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-wav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/audio/x-wav.png -------------------------------------------------------------------------------- /public/mimeicons/fonts/package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/fonts/package.png -------------------------------------------------------------------------------- /public/mimeicons/image/svg+xml-compressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/image/svg+xml-compressed.png -------------------------------------------------------------------------------- /public/mimeicons/image/svg+xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/image/svg+xml.png -------------------------------------------------------------------------------- /public/mimeicons/image/x-eps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/image/x-eps.png -------------------------------------------------------------------------------- /public/mimeicons/image/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/image/x-generic.png -------------------------------------------------------------------------------- /public/mimeicons/image/x-vnd.trolltech.qpicture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/image/x-vnd.trolltech.qpicture.png -------------------------------------------------------------------------------- /public/mimeicons/image/x-xfig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/image/x-xfig.png -------------------------------------------------------------------------------- /public/mimeicons/inode/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/inode/directory.png -------------------------------------------------------------------------------- /public/mimeicons/message/news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/message/news.png -------------------------------------------------------------------------------- /public/mimeicons/message/rfc822.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/message/rfc822.png -------------------------------------------------------------------------------- /public/mimeicons/package/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/package/x-generic.png -------------------------------------------------------------------------------- /public/mimeicons/text/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/calendar.png -------------------------------------------------------------------------------- /public/mimeicons/text/css.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/css.png -------------------------------------------------------------------------------- /public/mimeicons/text/csv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/csv.png -------------------------------------------------------------------------------- /public/mimeicons/text/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/directory.png -------------------------------------------------------------------------------- /public/mimeicons/text/enriched.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/enriched.png -------------------------------------------------------------------------------- /public/mimeicons/text/html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/html.png -------------------------------------------------------------------------------- /public/mimeicons/text/mathml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/mathml.png -------------------------------------------------------------------------------- /public/mimeicons/text/plain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/plain.png -------------------------------------------------------------------------------- /public/mimeicons/text/rdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/rdf.png -------------------------------------------------------------------------------- /public/mimeicons/text/rtf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/rtf.png -------------------------------------------------------------------------------- /public/mimeicons/text/sgml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/sgml.png -------------------------------------------------------------------------------- /public/mimeicons/text/troff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/troff.png -------------------------------------------------------------------------------- /public/mimeicons/text/vcalendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/vcalendar.png -------------------------------------------------------------------------------- /public/mimeicons/text/vnd.abc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/vnd.abc.png -------------------------------------------------------------------------------- /public/mimeicons/text/vnd.wap.wml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/vnd.wap.wml.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-adasrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-adasrc.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-authors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-authors.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-bibtex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-bibtex.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-c++hdr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-c++hdr.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-c++src.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-c++src.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-changelog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-changelog.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-chdr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-chdr.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-cmake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-cmake.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-copying.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-copying.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-csharp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-csharp.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-csrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-csrc.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-dtd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-dtd.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-generic.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-haskell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-haskell.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-hex.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-install.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-java.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-katefilelist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-katefilelist.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-ldif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-ldif.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-log.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-makefile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-makefile.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-nfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-nfo.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-objchdr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-objchdr.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-objcsrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-objcsrc.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-pascal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-pascal.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-patch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-patch.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-po.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-po.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-python.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-readme.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-script.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-sql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-sql.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-tcl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-tcl.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-tex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-tex.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-texinfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-texinfo.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-vcard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-vcard.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-xslfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/x-xslfo.png -------------------------------------------------------------------------------- /public/mimeicons/text/xmcd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/xmcd.png -------------------------------------------------------------------------------- /public/mimeicons/text/xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/text/xml.png -------------------------------------------------------------------------------- /public/mimeicons/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/unknown.png -------------------------------------------------------------------------------- /public/mimeicons/uri/mms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/uri/mms.png -------------------------------------------------------------------------------- /public/mimeicons/uri/mmst.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/uri/mmst.png -------------------------------------------------------------------------------- /public/mimeicons/uri/mmsu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/uri/mmsu.png -------------------------------------------------------------------------------- /public/mimeicons/uri/pnm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/uri/pnm.png -------------------------------------------------------------------------------- /public/mimeicons/uri/rtspt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/uri/rtspt.png -------------------------------------------------------------------------------- /public/mimeicons/uri/rtspu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/uri/rtspu.png -------------------------------------------------------------------------------- /public/mimeicons/video/mp4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/video/mp4.png -------------------------------------------------------------------------------- /public/mimeicons/video/webm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/video/webm.png -------------------------------------------------------------------------------- /public/mimeicons/video/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/video/x-generic.png -------------------------------------------------------------------------------- /public/mimeicons/video/x-mng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/video/x-mng.png -------------------------------------------------------------------------------- /public/mimeicons/video/x-wmv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/smile1130/laravel-vue-marketplace/c87e2b2c63ca0f98a608f3fef5c40360c8c6131c/public/mimeicons/video/x-wmv.png -------------------------------------------------------------------------------- /src/Base/Aimeos.php: -------------------------------------------------------------------------------- 1 | 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 | 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, array() ) ) !== array() ) { 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/I18n.php: -------------------------------------------------------------------------------- 1 | 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 | 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 | 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 | -------------------------------------------------------------------------------- /src/Base/Support.php: -------------------------------------------------------------------------------- 1 | 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 | * Returns the available group codes 91 | * 92 | * @param \Aimeos\MShop\ContextIface $context Context item 93 | * @return string[] List of group codes 94 | */ 95 | public function getGroups( \Aimeos\MShop\ContextIface $context ) : array 96 | { 97 | $manager = \Aimeos\MShop::create( $context, 'customer/group' ); 98 | 99 | $search = $manager->filter(); 100 | $search->setConditions( $search->compare( '==', 'customer.group.id', $context->groups() ) ); 101 | 102 | return $manager->search( $search )->getCode()->toArray(); 103 | } 104 | 105 | 106 | /** 107 | * Checks if one of the groups is associated to the given user ID 108 | * 109 | * @param \Aimeos\MShop\ContextIface $context Context item 110 | * @param string $userid ID of the logged in user 111 | * @param string[]|string $groupcodes List of group codes to check against 112 | * @return bool True if the user is in one of the groups, false if not 113 | */ 114 | protected function checkGroups( \Aimeos\MShop\ContextIface $context, string $userid, $groupcodes ) : bool 115 | { 116 | $manager = \Aimeos\MShop::create( $context, 'customer/group' ); 117 | 118 | $search = $manager->filter(); 119 | $search->setConditions( $search->compare( '==', 'customer.group.code', (array) $groupcodes ) ); 120 | $groupIds = $manager->search( $search )->keys()->toArray(); 121 | 122 | $manager = \Aimeos\MShop::create( $context, 'customer/lists' ); 123 | 124 | $search = $manager->filter()->slice( 0, 1 ); 125 | $expr = array( 126 | $search->compare( '==', 'customer.lists.parentid', $userid ), 127 | $search->compare( '==', 'customer.lists.refid', $groupIds ), 128 | $search->compare( '==', 'customer.lists.domain', 'customer/group' ), 129 | ); 130 | $search->setConditions( $search->combine( '&&', $expr ) ); 131 | 132 | return !$manager->search( $search )->isEmpty(); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /src/Base/View.php: -------------------------------------------------------------------------------- 1 | i18n = $i18n; 48 | $this->config = $config; 49 | $this->support = $support; 50 | } 51 | 52 | 53 | /** 54 | * Creates the view object for the HTML client. 55 | * 56 | * @param \Aimeos\MShop\ContextIface $context Context object 57 | * @param array $templatePaths List of base path names with relative template paths as key/value pairs 58 | * @param string|null $locale Code of the current language or null for no translation 59 | * @return \Aimeos\Base\View\Iface View object 60 | */ 61 | public function create( \Aimeos\MShop\ContextIface $context, array $templatePaths, 62 | string $locale = null ) : \Aimeos\Base\View\Iface 63 | { 64 | $engine = new \Aimeos\Base\View\Engine\Blade( app( 'Illuminate\Contracts\View\Factory' ) ); 65 | $view = new \Aimeos\Base\View\Standard( $templatePaths, array( '.blade.php' => $engine ) ); 66 | 67 | $config = $context->config(); 68 | $session = $context->session(); 69 | 70 | $this->addCsrf( $view ); 71 | $this->addAccess( $view, $context ); 72 | $this->addConfig( $view, $config ); 73 | $this->addNumber( $view, $config, $locale ); 74 | $this->addParam( $view ); 75 | $this->addRequest( $view ); 76 | $this->addResponse( $view ); 77 | $this->addSession( $view, $session ); 78 | $this->addTranslate( $view, $locale ); 79 | $this->addUrl( $view ); 80 | 81 | return $view; 82 | } 83 | 84 | 85 | /** 86 | * Adds the "access" helper to the view object 87 | * 88 | * @param \Aimeos\Base\View\Iface $view View object 89 | * @param \Aimeos\MShop\ContextIface $context Context object 90 | * @return \Aimeos\Base\View\Iface Modified view object 91 | */ 92 | protected function addAccess( \Aimeos\Base\View\Iface $view, \Aimeos\MShop\ContextIface $context ) : \Aimeos\Base\View\Iface 93 | { 94 | if( $this->config->get( 'shop.accessControl', true ) === false 95 | || ( ( $user = \Illuminate\Support\Facades\Auth::user() ) !== null && $user->superuser ) 96 | ) { 97 | $helper = new \Aimeos\Base\View\Helper\Access\All( $view ); 98 | } 99 | else 100 | { 101 | $support = $this->support; 102 | 103 | $fcn = function() use ( $support, $context ) { 104 | return $support->getGroups( $context ); 105 | }; 106 | 107 | $helper = new \Aimeos\Base\View\Helper\Access\Standard( $view, $fcn ); 108 | } 109 | 110 | $view->addHelper( 'access', $helper ); 111 | 112 | return $view; 113 | } 114 | 115 | 116 | /** 117 | * Adds the "config" helper to the view object 118 | * 119 | * @param \Aimeos\Base\View\Iface $view View object 120 | * @param \Aimeos\Base\Config\Iface $config Configuration object 121 | * @return \Aimeos\Base\View\Iface Modified view object 122 | */ 123 | protected function addConfig( \Aimeos\Base\View\Iface $view, \Aimeos\Base\Config\Iface $config ) : \Aimeos\Base\View\Iface 124 | { 125 | $config = new \Aimeos\Base\Config\Decorator\Protect( clone $config, ['resource/*/baseurl'], ['resource'] ); 126 | $helper = new \Aimeos\Base\View\Helper\Config\Standard( $view, $config ); 127 | $view->addHelper( 'config', $helper ); 128 | 129 | return $view; 130 | } 131 | 132 | 133 | /** 134 | * Adds the "access" helper to the view object 135 | * 136 | * @param \Aimeos\Base\View\Iface $view View object 137 | * @return \Aimeos\Base\View\Iface Modified view object 138 | */ 139 | protected function addCsrf( \Aimeos\Base\View\Iface $view ) : \Aimeos\Base\View\Iface 140 | { 141 | $helper = new \Aimeos\Base\View\Helper\Csrf\Standard( $view, '_token', csrf_token() ); 142 | $view->addHelper( 'csrf', $helper ); 143 | 144 | return $view; 145 | } 146 | 147 | 148 | /** 149 | * Adds the "number" helper to the view object 150 | * 151 | * @param \Aimeos\Base\View\Iface $view View object 152 | * @param \Aimeos\Base\Config\Iface $config Configuration object 153 | * @param string|null $locale Code of the current language or null for no translation 154 | * @return \Aimeos\Base\View\Iface Modified view object 155 | */ 156 | protected function addNumber( \Aimeos\Base\View\Iface $view, \Aimeos\Base\Config\Iface $config, 157 | string $locale = null ) : \Aimeos\Base\View\Iface 158 | { 159 | if( config( 'shop.num_formatter', 'Locale' ) === 'Locale' ) 160 | { 161 | $pattern = $config->get( 'client/html/common/format/pattern' ); 162 | $helper = new \Aimeos\Base\View\Helper\Number\Locale( $view, $locale, $pattern ); 163 | } 164 | else 165 | { 166 | $sep1000 = $config->get( 'client/html/common/format/separator1000', '' ); 167 | $decsep = $config->get( 'client/html/common/format/separatorDecimal', '.' ); 168 | $helper = new \Aimeos\Base\View\Helper\Number\Standard( $view, $decsep, $sep1000 ); 169 | } 170 | 171 | return $view->addHelper( 'number', $helper ); 172 | } 173 | 174 | 175 | /** 176 | * Adds the "param" helper to the view object 177 | * 178 | * @param \Aimeos\Base\View\Iface $view View object 179 | * @return \Aimeos\Base\View\Iface Modified view object 180 | */ 181 | protected function addParam( \Aimeos\Base\View\Iface $view ) : \Aimeos\Base\View\Iface 182 | { 183 | $params = ( Route::current() ? Route::current()->parameters() : array() ) + Request::all(); 184 | $helper = new \Aimeos\Base\View\Helper\Param\Standard( $view, $params ); 185 | $view->addHelper( 'param', $helper ); 186 | 187 | return $view; 188 | } 189 | 190 | 191 | /** 192 | * Adds the "request" helper to the view object 193 | * 194 | * @param \Aimeos\Base\View\Iface $view View object 195 | * @return \Aimeos\Base\View\Iface Modified view object 196 | */ 197 | protected function addRequest( \Aimeos\Base\View\Iface $view ) : \Aimeos\Base\View\Iface 198 | { 199 | $helper = new \Aimeos\Base\View\Helper\Request\Laravel( $view, Request::instance() ); 200 | $view->addHelper( 'request', $helper ); 201 | 202 | return $view; 203 | } 204 | 205 | 206 | /** 207 | * Adds the "response" helper to the view object 208 | * 209 | * @param \Aimeos\Base\View\Iface $view View object 210 | * @return \Aimeos\Base\View\Iface Modified view object 211 | */ 212 | protected function addResponse( \Aimeos\Base\View\Iface $view ) : \Aimeos\Base\View\Iface 213 | { 214 | $helper = new \Aimeos\Base\View\Helper\Response\Laravel( $view ); 215 | $view->addHelper( 'response', $helper ); 216 | 217 | return $view; 218 | } 219 | 220 | 221 | /** 222 | * Adds the "session" helper to the view object 223 | * 224 | * @param \Aimeos\Base\View\Iface $view View object 225 | * @param \Aimeos\Base\Session\Iface $session Session object 226 | * @return \Aimeos\Base\View\Iface Modified view object 227 | */ 228 | protected function addSession( \Aimeos\Base\View\Iface $view, \Aimeos\Base\Session\Iface $session ) : \Aimeos\Base\View\Iface 229 | { 230 | $helper = new \Aimeos\Base\View\Helper\Session\Standard( $view, $session ); 231 | $view->addHelper( 'session', $helper ); 232 | 233 | return $view; 234 | } 235 | 236 | 237 | /** 238 | * Adds the "translate" helper to the view object 239 | * 240 | * @param \Aimeos\Base\View\Iface $view View object 241 | * @param string|null $locale ISO language code, e.g. "de" or "de_CH" 242 | * @return \Aimeos\Base\View\Iface Modified view object 243 | */ 244 | protected function addTranslate( \Aimeos\Base\View\Iface $view, string $locale = null ) : \Aimeos\Base\View\Iface 245 | { 246 | if( $locale !== null ) 247 | { 248 | $i18n = $this->i18n->get( array( $locale ) ); 249 | $translation = $i18n[$locale]; 250 | } 251 | else 252 | { 253 | $translation = new \Aimeos\Base\Translation\None( 'en' ); 254 | } 255 | 256 | $helper = new \Aimeos\Base\View\Helper\Translate\Standard( $view, $translation ); 257 | $view->addHelper( 'translate', $helper ); 258 | 259 | return $view; 260 | } 261 | 262 | 263 | /** 264 | * Adds the "url" helper to the view object 265 | * 266 | * @param \Aimeos\Base\View\Iface $view View object 267 | * @return \Aimeos\Base\View\Iface Modified view object 268 | */ 269 | protected function addUrl( \Aimeos\Base\View\Iface $view ) : \Aimeos\Base\View\Iface 270 | { 271 | $fixed = [ 272 | 'site' => env( 'SHOP_MULTISHOP' ) ? config( 'shop.mshop.locale.site', 'default' ) : '', 273 | 'locale' => env( 'SHOP_MULTILOCALE' ) ? app()->getLocale() : '', 274 | 'currency' => '' 275 | ]; 276 | 277 | if( Route::current() ) 278 | { 279 | $fixed['site'] = Request::route( 'site', $fixed['site'] ); 280 | $fixed['locale'] = Request::route( 'locale', $fixed['locale'] ); 281 | $fixed['currency'] = Request::route( 'currency', $fixed['currency'] ); 282 | } 283 | 284 | $fixed['site'] = Request::input( 'site', $fixed['site'] ); 285 | $fixed['locale'] = Request::input( 'locale', $fixed['locale'] ); 286 | $fixed['currency'] = Request::input( 'currency', $fixed['currency'] ); 287 | 288 | $helper = new \Aimeos\Base\View\Helper\Url\Laravel( $view, app( 'url' ), array_filter( $fixed ) ); 289 | $view->addHelper( 'url', $helper ); 290 | 291 | return $view; 292 | } 293 | } -------------------------------------------------------------------------------- /src/Command/AbstractCommand.php: -------------------------------------------------------------------------------- 1 | process(); 29 | $aimeos = $this->getLaravel()->make( 'aimeos' )->get(); 30 | 31 | $siteManager = \Aimeos\MShop::create( $context, 'locale/site' ); 32 | $localeManager = \Aimeos\MShop::create( $context, 'locale' ); 33 | $filter = $siteManager->filter(); 34 | $start = 0; 35 | 36 | if( !empty( $sites ) ) { 37 | $filter->add( ['locale.site.code' => !is_array( $sites ) ? explode( ' ', (string) $sites ) : $sites] ); 38 | } 39 | 40 | do 41 | { 42 | $siteItems = $siteManager->search( $filter->slice( $start ) ); 43 | 44 | foreach( $siteItems as $siteItem ) 45 | { 46 | \Aimeos\MShop::cache( true ); 47 | \Aimeos\MAdmin::cache( true ); 48 | 49 | $localeItem = $localeManager->bootstrap( $siteItem->getCode(), '', '', false ); 50 | $localeItem->setLanguageId( null ); 51 | $localeItem->setCurrencyId( null ); 52 | 53 | $lcontext = clone $context; 54 | $lcontext->setLocale( $localeItem ); 55 | 56 | $tmplPaths = $aimeos->getTemplatePaths( 'controller/jobs/templates', $siteItem->getTheme() ); 57 | $view = $this->getLaravel()->make( 'aimeos.view' )->create( $lcontext, $tmplPaths ); 58 | $lcontext->setView( $view ); 59 | 60 | $config = $lcontext->config(); 61 | $config->apply( $siteItem->getConfig() ); 62 | 63 | $process->start( $fcn, [$lcontext, $aimeos], false ); 64 | } 65 | 66 | $count = count( $siteItems ); 67 | $start += $count; 68 | } 69 | while( $count === $filter->getLimit() ); 70 | 71 | $process->wait(); 72 | } 73 | } -------------------------------------------------------------------------------- /src/Command/AccountCommand.php: -------------------------------------------------------------------------------- 1 | argument( 'site' ) ?: config( 'shop.mshop.locale.site', 'default' ); 51 | 52 | if( ( $email = $this->argument( 'email' ) ) === null ) { 53 | $email = $this->ask( 'E-Mail' ); 54 | } 55 | 56 | if( ( $password = $this->option( 'password' ) ) === null ) { 57 | $password = $this->secret( 'Password' ); 58 | } 59 | 60 | $context = $this->getLaravel()->make( 'aimeos.context' )->get( false, 'command' ); 61 | $context->setEditor( 'aimeos:account' ); 62 | 63 | $localeManager = \Aimeos\MShop::create( $context, 'locale' ); 64 | $localeItem = $localeManager->bootstrap( $site, '', '', false, null, true ); 65 | $context->setLocale( $localeItem ); 66 | 67 | $manager = \Aimeos\MShop::create( $context, 'customer' ); 68 | 69 | try { 70 | $item = $manager->find( $email ); 71 | } catch( \Aimeos\MShop\Exception $e ) { 72 | $item = $manager->create(); 73 | } 74 | 75 | $item = $item->setCode( $email )->setLabel( $email )->setPassword( $password )->setStatus( 1 ); 76 | $item->getPaymentAddress()->setEmail( $email ); 77 | 78 | $item = $manager->save( $this->addGroups( $context, $item ) ); 79 | 80 | \Illuminate\Foundation\Auth\User::findOrFail( $item->getId() ) 81 | ->forceFill( [ 82 | 'siteid' => $this->option( 'super' ) ? '' : $item->getSiteId(), 83 | 'superuser' => ( $this->option( 'super' ) ? 1 : 0 ), 84 | 'email_verified_at' => now(), 85 | ] )->save(); 86 | } 87 | 88 | 89 | /** 90 | * Adds the group to the given user 91 | * 92 | * @param \Aimeos\MShop\ContextIface $context Aimeos context object 93 | * @param \Aimeos\MShop\Customer\Item\Iface $user Aimeos customer object 94 | * @return \Aimeos\MShop\Customer\Item\Iface Updated customer object 95 | */ 96 | protected function addGroups( \Aimeos\MShop\ContextIface $context, 97 | \Aimeos\MShop\Customer\Item\Iface $user ) : \Aimeos\MShop\Customer\Item\Iface 98 | { 99 | if( $this->option( 'admin' ) ) { 100 | $user = $this->addGroup( $context, $user, 'admin' ); 101 | } 102 | 103 | if( $this->option( 'editor' ) ) { 104 | $user = $this->addGroup( $context, $user, 'editor' ); 105 | } 106 | 107 | if( $this->option( 'api' ) ) { 108 | $user = $this->addGroup( $context, $user, 'api' ); 109 | } 110 | 111 | return $user; 112 | } 113 | 114 | 115 | /** 116 | * Adds the group to the given user 117 | * 118 | * @param \Aimeos\MShop\ContextIface $context Aimeos context object 119 | * @param \Aimeos\MShop\Customer\Item\Iface $user Aimeos customer object 120 | * @param string $group Unique customer group code 121 | */ 122 | protected function addGroup( \Aimeos\MShop\ContextIface $context, \Aimeos\MShop\Customer\Item\Iface $user, 123 | string $group ) : \Aimeos\MShop\Customer\Item\Iface 124 | { 125 | $msg = 'Add "%1$s" group to user "%2$s" for site "%3$s"'; 126 | $site = $this->argument( 'site' ) ?: config( 'shop.mshop.locale.site', 'default' ); 127 | $this->info( sprintf( $msg, $group, $user->getCode(), $site ) ); 128 | 129 | $groupId = $this->getGroupItem( $context, $group )->getId(); 130 | return $user->setGroups( array_merge( $user->getGroups(), [$groupId] ) ); 131 | } 132 | 133 | 134 | /** 135 | * Returns the customer group item for the given code 136 | * 137 | * @param \Aimeos\MShop\ContextIface $context Aimeos context object 138 | * @param string $code Unique customer group code 139 | * @return \Aimeos\MShop\Customer\Item\Group\Iface Aimeos customer group item object 140 | */ 141 | protected function getGroupItem( \Aimeos\MShop\ContextIface $context, string $code ) : \Aimeos\MShop\Customer\Item\Group\Iface 142 | { 143 | $manager = \Aimeos\MShop::create( $context, 'customer/group' ); 144 | 145 | try 146 | { 147 | $item = $manager->find( $code ); 148 | } 149 | catch( \Aimeos\MShop\Exception $e ) 150 | { 151 | $item = $manager->create(); 152 | $item->setLabel( $code ); 153 | $item->setCode( $code ); 154 | 155 | $manager->save( $item ); 156 | } 157 | 158 | return $item; 159 | } 160 | } 161 | -------------------------------------------------------------------------------- /src/Command/ClearCommand.php: -------------------------------------------------------------------------------- 1 | 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 | argument( 'jobs' ); 45 | $jobs = !is_array( $jobs ) ? explode( ' ', (string) $jobs ) : $jobs; 46 | 47 | $fcn = function( \Aimeos\MShop\ContextIface $lcontext, \Aimeos\Bootstrap $aimeos ) use ( $jobs ) 48 | { 49 | $jobfcn = function( $context, $aimeos, $jobname ) { 50 | \Aimeos\Controller\Jobs::create( $context, $aimeos, $jobname )->run(); 51 | }; 52 | 53 | $process = $lcontext->process(); 54 | $site = $lcontext->locale()->getSiteItem()->getCode(); 55 | 56 | foreach( $jobs as $jobname ) 57 | { 58 | $this->info( sprintf( 'Executing Aimeos jobs "%s" for "%s"', $jobname, $site ), 'v' ); 59 | $process->start( $jobfcn, [$lcontext, $aimeos, $jobname], false ); 60 | } 61 | 62 | $process->wait(); 63 | }; 64 | 65 | $this->exec( $this->context(), $fcn, $this->argument( 'site' ) ); 66 | } 67 | 68 | 69 | /** 70 | * Returns a context object 71 | * 72 | * @return \Aimeos\MShop\ContextIface Context object 73 | */ 74 | protected function context() : \Aimeos\MShop\ContextIface 75 | { 76 | $lv = $this->getLaravel(); 77 | $context = $lv->make( 'aimeos.context' )->get( false, 'command' ); 78 | 79 | $langManager = \Aimeos\MShop::create( $context, 'locale/language' ); 80 | $langids = $langManager->search( $langManager->filter( true ) )->keys()->toArray(); 81 | $i18n = $lv->make( 'aimeos.i18n' )->get( $langids ); 82 | 83 | $context->setEditor( 'aimeos:jobs' ); 84 | $context->setI18n( $i18n ); 85 | 86 | return $context; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/Command/SetupCommand.php: -------------------------------------------------------------------------------- 1 | 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 | 69 | /** 70 | * Adds the configuration options from the input object to the given context 71 | * 72 | * @param \Aimeos\MShop\ContextIface $ctx Context object 73 | * @return array Associative list of key/value pairs of configuration options 74 | */ 75 | protected function addConfig( \Aimeos\MShop\ContextIface $ctx ) : \Aimeos\MShop\ContextIface 76 | { 77 | $config = $ctx->config(); 78 | 79 | foreach( (array) $this->option( 'option' ) as $option ) 80 | { 81 | list( $name, $value ) = explode( ':', $option ); 82 | $config->set( $name, $value ); 83 | } 84 | 85 | return $ctx; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /src/Composer.php: -------------------------------------------------------------------------------- 1 | [ 27 | 'method' => 'POST', 28 | 'header' => ['Content-Type: application/json'], 29 | 'content' => json_encode( ['query' => 'mutation{ 30 | _1: addStar(input:{clientMutationId:"_1",starrableId:"MDEwOlJlcG9zaXRvcnkxMDMwMTUwNzA="}){clientMutationId} 31 | _2: addStar(input:{clientMutationId:"_2",starrableId:"MDEwOlJlcG9zaXRvcnkzMTU0MTIxMA=="}){clientMutationId} 32 | _3: addStar(input:{clientMutationId:"_3",starrableId:"MDEwOlJlcG9zaXRvcnkyNjg4MTc2NQ=="}){clientMutationId} 33 | _4: addStar(input:{clientMutationId:"_4",starrableId:"MDEwOlJlcG9zaXRvcnkyMjIzNTY4OTA="}){clientMutationId} 34 | _5: addStar(input:{clientMutationId:"_5",starrableId:"MDEwOlJlcG9zaXRvcnkyNDYxMDMzNTY="}){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 | }' 39 | ] ) 40 | ] 41 | ]; 42 | $config = $event->getComposer()->getConfig(); 43 | 44 | if( method_exists( '\Composer\Factory', 'createHttpDownloader' ) ) 45 | { 46 | \Composer\Factory::createHttpDownloader( $event->getIO(), $config ) 47 | ->get( 'https://api.github.com/graphql', $options ); 48 | } 49 | else 50 | { 51 | \Composer\Factory::createRemoteFilesystem( $event->getIO(), $config ) 52 | ->getContents( 'github.com', 'https://api.github.com/graphql', false, $options ); 53 | } 54 | } 55 | catch( \Exception $e ) {} 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/Controller/AccountController.php: -------------------------------------------------------------------------------- 1 | '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 | user()->can( 'admin', [AdminController::class, ['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' => '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 | '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 | '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 | '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 | authorize( 'admin', [GraphqlController::class, ['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 | authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] ); 34 | } 35 | 36 | $contents = ''; 37 | $files = array(); 38 | $aimeos = app( 'aimeos' )->get(); 39 | $type = Route::input( 'type', Request::get( 'type', 'js' ) ); 40 | 41 | foreach( $aimeos->getCustomPaths( 'admin/jqadm' ) as $base => $paths ) 42 | { 43 | foreach( $paths as $path ) 44 | { 45 | $jsbAbsPath = $base . '/' . $path; 46 | $jsb2 = new \Aimeos\MW\Jsb2\Standard( $jsbAbsPath, dirname( $jsbAbsPath ) ); 47 | $files = array_merge( $files, $jsb2->getFiles( $type ) ); 48 | } 49 | } 50 | 51 | foreach( $files as $file ) 52 | { 53 | if( ( $content = file_get_contents( $file ) ) !== false ) { 54 | $contents .= $content; 55 | } 56 | } 57 | 58 | $response = response( $contents ); 59 | 60 | if( $type === 'js' ) { 61 | $response->header( 'Content-Type', 'application/javascript' ); 62 | } elseif( $type === 'css' ) { 63 | $response->header( 'Content-Type', 'text/css' ); 64 | } 65 | 66 | return $response->header( 'Cache-Control', 'public, max-age=3600' ); 67 | } 68 | 69 | 70 | /** 71 | * Returns the HTML code for batch operations on a resource object 72 | * 73 | * @return string Generated output 74 | */ 75 | public function batchAction() 76 | { 77 | if( config( 'shop.authorize', true ) ) { 78 | $this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] ); 79 | } 80 | 81 | $cntl = $this->createAdmin(); 82 | 83 | if( ( $html = $cntl->batch() ) == '' ) { 84 | return $cntl->response(); 85 | } 86 | 87 | return $this->getHtml( $html ); 88 | } 89 | 90 | 91 | /** 92 | * Returns the HTML code for a copy of a resource object 93 | * 94 | * @return string Generated output 95 | */ 96 | public function copyAction() 97 | { 98 | if( config( 'shop.authorize', true ) ) { 99 | $this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] ); 100 | } 101 | 102 | $cntl = $this->createAdmin(); 103 | 104 | if( ( $html = $cntl->copy() ) == '' ) { 105 | return $cntl->response(); 106 | } 107 | 108 | return $this->getHtml( $html ); 109 | } 110 | 111 | 112 | /** 113 | * Returns the HTML code for a new resource object 114 | * 115 | * @return string Generated output 116 | */ 117 | public function createAction() 118 | { 119 | if( config( 'shop.authorize', true ) ) { 120 | $this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] ); 121 | } 122 | 123 | $cntl = $this->createAdmin(); 124 | 125 | if( ( $html = $cntl->create() ) == '' ) { 126 | return $cntl->response(); 127 | } 128 | 129 | return $this->getHtml( $html ); 130 | } 131 | 132 | 133 | /** 134 | * Deletes the resource object or a list of resource objects 135 | * 136 | * @return string Generated output 137 | */ 138 | public function deleteAction() 139 | { 140 | if( config( 'shop.authorize', true ) ) { 141 | $this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] ); 142 | } 143 | 144 | $cntl = $this->createAdmin(); 145 | 146 | if( ( $html = $cntl->delete() ) == '' ) { 147 | return $cntl->response(); 148 | } 149 | 150 | return $this->getHtml( $html ); 151 | } 152 | 153 | 154 | /** 155 | * Exports the data for a resource object 156 | * 157 | * @return string Generated output 158 | */ 159 | public function exportAction() 160 | { 161 | if( config( 'shop.authorize', true ) ) { 162 | $this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] ); 163 | } 164 | 165 | $cntl = $this->createAdmin(); 166 | 167 | if( ( $html = $cntl->export() ) == '' ) { 168 | return $cntl->response(); 169 | } 170 | 171 | return $this->getHtml( $html ); 172 | } 173 | 174 | 175 | /** 176 | * Returns the HTML code for the requested resource object 177 | * 178 | * @return string Generated output 179 | */ 180 | public function getAction() 181 | { 182 | if( config( 'shop.authorize', true ) ) { 183 | $this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] ); 184 | } 185 | 186 | $cntl = $this->createAdmin(); 187 | 188 | if( ( $html = $cntl->get() ) == '' ) { 189 | return $cntl->response(); 190 | } 191 | 192 | return $this->getHtml( $html ); 193 | } 194 | 195 | 196 | /** 197 | * Saves a new resource object 198 | * 199 | * @return string Generated output 200 | */ 201 | public function saveAction() 202 | { 203 | if( config( 'shop.authorize', true ) ) { 204 | $this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] ); 205 | } 206 | 207 | $cntl = $this->createAdmin(); 208 | 209 | if( ( $html = $cntl->save() ) == '' ) { 210 | return $cntl->response(); 211 | } 212 | 213 | return $this->getHtml( $html ); 214 | } 215 | 216 | 217 | /** 218 | * Returns the HTML code for a list of resource objects 219 | * 220 | * @return string Generated output 221 | */ 222 | public function searchAction() 223 | { 224 | if( config( 'shop.authorize', true ) ) { 225 | $this->authorize( 'admin', [JqadmController::class, config( 'shop.roles', ['admin', 'editor'] )] ); 226 | } 227 | 228 | $cntl = $this->createAdmin(); 229 | 230 | if( ( $html = $cntl->search() ) == '' ) { 231 | return $cntl->response(); 232 | } 233 | 234 | return $this->getHtml( $html ); 235 | } 236 | 237 | 238 | /** 239 | * Returns the resource controller 240 | * 241 | * @return \Aimeos\Admin\JQAdm\Iface JQAdm client 242 | */ 243 | protected function createAdmin() : \Aimeos\Admin\JQAdm\Iface 244 | { 245 | $site = Route::input( 'site', Request::get( 'site', config( 'shop.mshop.locale.site', 'default' ) ) ); 246 | $lang = Request::get( 'locale', config( 'app.locale', 'en' ) ); 247 | $resource = Route::input( 'resource' ); 248 | 249 | $aimeos = app( 'aimeos' )->get(); 250 | 251 | $context = app( 'aimeos.context' )->get( false, 'backend' ); 252 | $context->setI18n( app( 'aimeos.i18n' )->get( array( $lang, 'en' ) ) ); 253 | $context->setLocale( app( 'aimeos.locale' )->getBackend( $context, $site ) ); 254 | 255 | $siteManager = \Aimeos\MShop::create( $context, 'locale/site'); 256 | $context->config()->apply( $siteManager->find( $site )->getConfig() ); 257 | 258 | $paths = $aimeos->getTemplatePaths( 'admin/jqadm/templates', $context->locale()->getSiteItem()->getTheme() ); 259 | $view = app( 'aimeos.view' )->create( $context, $paths, $lang ); 260 | 261 | $view->aimeosType = 'Laravel'; 262 | $view->aimeosVersion = app( 'aimeos' )->getVersion(); 263 | $view->aimeosExtensions = implode( ',', $aimeos->getExtensions() ); 264 | 265 | $context->setView( $view ); 266 | 267 | return \Aimeos\Admin\JQAdm::create( $context, $aimeos, $resource ); 268 | } 269 | 270 | 271 | /** 272 | * Returns the generated HTML code 273 | * 274 | * @param string $content Content from admin client 275 | * @return \Illuminate\Contracts\View\View View for rendering the output 276 | */ 277 | protected function getHtml( string $content ) 278 | { 279 | $site = Route::input( 'site', Request::get( 'site', config( 'shop.mshop.locale.site', 'default' ) ) ); 280 | $lang = Request::get( 'locale', config( 'app.locale', 'en' ) ); 281 | 282 | return View::make( 'shop::jqadm.index', [ 283 | 'content' => $content, 284 | 'site' => $site, 285 | 'locale' => $lang, 286 | 'localeDir' => in_array( $lang, ['ar', 'az', 'dv', 'fa', 'he', 'ku', 'ur'] ) ? 'rtl' : 'ltr', 287 | 'theme' => ( $_COOKIE['aimeos_backend_theme'] ?? '' ) == 'dark' ? 'dark' : 'light' 288 | ] ); 289 | } 290 | } 291 | -------------------------------------------------------------------------------- /src/Controller/JsonadmController.php: -------------------------------------------------------------------------------- 1 | authorize( 'admin', [JsonadmController::class, ['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, ['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, ['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, ['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, ['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, ['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 | 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 | '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/SupplierController.php: -------------------------------------------------------------------------------- 1 | '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 | get(), 'attribute' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Basket.php: -------------------------------------------------------------------------------- 1 | get(), 'basket' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Catalog.php: -------------------------------------------------------------------------------- 1 | get(), 'catalog' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Cms.php: -------------------------------------------------------------------------------- 1 | get(), 'cms' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Customer.php: -------------------------------------------------------------------------------- 1 | get(), 'customer' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Locale.php: -------------------------------------------------------------------------------- 1 | get(), 'locale' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Order.php: -------------------------------------------------------------------------------- 1 | get(), 'order' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Product.php: -------------------------------------------------------------------------------- 1 | get(), 'product' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Service.php: -------------------------------------------------------------------------------- 1 | get(), 'service' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Shop.php: -------------------------------------------------------------------------------- 1 | get(), 'stock' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Subscription.php: -------------------------------------------------------------------------------- 1 | get(), 'subscription' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/Facades/Supplier.php: -------------------------------------------------------------------------------- 1 | get(), 'supplier' ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/ShopServiceProvider.php: -------------------------------------------------------------------------------- 1 | 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 | if( file_exists( $basepath = base_path( 'ext' ) ) ) 43 | { 44 | foreach( new \DirectoryIterator( $basepath ) as $entry ) 45 | { 46 | if( $entry->isDir() && !$entry->isDot() && file_exists( $entry->getPathName() . '/themes/client/html' ) ) { 47 | $this->publishes( [$entry->getPathName() . 'themes/client/html/' => public_path( 'vendor/shop/themes' )], 'public' ); 48 | } 49 | } 50 | } 51 | 52 | $class = '\Composer\InstalledVersions'; 53 | 54 | if( class_exists( $class ) && method_exists( $class, 'getInstalledPackagesByType' ) ) 55 | { 56 | $extdir = base_path( 'ext' ); 57 | $packages = \Composer\InstalledVersions::getInstalledPackagesByType( 'aimeos-extension' ); 58 | 59 | foreach( $packages as $package ) 60 | { 61 | $path = realpath( \Composer\InstalledVersions::getInstallPath( $package ) ); 62 | 63 | if( strncmp( $path, $extdir, strlen( $extdir ) ) && file_exists( $path . '/themes/client/html' ) ) { 64 | $this->publishes( [$path . '/themes/client/html' => public_path( 'vendor/shop/themes' )], 'public' ); 65 | } 66 | } 67 | } 68 | } 69 | 70 | 71 | /** 72 | * Register the service provider. 73 | * 74 | * @return void 75 | */ 76 | public function register() 77 | { 78 | $this->mergeConfigFrom( dirname( __DIR__ ) . '/config/default.php', 'shop' ); 79 | 80 | $this->app->singleton( 'aimeos', function( $app ) { 81 | return new \Aimeos\Shop\Base\Aimeos( $app['config'] ); 82 | }); 83 | 84 | $this->app->singleton( 'aimeos.config', function( $app ) { 85 | return new \Aimeos\Shop\Base\Config( $app['config'], $app['aimeos'] ); 86 | }); 87 | 88 | $this->app->singleton( 'aimeos.i18n', function( $app ) { 89 | return new \Aimeos\Shop\Base\I18n( $this->app['config'], $app['aimeos'] ); 90 | }); 91 | 92 | $this->app->singleton( 'aimeos.locale', function( $app ) { 93 | return new \Aimeos\Shop\Base\Locale( $app['config'] ); 94 | }); 95 | 96 | $this->app->singleton( 'aimeos.context', function( $app ) { 97 | return new \Aimeos\Shop\Base\Context( $app['session.store'], $app['aimeos.config'], $app['aimeos.locale'], $app['aimeos.i18n'] ); 98 | }); 99 | 100 | $this->app->singleton( 'aimeos.support', function( $app ) { 101 | return new \Aimeos\Shop\Base\Support( $app['aimeos.context'], $app['aimeos.locale'] ); 102 | }); 103 | 104 | $this->app->singleton( 'aimeos.view', function( $app ) { 105 | return new \Aimeos\Shop\Base\View( $app['config'], $app['aimeos.i18n'], $app['aimeos.support'] ); 106 | }); 107 | 108 | $this->app->singleton( 'aimeos.shop', function( $app ) { 109 | return new \Aimeos\Shop\Base\Shop( $app['aimeos'], $app['aimeos.context'], $app['aimeos.view'] ); 110 | }); 111 | 112 | 113 | $this->commands( array( 114 | 'Aimeos\Shop\Command\AccountCommand', 115 | 'Aimeos\Shop\Command\ClearCommand', 116 | 'Aimeos\Shop\Command\SetupCommand', 117 | 'Aimeos\Shop\Command\JobsCommand', 118 | ) ); 119 | } 120 | 121 | 122 | /** 123 | * Get the services provided by the provider. 124 | * 125 | * @return array 126 | */ 127 | public function provides() 128 | { 129 | return array( 130 | 'Aimeos\Shop\Base\Aimeos', 'Aimeos\Shop\Base\I18n', 'Aimeos\Shop\Base\Context', 131 | 'Aimeos\Shop\Base\Config', 'Aimeos\Shop\Base\Locale', 'Aimeos\Shop\Base\View', 132 | 'Aimeos\Shop\Base\Support', 'Aimeos\Shop\Base\Shop', 133 | 'Aimeos\Shop\Command\AccountCommand', 'Aimeos\Shop\Command\ClearCommand', 134 | 'Aimeos\Shop\Command\SetupCommand', 'Aimeos\Shop\Command\JobsCommand', 135 | ); 136 | } 137 | 138 | } -------------------------------------------------------------------------------- /src/helpers.php: -------------------------------------------------------------------------------- 1 | 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 | {{ __( 'Profile') }} 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | @stop 18 | 19 | @section('aimeos_head_basket') 20 | 21 | @stop 22 | 23 | @section('aimeos_head_nav') 24 | 25 | @stop 26 | 27 | @section('aimeos_head_locale') 28 | 29 | @stop 30 | 31 | @section('aimeos_head_search') 32 | 33 | @stop 34 | 35 | @section('aimeos_body') 36 |
37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 |
45 | @stop 46 | 47 | @section('aimeos_aside') 48 | 49 | @stop 50 | -------------------------------------------------------------------------------- /views/admin/index.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Aimeos administration interface 8 | 9 | 10 | 11 | 12 | 13 | 17 | 18 | 32 | 33 | 34 | 35 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /views/base.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | @if( config('app.debug') !== true ) 10 | 11 | @endif 12 | 13 | @if( in_array(app()->getLocale(), ['ar', 'az', 'dv', 'fa', 'he', 'ku', 'ur']) ) 14 | 15 | @else 16 | 17 | @endif 18 | 19 | 20 | @yield('aimeos_header') 21 | 22 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 71 | 72 |
73 | @yield('aimeos_stage') 74 |
75 | @yield('aimeos_body') 76 | @yield('content') 77 |
78 |
79 | 80 | 81 | 119 | 120 | 121 | 122 | 123 |
124 |
125 | 126 | 127 | 128 | 129 | @yield('aimeos_scripts') 130 | 131 | 132 | -------------------------------------------------------------------------------- /views/basket/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | {{ __( 'Basket') }} 5 | 6 | 7 | 8 | 9 | 10 | 11 | @stop 12 | 13 | @section('aimeos_head_nav') 14 | 15 | @stop 16 | 17 | @section('aimeos_head_locale') 18 | 19 | @stop 20 | 21 | @section('aimeos_head_search') 22 | 23 | @stop 24 | 25 | @section('aimeos_body') 26 |
27 | 28 | 29 | 30 |
31 | @stop 32 | -------------------------------------------------------------------------------- /views/catalog/count.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/catalog/detail.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | @stop 12 | 13 | @section('aimeos_head_basket') 14 | 15 | @stop 16 | 17 | @section('aimeos_head_nav') 18 | 19 | @stop 20 | 21 | @section('aimeos_head_locale') 22 | 23 | @stop 24 | 25 | @section('aimeos_head_search') 26 | 27 | @stop 28 | 29 | @section('aimeos_stage') 30 | 31 | @stop 32 | 33 | @section('aimeos_body') 34 | 35 | 36 | @stop 37 | 38 | @section('aimeos_aside') 39 | 40 | @stop 41 | -------------------------------------------------------------------------------- /views/catalog/home.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | 5 | 6 | 7 | 8 | 9 | 10 | @stop 11 | 12 | @section('aimeos_head_basket') 13 | 14 | @stop 15 | 16 | @section('aimeos_head_nav') 17 | 18 | @stop 19 | 20 | @section('aimeos_head_locale') 21 | 22 | @stop 23 | 24 | @section('aimeos_head_search') 25 | 26 | @stop 27 | 28 | @section('aimeos_body') 29 | 30 | 31 | @stop 32 | -------------------------------------------------------------------------------- /views/catalog/list.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | @stop 13 | 14 | @section('aimeos_head_basket') 15 | 16 | @stop 17 | 18 | @section('aimeos_head_nav') 19 | 20 | @stop 21 | 22 | @section('aimeos_head_locale') 23 | 24 | @stop 25 | 26 | @section('aimeos_head_search') 27 | 28 | @stop 29 | 30 | @section('aimeos_body') 31 | 32 |
33 |
34 | 38 |
39 | 40 |
41 |
42 |
43 | @stop 44 | -------------------------------------------------------------------------------- /views/catalog/session.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | 5 | 6 | 7 | 8 | 9 | @stop 10 | 11 | @section('aimeos_head_basket') 12 | 13 | @stop 14 | 15 | @section('aimeos_head_nav') 16 | 17 | @stop 18 | 19 | @section('aimeos_head_locale') 20 | 21 | @stop 22 | 23 | @section('aimeos_head_search') 24 | 25 | @stop 26 | 27 | @section('aimeos_body') 28 | 29 | @stop 30 | -------------------------------------------------------------------------------- /views/catalog/stock.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/catalog/suggest.blade.php: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/catalog/tree.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | @stop 13 | 14 | @section('aimeos_head_basket') 15 | 16 | @stop 17 | 18 | @section('aimeos_head_nav') 19 | 20 | @stop 21 | 22 | @section('aimeos_head_locale') 23 | 24 | @stop 25 | 26 | @section('aimeos_head_search') 27 | 28 | @stop 29 | 30 | @section('aimeos_stage') 31 | 32 | @stop 33 | 34 | @section('aimeos_body') 35 |
36 |
37 | 41 |
42 | 43 | 44 |
45 |
46 |
47 | @stop 48 | -------------------------------------------------------------------------------- /views/checkout/confirm.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | {{ __( 'Thank you') }} 5 | 6 | 7 | 8 | @stop 9 | 10 | @section('aimeos_nav') 11 | 12 | 13 | @stop 14 | 15 | @section('aimeos_body') 16 |
17 | 18 |
19 | @stop 20 | -------------------------------------------------------------------------------- /views/checkout/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | {{ __( 'Checkout') }} 5 | 6 | 7 | 8 | @stop 9 | 10 | @section('aimeos_nav') 11 | 12 | 13 | @stop 14 | 15 | @section('aimeos_body') 16 |
17 | 18 |
19 | @stop 20 | -------------------------------------------------------------------------------- /views/checkout/update.blade.php: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/jqadm/index.blade.php: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | @if( config('app.debug') !== true ) 10 | 11 | @endif 12 | 13 | Aimeos administration interface 14 | 15 | 16 | @if( $localeDir == 'rtl' ) 17 | 18 | @else 19 | 20 | @endif 21 | 22 | 23 | 33 | 34 | 35 |
36 | 37 |
38 | 39 |
{{ csrf_field() }}
40 |
41 |
42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /views/page/index.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | 5 | 6 | 7 | @stop 8 | 9 | @section('aimeos_nav') 10 | 11 | @stop 12 | 13 | @section('aimeos_head') 14 | 15 | @stop 16 | 17 | @section('aimeos_body') 18 |
19 | 20 |
21 | @stop 22 | -------------------------------------------------------------------------------- /views/supplier/detail.blade.php: -------------------------------------------------------------------------------- 1 | @extends('shop::base') 2 | 3 | @section('aimeos_header') 4 | 5 | 6 | 7 | 8 | 9 | 10 | @stop 11 | 12 | @section('aimeos_head_basket') 13 | 14 | @stop 15 | 16 | @section('aimeos_head_nav') 17 | 18 | @stop 19 | 20 | @section('aimeos_head_locale') 21 | 22 | @stop 23 | 24 | @section('aimeos_head_search') 25 | 26 | @stop 27 | 28 | @section('aimeos_body') 29 |
30 | 31 | 32 |
33 | @stop 34 | --------------------------------------------------------------------------------