├── public ├── themes │ └── default │ │ ├── catalog-home.js │ │ ├── account-review.js │ │ ├── basket-related.js │ │ ├── catalog-product.css │ │ ├── catalog-product.js │ │ ├── checkout-confirm.js │ │ ├── supplier-detail.js │ │ ├── assets │ │ ├── icon.png │ │ ├── logo.png │ │ ├── preloader.gif │ │ ├── default-skin.png │ │ ├── bootstrap-icons.woff │ │ ├── bootstrap-icons.woff2 │ │ ├── roboto-condensed-v19-latin-700.woff │ │ ├── roboto-condensed-v19-latin-700.woff2 │ │ ├── roboto-condensed-v19-latin-regular.woff │ │ ├── roboto-condensed-v19-latin-regular.woff2 │ │ └── default-skin.svg │ │ ├── supplier-detail.css │ │ ├── basket-related.css │ │ ├── catalog-stage.js │ │ ├── checkout-confirm.css │ │ ├── locale-select.js │ │ ├── account-basket.js │ │ ├── account-history.js │ │ ├── account-subscription.js │ │ ├── account-review.css │ │ ├── account-favorite.css │ │ ├── account-favorite.js │ │ ├── account-basket.css │ │ ├── account-history.css │ │ ├── catalog-home.css │ │ ├── account-subscription.css │ │ ├── basket-bulk.css │ │ ├── catalog-stage.css │ │ ├── account-watch.css │ │ ├── account-watch.js │ │ ├── catalog-session.js │ │ ├── basket-standard.js │ │ ├── locale-select.css │ │ ├── basket-standard.css │ │ └── email.css └── mimeicons │ ├── unknown.png │ ├── uri │ ├── mms.png │ ├── pnm.png │ ├── mmst.png │ ├── mmsu.png │ ├── rtspt.png │ └── rtspu.png │ ├── audio │ ├── ac3.png │ ├── midi.png │ ├── x-aiff.png │ ├── x-flac.png │ ├── x-wav.png │ ├── prs.sid.png │ ├── x-adpcm.png │ ├── x-monkey.png │ ├── x-flac+ogg.png │ ├── x-generic.png │ ├── x-speex+ogg.png │ └── vnd.rn-realvideo.png │ ├── text │ ├── css.png │ ├── csv.png │ ├── html.png │ ├── rdf.png │ ├── rtf.png │ ├── sgml.png │ ├── x-po.png │ ├── xmcd.png │ ├── xml.png │ ├── mathml.png │ ├── plain.png │ ├── troff.png │ ├── vnd.abc.png │ ├── x-chdr.png │ ├── x-cmake.png │ ├── x-csrc.png │ ├── x-dtd.png │ ├── x-hex.png │ ├── x-java.png │ ├── x-ldif.png │ ├── x-log.png │ ├── x-nfo.png │ ├── x-patch.png │ ├── x-sql.png │ ├── x-tcl.png │ ├── x-tex.png │ ├── x-vcard.png │ ├── x-xslfo.png │ ├── calendar.png │ ├── directory.png │ ├── enriched.png │ ├── vcalendar.png │ ├── x-adasrc.png │ ├── x-authors.png │ ├── x-bibtex.png │ ├── x-c++hdr.png │ ├── x-c++src.png │ ├── x-copying.png │ ├── x-csharp.png │ ├── x-generic.png │ ├── x-haskell.png │ ├── x-install.png │ ├── x-objchdr.png │ ├── x-objcsrc.png │ ├── x-pascal.png │ ├── x-python.png │ ├── x-readme.png │ ├── x-script.png │ ├── x-texinfo.png │ ├── vnd.wap.wml.png │ ├── x-changelog.png │ ├── x-makefile.png │ └── x-katefilelist.png │ ├── video │ ├── mp4.png │ ├── webm.png │ ├── x-mng.png │ ├── x-wmv.png │ └── x-generic.png │ ├── image │ ├── x-eps.png │ ├── x-xfig.png │ ├── svg+xml.png │ ├── x-generic.png │ ├── svg+xml-compressed.png │ └── x-vnd.trolltech.qpicture.png │ ├── message │ ├── news.png │ └── rfc822.png │ ├── fonts │ └── package.png │ ├── application │ ├── pdf.png │ ├── rtf.png │ ├── sxw.png │ ├── x-ace.png │ ├── x-ar.png │ ├── x-arc.png │ ├── x-arj.png │ ├── x-awk.png │ ├── x-cda.png │ ├── x-cue.png │ ├── x-deb.png │ ├── x-k3b.png │ ├── x-lha.png │ ├── x-lyx.png │ ├── x-m4.png │ ├── x-nzb.png │ ├── x-pak.png │ ├── x-php.png │ ├── x-rar.png │ ├── x-rpm.png │ ├── x-tar.png │ ├── x-tzo.png │ ├── x-wmf.png │ ├── x-zoo.png │ ├── xml.png │ ├── xsd.png │ ├── zip.png │ ├── msword.png │ ├── relaxng.png │ ├── rss+xml.png │ ├── x-bzdvi.png │ ├── x-bzip.png │ ├── x-cpio.png │ ├── x-egon.png │ ├── x-gzdvi.png │ ├── x-gzip.png │ ├── x-java.png │ ├── x-kcsrc.png │ ├── x-krita.png │ ├── x-kvtml.png │ ├── x-lzop.png │ ├── x-perl.png │ ├── x-ruby.png │ ├── x-siag.png │ ├── x-tarz.png │ ├── x-tgif.png │ ├── x-trash.png │ ├── javascript.png │ ├── pgp-keys.png │ ├── pkcs7-mime.png │ ├── postscript.png │ ├── x-archive.png │ ├── x-cd-image.png │ ├── x-compress.png │ ├── x-designer.png │ ├── x-desktop.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-gnumeric.png │ ├── x-kgetlist.png │ ├── x-kontour.png │ ├── x-kplato.png │ ├── x-marble.png │ ├── x-mplayer2.png │ ├── x-mswinurl.png │ ├── x-mswrite.png │ ├── x-object.png │ ├── x-pem-key.png │ ├── x-plasma.png │ ├── x-subrip.png │ ├── x-zerosize.png │ ├── xhtml+xml.png │ ├── xslt+xml.png │ ├── illustrator.png │ ├── octet-stream.png │ ├── vnd.ms-excel.png │ ├── vnd.scribus.png │ ├── x-bittorrent.png │ ├── x-executable.png │ ├── x-font-type1.png │ ├── x-javascript.png │ ├── x-quattropro.png │ ├── x-sharedlib.png │ ├── x-smb-server.png │ ├── x-troff-man.png │ ├── pgp-encrypted.png │ ├── vnd.ms-access.png │ ├── x-7z-compressed.png │ ├── x-gzpostscript.png │ ├── x-java-applet.png │ ├── x-java-archive.png │ ├── x-mimearchive.png │ ├── x-qet-element.png │ ├── x-qet-project.png │ ├── x-shellscript.png │ ├── x-smb-workgroup.png │ ├── vnd.ms-powerpoint.png │ ├── vnd.rn-realmedia.png │ ├── vnd.sun.xml.calc.png │ ├── vnd.sun.xml.draw.png │ ├── x-compressed-tar.png │ ├── x-python-bytecode.png │ ├── x-shockwave-flash.png │ ├── x-applix-spreadsheet.png │ ├── x-executable-script.png │ ├── x-ms-dos-executable.png │ ├── vnd.stardivision.calc.png │ ├── vnd.stardivision.draw.png │ ├── x-bzip-compressed-tar.png │ ├── x-lzma-compressed-tar.png │ ├── vnd.sun.xml.calc.template.png │ ├── vnd.sun.xml.draw.template.png │ ├── vnd.oasis.opendocument.text.png │ ├── vnd.oasis.opendocument.chart.png │ ├── vnd.oasis.opendocument.formula.png │ ├── vnd.oasis.opendocument.image.png │ ├── vnd.oasis.opendocument.database.png │ ├── vnd.oasis.opendocument.graphics.png │ ├── vnd.oasis.opendocument.presentation.png │ ├── vnd.oasis.opendocument.spreadsheet.png │ ├── vnd.oasis.opendocument.presentation-template.png │ └── vnd.oasis.opendocument.spreadsheet-template.png │ ├── inode │ └── directory.png │ └── package │ └── x-generic.png ├── Resources ├── public │ └── themes │ │ └── default │ │ ├── catalog-home.js │ │ ├── account-review.js │ │ ├── basket-related.js │ │ ├── catalog-product.css │ │ ├── catalog-product.js │ │ ├── checkout-confirm.js │ │ ├── supplier-detail.js │ │ ├── assets │ │ ├── icon.png │ │ ├── logo.png │ │ ├── preloader.gif │ │ ├── default-skin.png │ │ ├── bootstrap-icons.woff │ │ ├── bootstrap-icons.woff2 │ │ ├── roboto-condensed-v19-latin-700.woff │ │ ├── roboto-condensed-v19-latin-700.woff2 │ │ ├── roboto-condensed-v19-latin-regular.woff │ │ ├── roboto-condensed-v19-latin-regular.woff2 │ │ └── default-skin.svg │ │ ├── supplier-detail.css │ │ ├── basket-related.css │ │ ├── catalog-stage.js │ │ ├── checkout-confirm.css │ │ ├── locale-select.js │ │ ├── account-basket.js │ │ ├── account-history.js │ │ ├── account-subscription.js │ │ ├── account-review.css │ │ ├── account-favorite.css │ │ ├── account-favorite.js │ │ ├── basket-bulk.css │ │ ├── account-history.css │ │ ├── catalog-home.css │ │ ├── account-basket.css │ │ ├── account-subscription.css │ │ ├── catalog-stage.css │ │ ├── account-watch.css │ │ ├── account-profile.js │ │ ├── account-watch.js │ │ ├── catalog-session.js │ │ ├── basket-standard.js │ │ ├── locale-select.css │ │ ├── basket-standard.css │ │ └── account-profile.css └── views │ ├── Catalog │ ├── count.html.twig │ ├── stock.html.twig │ ├── suggest.html.twig │ ├── home.html.twig │ ├── session.html.twig │ ├── detail.html.twig │ ├── list.html.twig │ └── tree.html.twig │ ├── Checkout │ ├── update.html.twig │ ├── index.html.twig │ └── confirm.html.twig │ ├── Page │ ├── privacy.html.twig │ └── terms.html.twig │ ├── Basket │ └── index.html.twig │ ├── Supplier │ └── detail.html.twig │ ├── Account │ └── index.html.twig │ └── Admin │ └── index.html.twig ├── .coveralls.yml ├── .gitignore ├── config ├── routing_update.yaml ├── routing_adm.yaml ├── routing_supplier.yaml ├── routing_graphql.yaml ├── routing_account.yaml ├── routing_jsonapi.yaml ├── routing.yaml ├── routing_jsonadm.yaml └── routing_default.yaml ├── tests ├── Fixtures │ ├── config │ │ ├── database.yaml │ │ ├── bundles.php │ │ ├── security.yaml │ │ ├── routing.yaml │ │ └── config.yaml │ ├── console │ ├── AppKernel.php │ └── templates │ │ └── base.html.twig ├── Controller │ ├── AdminControllerTest.php │ ├── PageControllerTest.php │ ├── SupplierControllerTest.php │ └── AccountControllerTest.php ├── Command │ ├── ClearCommandTest.php │ ├── JobsCommandTest.php │ ├── SetupCommandTest.php │ └── AccountCommandTest.php └── Entity │ └── UserTest.php ├── src ├── AimeosShopBundle.php ├── Controller │ ├── PageController.php │ ├── BasketController.php │ ├── SupplierController.php │ ├── AccountController.php │ ├── GraphqlController.php │ └── CheckoutController.php ├── Service │ ├── Shop.php │ ├── Aimeos.php │ ├── I18n.php │ ├── Config.php │ └── Locale.php ├── EventListener │ └── CsrfListener.php ├── Command │ ├── ClearCommand.php │ └── Command.php └── DependencyInjection │ ├── Configuration.php │ └── AimeosShopExtension.php ├── LICENSE ├── phpunit.xml.dist ├── .circleci └── config.yml └── composer.json /public/themes/default/catalog-home.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/themes/default/account-review.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/themes/default/basket-related.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/themes/default/catalog-product.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/themes/default/catalog-product.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/themes/default/checkout-confirm.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/themes/default/supplier-detail.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/themes/default/catalog-home.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-review.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/themes/default/basket-related.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/themes/default/catalog-product.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/themes/default/catalog-product.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/themes/default/checkout-confirm.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/public/themes/default/supplier-detail.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Resources/views/Catalog/count.html.twig: -------------------------------------------------------------------------------- 1 | {{ aibody['catalog/count']|raw }} 2 | -------------------------------------------------------------------------------- /Resources/views/Catalog/stock.html.twig: -------------------------------------------------------------------------------- 1 | {{ aibody['catalog/stock']|raw }} 2 | -------------------------------------------------------------------------------- /Resources/views/Catalog/suggest.html.twig: -------------------------------------------------------------------------------- 1 | {{ aibody['catalog/suggest']|raw }} 2 | -------------------------------------------------------------------------------- /Resources/views/Checkout/update.html.twig: -------------------------------------------------------------------------------- 1 | {{ aibody['checkout/update']|raw }} 2 | -------------------------------------------------------------------------------- /.coveralls.yml: -------------------------------------------------------------------------------- 1 | src_dir: ./ 2 | json_path: coveralls.json 3 | coverage_clover: coverage.xml 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .phpunit.result.cache 2 | coveralls.json 3 | coverage.xml 4 | tests/Fixtures/var/ 5 | vendor/ 6 | -------------------------------------------------------------------------------- /public/mimeicons/unknown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/unknown.png -------------------------------------------------------------------------------- /public/mimeicons/uri/mms.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/uri/mms.png -------------------------------------------------------------------------------- /public/mimeicons/uri/pnm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/uri/pnm.png -------------------------------------------------------------------------------- /public/mimeicons/audio/ac3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/ac3.png -------------------------------------------------------------------------------- /public/mimeicons/text/css.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/css.png -------------------------------------------------------------------------------- /public/mimeicons/text/csv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/csv.png -------------------------------------------------------------------------------- /public/mimeicons/text/html.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/html.png -------------------------------------------------------------------------------- /public/mimeicons/text/rdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/rdf.png -------------------------------------------------------------------------------- /public/mimeicons/text/rtf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/rtf.png -------------------------------------------------------------------------------- /public/mimeicons/text/sgml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/sgml.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-po.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-po.png -------------------------------------------------------------------------------- /public/mimeicons/text/xmcd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/xmcd.png -------------------------------------------------------------------------------- /public/mimeicons/text/xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/xml.png -------------------------------------------------------------------------------- /public/mimeicons/uri/mmst.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/uri/mmst.png -------------------------------------------------------------------------------- /public/mimeicons/uri/mmsu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/uri/mmsu.png -------------------------------------------------------------------------------- /public/mimeicons/uri/rtspt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/uri/rtspt.png -------------------------------------------------------------------------------- /public/mimeicons/uri/rtspu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/uri/rtspu.png -------------------------------------------------------------------------------- /public/mimeicons/video/mp4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/video/mp4.png -------------------------------------------------------------------------------- /public/mimeicons/audio/midi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/midi.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-aiff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/x-aiff.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-flac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/x-flac.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-wav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/x-wav.png -------------------------------------------------------------------------------- /public/mimeicons/image/x-eps.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/image/x-eps.png -------------------------------------------------------------------------------- /public/mimeicons/image/x-xfig.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/image/x-xfig.png -------------------------------------------------------------------------------- /public/mimeicons/message/news.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/message/news.png -------------------------------------------------------------------------------- /public/mimeicons/text/mathml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/mathml.png -------------------------------------------------------------------------------- /public/mimeicons/text/plain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/plain.png -------------------------------------------------------------------------------- /public/mimeicons/text/troff.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/troff.png -------------------------------------------------------------------------------- /public/mimeicons/text/vnd.abc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/vnd.abc.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-chdr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-chdr.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-cmake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-cmake.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-csrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-csrc.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-dtd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-dtd.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-hex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-hex.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-java.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-ldif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-ldif.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-log.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-log.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-nfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-nfo.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-patch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-patch.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-sql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-sql.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-tcl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-tcl.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-tex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-tex.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-vcard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-vcard.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-xslfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-xslfo.png -------------------------------------------------------------------------------- /public/mimeicons/video/webm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/video/webm.png -------------------------------------------------------------------------------- /public/mimeicons/video/x-mng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/video/x-mng.png -------------------------------------------------------------------------------- /public/mimeicons/video/x-wmv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/video/x-wmv.png -------------------------------------------------------------------------------- /public/mimeicons/audio/prs.sid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/prs.sid.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-adpcm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/x-adpcm.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-monkey.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/x-monkey.png -------------------------------------------------------------------------------- /public/mimeicons/fonts/package.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/fonts/package.png -------------------------------------------------------------------------------- /public/mimeicons/image/svg+xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/image/svg+xml.png -------------------------------------------------------------------------------- /public/mimeicons/message/rfc822.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/message/rfc822.png -------------------------------------------------------------------------------- /public/mimeicons/text/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/calendar.png -------------------------------------------------------------------------------- /public/mimeicons/text/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/directory.png -------------------------------------------------------------------------------- /public/mimeicons/text/enriched.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/enriched.png -------------------------------------------------------------------------------- /public/mimeicons/text/vcalendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/vcalendar.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-adasrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-adasrc.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-authors.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-authors.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-bibtex.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-bibtex.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-c++hdr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-c++hdr.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-c++src.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-c++src.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-copying.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-copying.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-csharp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-csharp.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-generic.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-haskell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-haskell.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-install.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-install.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-objchdr.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-objchdr.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-objcsrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-objcsrc.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-pascal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-pascal.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-python.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-readme.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-readme.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-script.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-texinfo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-texinfo.png -------------------------------------------------------------------------------- /public/mimeicons/application/pdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/pdf.png -------------------------------------------------------------------------------- /public/mimeicons/application/rtf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/rtf.png -------------------------------------------------------------------------------- /public/mimeicons/application/sxw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/sxw.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-ace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-ace.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-ar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-ar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-arc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-arc.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-arj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-arj.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-awk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-awk.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-cda.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-cda.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-cue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-cue.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-deb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-deb.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-k3b.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-k3b.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-lha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-lha.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-lyx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-lyx.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-m4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-m4.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-nzb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-nzb.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-pak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-pak.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-php.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-php.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-rar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-rar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-rpm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-rpm.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-tar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-tar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-tzo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-tzo.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-wmf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-wmf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-zoo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-zoo.png -------------------------------------------------------------------------------- /public/mimeicons/application/xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/xml.png -------------------------------------------------------------------------------- /public/mimeicons/application/xsd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/xsd.png -------------------------------------------------------------------------------- /public/mimeicons/application/zip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/zip.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-flac+ogg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/x-flac+ogg.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/x-generic.png -------------------------------------------------------------------------------- /public/mimeicons/audio/x-speex+ogg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/x-speex+ogg.png -------------------------------------------------------------------------------- /public/mimeicons/image/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/image/x-generic.png -------------------------------------------------------------------------------- /public/mimeicons/inode/directory.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/inode/directory.png -------------------------------------------------------------------------------- /public/mimeicons/package/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/package/x-generic.png -------------------------------------------------------------------------------- /public/mimeicons/text/vnd.wap.wml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/vnd.wap.wml.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-changelog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-changelog.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-makefile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-makefile.png -------------------------------------------------------------------------------- /public/mimeicons/video/x-generic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/video/x-generic.png -------------------------------------------------------------------------------- /public/themes/default/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/icon.png -------------------------------------------------------------------------------- /public/themes/default/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/logo.png -------------------------------------------------------------------------------- /public/mimeicons/application/msword.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/msword.png -------------------------------------------------------------------------------- /public/mimeicons/application/relaxng.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/relaxng.png -------------------------------------------------------------------------------- /public/mimeicons/application/rss+xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/rss+xml.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-bzdvi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-bzdvi.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-bzip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-bzip.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-cpio.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-cpio.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-egon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-egon.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-gzdvi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-gzdvi.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-gzip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-gzip.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-java.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kcsrc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-kcsrc.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-krita.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-krita.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kvtml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-kvtml.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-lzop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-lzop.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-perl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-perl.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-ruby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-ruby.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-siag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-siag.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-tarz.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-tarz.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-tgif.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-tgif.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-trash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-trash.png -------------------------------------------------------------------------------- /public/mimeicons/text/x-katefilelist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/text/x-katefilelist.png -------------------------------------------------------------------------------- /public/mimeicons/application/javascript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/javascript.png -------------------------------------------------------------------------------- /public/mimeicons/application/pgp-keys.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/pgp-keys.png -------------------------------------------------------------------------------- /public/mimeicons/application/pkcs7-mime.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/pkcs7-mime.png -------------------------------------------------------------------------------- /public/mimeicons/application/postscript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/postscript.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-archive.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-cd-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-cd-image.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-compress.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-compress.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-designer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-designer.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-desktop.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-afm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-font-afm.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-bdf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-font-bdf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-otf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-font-otf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-pcf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-font-pcf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-snf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-font-snf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-ttf.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-font-ttf.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-gnumeric.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-gnumeric.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kgetlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-kgetlist.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kontour.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-kontour.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-kplato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-kplato.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-marble.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-marble.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-mplayer2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-mplayer2.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-mswinurl.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-mswinurl.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-mswrite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-mswrite.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-object.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-object.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-pem-key.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-pem-key.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-plasma.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-plasma.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-subrip.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-subrip.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-zerosize.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-zerosize.png -------------------------------------------------------------------------------- /public/mimeicons/application/xhtml+xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/xhtml+xml.png -------------------------------------------------------------------------------- /public/mimeicons/application/xslt+xml.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/xslt+xml.png -------------------------------------------------------------------------------- /public/mimeicons/audio/vnd.rn-realvideo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/audio/vnd.rn-realvideo.png -------------------------------------------------------------------------------- /public/themes/default/assets/preloader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/preloader.gif -------------------------------------------------------------------------------- /public/mimeicons/application/illustrator.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/illustrator.png -------------------------------------------------------------------------------- /public/mimeicons/application/octet-stream.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/octet-stream.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.ms-excel.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.ms-excel.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.scribus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.scribus.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-bittorrent.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-bittorrent.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-executable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-executable.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-font-type1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-font-type1.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-javascript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-javascript.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-quattropro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-quattropro.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-sharedlib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-sharedlib.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-smb-server.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-smb-server.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-troff-man.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-troff-man.png -------------------------------------------------------------------------------- /public/mimeicons/image/svg+xml-compressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/image/svg+xml-compressed.png -------------------------------------------------------------------------------- /public/themes/default/assets/default-skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/default-skin.png -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/icon.png -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/logo.png -------------------------------------------------------------------------------- /public/mimeicons/application/pgp-encrypted.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/pgp-encrypted.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.ms-access.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.ms-access.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-7z-compressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-7z-compressed.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-gzpostscript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-gzpostscript.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-java-applet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-java-applet.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-java-archive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-java-archive.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-mimearchive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-mimearchive.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-qet-element.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-qet-element.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-qet-project.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-qet-project.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-shellscript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-shellscript.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-smb-workgroup.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-smb-workgroup.png -------------------------------------------------------------------------------- /config/routing_update.yaml: -------------------------------------------------------------------------------- 1 | aimeos_shop_update: 2 | path: /update 3 | controller: Aimeos\ShopBundle\Controller\CheckoutController::updateAction 4 | -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.ms-powerpoint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.ms-powerpoint.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.rn-realmedia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.rn-realmedia.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.sun.xml.calc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.sun.xml.calc.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.sun.xml.draw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.sun.xml.draw.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-compressed-tar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-compressed-tar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-python-bytecode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-python-bytecode.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-shockwave-flash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-shockwave-flash.png -------------------------------------------------------------------------------- /public/themes/default/assets/bootstrap-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/bootstrap-icons.woff -------------------------------------------------------------------------------- /public/themes/default/assets/bootstrap-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/bootstrap-icons.woff2 -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/preloader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/preloader.gif -------------------------------------------------------------------------------- /public/mimeicons/application/x-applix-spreadsheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-applix-spreadsheet.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-executable-script.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-executable-script.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-ms-dos-executable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-ms-dos-executable.png -------------------------------------------------------------------------------- /public/mimeicons/image/x-vnd.trolltech.qpicture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/image/x-vnd.trolltech.qpicture.png -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/default-skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/default-skin.png -------------------------------------------------------------------------------- /Resources/views/Page/privacy.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_body %} 4 | Privacy policy page 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.stardivision.calc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.stardivision.calc.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.stardivision.draw.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.stardivision.draw.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-bzip-compressed-tar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-bzip-compressed-tar.png -------------------------------------------------------------------------------- /public/mimeicons/application/x-lzma-compressed-tar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/x-lzma-compressed-tar.png -------------------------------------------------------------------------------- /Resources/views/Page/terms.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_body %} 4 | Terms and conditions page 5 | {% endblock %} 6 | -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.sun.xml.calc.template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.sun.xml.calc.template.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.sun.xml.draw.template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.sun.xml.draw.template.png -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/bootstrap-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/bootstrap-icons.woff -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/bootstrap-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/bootstrap-icons.woff2 -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.text.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.chart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.chart.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.formula.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.formula.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.image.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.database.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.database.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.graphics.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.graphics.png -------------------------------------------------------------------------------- /public/themes/default/assets/roboto-condensed-v19-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/roboto-condensed-v19-latin-700.woff -------------------------------------------------------------------------------- /public/themes/default/assets/roboto-condensed-v19-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/roboto-condensed-v19-latin-700.woff2 -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.presentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.presentation.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.spreadsheet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.spreadsheet.png -------------------------------------------------------------------------------- /public/themes/default/assets/roboto-condensed-v19-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/roboto-condensed-v19-latin-regular.woff -------------------------------------------------------------------------------- /public/themes/default/assets/roboto-condensed-v19-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/themes/default/assets/roboto-condensed-v19-latin-regular.woff2 -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/roboto-condensed-v19-latin-700.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/roboto-condensed-v19-latin-700.woff -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/roboto-condensed-v19-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/roboto-condensed-v19-latin-700.woff2 -------------------------------------------------------------------------------- /config/routing_adm.yaml: -------------------------------------------------------------------------------- 1 | aimeos_shop_admin: 2 | path: /admin 3 | controller: Aimeos\ShopBundle\Controller\AdminController::indexAction 4 | 5 | aimeos_shop_admin_check: 6 | path: /admin_check 7 | -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/roboto-condensed-v19-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/roboto-condensed-v19-latin-regular.woff -------------------------------------------------------------------------------- /config/routing_supplier.yaml: -------------------------------------------------------------------------------- 1 | aimeos_shop_supplier_detail: 2 | path: /{s_name}/{f_supid} 3 | controller: Aimeos\ShopBundle\Controller\SupplierController::detailAction 4 | defaults: { s_name: null } 5 | -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.presentation-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.presentation-template.png -------------------------------------------------------------------------------- /public/mimeicons/application/vnd.oasis.opendocument.spreadsheet-template.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/public/mimeicons/application/vnd.oasis.opendocument.spreadsheet-template.png -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/roboto-condensed-v19-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aimeos/aimeos-symfony/HEAD/Resources/public/themes/default/assets/roboto-condensed-v19-latin-regular.woff2 -------------------------------------------------------------------------------- /config/routing_graphql.yaml: -------------------------------------------------------------------------------- 1 | aimeos_shop_graphql: 2 | path: / 3 | controller: Aimeos\ShopBundle\Controller\GraphqlController::indexAction 4 | methods: [POST] 5 | requirements: 6 | site: '[A-Za-z0-9\.\-]+' 7 | -------------------------------------------------------------------------------- /tests/Fixtures/config/database.yaml: -------------------------------------------------------------------------------- 1 | parameters: 2 | database_driver: pdo_mysql 3 | database_host: 127.0.0.1 4 | database_port: null 5 | database_name: symfony 6 | database_user: aimeos 7 | database_password: aimeos 8 | -------------------------------------------------------------------------------- /public/themes/default/supplier-detail.css: -------------------------------------------------------------------------------- 1 | .supplier-detail { 2 | padding-top: 4rem; 3 | margin-bottom: 2rem; 4 | background-color: var(--ai-bg-alt); 5 | } 6 | 7 | .supplier-detail-basic { 8 | padding: 0 2rem; 9 | } 10 | 11 | .supplier-detail .image-single img { 12 | max-height: 20rem; 13 | padding: 0 2rem; 14 | width: 100%; 15 | } 16 | -------------------------------------------------------------------------------- /Resources/public/themes/default/supplier-detail.css: -------------------------------------------------------------------------------- 1 | .supplier-detail { 2 | padding-top: 4rem; 3 | margin-bottom: 2rem; 4 | background-color: var(--ai-bg-alt); 5 | } 6 | 7 | .supplier-detail-basic { 8 | padding: 0 2rem; 9 | } 10 | 11 | .supplier-detail .image-single img { 12 | max-height: 20rem; 13 | padding: 0 2rem; 14 | width: 100%; 15 | } 16 | -------------------------------------------------------------------------------- /tests/Fixtures/config/bundles.php: -------------------------------------------------------------------------------- 1 | ['all' => true], 5 | Symfony\Bundle\WebServerBundle\WebServerBundle::class => ['dev' => true], 6 | Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true], 7 | Aimeos\ShopBundle\AimeosShopBundle::class => ['all' => true], 8 | ]; -------------------------------------------------------------------------------- /src/AimeosShopBundle.php: -------------------------------------------------------------------------------- 1 | run(new ArgvInput()); -------------------------------------------------------------------------------- /public/themes/default/catalog-stage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Catalog session client actions 3 | */ 4 | AimeosCatalogStage = { 5 | 6 | /** 7 | * Back to last page 8 | */ 9 | onBack() { 10 | 11 | $("body").on("click", ".catalog-stage-breadcrumb a.back", ev => { 12 | 13 | history.back(); 14 | return false; 15 | }); 16 | }, 17 | 18 | 19 | /** 20 | * Initializes the catalog session actions 21 | */ 22 | init: function() { 23 | this.onBack(); 24 | } 25 | }; 26 | 27 | 28 | $(function() { 29 | AimeosCatalogStage.init(); 30 | }); -------------------------------------------------------------------------------- /tests/Controller/AdminControllerTest.php: -------------------------------------------------------------------------------- 1 | request( 'GET', '/admin' ); 15 | $response = $client->getResponse(); 16 | 17 | $this->assertEquals( 200, $response->getStatusCode() ); 18 | $this->assertStringContainsString( '
getContent() ); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /public/themes/default/checkout-confirm.css: -------------------------------------------------------------------------------- 1 | .checkout-confirm { 2 | padding: 2rem 0; 3 | } 4 | 5 | .checkout-confirm-basic { 6 | padding: 2rem 0; 7 | margin-top: 1.5rem; 8 | } 9 | 10 | .checkout-confirm-basic .attr-list { 11 | padding: 0.5rem 1rem; 12 | margin: 0.5rem; 13 | } 14 | 15 | .checkout-confirm-basic .attr-list .name, 16 | .checkout-confirm-basic .attr-list .value { 17 | display: inline-block; 18 | width: 25%; 19 | } 20 | 21 | .checkout-confirm-basic h2 { 22 | border-bottom: 1px solid var(--ai-secondary); 23 | padding: 0.5rem 1rem; 24 | margin: 0.5rem; 25 | margin-top: 0; 26 | } 27 | -------------------------------------------------------------------------------- /Resources/public/themes/default/catalog-stage.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Catalog session client actions 3 | */ 4 | AimeosCatalogStage = { 5 | 6 | /** 7 | * Back to last page 8 | */ 9 | onBack() { 10 | 11 | $("body").on("click", ".catalog-stage-breadcrumb a.back", ev => { 12 | 13 | history.back(); 14 | return false; 15 | }); 16 | }, 17 | 18 | 19 | /** 20 | * Initializes the catalog session actions 21 | */ 22 | init: function() { 23 | if(this.once) return; 24 | this.once = true; 25 | 26 | this.onBack(); 27 | } 28 | }; 29 | 30 | 31 | $(function() { 32 | AimeosCatalogStage.init(); 33 | }); -------------------------------------------------------------------------------- /Resources/public/themes/default/checkout-confirm.css: -------------------------------------------------------------------------------- 1 | .checkout-confirm { 2 | padding: 2rem 0; 3 | } 4 | 5 | .checkout-confirm-basic { 6 | padding: 2rem 0; 7 | margin-top: 1.5rem; 8 | } 9 | 10 | .checkout-confirm-basic .attr-list { 11 | padding: 0.5rem 1rem; 12 | margin: 0.5rem; 13 | } 14 | 15 | .checkout-confirm-basic .attr-list .name, 16 | .checkout-confirm-basic .attr-list .value { 17 | display: inline-block; 18 | width: 25%; 19 | } 20 | 21 | .checkout-confirm-basic h2 { 22 | border-bottom: 1px solid var(--ai-secondary); 23 | padding: 0.5rem 1rem; 24 | margin: 0.5rem; 25 | margin-top: 0; 26 | } 27 | -------------------------------------------------------------------------------- /public/themes/default/locale-select.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Locale selector actions 3 | */ 4 | AimeosLocaleSelect = { 5 | 6 | /** 7 | * Keeps menu open on click resp. closes on second click 8 | */ 9 | setupMenuToggle: function() { 10 | 11 | $(".select-menu .select-dropdown").on('click', function() { 12 | $("ul", this).toggleClass("active"); 13 | $(this).toggleClass("active"); 14 | }); 15 | }, 16 | 17 | 18 | /** 19 | * Initializes the locale selector actions 20 | */ 21 | init: function() { 22 | this.setupMenuToggle(); 23 | } 24 | }; 25 | 26 | 27 | $(function() { 28 | AimeosLocaleSelect.init(); 29 | }); -------------------------------------------------------------------------------- /Resources/views/Checkout/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_header %} 4 | Checkout 5 | {{ aiheader['checkout/standard']|raw }} 6 | {{ aiheader['catalog/search']|raw }} 7 | {{ aiheader['catalog/tree']|raw }} 8 | {% endblock %} 9 | 10 | {% block aimeos_head_nav %} 11 | {{ (aibody['catalog/tree'] ?? '')|raw }} 12 | {% endblock %} 13 | 14 | {% block aimeos_head_search %} 15 | {{ (aibody['catalog/search'] ?? '')|raw }} 16 | {% endblock %} 17 | 18 | {% block aimeos_body %} 19 |
20 | {{ aibody['checkout/standard']|raw }} 21 |
22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /Resources/views/Checkout/confirm.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_header %} 4 | Thank you 5 | {{ aiheader['checkout/confirm']|raw }} 6 | {{ aiheader['catalog/search']|raw }} 7 | {{ aiheader['catalog/tree']|raw }} 8 | {% endblock %} 9 | 10 | {% block aimeos_head_nav %} 11 | {{ (aibody['catalog/tree'] ?? '')|raw }} 12 | {% endblock %} 13 | 14 | {% block aimeos_head_search %} 15 | {{ (aibody['catalog/search'] ?? '')|raw }} 16 | {% endblock %} 17 | 18 | {% block aimeos_body %} 19 |
20 | {{ aibody['checkout/confirm']|raw }} 21 |
22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /Resources/public/themes/default/locale-select.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Locale selector actions 3 | */ 4 | AimeosLocaleSelect = { 5 | 6 | /** 7 | * Keeps menu open on click resp. closes on second click 8 | */ 9 | setupMenuToggle: function() { 10 | 11 | $(".select-menu .select-dropdown").on('click', function() { 12 | $("ul", this).toggleClass("active"); 13 | $(this).toggleClass("active"); 14 | }); 15 | }, 16 | 17 | 18 | /** 19 | * Initializes the locale selector actions 20 | */ 21 | init: function() { 22 | if(this.once) return; 23 | this.once = true; 24 | 25 | this.setupMenuToggle(); 26 | } 27 | }; 28 | 29 | 30 | $(function() { 31 | AimeosLocaleSelect.init(); 32 | }); -------------------------------------------------------------------------------- /tests/Controller/PageControllerTest.php: -------------------------------------------------------------------------------- 1 | request( 'GET', '/unittest/de/EUR/terms' ); 14 | 15 | $this->assertEquals( 1, $crawler->filter( 'body:contains("Terms")' )->count() ); 16 | } 17 | 18 | 19 | public function testPrivacy() 20 | { 21 | $client = static::createClient(); 22 | $crawler = $client->request( 'GET', '/unittest/de/EUR/privacy' ); 23 | 24 | $this->assertEquals( 1, $crawler->filter( 'body:contains("Privacy")' )->count() ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /config/routing_account.yaml: -------------------------------------------------------------------------------- 1 | aimeos_shop_account: 2 | path: / 3 | controller: Aimeos\ShopBundle\Controller\AccountController::indexAction 4 | 5 | aimeos_shop_account_favorite: 6 | path: /favorite/{fav_action}/{fav_id}/{d_name} 7 | controller: Aimeos\ShopBundle\Controller\AccountController::indexAction 8 | defaults: { fav_action: '', fav_id: null, d_name: '' } 9 | 10 | aimeos_shop_account_watch: 11 | path: /watch/{wat_action}/{wat_id}/{d_name} 12 | controller: Aimeos\ShopBundle\Controller\AccountController::indexAction 13 | defaults: { wat_action: '', wat_id: null, d_name: '' } 14 | 15 | aimeos_shop_account_download: 16 | path: /download/{dl_id} 17 | controller: Aimeos\ShopBundle\Controller\AccountController::downloadAction 18 | -------------------------------------------------------------------------------- /public/themes/default/account-basket.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account basket actions 3 | */ 4 | AimeosAccountBasket = { 5 | 6 | /** 7 | * Shows basket details without page reload 8 | */ 9 | onToggleDetail() { 10 | 11 | $(".account-basket").on("click", ".basket-item .action .btn", ev => { 12 | 13 | const target = $(ev.currentTarget).closest(".basket-item"); 14 | const details = $(".account-basket-detail", target); 15 | 16 | $(".btn.show", target).toggleClass('hidden'); 17 | $(".btn.close", target).toggleClass('hidden'); 18 | 19 | slideToggle(details[0], 300); 20 | 21 | return false; 22 | }); 23 | }, 24 | 25 | 26 | /** 27 | * Initializes the account basket actions 28 | */ 29 | init() { 30 | this.onToggleDetail(); 31 | } 32 | }; 33 | 34 | 35 | $(() => { 36 | AimeosAccountBasket.init(); 37 | }); -------------------------------------------------------------------------------- /public/themes/default/account-history.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account history actions 3 | */ 4 | AimeosAccountHistory = { 5 | 6 | /** 7 | * Shows history details without page reload 8 | */ 9 | onToggleDetail() { 10 | 11 | $(".account-history").on("click", ".history-item .action .btn", ev => { 12 | 13 | const target = $(ev.currentTarget).closest(".history-item"); 14 | const details = $(".account-history-detail", target); 15 | 16 | $(".btn.show", target).toggleClass('hidden'); 17 | $(".btn.close", target).toggleClass('hidden'); 18 | 19 | slideToggle(details[0], 300); 20 | 21 | return false; 22 | }); 23 | }, 24 | 25 | 26 | /** 27 | * Initializes the account history actions 28 | */ 29 | init() { 30 | this.onToggleDetail(); 31 | } 32 | }; 33 | 34 | 35 | $(() => { 36 | AimeosAccountHistory.init(); 37 | }); -------------------------------------------------------------------------------- /public/themes/default/account-subscription.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account subscription actions 3 | */ 4 | AimeosAccountSubscription = { 5 | 6 | /** 7 | * Shows subscription details without page reload 8 | */ 9 | onToggleDetail() { 10 | 11 | $(".account-subscription").on("click", ".subscription-item .action .btn", ev => { 12 | 13 | const target = $(ev.currentTarget).closest(".subscription-item"); 14 | const details = $(".account-subscription-detail", target); 15 | 16 | $(".btn.show", target).toggleClass('hidden'); 17 | $(".btn.close", target).toggleClass('hidden'); 18 | 19 | slideToggle(details[0], 300); 20 | 21 | return false; 22 | }); 23 | }, 24 | 25 | 26 | /** 27 | * Initializes the account subscription actions 28 | */ 29 | init() { 30 | this.onToggleDetail(); 31 | } 32 | }; 33 | 34 | 35 | $(() => { 36 | AimeosAccountSubscription.init(); 37 | }); -------------------------------------------------------------------------------- /Resources/public/themes/default/account-basket.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account basket actions 3 | */ 4 | AimeosAccountBasket = { 5 | 6 | /** 7 | * Shows basket details without page reload 8 | */ 9 | onToggleDetail() { 10 | 11 | $(".account-basket").on("click", ".basket-item .action .btn", ev => { 12 | 13 | const target = $(ev.currentTarget).closest(".basket-item"); 14 | const details = $(".account-basket-detail", target); 15 | 16 | $(".btn.show", target).toggleClass('hidden'); 17 | $(".btn.close", target).toggleClass('hidden'); 18 | 19 | slideToggle(details[0], 300); 20 | 21 | return false; 22 | }); 23 | }, 24 | 25 | 26 | /** 27 | * Initializes the account basket actions 28 | */ 29 | init() { 30 | if(this.once) return; 31 | this.once = true; 32 | 33 | this.onToggleDetail(); 34 | } 35 | }; 36 | 37 | 38 | $(() => { 39 | AimeosAccountBasket.init(); 40 | }); -------------------------------------------------------------------------------- /Resources/public/themes/default/account-history.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account history actions 3 | */ 4 | AimeosAccountHistory = { 5 | 6 | /** 7 | * Shows history details without page reload 8 | */ 9 | onToggleDetail() { 10 | 11 | $(".account-history").on("click", ".history-item .action .btn", ev => { 12 | 13 | const target = $(ev.currentTarget).closest(".history-item"); 14 | const details = $(".account-history-detail", target); 15 | 16 | $(".btn.show", target).toggleClass('hidden'); 17 | $(".btn.close", target).toggleClass('hidden'); 18 | 19 | slideToggle(details[0], 300); 20 | 21 | return false; 22 | }); 23 | }, 24 | 25 | 26 | /** 27 | * Initializes the account history actions 28 | */ 29 | init() { 30 | if(this.once) return; 31 | this.once = true; 32 | 33 | this.onToggleDetail(); 34 | } 35 | }; 36 | 37 | 38 | $(() => { 39 | AimeosAccountHistory.init(); 40 | }); -------------------------------------------------------------------------------- /Resources/views/Catalog/home.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_header %} 4 | {{ (aiheader['locale/select'] ?? '' )|raw }} 5 | {{ (aiheader['basket/mini'] ?? '' )|raw }} 6 | {{ (aiheader['catalog/search'] ?? '' )|raw }} 7 | {{ (aiheader['catalog/tree'] ?? '' )|raw }} 8 | {{ (aiheader['catalog/home'] ?? '' )|raw }} 9 | {% endblock %} 10 | 11 | {% block aimeos_head_basket %} 12 | {{ (aibody['basket/mini'] ?? '' )|raw }} 13 | {% endblock %} 14 | 15 | {% block aimeos_head_locale %} 16 | {{ (aibody['locale/select'] ?? '' )|raw }} 17 | {% endblock %} 18 | 19 | {% block aimeos_head_nav %} 20 | {{ (aibody['catalog/tree'] ?? '' )|raw }} 21 | {% endblock %} 22 | 23 | {% block aimeos_head_search %} 24 | {{ (aibody['catalog/search'] ?? '' )|raw }} 25 | {% endblock %} 26 | 27 | {% block aimeos_body %} 28 | {{ (aibody['catalog/home'] ?? '' )|raw }} 29 | {% endblock %} 30 | -------------------------------------------------------------------------------- /Resources/views/Catalog/session.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_header %} 4 | {{ (aiheader['locale/select'] ?? '' )|raw }} 5 | {{ (aiheader['basket/mini'] ?? '' )|raw }} 6 | {{ (aiheader['catalog/search'] ?? '' )|raw }} 7 | {{ (aiheader['catalog/tree'] ?? '' )|raw }} 8 | {{ (aiheader['catalog/session'] ?? '' )|raw }} 9 | {% endblock %} 10 | 11 | {% block aimeos_head_basket %} 12 | {{ (aibody['basket/mini'] ?? '' )|raw }} 13 | {% endblock %} 14 | 15 | {% block aimeos_head_nav %} 16 | {{ (aibody['locale/select'] ?? '' )|raw }} 17 | {% endblock %} 18 | 19 | {% block aimeos_head_locale %} 20 | {{ (aibody['catalog/tree'] ?? '' )|raw }} 21 | {% endblock %} 22 | 23 | {% block aimeos_head_search %} 24 | {{ (aibody['catalog/search'] ?? '' )|raw }} 25 | {% endblock %} 26 | 27 | {% block aimeos_body %} 28 | {{ (aibody['catalog/session'] ?? '' )|raw }} 29 | {% endblock %} 30 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-subscription.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account subscription actions 3 | */ 4 | AimeosAccountSubscription = { 5 | 6 | /** 7 | * Shows subscription details without page reload 8 | */ 9 | onToggleDetail() { 10 | 11 | $(".account-subscription").on("click", ".subscription-item .action .btn", ev => { 12 | 13 | const target = $(ev.currentTarget).closest(".subscription-item"); 14 | const details = $(".account-subscription-detail", target); 15 | 16 | $(".btn.show", target).toggleClass('hidden'); 17 | $(".btn.close", target).toggleClass('hidden'); 18 | 19 | slideToggle(details[0], 300); 20 | 21 | return false; 22 | }); 23 | }, 24 | 25 | 26 | /** 27 | * Initializes the account subscription actions 28 | */ 29 | init() { 30 | if(this.once) return; 31 | this.once = true; 32 | 33 | this.onToggleDetail(); 34 | } 35 | }; 36 | 37 | 38 | $(() => { 39 | AimeosAccountSubscription.init(); 40 | }); -------------------------------------------------------------------------------- /tests/Command/ClearCommandTest.php: -------------------------------------------------------------------------------- 1 | createKernel(); 17 | $kernel->boot(); 18 | 19 | $container = static::getContainer(); 20 | 21 | $application = new Application( $kernel ); 22 | $application->add( new Command\ClearCommand( $container ) ); 23 | 24 | $command = $application->find( 'aimeos:clear' ); 25 | $commandTester = new CommandTester( $command ); 26 | $commandTester->execute( array( 'command' => $command->getName(), 'site' => 'unittest' ) ); 27 | 28 | $this->assertEquals( 0, $commandTester->getStatusCode() ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /tests/Controller/SupplierControllerTest.php: -------------------------------------------------------------------------------- 1 | getContainer()->get( 'aimeos.context' )->get( false ); 22 | $context->setLocale( $this->getContainer()->get( 'aimeos.locale' )->getBackend( $context, 'unittest' ) ); 23 | $supplier = \Aimeos\MShop::create( $context, 'supplier' )->find( 'unitSupplier001' ); 24 | 25 | $crawler = $client->request( 'GET', '/unittest/de/EUR/s/TestSupplier/' . $supplier->getId() ); 26 | 27 | $this->assertEquals( 1, $crawler->filter( '.supplier-detail' )->count() ); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/Command/JobsCommandTest.php: -------------------------------------------------------------------------------- 1 | createKernel(); 17 | $kernel->boot(); 18 | 19 | $container = static::getContainer(); 20 | 21 | $application = new Application( $kernel ); 22 | $application->add( new Command\JobsCommand( $container ) ); 23 | 24 | $command = $application->find( 'aimeos:jobs' ); 25 | $commandTester = new CommandTester( $command ); 26 | $commandTester->execute( array( 'command' => $command->getName(), 'site' => 'unittest', 'jobs' => 'index/rebuild' ) ); 27 | 28 | $this->assertEquals( 0, $commandTester->getStatusCode() ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-review.css: -------------------------------------------------------------------------------- 1 | .account-review { 2 | padding: 2rem 0; 3 | } 4 | 5 | .account-review .header { 6 | text-transform: uppercase; 7 | text-align: start; 8 | font-weight: normal; 9 | padding: 0.5rem 1rem; 10 | color: var(--ai-secondary); 11 | border-bottom: 1px solid var(--ai-secondary); 12 | } 13 | 14 | .account-review .review-item { 15 | padding: 1rem; 16 | } 17 | 18 | .account-review .col-md-6 { 19 | padding-top: 1rem; 20 | } 21 | 22 | .account-review .review-image { 23 | max-width: 100%; 24 | max-height: 10rem; 25 | } 26 | 27 | .account-review .review-rating input { 28 | vertical-align: middle; 29 | } 30 | 31 | .account-review .review-rating input:checked ~ label { 32 | color: var(--ai-primary); 33 | } 34 | 35 | .account-review .review-comment { 36 | width: 100%; 37 | height: 8.5rem; 38 | padding: 0.5rem; 39 | border: 1px solid var(--ai-tertiary); 40 | } 41 | 42 | .account-review .btn { 43 | display: block; 44 | margin: 1rem auto; 45 | } 46 | -------------------------------------------------------------------------------- /tests/Command/SetupCommandTest.php: -------------------------------------------------------------------------------- 1 | createKernel(); 17 | $kernel->boot(); 18 | 19 | $container = static::getContainer(); 20 | 21 | $application = new Application( $kernel ); 22 | $application->add( new Command\SetupCommand( $container ) ); 23 | 24 | $command = $application->find( 'aimeos:setup' ); 25 | $commandTester = new CommandTester( $command ); 26 | $commandTester->execute( array( 'command' => $command->getName(), 'site' => 'unittest', 'tplsite' => 'unittest', '--option' => 'setup/default/demo:0' ) ); 27 | 28 | $this->assertEquals( 0, $commandTester->getStatusCode() ); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /tests/Entity/UserTest.php: -------------------------------------------------------------------------------- 1 | object = new User(); 17 | } 18 | 19 | 20 | public function testGetId() 21 | { 22 | $this->assertEquals( null, $this->object->getId() ); 23 | } 24 | 25 | 26 | public function testGetUserIdentifier() 27 | { 28 | $this->assertEquals( null, $this->object->getUserIdentifier() ); 29 | } 30 | 31 | 32 | public function testGetPassword() 33 | { 34 | $this->assertEquals( null, $this->object->getPassword() ); 35 | } 36 | 37 | 38 | public function testGetRoles() 39 | { 40 | $this->assertEquals( array( 'ROLE_USER' ), $this->object->getRoles() ); 41 | } 42 | 43 | 44 | public function testEraseCredentials() 45 | { 46 | $this->object->eraseCredentials(); 47 | $this->assertNull( $this->object->getPassword() ); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /config/routing_jsonapi.yaml: -------------------------------------------------------------------------------- 1 | aimeos_shop_jsonapi_delete: 2 | path: /{resource} 3 | controller: Aimeos\ShopBundle\Controller\JsonapiController::deleteAction 4 | methods: [DELETE] 5 | 6 | aimeos_shop_jsonapi_get: 7 | path: /{resource} 8 | controller: Aimeos\ShopBundle\Controller\JsonapiController::getAction 9 | methods: [GET] 10 | 11 | aimeos_shop_jsonapi_patch: 12 | path: /{resource} 13 | controller: Aimeos\ShopBundle\Controller\JsonapiController::patchAction 14 | methods: [PATCH] 15 | 16 | aimeos_shop_jsonapi_post: 17 | path: /{resource} 18 | controller: Aimeos\ShopBundle\Controller\JsonapiController::postAction 19 | methods: [POST] 20 | 21 | aimeos_shop_jsonapi_put: 22 | path: /{resource} 23 | controller: Aimeos\ShopBundle\Controller\JsonapiController::putAction 24 | methods: [PUT] 25 | 26 | aimeos_shop_jsonapi_options: 27 | path: /{resource} 28 | controller: Aimeos\ShopBundle\Controller\JsonapiController::optionsAction 29 | defaults: { resource: '' } 30 | methods: [OPTIONS] 31 | -------------------------------------------------------------------------------- /public/themes/default/account-review.css: -------------------------------------------------------------------------------- 1 | .account-review h1.header { 2 | border-bottom: 1px solid var(--ai-secondary); 3 | text-transform: uppercase; 4 | text-align: start; 5 | font-weight: normal; 6 | padding: 0.5rem 1rem; 7 | color: var(--ai-secondary); 8 | } 9 | 10 | .account-review h2 { 11 | margin: 8px 15px; 12 | } 13 | 14 | .account-review .review-item { 15 | padding: 1rem; 16 | } 17 | 18 | .account-review h3 { 19 | padding: 0 1rem; 20 | } 21 | 22 | .account-review .col-md-6 { 23 | padding-top: 1rem; 24 | } 25 | 26 | .account-review .review-image { 27 | max-width: 100%; 28 | max-height: 10rem; 29 | } 30 | 31 | .account-review .review-rating input { 32 | vertical-align: middle; 33 | } 34 | 35 | .account-review .review-rating input:checked ~ label { 36 | color: var(--ai-primary); 37 | } 38 | 39 | .account-review .review-comment { 40 | width: 100%; 41 | height: 8.5rem; 42 | padding: 0.5rem; 43 | border: 1px solid var(--ai-tertiary); 44 | } 45 | 46 | .account-review .btn { 47 | display: block; 48 | margin: 1rem auto; 49 | } 50 | -------------------------------------------------------------------------------- /Resources/views/Basket/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_header %} 4 | Basket 5 | {{ (aiheader['locale/select'] ?? '')|raw }} 6 | {{ (aiheader['catalog/search'] ?? '')|raw }} 7 | {{ (aiheader['catalog/tree'] ?? '')|raw }} 8 | {{ (aiheader['basket/bulk'] ?? '')|raw }} 9 | {{ (aiheader['basket/standard'] ?? '')|raw }} 10 | {{ (aiheader['basket/related'] ?? '')|raw }} 11 | {% endblock %} 12 | 13 | {% block aimeos_head_nav %} 14 | {{ (aibody['catalog/tree'] ?? '')|raw }} 15 | {% endblock %} 16 | 17 | {% block aimeos_head_locale %} 18 | {{ (aibody['locale/select'] ?? '')|raw }} 19 | {% endblock %} 20 | 21 | {% block aimeos_head_search %} 22 | {{ (aibody['catalog/search'] ?? '')|raw }} 23 | {% endblock %} 24 | 25 | {% block aimeos_body %} 26 |
27 | {{ (aibody['basket/standard'] ?? '')|raw }} 28 | {{ (aibody['basket/bulk'] ?? '')|raw }} 29 | {{ (aibody['basket/related'] ?? '')|raw }} 30 |
31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-favorite.css: -------------------------------------------------------------------------------- 1 | .account-favorite { 2 | padding: 2rem 0; 3 | } 4 | 5 | .account-favorite .header { 6 | text-transform: uppercase; 7 | text-align: start; 8 | font-weight: normal; 9 | padding: 0.5rem 1rem; 10 | color: var(--ai-secondary); 11 | border-bottom: 1px solid var(--ai-secondary); 12 | } 13 | 14 | .account-favorite .favorite-items { 15 | display: flex; 16 | justify-content: center; 17 | } 18 | 19 | .account-favorite .favorite-item { 20 | position: relative; 21 | text-align: end; 22 | width: 180px; 23 | margin: 1%; 24 | } 25 | 26 | .account-favorite .name { 27 | margin-top: 0.75rem; 28 | } 29 | 30 | .account-favorite .price-list .rebatepercent { 31 | display: none; 32 | } 33 | 34 | .account-favorite form.delete { 35 | position: absolute; 36 | left: 0; 37 | top: 0; 38 | } 39 | 40 | .account-favorite .minibutton.delete { 41 | color: var(--ai-secondary); 42 | background-color: var(--ai-bg); 43 | padding: .5rem 0.75rem; 44 | z-index: 5; 45 | } 46 | 47 | .account-favorite .media-item > img { 48 | width: 100%; 49 | } 50 | -------------------------------------------------------------------------------- /public/themes/default/account-favorite.css: -------------------------------------------------------------------------------- 1 | .account-favorite { 2 | margin: 1rem 0; 3 | padding: 0; 4 | } 5 | 6 | .account-favorite .header { 7 | text-transform: uppercase; 8 | text-align: start; 9 | font-weight: normal; 10 | padding: 0.5rem 1rem; 11 | color: var(--ai-secondary); 12 | border-bottom: 1px solid var(--ai-secondary); 13 | } 14 | 15 | .account-favorite .favorite-items { 16 | display: flex; 17 | justify-content: center; 18 | } 19 | 20 | .account-favorite .favorite-item { 21 | position: relative; 22 | text-align: end; 23 | width: 180px; 24 | margin: 1%; 25 | } 26 | 27 | .account-favorite .name { 28 | margin-top: 0.75rem; 29 | } 30 | 31 | .account-favorite .price-list .rebatepercent { 32 | display: none; 33 | } 34 | 35 | .account-favorite form.delete { 36 | position: absolute; 37 | left: 0; 38 | top: 0; 39 | } 40 | 41 | .account-favorite .minibutton.delete { 42 | color: var(--ai-secondary); 43 | background-color: var(--ai-bg); 44 | padding: .5rem 0.75rem; 45 | z-index: 5; 46 | } 47 | 48 | .account-favorite .media-item > img { 49 | width: 100%; 50 | } 51 | -------------------------------------------------------------------------------- /Resources/views/Supplier/detail.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_header %} 4 | {{ (aiheader['locale/select'] ?? '')|raw }} 5 | {{ (aiheader['basket/mini'] ?? '')|raw }} 6 | {{ (aiheader['catalog/tree'] ?? '')|raw }} 7 | {{ (aiheader['catalog/search'] ?? '')|raw }} 8 | {{ (aiheader['supplier/detail'] ?? '')|raw }} 9 | {{ (aiheader['catalog/lists'] ?? '')|raw }} 10 | {% endblock %} 11 | 12 | {% block aimeos_head_basket %} 13 | {{ (aibody['basket/mini'] ?? '')|raw }} 14 | {% endblock %} 15 | 16 | {% block aimeos_head_nav %} 17 | {{ (aibody['catalog/tree'] ?? '')|raw }} 18 | {% endblock %} 19 | 20 | {% block aimeos_head_locale %} 21 | {{ (aibody['locale/select'] ?? '')|raw }} 22 | {% endblock %} 23 | 24 | {% block aimeos_head_search %} 25 | {{ (aibody['catalog/search'] ?? '')|raw }} 26 | {% endblock %} 27 | 28 | {% block aimeos_body %} 29 |
30 | {{ (aibody['supplier/detail'] ?? '')|raw }} 31 | {{ (aibody['catalog/lists'] ?? '')|raw }} 32 |
33 | {% endblock %} 34 | -------------------------------------------------------------------------------- /public/themes/default/account-favorite.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account favorite actions 3 | */ 4 | AimeosAccountFavorite = { 5 | 6 | /** 7 | * Deletes a favorite item without page reload 8 | */ 9 | onRemoveProduct() { 10 | 11 | $("body").on("click", ".account-favorite .delete", async ev => { 12 | 13 | const form = $(ev.currentTarget).closest("form"); 14 | $(ev.currentTarget).closest("favorite-item").addClass("loading"); 15 | 16 | await fetch(form.attr("action"), { 17 | body: new FormData(form[0]), 18 | method: 'POST' 19 | }).then(response => { 20 | return response.text(); 21 | }).then(data => { 22 | const doc = $("").html(data); 23 | 24 | $(".aimeos.account-favorite").replaceWith($(".aimeos.account-favorite", doc)); 25 | 26 | if(!$(".aimeos.account-favorite .favorite-items").length) { 27 | Aimeos.removeOverlay(); 28 | } 29 | }); 30 | 31 | return false; 32 | }); 33 | }, 34 | 35 | 36 | /** 37 | * Initializes the account favorite actions 38 | */ 39 | init() { 40 | this.onRemoveProduct(); 41 | } 42 | }; 43 | 44 | 45 | $(function() { 46 | AimeosAccountFavorite.init(); 47 | }); -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 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 13 | all 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 21 | THE SOFTWARE. 22 | -------------------------------------------------------------------------------- /config/routing.yaml: -------------------------------------------------------------------------------- 1 | aimeos_shop_terms: 2 | path: /terms 3 | controller: Aimeos\ShopBundle\Controller\PageController::termsAction 4 | 5 | aimeos_shop_privacy: 6 | path: /privacy 7 | controller: Aimeos\ShopBundle\Controller\PageController::privacyAction 8 | 9 | 10 | aimeos_shop_adm: 11 | resource: "./routing_adm.yaml" 12 | prefix: / 13 | 14 | aimeos_shop_graphql: 15 | resource: "./routing_graphql.yaml" 16 | prefix: /admin/{site}/graphql 17 | 18 | aimeos_shop_jqadm: 19 | resource: "./routing_jqadm.yaml" 20 | prefix: /admin/{site}/jqadm 21 | 22 | aimeos_shop_jsonadm: 23 | resource: "./routing_jsonadm.yaml" 24 | prefix: /admin/{site}/jsonadm 25 | 26 | aimeos_shop_jsonapi: 27 | resource: "./routing_jsonapi.yaml" 28 | prefix: /jsonapi 29 | 30 | aimeos_shop_account: 31 | resource: "./routing_account.yaml" 32 | prefix: /profile 33 | 34 | aimeos_shop_default: 35 | resource: "./routing_default.yaml" 36 | prefix: /shop 37 | 38 | aimeos_shop_supplier: 39 | resource: "./routing_supplier.yaml" 40 | prefix: /s 41 | 42 | aimeos_shop_update: 43 | resource: "./routing_update.yaml" 44 | prefix: / 45 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-favorite.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account favorite actions 3 | */ 4 | AimeosAccountFavorite = { 5 | 6 | /** 7 | * Deletes a favorite item without page reload 8 | */ 9 | onRemoveProduct() { 10 | 11 | $("body").on("click", ".account-favorite .delete", async ev => { 12 | 13 | const form = $(ev.currentTarget).closest("form"); 14 | $(ev.currentTarget).closest("favorite-item").addClass("loading"); 15 | 16 | await fetch(form.attr("action"), { 17 | body: new FormData(form[0]), 18 | method: 'POST' 19 | }).then(response => { 20 | return response.text(); 21 | }).then(data => { 22 | const doc = $("").html(data); 23 | 24 | $(".aimeos.account-favorite").replaceWith($(".aimeos.account-favorite", doc)); 25 | 26 | if(!$(".aimeos.account-favorite .favorite-items").length) { 27 | Aimeos.removeOverlay(); 28 | } 29 | }); 30 | 31 | return false; 32 | }); 33 | }, 34 | 35 | 36 | /** 37 | * Initializes the account favorite actions 38 | */ 39 | init() { 40 | if(this.once) return; 41 | this.once = true; 42 | 43 | this.onRemoveProduct(); 44 | } 45 | }; 46 | 47 | 48 | $(function() { 49 | AimeosAccountFavorite.init(); 50 | }); -------------------------------------------------------------------------------- /src/Controller/PageController.php: -------------------------------------------------------------------------------- 1 | render( '@AimeosShop/Page/privacy.html.twig' ); 33 | } 34 | 35 | 36 | /** 37 | * Returns the html for the terms and conditions page. 38 | * 39 | * @return Response Response object containing the generated output 40 | */ 41 | public function termsAction( \Twig\Environment $twig ) : Response 42 | { 43 | return $twig->render( '@AimeosShop/Page/terms.html.twig' ); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/Fixtures/AppKernel.php: -------------------------------------------------------------------------------- 1 | load( __DIR__ . '/config/config.yaml' ); 33 | } 34 | 35 | 36 | /** 37 | * {@inheritdoc} 38 | */ 39 | public function getCacheDir() : string 40 | { 41 | return __DIR__ . '/var/cache'; 42 | } 43 | 44 | 45 | /** 46 | * {@inheritdoc} 47 | */ 48 | public function getLogDir() : string 49 | { 50 | return __DIR__ . '/var/logs'; 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /tests/Fixtures/templates/base.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% block aimeos_header %}{% endblock %} 5 | 6 | 7 | {% block title %}Aimeos shop{% endblock %} 8 | {% block aimeos_styles %}{% endblock %} 9 | 10 | 11 | 14 | {% if block('aimeos_nav') %} 15 |
16 | {% block aimeos_nav %}{% endblock %} 17 |
18 | {% endif %} 19 | {% if block('aimeos_nav') or block('aimeos_aside') %} 20 |
21 | {% else %} 22 |
23 | {% endif %} 24 | {% block aimeos_stage %}{% endblock %} 25 | {% block aimeos_body %}{% endblock %} 26 |
27 | {% if block('aimeos_aside') %} 28 |
29 | {% block aimeos_aside %}{% endblock %} 30 |
31 | {% endif %} 32 | {% block aimeos_scripts %}{% endblock %} 33 | 34 | 35 | -------------------------------------------------------------------------------- /tests/Controller/AccountControllerTest.php: -------------------------------------------------------------------------------- 1 | request( 'GET', '/unittest/de/EUR/profile/' ); 22 | 23 | $this->assertStringContainsString( 'aimeos account-profile', $client->getResponse()->getContent() ); 24 | $this->assertStringContainsString( 'aimeos account-history', $client->getResponse()->getContent() ); 25 | $this->assertStringContainsString( 'aimeos account-favorite', $client->getResponse()->getContent() ); 26 | $this->assertStringContainsString( 'aimeos account-watch', $client->getResponse()->getContent() ); 27 | } 28 | 29 | 30 | public function testDownload() 31 | { 32 | $client = static::createClient(); 33 | $client->request( 'GET', '/unittest/de/EUR/profile/download/0' ); 34 | 35 | $this->assertEquals( 401, $client->getResponse()->getStatusCode() ); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /Resources/public/themes/default/basket-bulk.css: -------------------------------------------------------------------------------- 1 | /* Basket bulk order */ 2 | 3 | .basket-bulk { 4 | margin: 2rem 0; 5 | } 6 | 7 | .basket-bulk .headline, 8 | .basket-bulk .bulk-content .details { 9 | border-bottom: 1px solid var(--ai-secondary); 10 | } 11 | 12 | .basket-bulk .row { 13 | align-items: center; 14 | } 15 | 16 | .basket-bulk .headline { 17 | background-color: var(--ai-bg-light); 18 | font-weight: bold; 19 | font-size: 115%; 20 | } 21 | 22 | .basket-bulk .quantity, 23 | .basket-bulk .quantity input { 24 | text-align: center; 25 | } 26 | 27 | .basket-bulk .price { 28 | text-align: end; 29 | } 30 | 31 | .basket-bulk .product, 32 | .basket-bulk .price { 33 | padding: 0 .75rem; 34 | } 35 | 36 | .basket-bulk .buttons { 37 | text-align: center; 38 | } 39 | 40 | 41 | /* JS autocomplete */ 42 | 43 | .autocomplete { 44 | z-index: 1050; 45 | overflow: auto; 46 | box-sizing: border-box; 47 | border: 1px solid var(--ai-secondary); 48 | background-color: var(--ai-bg); 49 | } 50 | 51 | .autocomplete > div { 52 | padding: 0.25rem; 53 | } 54 | 55 | .autocomplete .group { 56 | background-color: var(--ai-bg-light); 57 | } 58 | 59 | .autocomplete > div:hover:not(.group), 60 | .autocomplete > div.selected { 61 | cursor: pointer; 62 | background-color: var(--ai-tertiary); 63 | } 64 | -------------------------------------------------------------------------------- /public/themes/default/account-basket.css: -------------------------------------------------------------------------------- 1 | .account-basket { 2 | margin: 0 auto; 3 | } 4 | 5 | .account-basket .header { 6 | text-transform: uppercase; 7 | text-align: start; 8 | font-weight: normal; 9 | padding: 0.5rem 1rem; 10 | color: var(--ai-secondary); 11 | border-bottom: 1px solid var(--ai-secondary); 12 | } 13 | 14 | .account-basket .basket-item { 15 | border: 1px solid var(--ai-tertiary); 16 | padding: 1rem; 17 | margin: 1rem; 18 | } 19 | 20 | .account-basket .basket-basic { 21 | font-weight: bold; 22 | } 23 | 24 | .account-basket .name:after { 25 | content: ": "; 26 | } 27 | 28 | .account-basket .action { 29 | margin-top: 0.5rem; 30 | } 31 | 32 | .account-basket .action .btn { 33 | border: 1px solid var(--ai-secondary); 34 | display: block; 35 | width: 100%; 36 | max-width: 6rem; 37 | margin: auto; 38 | } 39 | 40 | .account-basket-detail { 41 | padding-top: 1rem; 42 | display: none; 43 | } 44 | 45 | .account-basket-detail a:hover { 46 | text-decoration: underline; 47 | } 48 | 49 | .account-basket-detail h2 { 50 | margin: 0.5rem 0; 51 | } 52 | 53 | .account-basket-detail h3 { 54 | display: inline-block; 55 | font-size: 1rem; 56 | margin: 0; 57 | } 58 | 59 | .account-basket-detail li.attr-item .name, 60 | .account-basket-detail li.attr-item .value { 61 | min-width: 0; 62 | } 63 | -------------------------------------------------------------------------------- /public/themes/default/account-history.css: -------------------------------------------------------------------------------- 1 | .account-history { 2 | margin: 0 auto; 3 | } 4 | 5 | .account-history .header { 6 | text-transform: uppercase; 7 | text-align: start; 8 | font-weight: normal; 9 | padding: 0.5rem 1rem; 10 | color: var(--ai-secondary); 11 | border-bottom: 1px solid var(--ai-secondary); 12 | } 13 | 14 | .account-history .history-item { 15 | border: 1px solid var(--ai-tertiary); 16 | padding: 1rem; 17 | margin: 1rem; 18 | } 19 | 20 | .account-history .order-basic { 21 | font-weight: bold; 22 | } 23 | 24 | .account-history .name:after { 25 | content: ": "; 26 | } 27 | 28 | .account-history .action { 29 | margin-top: 0.5rem; 30 | } 31 | 32 | .account-history .action .btn { 33 | border: 1px solid var(--ai-secondary); 34 | display: block; 35 | width: 100%; 36 | max-width: 6rem; 37 | margin: auto; 38 | } 39 | 40 | .account-history-detail { 41 | padding-top: 1rem; 42 | display: none; 43 | } 44 | 45 | .account-history-detail a:hover { 46 | text-decoration: underline; 47 | } 48 | 49 | .account-history-detail h2 { 50 | margin: 0.5rem 0; 51 | } 52 | 53 | .account-history-detail h3 { 54 | display: inline-block; 55 | font-size: 1rem; 56 | margin: 0; 57 | } 58 | 59 | .account-history-detail li.attr-item .name, 60 | .account-history-detail li.attr-item .value { 61 | min-width: 0; 62 | } 63 | -------------------------------------------------------------------------------- /phpunit.xml.dist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | ./tests/Command/SetupCommandTest.php 23 | ./tests/Command/ClearCommandTest.php 24 | ./tests/Command/JobsCommandTest.php 25 | ./tests/Command/AccountCommandTest.php 26 | 27 | 28 | ./tests/Entity 29 | 30 | 31 | ./tests/Controller 32 | 33 | 34 | 35 | 36 | 37 | src/ 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-history.css: -------------------------------------------------------------------------------- 1 | .account-history { 2 | padding: 2rem 0; 3 | } 4 | 5 | .account-history .header { 6 | text-transform: uppercase; 7 | text-align: start; 8 | font-weight: normal; 9 | padding: 0.5rem 1rem; 10 | color: var(--ai-secondary); 11 | border-bottom: 1px solid var(--ai-secondary); 12 | } 13 | 14 | .account-history .history-item { 15 | border: 1px solid var(--ai-tertiary); 16 | padding: 1rem; 17 | margin: 1rem; 18 | } 19 | 20 | .account-history .order-basic { 21 | font-weight: bold; 22 | } 23 | 24 | .account-history .name:after { 25 | content: ": "; 26 | } 27 | 28 | .account-history .action { 29 | margin-top: 0.5rem; 30 | } 31 | 32 | .account-history .action .btn { 33 | border: 1px solid var(--ai-secondary); 34 | display: block; 35 | width: 100%; 36 | max-width: 6rem; 37 | margin: auto; 38 | } 39 | 40 | .account-history-detail { 41 | padding-top: 1rem; 42 | display: none; 43 | } 44 | 45 | .account-history-detail a:hover { 46 | text-decoration: underline; 47 | } 48 | 49 | .account-history-detail h2 { 50 | margin: 0.5rem 0; 51 | } 52 | 53 | .account-history-detail h3 { 54 | display: inline-block; 55 | font-size: 1rem; 56 | margin: 0; 57 | } 58 | 59 | .account-history-detail li.attr-item .name, 60 | .account-history-detail li.attr-item .value { 61 | min-width: 0; 62 | } 63 | -------------------------------------------------------------------------------- /src/Controller/BasketController.php: -------------------------------------------------------------------------------- 1 | container->get( 'shop' ); 34 | 35 | foreach( $this->container->getParameter( 'aimeos_shop.page' )['basket-index'] as $name ) 36 | { 37 | $params['aiheader'][$name] = $shop->get( $name )->header(); 38 | $params['aibody'][$name] = $shop->get( $name )->body(); 39 | } 40 | 41 | return new Response( 42 | $twig->render( '@AimeosShop/Basket/index.html.twig', $params ), 43 | 200, ['Cache-Control' => 'no-store, , max-age=0'] 44 | ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /src/Controller/SupplierController.php: -------------------------------------------------------------------------------- 1 | container->get( 'shop' ); 34 | 35 | foreach( $this->container->getParameter( 'aimeos_shop.page' )['supplier-detail'] as $name ) 36 | { 37 | $params['aiheader'][$name] = $shop->get( $name )->header(); 38 | $params['aibody'][$name] = $shop->get( $name )->body(); 39 | } 40 | 41 | return new Response( 42 | $twig->render( '@AimeosShop/Supplier/detail.html.twig', $params ), 43 | 200, ['Cache-Control' => 'private, max-age=10'] 44 | ); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /public/themes/default/catalog-home.css: -------------------------------------------------------------------------------- 1 | /* Catalog home */ 2 | 3 | .aimeos.catalog-home { 4 | margin-top: calc(-1rem - 80px); 5 | } 6 | 7 | .catalog-home .stage-item { 8 | background-color: var(--ai-bg); 9 | color: var(--ai-bg); 10 | margin: 0; 11 | } 12 | 13 | .catalog-home .stage-image { 14 | min-height: 600px; 15 | object-fit: cover; 16 | padding: 0; 17 | } 18 | 19 | .catalog-home .stage-text { 20 | position: absolute; 21 | font-size: 200%; 22 | margin: 0 5%; 23 | top: 33%; 24 | text-align: start; 25 | color: var(--ai-bg); 26 | } 27 | 28 | .catalog-home .stage-text .btn { 29 | background-color: transparent; 30 | border-color: var(--ai-bg); 31 | color: var(--ai-bg); 32 | border-width: 2px; 33 | font-weight: normal; 34 | margin-top: 1rem; 35 | font-size: 50%; 36 | width: 12rem; 37 | } 38 | 39 | @media (min-width:576px) { 40 | .catalog-home .stage-text { 41 | max-width: 66%; 42 | } 43 | } 44 | 45 | @media (min-width:768px) { 46 | .catalog-home .stage-text { 47 | max-width: 50%; 48 | font-size: 225%; 49 | } 50 | } 51 | 52 | @media (min-width:992px) { 53 | .aimeos.catalog-home { 54 | margin-top: calc(-7rem - 50px); 55 | } 56 | .catalog-home .stage-text { 57 | max-width: 40%; 58 | } 59 | } 60 | 61 | @media (min-width:1200px) { 62 | .catalog-home .stage-text { 63 | max-width: 35%; 64 | font-size: 250%; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Resources/public/themes/default/catalog-home.css: -------------------------------------------------------------------------------- 1 | /* Catalog home */ 2 | 3 | .aimeos.catalog-home { 4 | margin-top: calc(-1rem - 80px); 5 | } 6 | 7 | .catalog-home .stage-item { 8 | background-color: var(--ai-bg); 9 | color: var(--ai-bg); 10 | margin: 0; 11 | } 12 | 13 | .catalog-home .stage-image { 14 | min-height: 600px; 15 | object-fit: cover; 16 | padding: 0; 17 | } 18 | 19 | .catalog-home .stage-text { 20 | position: absolute; 21 | font-size: 200%; 22 | margin: 0 5%; 23 | top: 33%; 24 | text-align: start; 25 | color: var(--ai-bg); 26 | } 27 | 28 | .catalog-home .stage-text .btn { 29 | background-color: transparent; 30 | border-color: var(--ai-bg); 31 | color: var(--ai-bg); 32 | border-width: 2px; 33 | font-weight: normal; 34 | margin-top: 1rem; 35 | font-size: 50%; 36 | width: 12rem; 37 | } 38 | 39 | @media (min-width:576px) { 40 | .catalog-home .stage-text { 41 | max-width: 66%; 42 | } 43 | } 44 | 45 | @media (min-width:768px) { 46 | .catalog-home .stage-text { 47 | max-width: 50%; 48 | font-size: 225%; 49 | } 50 | } 51 | 52 | @media (min-width:992px) { 53 | .aimeos.catalog-home { 54 | margin-top: calc(-7rem - 50px); 55 | } 56 | .catalog-home .stage-text { 57 | max-width: 40%; 58 | } 59 | } 60 | 61 | @media (min-width:1200px) { 62 | .catalog-home .stage-text { 63 | max-width: 35%; 64 | font-size: 250%; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /public/themes/default/account-subscription.css: -------------------------------------------------------------------------------- 1 | .account-subscription .header { 2 | text-transform: uppercase; 3 | text-align: start; 4 | font-weight: normal; 5 | padding: 0.5rem 1rem; 6 | color: var(--ai-secondary); 7 | border-bottom: 1px solid var(--ai-secondary); 8 | } 9 | 10 | .account-subscription { 11 | margin: 0 auto; 12 | } 13 | 14 | .account-subscription .subscription-item { 15 | border: 1px solid var(--ai-tertiary); 16 | padding: 1rem; 17 | margin: 1rem; 18 | } 19 | 20 | .account-subscription .name:after { 21 | content: ": "; 22 | } 23 | 24 | .account-subscription .subscription-basic { 25 | font-weight: bold; 26 | } 27 | 28 | .account-subscription .action { 29 | margin-top: 0.5rem; 30 | } 31 | 32 | .account-subscription .action .btn { 33 | border: 1px solid var(--ai-secondary); 34 | display: block; 35 | width: 100%; 36 | max-width: 6rem; 37 | margin: auto; 38 | } 39 | 40 | .account-subscription-detail { 41 | padding-top: 1rem; 42 | display: none; 43 | } 44 | 45 | .account-subscription-detail a:hover { 46 | text-decoration: underline; 47 | } 48 | 49 | .account-subscription-detail h2 { 50 | margin: 0.5rem 0; 51 | } 52 | 53 | .account-subscription-detail h3 { 54 | display: inline-block; 55 | font-size: 1rem; 56 | margin: 0; 57 | } 58 | 59 | .account-subscription-detail .attr-item .name, 60 | .account-subscription-detail .attr-item .value { 61 | min-width: 0; 62 | } 63 | -------------------------------------------------------------------------------- /public/themes/default/basket-bulk.css: -------------------------------------------------------------------------------- 1 | /* Basket bulk order */ 2 | 3 | .basket-bulk { 4 | margin: 2rem 0; 5 | } 6 | 7 | .basket-bulk .headline, 8 | .basket-bulk .bulk-content .details { 9 | border-bottom: 1px solid var(--ai-secondary); 10 | } 11 | 12 | .basket-bulk .row { 13 | align-items: center; 14 | } 15 | 16 | .basket-bulk .headline { 17 | background-color: var(--ai-bg-light); 18 | font-weight: bold; 19 | } 20 | 21 | .basket-bulk .quantity, 22 | .basket-bulk .quantity input { 23 | text-align: center; 24 | } 25 | 26 | .basket-bulk .price { 27 | text-align: end; 28 | } 29 | 30 | .basket-bulk .product, 31 | .basket-bulk .price { 32 | padding: 0 .75rem; 33 | } 34 | 35 | .basket-bulk .buttons { 36 | text-align: center; 37 | } 38 | 39 | .basket-bulk .minibutton { 40 | color: var(--ai-primary); 41 | line-height: 1; 42 | width: 2.5rem; 43 | padding: 0.75rem; 44 | } 45 | 46 | 47 | /* JS autocomplete */ 48 | 49 | .autocomplete { 50 | z-index: 1050; 51 | overflow: auto; 52 | box-sizing: border-box; 53 | border: 1px solid var(--ai-secondary); 54 | background-color: var(--ai-bg); 55 | } 56 | 57 | .autocomplete > div { 58 | padding: 0.25rem; 59 | } 60 | 61 | .autocomplete .group { 62 | background-color: var(--ai-bg-light); 63 | } 64 | 65 | .autocomplete > div:hover:not(.group), 66 | .autocomplete > div.selected { 67 | cursor: pointer; 68 | background-color: var(--ai-tertiary); 69 | } 70 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-basket.css: -------------------------------------------------------------------------------- 1 | .account-basket { 2 | padding: 2rem 0; 3 | } 4 | 5 | .account-basket .header { 6 | text-transform: uppercase; 7 | text-align: start; 8 | font-weight: normal; 9 | padding: 0.5rem 1rem; 10 | color: var(--ai-secondary); 11 | border-bottom: 1px solid var(--ai-secondary); 12 | } 13 | 14 | .account-basket .basket-item { 15 | border: 1px solid var(--ai-tertiary); 16 | padding: 1rem; 17 | margin: 1rem; 18 | } 19 | 20 | .account-basket .basket-basic .name { 21 | font-weight: bold; 22 | } 23 | 24 | .account-basket .basket-basic .value { 25 | text-transform: none; 26 | } 27 | 28 | .account-basket .name:after { 29 | content: ": "; 30 | } 31 | 32 | .account-basket .action { 33 | margin-top: 0.5rem; 34 | } 35 | 36 | .account-basket .action .btn { 37 | border: 1px solid var(--ai-secondary); 38 | display: block; 39 | width: 100%; 40 | max-width: 6rem; 41 | margin: auto; 42 | } 43 | 44 | .account-basket-detail { 45 | padding-top: 1rem; 46 | display: none; 47 | } 48 | 49 | .account-basket-detail a:hover { 50 | text-decoration: underline; 51 | } 52 | 53 | .account-basket-detail h2 { 54 | margin: 0.5rem 0; 55 | } 56 | 57 | .account-basket-detail h3 { 58 | display: inline-block; 59 | font-size: 1rem; 60 | margin: 0; 61 | } 62 | 63 | .account-basket-detail li.attr-item .name, 64 | .account-basket-detail li.attr-item .value { 65 | min-width: 0; 66 | } 67 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-subscription.css: -------------------------------------------------------------------------------- 1 | .account-subscription { 2 | padding: 2rem 0; 3 | } 4 | 5 | .account-subscription .header { 6 | text-transform: uppercase; 7 | text-align: start; 8 | font-weight: normal; 9 | padding: 0.5rem 1rem; 10 | color: var(--ai-secondary); 11 | border-bottom: 1px solid var(--ai-secondary); 12 | } 13 | 14 | .account-subscription .subscription-item { 15 | border: 1px solid var(--ai-tertiary); 16 | padding: 1rem; 17 | margin: 1rem; 18 | } 19 | 20 | .account-subscription .name:after { 21 | content: ": "; 22 | } 23 | 24 | .account-subscription .subscription-basic { 25 | font-weight: bold; 26 | } 27 | 28 | .account-subscription .action { 29 | margin-top: 0.5rem; 30 | } 31 | 32 | .account-subscription .action .btn { 33 | border: 1px solid var(--ai-secondary); 34 | display: block; 35 | width: 100%; 36 | max-width: 6rem; 37 | margin: auto; 38 | } 39 | 40 | .account-subscription-detail { 41 | padding-top: 1rem; 42 | display: none; 43 | } 44 | 45 | .account-subscription-detail a:hover { 46 | text-decoration: underline; 47 | } 48 | 49 | .account-subscription-detail h2 { 50 | margin: 0.5rem 0; 51 | } 52 | 53 | .account-subscription-detail h3 { 54 | display: inline-block; 55 | font-size: 1rem; 56 | margin: 0; 57 | } 58 | 59 | .account-subscription-detail .attr-item .name, 60 | .account-subscription-detail .attr-item .value { 61 | min-width: 0; 62 | } 63 | -------------------------------------------------------------------------------- /Resources/views/Catalog/detail.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_scripts %} 4 | {{ parent() }} 5 | 6 | {% endblock %} 7 | 8 | {% block aimeos_header %} 9 | {{ (aiheader['locale/select'] ?? '')|raw }} 10 | {{ (aiheader['basket/mini'] ?? '')|raw }} 11 | {{ (aiheader['catalog/tree'] ?? '')|raw }} 12 | {{ (aiheader['catalog/search'] ?? '')|raw }} 13 | {{ (aiheader['catalog/stage'] ?? '')|raw }} 14 | {{ (aiheader['catalog/detail'] ?? '')|raw }} 15 | {{ (aiheader['catalog/session'] ?? '')|raw }} 16 | {% endblock %} 17 | 18 | {% block aimeos_head_basket %} 19 | {{ (aibody['basket/mini'] ?? '')|raw }} 20 | {% endblock %} 21 | 22 | {% block aimeos_head_nav %} 23 | {{ (aibody['catalog/tree'] ?? '')|raw }} 24 | {% endblock %} 25 | 26 | {% block aimeos_head_locale %} 27 | {{ (aibody['locale/select'] ?? '')|raw }} 28 | {% endblock %} 29 | 30 | {% block aimeos_head_search %} 31 | {{ (aibody['catalog/search'] ?? '')|raw }} 32 | {% endblock %} 33 | 34 | {% block aimeos_stage %} 35 | {{ (aibody['catalog/stage'] ?? '')|raw }} 36 | {% endblock %} 37 | 38 | {% block aimeos_body %} 39 | {{ (aibody['catalog/detail'] ?? '')|raw }} 40 | {% endblock %} 41 | 42 | {% block aimeos_aside %} 43 | {{ (aibody['catalog/session'] ?? '')|raw }} 44 | {% endblock %} 45 | -------------------------------------------------------------------------------- /public/themes/default/catalog-stage.css: -------------------------------------------------------------------------------- 1 | /* Navbar background */ 2 | 3 | .aimeos .catalog-stage-image { 4 | margin-top: -6rem; 5 | height: 6rem; 6 | } 7 | 8 | @media screen and (min-width: 992px) { 9 | .aimeos .catalog-stage-image { 10 | margin-top: -10rem; 11 | height: 10rem; 12 | } 13 | } 14 | 15 | /* Stage image */ 16 | 17 | .catalog-stage { 18 | position: relative; 19 | width: 100%; 20 | color: var(--ai-primary); 21 | } 22 | 23 | .catalog-stage-image { 24 | position: relative; 25 | display: block; 26 | margin: 0; 27 | overflow: hidden; 28 | } 29 | 30 | .catalog-stage-image img { 31 | width: 100%; 32 | } 33 | 34 | .catalog-stage-breadcrumb { 35 | color: var(--ai-secondary); 36 | font-size: 90%; 37 | padding: 0.5rem; 38 | } 39 | 40 | .catalog-stage-breadcrumb .breadcrumb { 41 | background-color: inherit; 42 | font-weight: normal; 43 | padding: 0; 44 | margin: 0; 45 | } 46 | 47 | .catalog-stage-breadcrumb ol { 48 | display: inline; 49 | list-style: none; 50 | padding-inline-start: 1rem; 51 | margin: 0; 52 | } 53 | 54 | .catalog-stage-breadcrumb li { 55 | display: inline; 56 | white-space: nowrap; 57 | } 58 | 59 | .catalog-stage-breadcrumb .title, 60 | .catalog-stage-breadcrumb a { 61 | text-decoration: none; 62 | display: inline-block; 63 | padding: 0.5rem; 64 | } 65 | 66 | .catalog-stage-breadcrumb li:after { 67 | content: ' / '; 68 | } 69 | 70 | .catalog-stage-breadcrumb li:last-child:after { 71 | content: ''; 72 | } 73 | -------------------------------------------------------------------------------- /Resources/public/themes/default/catalog-stage.css: -------------------------------------------------------------------------------- 1 | /* Navbar background */ 2 | 3 | .aimeos .catalog-stage-image { 4 | margin-top: -6rem; 5 | height: 6rem; 6 | } 7 | 8 | @media screen and (min-width: 992px) { 9 | .aimeos .catalog-stage-image { 10 | margin-top: -10rem; 11 | height: 10rem; 12 | } 13 | } 14 | 15 | /* Stage image */ 16 | 17 | .catalog-stage { 18 | position: relative; 19 | width: 100%; 20 | color: var(--ai-primary); 21 | } 22 | 23 | .catalog-stage-image { 24 | position: relative; 25 | display: block; 26 | margin: 0; 27 | overflow: hidden; 28 | } 29 | 30 | .catalog-stage-image img { 31 | width: 100%; 32 | } 33 | 34 | .catalog-stage-breadcrumb { 35 | color: var(--ai-secondary); 36 | font-size: 90%; 37 | padding: 0.5rem; 38 | } 39 | 40 | .catalog-stage-breadcrumb .breadcrumb { 41 | background-color: inherit; 42 | font-weight: normal; 43 | padding: 0; 44 | margin: 0; 45 | } 46 | 47 | .catalog-stage-breadcrumb ol { 48 | display: inline; 49 | list-style: none; 50 | padding-inline-start: 1rem; 51 | margin: 0; 52 | } 53 | 54 | .catalog-stage-breadcrumb li { 55 | display: inline; 56 | white-space: nowrap; 57 | } 58 | 59 | .catalog-stage-breadcrumb .title, 60 | .catalog-stage-breadcrumb a { 61 | text-decoration: none; 62 | display: inline-block; 63 | padding: 0.5rem; 64 | } 65 | 66 | .catalog-stage-breadcrumb li:after { 67 | content: ' / '; 68 | } 69 | 70 | .catalog-stage-breadcrumb li:last-child:after { 71 | content: ''; 72 | } 73 | -------------------------------------------------------------------------------- /tests/Fixtures/config/security.yaml: -------------------------------------------------------------------------------- 1 | security: 2 | providers: 3 | in_memory: 4 | memory: 5 | users: 6 | admin: { password: adminpass, roles: [ 'ROLE_SUPER_ADMIN' ] } 7 | default: 8 | entity: { class: Aimeos\ShopBundle\Entity\User, property: username } 9 | 10 | password_hashers: 11 | Symfony\Component\Security\Core\User\InMemoryUser: plaintext 12 | Aimeos\ShopBundle\Entity\User: 13 | algorithm: bcrypt 14 | 15 | firewalls: 16 | login_firewall: 17 | pattern: ^/admin$ 18 | provider: in_memory 19 | http_basic: 20 | realm: "Admin Area" 21 | aimeos_jqadm: 22 | pattern: ^/unittest/jqadm 23 | provider: in_memory 24 | http_basic: 25 | realm: "Admin Area" 26 | aimeos_jsonadm: 27 | pattern: ^/unittest/jsonadm 28 | provider: in_memory 29 | http_basic: 30 | realm: "Admin Area" 31 | secured_area: 32 | pattern: ^/unittest 33 | provider: default 34 | http_basic: 35 | realm: "Default" 36 | 37 | access_control: 38 | - { path: ^/unittest/jqadm, roles: [ROLE_ADMIN, ROLE_SUPER_ADMIN] } 39 | - { path: ^/unittest/jsonadm, roles: [ROLE_ADMIN, ROLE_SUPER_ADMIN] } 40 | - { path: ^/unittest/de/EUR/shop/checkout, roles: ROLE_USER } 41 | -------------------------------------------------------------------------------- /Resources/views/Catalog/list.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_header %} 4 | {{ (aiheader['locale/select'] ?? '' )|raw }} 5 | {{ (aiheader['basket/mini'] ?? '' )|raw }} 6 | {{ (aiheader['catalog/search'] ?? '' )|raw }} 7 | {{ (aiheader['catalog/filter'] ?? '' )|raw }} 8 | {{ (aiheader['catalog/tree'] ?? '' )|raw }} 9 | {{ (aiheader['catalog/stage'] ?? '' )|raw }} 10 | {{ (aiheader['catalog/session'] ?? '' )|raw }} 11 | {{ (aiheader['catalog/lists'] ?? '' )|raw }} 12 | {% endblock %} 13 | 14 | {% block aimeos_head_basket %} 15 | {{ (aibody['basket/mini'] ?? '' )|raw }} 16 | {% endblock %} 17 | 18 | {% block aimeos_head_locale %} 19 | {{ (aibody['locale/select'] ?? '' )|raw }} 20 | {% endblock %} 21 | 22 | {% block aimeos_head_nav %} 23 | {{ (aibody['catalog/tree'] ?? '' )|raw }} 24 | {% endblock %} 25 | 26 | {% block aimeos_head_search %} 27 | {{ (aibody['catalog/search'] ?? '' )|raw }} 28 | {% endblock %} 29 | 30 | {% block aimeos_body %} 31 | {{ (aibody['catalog/stage'] ?? '' )|raw }} 32 |
33 |
34 | 38 |
39 | {{ (aibody['catalog/lists'] ?? '' )|raw }} 40 |
41 |
42 |
43 | {% endblock %} 44 | -------------------------------------------------------------------------------- /public/themes/default/assets/default-skin.svg: -------------------------------------------------------------------------------- 1 | default-skin 2 -------------------------------------------------------------------------------- /Resources/public/themes/default/account-watch.css: -------------------------------------------------------------------------------- 1 | .account-watch { 2 | padding: 2rem 0; 3 | } 4 | 5 | .account-watch .header { 6 | text-transform: uppercase; 7 | text-align: start; 8 | font-weight: normal; 9 | padding: 0.5rem 1rem; 10 | color: var(--ai-secondary); 11 | border-bottom: 1px solid var(--ai-secondary); 12 | } 13 | 14 | .account-watch form.delete { 15 | position: absolute; 16 | left: 0; 17 | top: 0; 18 | z-index: 5; 19 | } 20 | 21 | .account-watch .minibutton.delete { 22 | background-color: var(--ai-bg); 23 | padding: .5rem 0.75rem; 24 | z-index: 5; 25 | } 26 | 27 | .account-watch .watch-items { 28 | display: flex; 29 | flex-wrap: wrap; 30 | justify-content: space-around; 31 | } 32 | 33 | .account-watch .product.watch-item { 34 | position: relative; 35 | flex-direction: row; 36 | display: flex; 37 | min-width: 180px; 38 | max-width: 360px; 39 | width: 100%; 40 | margin: 1%; 41 | } 42 | 43 | .account-watch .watch-basic { 44 | margin: 1%; 45 | position: relative; 46 | display: inline-block; 47 | max-width: 50%; 48 | } 49 | 50 | .aimeos .product.watch-item .price-item .rebatepercent { 51 | position: absolute; 52 | } 53 | 54 | .account-watch .name { 55 | margin-top: 0.75rem; 56 | } 57 | 58 | .account-watch .watch-details { 59 | display: inline-block; 60 | text-align: center; 61 | max-width: 180px; 62 | min-width: 120px; 63 | margin: 1%; 64 | } 65 | 66 | .account-watch .btn, 67 | .account-watch .form-list label, 68 | .account-watch .form-list input, 69 | .account-watch .form-list select { 70 | width: 100%; 71 | } 72 | -------------------------------------------------------------------------------- /config/routing_jsonadm.yaml: -------------------------------------------------------------------------------- 1 | aimeos_shop_jsonadm_delete: 2 | path: /{resource}/{id} 3 | controller: Aimeos\ShopBundle\Controller\JsonadmController::deleteAction 4 | defaults: { id: null } 5 | methods: [DELETE] 6 | requirements: 7 | resource: '[a-z\/]+' 8 | 9 | aimeos_shop_jsonadm_get: 10 | path: /{resource}/{id} 11 | controller: Aimeos\ShopBundle\Controller\JsonadmController::getAction 12 | defaults: { id: null } 13 | methods: [GET] 14 | requirements: 15 | resource: '[a-z\/]+' 16 | 17 | aimeos_shop_jsonadm_patch: 18 | path: /{resource}/{id} 19 | controller: Aimeos\ShopBundle\Controller\JsonadmController::patchAction 20 | defaults: { id: null } 21 | methods: [PATCH] 22 | requirements: 23 | resource: '[a-z\/]+' 24 | 25 | aimeos_shop_jsonadm_post: 26 | path: /{resource}/{id} 27 | controller: Aimeos\ShopBundle\Controller\JsonadmController::postAction 28 | defaults: { id: null } 29 | methods: [POST] 30 | requirements: 31 | resource: '[a-z\/]+' 32 | 33 | aimeos_shop_jsonadm_put: 34 | path: /{resource}/{id} 35 | controller: Aimeos\ShopBundle\Controller\JsonadmController::putAction 36 | defaults: { id: null } 37 | methods: [PUT] 38 | requirements: 39 | resource: '[a-z\/]+' 40 | 41 | aimeos_shop_jsonadm_options: 42 | path: /{resource} 43 | controller: Aimeos\ShopBundle\Controller\JsonadmController::optionsAction 44 | defaults: { resource: '' } 45 | methods: [OPTIONS] 46 | requirements: 47 | resource: '.*' 48 | -------------------------------------------------------------------------------- /Resources/public/themes/default/assets/default-skin.svg: -------------------------------------------------------------------------------- 1 | default-skin 2 -------------------------------------------------------------------------------- /public/themes/default/account-watch.css: -------------------------------------------------------------------------------- 1 | .account-watch { 2 | margin: 1rem; 3 | padding: 0; 4 | } 5 | 6 | .account-watch .header { 7 | text-transform: uppercase; 8 | text-align: start; 9 | font-weight: normal; 10 | padding: 0.5rem 1rem; 11 | color: var(--ai-secondary); 12 | border-bottom: 1px solid var(--ai-secondary); 13 | } 14 | 15 | .account-watch form.delete { 16 | position: absolute; 17 | left: 0; 18 | top: 0; 19 | z-index: 5; 20 | } 21 | 22 | .account-watch .minibutton.delete { 23 | background-color: var(--ai-bg); 24 | padding: .5rem 0.75rem; 25 | z-index: 5; 26 | } 27 | 28 | .account-watch .watch-items { 29 | display: flex; 30 | flex-wrap: wrap; 31 | justify-content: space-around; 32 | } 33 | 34 | .account-watch .product.watch-item { 35 | position: relative; 36 | flex-direction: row; 37 | display: flex; 38 | min-width: 180px; 39 | max-width: 360px; 40 | width: 100%; 41 | margin: 1%; 42 | } 43 | 44 | .account-watch .watch-basic { 45 | margin: 1%; 46 | position: relative; 47 | display: inline-block; 48 | max-width: 50%; 49 | } 50 | 51 | .aimeos .product.watch-item .price-item .rebatepercent { 52 | position: absolute; 53 | } 54 | 55 | .account-watch .name { 56 | margin-top: 0.75rem; 57 | } 58 | 59 | .account-watch .watch-details { 60 | display: inline-block; 61 | text-align: center; 62 | max-width: 180px; 63 | min-width: 120px; 64 | margin: 1%; 65 | } 66 | 67 | .account-watch .btn, 68 | .account-watch .form-list label, 69 | .account-watch .form-list input, 70 | .account-watch .form-list select { 71 | width: 100%; 72 | } 73 | -------------------------------------------------------------------------------- /Resources/views/Catalog/tree.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_header %} 4 | {{ (aiheader['locale/select'] ?? '' )|raw }} 5 | {{ (aiheader['basket/mini'] ?? '' )|raw }} 6 | {{ (aiheader['catalog/search'] ?? '' )|raw }} 7 | {{ (aiheader['catalog/filter'] ?? '' )|raw }} 8 | {{ (aiheader['catalog/tree'] ?? '' )|raw }} 9 | {{ (aiheader['catalog/session'] ?? '' )|raw }} 10 | {{ (aiheader['catalog/stage'] ?? '' )|raw }} 11 | {{ (aiheader['catalog/lists'] ?? '' )|raw }} 12 | {% endblock %} 13 | 14 | {% block aimeos_head_basket %} 15 | {{ (aibody['basket/mini'] ?? '' )|raw }} 16 | {% endblock %} 17 | 18 | {% block aimeos_head_locale %} 19 | {{ (aibody['locale/select'] ?? '' )|raw }} 20 | {% endblock %} 21 | 22 | {% block aimeos_head_nav %} 23 | {{ (aibody['catalog/tree'] ?? '' )|raw }} 24 | {% endblock %} 25 | 26 | {% block aimeos_head_search %} 27 | {{ (aibody['catalog/search'] ?? '' )|raw }} 28 | {% endblock %} 29 | 30 | {% block aimeos_stage %} 31 | {{ (aibody['catalog/stage'] ?? '' )|raw }} 32 | {% endblock %} 33 | 34 | {% block aimeos_body %} 35 |
36 |
37 | 41 |
42 | {{ (aibody['catalog/lists'] ?? '' )|raw }} 43 |
44 |
45 |
46 | {% endblock %} 47 | -------------------------------------------------------------------------------- /tests/Fixtures/config/routing.yaml: -------------------------------------------------------------------------------- 1 | fos_user_security_logout: 2 | path: /logout 3 | 4 | 5 | aimeos_shop_terms: 6 | path: /{site}/{locale}/{currency}/terms 7 | controller: Aimeos\ShopBundle\Controller\PageController::terms 8 | 9 | aimeos_shop_privacy: 10 | path: /{site}/{locale}/{currency}/privacy 11 | controller: Aimeos\ShopBundle\Controller\CheckoutController::privacy 12 | 13 | 14 | aimeos_shop_adm: 15 | resource: "../../../config/routing_adm.yaml" 16 | 17 | aimeos_shop_graphql: 18 | resource: "../../../config/routing_graphql.yaml" 19 | prefix: /{site}/graphql 20 | 21 | aimeos_shop_jqadm: 22 | resource: "../../../config/routing_jqadm.yaml" 23 | prefix: /{site}/jqadm 24 | 25 | aimeos_shop_jsonadm: 26 | resource: "../../../config/routing_jsonadm.yaml" 27 | prefix: /{site}/jsonadm 28 | 29 | 30 | aimeos_shop_jsonapi: 31 | resource: "../../../config/routing_jsonapi.yaml" 32 | prefix: /{site}/{locale}/{currency}/jsonapi 33 | 34 | aimeos_shop_account: 35 | resource: "../../../config/routing_account.yaml" 36 | prefix: /{site}/{locale}/{currency}/profile 37 | 38 | aimeos_shop_default: 39 | resource: "../../../config/routing_default.yaml" 40 | prefix: /{site}/{locale}/{currency}/shop 41 | 42 | aimeos_shop_supplier: 43 | resource: "../../../config/routing_supplier.yaml" 44 | prefix: /{site}/{locale}/{currency}/s 45 | 46 | aimeos_shop_update: 47 | resource: "../../../config/routing_update.yaml" 48 | prefix: /{site}/{locale}/{currency} 49 | 50 | aimeos_shop_home: 51 | path: /{site}/{locale}/{currency}/ 52 | controller: Aimeos\ShopBundle\Controller\CatalogController::homeAction 53 | -------------------------------------------------------------------------------- /src/Service/Shop.php: -------------------------------------------------------------------------------- 1 | context = $container->get( 'aimeos.context' )->get(); 36 | 37 | $langid = $this->context->locale()->getLanguageId(); 38 | $tmplPaths = $container->get( 'aimeos' )->get()->getTemplatePaths( 'client/html/templates' ); 39 | 40 | $view = $container->get( 'aimeos.view' )->create( $this->context, $tmplPaths, $langid ); 41 | $this->context->setView( $view ); 42 | } 43 | 44 | 45 | /** 46 | * Returns the HTML client for the given name 47 | * 48 | * @param string $name Name of the shop component 49 | * @return \Aimeos\Client\Html\Iface HTML client 50 | */ 51 | public function get( $name ) 52 | { 53 | if( !isset( $this->objects[$name] ) ) 54 | { 55 | $client = \Aimeos\Client\Html::create( $this->context, $name ); 56 | $client->setView( $this->context->view() ); 57 | $client->init(); 58 | 59 | $this->objects[$name] = $client; 60 | } 61 | 62 | return $this->objects[$name]; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /tests/Command/AccountCommandTest.php: -------------------------------------------------------------------------------- 1 | createKernel(); 17 | $kernel->boot(); 18 | 19 | $container = static::getContainer(); 20 | 21 | $application = new Application( $kernel ); 22 | $application->add( new Command\AccountCommand( $container ) ); 23 | 24 | $command = $application->find( 'aimeos:account' ); 25 | $commandTester = new CommandTester( $command ); 26 | $commandTester->execute( array( 'command' => $command->getName(), 'site' => 'unittest', 'email' => 'unitCustomer@example.com', '--password' => 'test' ) ); 27 | 28 | $this->assertEquals( 0, $commandTester->getStatusCode() ); 29 | } 30 | 31 | 32 | public function testAccountCommandAdmin() 33 | { 34 | $kernel = $this->createKernel(); 35 | $kernel->boot(); 36 | 37 | $container = static::getContainer(); 38 | 39 | $application = new Application( $kernel ); 40 | $application->add( new Command\AccountCommand( $container ) ); 41 | 42 | $command = $application->find( 'aimeos:account' ); 43 | $commandTester = new CommandTester( $command ); 44 | $commandTester->execute( array( 'command' => $command->getName(), 'site' => 'unittest', 'email' => 'unitCustomer@example.com', '--password' => 'test', '--admin' => true ) ); 45 | 46 | $this->assertEquals( 0, $commandTester->getStatusCode() ); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-profile.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account profile actions 3 | */ 4 | AimeosAccountProfile = { 5 | 6 | /** 7 | * Enables/disables the address form 8 | */ 9 | onAddress() { 10 | 11 | document.querySelectorAll(".account-profile-address .address-item").forEach(el => { 12 | el.addEventListener("show.bs.collapse", ev => { 13 | $(".form-item.mandatory input, .form-item.mandatory select, .form-item.optional input, .form-item.optional select", ev.currentTarget).prop("disabled", false); 14 | }); 15 | }); 16 | 17 | document.querySelectorAll(".account-profile-address .address-item").forEach(el => { 18 | el.addEventListener("hidden.bs.collapse", ev => { 19 | $(".form-item input, .form-item select", ev.currentTarget).prop("disabled", true); 20 | }); 21 | }); 22 | }, 23 | 24 | 25 | /** 26 | * Show and close the address form 27 | */ 28 | onAddressToggle() { 29 | 30 | document.querySelectorAll(".account-profile-address .address-item").forEach(el => { 31 | el.addEventListener("show.bs.collapse", ev => { 32 | $(".act-show", ev.currentTarget).removeClass("act-show").addClass("act-hide"); 33 | }); 34 | }); 35 | 36 | document.querySelectorAll(".account-profile-address .address-item").forEach(el => { 37 | el.addEventListener("hidden.bs.collapse", ev => { 38 | $(".act-hide", ev.currentTarget).removeClass("act-hide").addClass("act-show"); 39 | }); 40 | }); 41 | }, 42 | 43 | 44 | /** 45 | * Initializes the account watch actions 46 | */ 47 | init() { 48 | if(this.once) return; 49 | this.once = true; 50 | 51 | this.onAddress(); 52 | this.onAddressToggle(); 53 | } 54 | }; 55 | 56 | 57 | $(function() { 58 | AimeosAccountProfile.init(); 59 | }); -------------------------------------------------------------------------------- /config/routing_default.yaml: -------------------------------------------------------------------------------- 1 | aimeos_shop_basket: 2 | path: /basket/{b_action} 3 | controller: Aimeos\ShopBundle\Controller\BasketController::indexAction 4 | defaults: { b_action: null } 5 | 6 | aimeos_shop_count: 7 | path: /count 8 | controller: Aimeos\ShopBundle\Controller\CatalogController::countAction 9 | defaults: { _format: js } 10 | 11 | aimeos_shop_checkout: 12 | path: /checkout/{c_step} 13 | controller: Aimeos\ShopBundle\Controller\CheckoutController::indexAction 14 | defaults: { c_step: null } 15 | 16 | aimeos_shop_confirm: 17 | path: /confirm/{code} 18 | controller: Aimeos\ShopBundle\Controller\CheckoutController::confirmAction 19 | defaults: { code: null } 20 | 21 | aimeos_shop_session_pinned: 22 | path: /pin 23 | controller: Aimeos\ShopBundle\Controller\CatalogController::sessionAction 24 | 25 | aimeos_shop_suggest: 26 | path: /suggest 27 | controller: Aimeos\ShopBundle\Controller\CatalogController::suggestAction 28 | defaults: { _format: json } 29 | 30 | aimeos_shop_stock: 31 | path: /stock 32 | controller: Aimeos\ShopBundle\Controller\CatalogController::stockAction 33 | defaults: { _format: js } 34 | 35 | aimeos_shop_tree: 36 | path: /{f_name}~{f_catid} 37 | controller: Aimeos\ShopBundle\Controller\CatalogController::treeAction 38 | requirements: 39 | f_name: '[^~]*' 40 | 41 | aimeos_shop_detail: 42 | path: /{d_name}/{d_pos}/{d_prodid} 43 | controller: Aimeos\ShopBundle\Controller\CatalogController::detailAction 44 | defaults: { d_pos: null, d_prodid: null } 45 | requirements: 46 | d_pos: '[0-9]*' 47 | 48 | aimeos_shop_list: 49 | path: '' 50 | controller: Aimeos\ShopBundle\Controller\CatalogController::listAction 51 | -------------------------------------------------------------------------------- /src/Controller/AccountController.php: -------------------------------------------------------------------------------- 1 | container->get( 'shop' ); 34 | 35 | foreach( $this->container->getParameter( 'aimeos_shop.page' )['account-index'] as $name ) 36 | { 37 | $params['aiheader'][$name] = $shop->get( $name )->header(); 38 | $params['aibody'][$name] = $shop->get( $name )->body(); 39 | } 40 | 41 | return new Response( 42 | $twig->render( '@AimeosShop/Account/index.html.twig', $params ), 43 | 200, ['Cache-Control' => 'no-store, , max-age=0'] 44 | ); 45 | } 46 | 47 | 48 | /** 49 | * Returns the html for the "My account" download page. 50 | * 51 | * @return Response Response object containing the generated output 52 | */ 53 | public function downloadAction() : Response 54 | { 55 | $response = $this->container->get( 'shop' )->get( 'account/download' )->view()->response(); 56 | return new Response( (string) $response->getBody(), $response->getStatusCode(), $response->getHeaders() ); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /tests/Fixtures/config/config.yaml: -------------------------------------------------------------------------------- 1 | imports: 2 | - { resource: security.yaml } 3 | - { resource: database.yaml } 4 | 5 | framework: 6 | test: ~ 7 | secret: aimeos 8 | form: ~ 9 | csrf_protection: ~ 10 | mailer: 11 | dsn: 'null://null' 12 | router: 13 | resource: "%kernel.project_dir%/tests/Fixtures/config/routing.yaml" 14 | session: 15 | handler_id: ~ 16 | storage_factory_id: session.storage.factory.mock_file 17 | http_method_override: false 18 | 19 | monolog: 20 | handlers: 21 | main: 22 | type: stream 23 | level: debug 24 | 25 | twig: 26 | debug: "%kernel.debug%" 27 | strict_variables: "%kernel.debug%" 28 | paths: 29 | "%kernel.project_dir%/tests/Fixtures/templates": ~ 30 | 31 | doctrine: 32 | dbal: 33 | driver: "%database_driver%" 34 | host: "%database_host%" 35 | port: "%database_port%" 36 | dbname: "%database_name%" 37 | user: "%database_user%" 38 | password: "%database_password%" 39 | charset: utf8mb4 40 | orm: 41 | auto_generate_proxy_classes: "%kernel.debug%" 42 | auto_mapping: true 43 | 44 | aimeos_shop: 45 | disable_sites: false 46 | client: 47 | html: 48 | catalog: 49 | home: 50 | url: 51 | target: aimeos_shop_home 52 | mshop: 53 | customer: 54 | manager: 55 | name: Standard 56 | password: 57 | name: Standard 58 | options: 59 | format: "%%1$s{%%2$s}" 60 | madmin: 61 | cache: 62 | manager: 63 | name: None 64 | -------------------------------------------------------------------------------- /src/EventListener/CsrfListener.php: -------------------------------------------------------------------------------- 1 | tokenManager = $tokenManager; 38 | } 39 | 40 | 41 | /** 42 | * Handles the kernel request 43 | * 44 | * @param KernelEvent $event Request event object 45 | */ 46 | public function onKernelRequest( KernelEvent $event ) 47 | { 48 | $request = $event->getRequest(); 49 | 50 | if( !in_array( $request->getMethod(), ['POST', 'PUT', 'PATCH', 'DELETE'] ) ) { 51 | return; 52 | } 53 | 54 | $token = ''; 55 | 56 | if( $request->request->has( '_token' ) ) { 57 | $token = $request->request->get( '_token' ); 58 | } elseif( $request->query->has( '_token' ) ) { 59 | $token = $request->query->get( '_token' ); 60 | } 61 | 62 | $csrfToken = new CsrfToken( '_token', $token ); 63 | 64 | if( !$this->tokenManager->isTokenValid( $csrfToken ) ) { 65 | $event->setResponse( new Response( 'Page expired', 419 ) ); 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/Service/Aimeos.php: -------------------------------------------------------------------------------- 1 | container = $container; 35 | } 36 | 37 | 38 | /** 39 | * Returns the Aimeos object. 40 | * 41 | * @return \Aimeos Aimeos object 42 | */ 43 | public function get() 44 | { 45 | if( $this->object === null ) { 46 | $this->object = new \Aimeos\Bootstrap( [], false ); 47 | } 48 | 49 | return $this->object; 50 | } 51 | 52 | 53 | /** 54 | * Returns the version of the Aimeos package 55 | * 56 | * @return string Version string 57 | */ 58 | public function getVersion() 59 | { 60 | $filename = dirname( $this->container->get( 'kernel' )->getProjectDir() ) . DIRECTORY_SEPARATOR . 'composer.lock'; 61 | 62 | if( file_exists( $filename ) === true && ( $content = file_get_contents( $filename ) ) !== false 63 | && ( $content = json_decode( $content, true ) ) !== null && isset( $content['packages'] ) 64 | ) { 65 | foreach( (array) $content['packages'] as $item ) 66 | { 67 | if( $item['name'] === 'aimeos/aimeos-symfony' ) { 68 | return $item['version']; 69 | } 70 | } 71 | } 72 | 73 | return ''; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /public/themes/default/account-watch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account watch actions 3 | */ 4 | AimeosAccountWatch = { 5 | 6 | /** 7 | * Deletes a watched item without page reload 8 | */ 9 | onRemoveProduct() { 10 | 11 | $("body").on("click", ".account-watch .delete", async ev => { 12 | 13 | const form = $(ev.currentTarget).closest("form"); 14 | $(ev.currentTarget).closest("watch-item").addClass("loading"); 15 | 16 | await fetch(form.attr("action"), { 17 | body: new FormData(form[0]), 18 | method: 'POST' 19 | }).then(response => { 20 | return response.text(); 21 | }).then(data => { 22 | const doc = $("").html(data); 23 | 24 | $(".aimeos.account-watch").replaceWith($(".aimeos.account-watch", doc)); 25 | 26 | if(!$(".aimeos.account-watch .watch-items").length) { 27 | Aimeos.removeOverlay(); 28 | } 29 | }); 30 | 31 | return false; 32 | }); 33 | }, 34 | 35 | 36 | /** 37 | * Saves a modifed watched item without page reload 38 | */ 39 | onSaveProduct() { 40 | 41 | $("body").on("click", ".account-watch .btn-action", async ev => { 42 | 43 | const form = $(ev.currentTarget).closest("form"); 44 | form.addClass("loading"); 45 | 46 | await fetch(form.attr("action"), { 47 | body: new FormData(form[0]), 48 | method: 'POST' 49 | }).then(response => { 50 | return response.text(); 51 | }).then(data => { 52 | const doc = $("").html(data); 53 | $(".aimeos.account-watch").replaceWith($(".aimeos.account-watch", doc)); 54 | }); 55 | 56 | return false; 57 | }); 58 | }, 59 | 60 | 61 | /** 62 | * Initializes the account watch actions 63 | */ 64 | init() { 65 | 66 | this.onRemoveProduct(); 67 | this.onSaveProduct(); 68 | } 69 | }; 70 | 71 | 72 | $(function() { 73 | AimeosAccountWatch.init(); 74 | }); -------------------------------------------------------------------------------- /Resources/views/Account/index.html.twig: -------------------------------------------------------------------------------- 1 | {% extends '@AimeosShop/base.html.twig' %} 2 | 3 | {% block aimeos_header %} 4 | Profile 5 | {{ (aiheader['locale/select'] ?? '')|raw }} 6 | {{ (aiheader['basket/mini'] ?? '')|raw }} 7 | {{ (aiheader['account/profile'] ?? '')|raw }} 8 | {{ (aiheader['account/review'] ?? '')|raw }} 9 | {{ (aiheader['account/subscription'] ?? '')|raw }} 10 | {{ (aiheader['account/basket'] ?? '')|raw }} 11 | {{ (aiheader['account/history'] ?? '')|raw }} 12 | {{ (aiheader['account/favorite'] ?? '')|raw }} 13 | {{ (aiheader['account/watch'] ?? '')|raw }} 14 | {{ (aiheader['catalog/search'] ?? '')|raw }} 15 | {{ (aiheader['catalog/session'] ?? '')|raw }} 16 | {{ (aiheader['catalog/tree'] ?? '')|raw }} 17 | {% endblock %} 18 | 19 | {% block aimeos_head_basket %} 20 | {{ (aibody['basket/mini'] ?? '')|raw }} 21 | {% endblock %} 22 | 23 | {% block aimeos_nav %} 24 | {{ (aibody['catalog/tree'] ?? '')|raw }} 25 | {% endblock %} 26 | 27 | {% block aimeos_head_locale %} 28 | {{ (aibody['locale/select'] ?? '')|raw }} 29 | {% endblock %} 30 | 31 | {% block aimeos_search %} 32 | {{ (aibody['catalog/search'] ?? '')|raw }} 33 | {% endblock %} 34 | 35 | {% block aimeos_body %} 36 |
37 | {{ (aibody['account/profile'] ?? '')|raw }} 38 | {{ (aibody['account/review'] ?? '')|raw }} 39 | {{ (aibody['account/subscription'] ?? '')|raw }} 40 | {{ (aibody['account/basket'] ?? '')|raw }} 41 | {{ (aibody['account/history'] ?? '')|raw }} 42 | {{ (aibody['account/favorite'] ?? '')|raw }} 43 | {{ (aibody['account/watch'] ?? '')|raw }} 44 |
45 | {% endblock %} 46 | 47 | {% block aimeos_aside %} 48 | {{ (aibody['catalog/session'] ?? '')|raw }} 49 | {% endblock %} 50 | -------------------------------------------------------------------------------- /public/themes/default/catalog-session.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Catalog session client actions 3 | */ 4 | AimeosCatalogSession = { 5 | 6 | /** 7 | * Toggles the Last Seen filters if hover isn't available 8 | */ 9 | onToggleSeen() { 10 | 11 | $('.catalog-session-seen .header').on("click", ev => { 12 | $(".seen-items", $(ev.currentTarget).closest(".catalog-session-seen")).each((idx, el) => { 13 | slideToggle(el, 300); 14 | }); 15 | }); 16 | }, 17 | 18 | 19 | /** 20 | * Toggles pinned items 21 | */ 22 | onTogglePinned() { 23 | 24 | $('.catalog-session-pinned .header').on("click", ev => { 25 | $(".pinned-items", $(ev.currentTarget).closest(".catalog-session-pinned")).each((idx, el) => { 26 | slideToggle(el, 300); 27 | }); 28 | }); 29 | }, 30 | 31 | 32 | /** 33 | * Delete a product without page reload 34 | */ 35 | onRemovePinned() { 36 | 37 | $("body").on("click", ".catalog-session-pinned .delete", async ev => { 38 | 39 | const form = $(ev.currentTarget).closest("form"); 40 | const prodid = $(ev.currentTarget).closest(".product").data('prodid'); 41 | 42 | await fetch(form.attr("action"), { 43 | method: "POST", 44 | body: new FormData(form[0]) 45 | }).then(response => { 46 | return response.text(); 47 | }).then(data => { 48 | const doc = $("").html(data); 49 | 50 | $(".catalog-session-pinned").replaceWith($(".catalog-session-pinned", doc)); 51 | $('.product[data-prodid="' + prodid + '"] .btn-pin').removeClass('active'); 52 | }); 53 | 54 | return false; 55 | }); 56 | }, 57 | 58 | 59 | /** 60 | * Initializes the catalog session actions 61 | */ 62 | init: function() { 63 | this.onRemovePinned(); 64 | this.onTogglePinned(); 65 | this.onToggleSeen(); 66 | } 67 | }; 68 | 69 | 70 | $(function() { 71 | AimeosCatalogSession.init(); 72 | }); -------------------------------------------------------------------------------- /Resources/public/themes/default/account-watch.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Account watch actions 3 | */ 4 | AimeosAccountWatch = { 5 | 6 | /** 7 | * Deletes a watched item without page reload 8 | */ 9 | onRemoveProduct() { 10 | 11 | $("body").on("click", ".account-watch .delete", async ev => { 12 | 13 | const form = $(ev.currentTarget).closest("form"); 14 | $(ev.currentTarget).closest("watch-item").addClass("loading"); 15 | 16 | await fetch(form.attr("action"), { 17 | body: new FormData(form[0]), 18 | method: 'POST' 19 | }).then(response => { 20 | return response.text(); 21 | }).then(data => { 22 | const doc = $("").html(data); 23 | 24 | $(".aimeos.account-watch").replaceWith($(".aimeos.account-watch", doc)); 25 | 26 | if(!$(".aimeos.account-watch .watch-items").length) { 27 | Aimeos.removeOverlay(); 28 | } 29 | }); 30 | 31 | return false; 32 | }); 33 | }, 34 | 35 | 36 | /** 37 | * Saves a modifed watched item without page reload 38 | */ 39 | onSaveProduct() { 40 | 41 | $("body").on("click", ".account-watch .btn-action", async ev => { 42 | 43 | const form = $(ev.currentTarget).closest("form"); 44 | form.addClass("loading"); 45 | 46 | await fetch(form.attr("action"), { 47 | body: new FormData(form[0]), 48 | method: 'POST' 49 | }).then(response => { 50 | return response.text(); 51 | }).then(data => { 52 | const doc = $("").html(data); 53 | $(".aimeos.account-watch").replaceWith($(".aimeos.account-watch", doc)); 54 | }); 55 | 56 | return false; 57 | }); 58 | }, 59 | 60 | 61 | /** 62 | * Initializes the account watch actions 63 | */ 64 | init() { 65 | if(this.once) return; 66 | this.once = true; 67 | 68 | this.onRemoveProduct(); 69 | this.onSaveProduct(); 70 | } 71 | }; 72 | 73 | 74 | $(function() { 75 | AimeosAccountWatch.init(); 76 | }); -------------------------------------------------------------------------------- /src/Command/ClearCommand.php: -------------------------------------------------------------------------------- 1 | container = $container; 37 | } 38 | 39 | 40 | /** 41 | * Configures the command name and description. 42 | */ 43 | protected function configure() 44 | { 45 | $this->setName( self::$defaultName ); 46 | $this->setDescription( 'Clears the content cache' ); 47 | $this->addArgument( 'site', InputArgument::OPTIONAL, 'Site codes to clear the cache like "default unittest" (none for all)' ); 48 | } 49 | 50 | 51 | /** 52 | * Executes the job controllers. 53 | * 54 | * @param InputInterface $input Input object 55 | * @param OutputInterface $output Output object 56 | */ 57 | protected function execute( InputInterface $input, OutputInterface $output ) 58 | { 59 | $context = $this->container->get( 'aimeos.context' )->get( false, 'command' ); 60 | $context->setEditor( 'aimeos:clear' ); 61 | 62 | \Aimeos\MAdmin::create( $context, 'cache' )->getCache()->clear(); 63 | return 0; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Resources/public/themes/default/catalog-session.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Catalog session client actions 3 | */ 4 | AimeosCatalogSession = { 5 | 6 | /** 7 | * Toggles the Last Seen filters if hover isn't available 8 | */ 9 | onToggleSeen() { 10 | 11 | $('.catalog-session-seen .header').on("click", ev => { 12 | $(".seen-items", $(ev.currentTarget).closest(".catalog-session-seen")).each((idx, el) => { 13 | slideToggle(el, 300); 14 | }); 15 | }); 16 | }, 17 | 18 | 19 | /** 20 | * Toggles pinned items 21 | */ 22 | onTogglePinned() { 23 | 24 | $('.catalog-session-pinned .header').on("click", ev => { 25 | $(".pinned-items", $(ev.currentTarget).closest(".catalog-session-pinned")).each((idx, el) => { 26 | slideToggle(el, 300); 27 | }); 28 | }); 29 | }, 30 | 31 | 32 | /** 33 | * Delete a product without page reload 34 | */ 35 | onRemovePinned() { 36 | 37 | $("body").on("click", ".catalog-session-pinned .delete", async ev => { 38 | 39 | const form = $(ev.currentTarget).closest("form"); 40 | const prodid = $(ev.currentTarget).closest(".product").data('prodid'); 41 | 42 | await fetch(form.attr("action"), { 43 | method: "POST", 44 | body: new FormData(form[0]) 45 | }).then(response => { 46 | return response.text(); 47 | }).then(data => { 48 | const doc = $("").html(data); 49 | 50 | $(".catalog-session-pinned").replaceWith($(".catalog-session-pinned", doc)); 51 | $('.product[data-prodid="' + prodid + '"] .btn-pin').removeClass('active'); 52 | }); 53 | 54 | return false; 55 | }); 56 | }, 57 | 58 | 59 | /** 60 | * Initializes the catalog session actions 61 | */ 62 | init: function() { 63 | if(this.once) return; 64 | this.once = true; 65 | 66 | this.onRemovePinned(); 67 | this.onTogglePinned(); 68 | this.onToggleSeen(); 69 | } 70 | }; 71 | 72 | 73 | $(function() { 74 | AimeosCatalogSession.init(); 75 | }); -------------------------------------------------------------------------------- /public/themes/default/basket-standard.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Basket standard client actions 3 | */ 4 | AimeosBasketStandard = { 5 | 6 | /** 7 | * Hides the update button and show only on quantity change 8 | */ 9 | onQuantity() { 10 | 11 | $(".basket-standard .btn-update").hide(); 12 | 13 | $(document).on("focusin", ".basket-standard .basket .product-item .quantity .value", {}, ev => { 14 | const target = $(ev.currentTarget).closest('.basket-standard'); 15 | 16 | $(".btn-update", target).show(); 17 | $(".btn-action", target).hide(); 18 | }); 19 | }, 20 | 21 | 22 | /** 23 | * Updates basket without page reload 24 | */ 25 | onSubmit() { 26 | 27 | $(document).on("submit", ".basket-standard form", ev => { 28 | Aimeos.createSpinner(); 29 | 30 | fetch($(ev.submitter).attr("formaction") || $(ev.currentTarget).attr("action"), { 31 | body: new FormData(ev.currentTarget), 32 | method: 'POST' 33 | }).then(response => { 34 | return response.text(); 35 | }).then(data => { 36 | $(".basket-standard").html(AimeosBasket.updateBasket(data).html()); 37 | }).finally(() => { 38 | Aimeos.removeSpinner(); 39 | }); 40 | 41 | return false; 42 | }); 43 | }, 44 | 45 | 46 | /** 47 | * Updates quantity and deletes products without page reload 48 | */ 49 | onChange() { 50 | 51 | $(document).on("click", ".basket-standard a.change", ev => { 52 | Aimeos.createSpinner(); 53 | 54 | fetch($(ev.currentTarget).attr("href")).then(response => { 55 | return response.text(); 56 | }).then(data => { 57 | $(".basket-standard").html(AimeosBasket.updateBasket(data).html()); 58 | }).finally(() => { 59 | Aimeos.removeSpinner(); 60 | }); 61 | 62 | return false; 63 | }); 64 | }, 65 | 66 | 67 | /** 68 | * Initializes the basket standard actions 69 | */ 70 | init() { 71 | this.onChange(); 72 | this.onSubmit(); 73 | this.onQuantity(); 74 | } 75 | }; 76 | 77 | 78 | $(function() { 79 | AimeosBasketStandard.init(); 80 | }); -------------------------------------------------------------------------------- /src/Command/Command.php: -------------------------------------------------------------------------------- 1 | config(); 35 | 36 | foreach( (array) $input->getOption( 'option' ) as $option ) 37 | { 38 | list( $name, $value ) = explode( ':', $option ); 39 | $config->set( $name, $value ); 40 | } 41 | 42 | return $ctx; 43 | } 44 | 45 | 46 | /** 47 | * Returns the enabled site items which may be limited by the input arguments. 48 | * 49 | * @param \Aimeos\MShop\ContextIface $context Context item object 50 | * @param InputInterface $input Input object 51 | * @return \Aimeos\Map List of site items implementing \Aimeos\MShop\Locale\Item\Site\Interface 52 | */ 53 | protected function getSiteItems( \Aimeos\MShop\ContextIface $context, InputInterface $input ) : \Aimeos\Map 54 | { 55 | $manager = \Aimeos\MShop::create( $context, 'locale/site' ); 56 | $search = $manager->filter(); 57 | 58 | if( ( $codes = (string) $input->getArgument( 'site' ) ) !== '' ) { 59 | $search->setConditions( $search->compare( '==', 'locale.site.code', explode( ' ', $codes ) ) ); 60 | } 61 | 62 | return $manager->search( $search ); 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/Service/I18n.php: -------------------------------------------------------------------------------- 1 | container = $container; 35 | } 36 | 37 | 38 | /** 39 | * Creates new translation objects. 40 | * 41 | * @param array $languageIds List of two letter ISO language IDs 42 | * @return \Aimeos\Base\Translation\Interface[] List of translation objects 43 | */ 44 | public function get( array $languageIds ) 45 | { 46 | $i18nPaths = $this->container->get( 'aimeos' )->get()->getI18nPaths(); 47 | 48 | foreach( $languageIds as $langid ) 49 | { 50 | if( !isset( $this->i18n[$langid] ) ) 51 | { 52 | $i18n = new \Aimeos\Base\Translation\Gettext( $i18nPaths, $langid ); 53 | 54 | $apc = (bool) $this->container->getParameter( 'aimeos_shop.apc_enable' ); 55 | $prefix = $this->container->getParameter( 'aimeos_shop.apc_prefix' ); 56 | 57 | if( function_exists( 'apcu_store' ) === true && $apc === true ) { 58 | $i18n = new \Aimeos\Base\Translation\Decorator\APC( $i18n, $prefix ); 59 | } 60 | 61 | $translations = $this->container->getParameter( 'aimeos_shop.i18n' ); 62 | 63 | if( isset( $translations[$langid] ) ) { 64 | $i18n = new \Aimeos\Base\Translation\Decorator\Memory( $i18n, $translations[$langid] ); 65 | } 66 | 67 | $this->i18n[$langid] = $i18n; 68 | } 69 | } 70 | 71 | return $this->i18n; 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /.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.1 / mysql-5.7": 9 | docker: 10 | - image: aimeos/ci-php:8.1 11 | - image: circleci/mysql:5.7 12 | environment: 13 | MYSQL_ROOT_PASSWORD: rootpw 14 | MYSQL_DATABASE: symfony 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 | - restore_cache: 21 | keys: 22 | - php73-{{ checksum "composer.json" }} 23 | - run: php composer update -n --prefer-dist 24 | - save_cache: 25 | key: php73-{{ checksum "composer.json" }} 26 | paths: [./vendor] 27 | - run: for i in `seq 1 10`; do nc -z 127.0.0.1 3306 && echo OK && exit 0; echo -n .; sleep 1; done 28 | - run: ./vendor/bin/phpunit --coverage-clover coverage.xml 29 | 30 | "php-8.2 / mysql-8.0": 31 | docker: 32 | - image: aimeos/ci-php:8.2 33 | - image: circleci/mysql:8.0 34 | environment: 35 | MYSQL_ROOT_PASSWORD: rootpw 36 | MYSQL_DATABASE: symfony 37 | MYSQL_USER: aimeos 38 | MYSQL_PASSWORD: aimeos 39 | steps: 40 | - checkout 41 | - run: wget https://getcomposer.org/download/latest-stable/composer.phar -O composer 42 | - restore_cache: 43 | keys: 44 | - php74-{{ checksum "composer.json" }} 45 | - run: php composer update -n --prefer-dist 46 | - save_cache: 47 | key: php74-{{ checksum "composer.json" }} 48 | paths: [./vendor] 49 | - run: for i in `seq 1 10`; do nc -z 127.0.0.1 3306 && echo OK && exit 0; echo -n .; sleep 1; done 50 | - run: ./vendor/bin/phpunit --coverage-clover coverage.xml 51 | 52 | workflows: 53 | version: 2 54 | unittest: 55 | jobs: 56 | - "php-8.1 / mysql-5.7" 57 | - "php-8.2 / mysql-8.0" 58 | -------------------------------------------------------------------------------- /src/DependencyInjection/Configuration.php: -------------------------------------------------------------------------------- 1 | getRootNode() 35 | ->children() 36 | ->booleanNode( 'disable_sites' )->defaultValue( true )->end() 37 | ->booleanNode( 'apc_enable' )->defaultValue( false )->end() 38 | ->scalarNode( 'apc_prefix' )->defaultValue( 'sf2:' )->end() 39 | ->scalarNode( 'uploaddir' )->end() 40 | ->variableNode( 'admin' )->defaultValue( array() )->end() 41 | ->variableNode( 'client' )->defaultValue( array() )->end() 42 | ->variableNode( 'controller' )->defaultValue( array() )->end() 43 | ->variableNode( 'i18n' )->defaultValue( array() )->end() 44 | ->variableNode( 'madmin' )->defaultValue( array() )->end() 45 | ->variableNode( 'mshop' )->defaultValue( array() )->end() 46 | ->variableNode( 'resource' )->defaultValue( array() )->end() 47 | ->variableNode( 'page' )->defaultValue( array() )->end() 48 | ->variableNode( 'backend' )->defaultValue( array() )->end() 49 | ->variableNode( 'frontend' )->defaultValue( array() )->end() 50 | ->variableNode( 'command' )->defaultValue( array() )->end() 51 | ->end() 52 | ; 53 | 54 | return $treeBuilder; 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Resources/public/themes/default/basket-standard.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Basket standard client actions 3 | */ 4 | AimeosBasketStandard = { 5 | 6 | /** 7 | * Hides the update button and show only on quantity change 8 | */ 9 | onQuantity() { 10 | 11 | $(".basket-standard .btn-update").hide(); 12 | 13 | $(document).on("focusin", ".basket-standard .basket .product-item .quantity .value", {}, ev => { 14 | const target = $(ev.currentTarget).closest('.basket-standard'); 15 | 16 | $(".btn-update", target).show(); 17 | $(".btn-action", target).hide(); 18 | }); 19 | }, 20 | 21 | 22 | /** 23 | * Updates basket without page reload 24 | */ 25 | onSubmit() { 26 | 27 | $(document).on("submit", ".basket-standard form", ev => { 28 | Aimeos.createSpinner(); 29 | const selector = ev.submitter || ev.originalEvent.submitter; 30 | 31 | fetch($(selector).attr("formaction") || $(ev.currentTarget).attr("action"), { 32 | body: new FormData(ev.currentTarget), 33 | method: 'POST' 34 | }).then(response => { 35 | return response.text(); 36 | }).then(data => { 37 | $(".basket-standard").html(AimeosBasket.updateBasket(data).html()); 38 | }).finally(() => { 39 | Aimeos.removeSpinner(); 40 | }); 41 | 42 | return false; 43 | }); 44 | }, 45 | 46 | 47 | /** 48 | * Updates quantity and deletes products without page reload 49 | */ 50 | onChange() { 51 | 52 | $(document).on("click", ".basket-standard a.change", ev => { 53 | Aimeos.createSpinner(); 54 | 55 | fetch($(ev.currentTarget).attr("href")).then(response => { 56 | return response.text(); 57 | }).then(data => { 58 | $(".basket-standard").html(AimeosBasket.updateBasket(data).html()); 59 | }).finally(() => { 60 | Aimeos.removeSpinner(); 61 | }); 62 | 63 | return false; 64 | }); 65 | }, 66 | 67 | 68 | /** 69 | * Initializes the basket standard actions 70 | */ 71 | init() { 72 | if(this.once) return; 73 | this.once = true; 74 | 75 | this.onChange(); 76 | this.onSubmit(); 77 | this.onQuantity(); 78 | } 79 | }; 80 | 81 | 82 | $(function() { 83 | AimeosBasketStandard.init(); 84 | }); -------------------------------------------------------------------------------- /public/themes/default/locale-select.css: -------------------------------------------------------------------------------- 1 | /* Locale selector */ 2 | .locale-select { 3 | display: inline-block; 4 | } 5 | 6 | .locale-select .header { 7 | display: none; 8 | } 9 | 10 | .locale-select ul.select-menu { 11 | text-transform: uppercase; 12 | position: relative; 13 | list-style: none; 14 | padding: 0; 15 | margin: 0; 16 | } 17 | 18 | .locale-select li.select-dropdown { 19 | border: 1px solid transparent; 20 | display: inline-block; 21 | padding: 0; 22 | } 23 | 24 | .locale-select li.select-dropdown > a:before { 25 | content: "» "; 26 | } 27 | 28 | .locale-select ul.select-menu a { 29 | text-decoration: none; 30 | white-space: nowrap; 31 | display: block; 32 | padding: 0.25rem; 33 | line-height: 1; 34 | } 35 | 36 | .locale-select ul.select-menu a:hover, 37 | .locale-select ul.select-menu a:link, 38 | .locale-select ul.select-menu a:visited { 39 | color: var(--ai-bg); 40 | text-decoration: none; 41 | } 42 | 43 | .locale-select ul.select-menu .select-current > a:hover 44 | .locale-select ul.select-menu .select-current > a:link:hover, 45 | .locale-select ul.select-menu .select-current > a:visited:hover { 46 | color: var(--ai-bg); 47 | } 48 | 49 | .locale-select ul.select-menu a:hover { 50 | color: var(--ai-tertiary) !important; 51 | } 52 | 53 | .locale-select ul.select-menu li.select-dropdown:hover > ul, 54 | .locale-select ul.select-menu ul.active { 55 | border: 1px solid var(--ai-bg); 56 | visibility: visible; 57 | opacity: 1; 58 | } 59 | 60 | .locale-select ul.select-menu ul { 61 | list-style: none outside none; 62 | position: absolute; 63 | visibility: hidden; 64 | z-index: 99999; 65 | opacity: 0; 66 | padding: 0.5rem 0; 67 | z-index: 1000; 68 | border-radius: var(--ai-radius); 69 | border: 1px solid var(--ai-tertiary); 70 | background-color: var(--ai-primary); 71 | } 72 | 73 | .locale-select ul.select-menu ul li { 74 | padding: .25rem 0.5rem; 75 | } 76 | 77 | .locale-select li.select-dropdown ul.select-dropdown li:hover { 78 | background-color: var(--ai-secondary); 79 | } 80 | 81 | .locale-select li.select-dropdown ul.select-dropdown li:hover a { 82 | color: var(--ai-bg); 83 | } 84 | 85 | .locale-select-language, 86 | .locale-select-currency { 87 | display: block; 88 | min-width: 2rem; 89 | } 90 | -------------------------------------------------------------------------------- /src/DependencyInjection/AimeosShopExtension.php: -------------------------------------------------------------------------------- 1 | processConfiguration( $configuration, $configs ); 38 | 39 | foreach( $configs as $list ) { 40 | $config = array_replace_recursive( $config, $list ); 41 | } 42 | 43 | foreach( $config as $key => $value ) { 44 | $container->setParameter( 'aimeos_shop.' . $key, $value ); 45 | } 46 | 47 | $loader = new Loader\YamlFileLoader( $container, new FileLocator( dirname( __DIR__, 2 ) . '/config' ) ); 48 | $loader->load( 'services.yaml' ); 49 | } 50 | 51 | 52 | /** 53 | * Allows an extension to prepend the extension configurations. 54 | * 55 | * @param ContainerBuilder $container ContainerBuilder object 56 | */ 57 | public function prepend( ContainerBuilder $container ) 58 | { 59 | $configFile = dirname( __DIR__, 2 ) . '/config/aimeos_shop.yaml'; 60 | $config = Yaml::parse( file_get_contents( $configFile ) ); 61 | 62 | $container->prependExtensionConfig( 'aimeos_shop', $config ); 63 | $container->addResource( new FileResource( $configFile ) ); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Resources/public/themes/default/locale-select.css: -------------------------------------------------------------------------------- 1 | /* Locale selector */ 2 | .locale-select { 3 | display: inline-block; 4 | } 5 | 6 | .locale-select .header { 7 | display: none; 8 | } 9 | 10 | .locale-select ul.select-menu { 11 | text-transform: uppercase; 12 | position: relative; 13 | list-style: none; 14 | padding: 0; 15 | margin: 0; 16 | } 17 | 18 | .locale-select li.select-dropdown { 19 | border: 1px solid transparent; 20 | display: inline-block; 21 | padding: 0; 22 | } 23 | 24 | .locale-select li.select-dropdown > a:before { 25 | content: "» "; 26 | } 27 | 28 | .locale-select ul.select-menu a { 29 | text-decoration: none; 30 | white-space: nowrap; 31 | display: block; 32 | padding: 0.25rem; 33 | line-height: 1; 34 | } 35 | 36 | .locale-select ul.select-menu a:hover, 37 | .locale-select ul.select-menu a:link, 38 | .locale-select ul.select-menu a:visited { 39 | color: var(--ai-bg); 40 | text-decoration: none; 41 | } 42 | 43 | .locale-select ul.select-menu .select-current > a:hover 44 | .locale-select ul.select-menu .select-current > a:link:hover, 45 | .locale-select ul.select-menu .select-current > a:visited:hover { 46 | color: var(--ai-bg); 47 | } 48 | 49 | .locale-select ul.select-menu a:hover { 50 | color: var(--ai-tertiary) !important; 51 | } 52 | 53 | .locale-select ul.select-menu li.select-dropdown:hover > ul, 54 | .locale-select ul.select-menu ul.active { 55 | border: 1px solid var(--ai-bg); 56 | visibility: visible; 57 | opacity: 1; 58 | } 59 | 60 | .locale-select ul.select-menu ul { 61 | list-style: none outside none; 62 | position: absolute; 63 | visibility: hidden; 64 | z-index: 99999; 65 | opacity: 0; 66 | padding: 0.5rem 0; 67 | z-index: 1000; 68 | border-radius: var(--ai-radius); 69 | border: 1px solid var(--ai-tertiary); 70 | background-color: var(--ai-primary); 71 | } 72 | 73 | .locale-select ul.select-menu ul li { 74 | padding: .25rem 0.5rem; 75 | } 76 | 77 | .locale-select li.select-dropdown ul.select-dropdown li:hover { 78 | background-color: var(--ai-secondary); 79 | } 80 | 81 | .locale-select li.select-dropdown ul.select-dropdown li:hover a { 82 | color: var(--ai-bg); 83 | } 84 | 85 | .locale-select-language, 86 | .locale-select-currency { 87 | display: block; 88 | min-width: 2rem; 89 | } 90 | -------------------------------------------------------------------------------- /src/Service/Config.php: -------------------------------------------------------------------------------- 1 | container = $container; 34 | } 35 | 36 | 37 | /** 38 | * Returns the config object 39 | * 40 | * @param string $type Configuration type ("frontend" or "backend") 41 | * @return \Aimeos\Base\Config\Iface Config object 42 | */ 43 | public function get( $type = 'frontend' ) 44 | { 45 | $configPaths = $this->container->get( 'aimeos' )->get()->getConfigPaths(); 46 | 47 | $conf = new \Aimeos\Base\Config\PHPArray( [], $configPaths ); 48 | 49 | $apc = (bool) $this->container->getParameter( 'aimeos_shop.apc_enable' ); 50 | $prefix = $this->container->getParameter( 'aimeos_shop.apc_prefix' ); 51 | 52 | if( function_exists( 'apcu_store' ) === true && $apc === true ) { 53 | $conf = new \Aimeos\Base\Config\Decorator\APC( $conf, $prefix ); 54 | } 55 | 56 | $local = array( 57 | 'admin' => $this->container->getParameter( 'aimeos_shop.admin' ), 58 | 'client' => $this->container->getParameter( 'aimeos_shop.client' ), 59 | 'controller' => $this->container->getParameter( 'aimeos_shop.controller' ), 60 | 'madmin' => $this->container->getParameter( 'aimeos_shop.madmin' ), 61 | 'mshop' => $this->container->getParameter( 'aimeos_shop.mshop' ), 62 | 'resource' => $this->container->getParameter( 'aimeos_shop.resource' ), 63 | ); 64 | 65 | $config = new \Aimeos\Base\Config\Decorator\Memory( $conf, $local ); 66 | $settings = $this->container->getParameter( 'aimeos_shop.' . $type ); 67 | 68 | if( is_array( $settings ) && $settings !== [] ) { 69 | $config = new \Aimeos\Base\Config\Decorator\Memory( $config, $settings ); 70 | } 71 | 72 | return $config; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aimeos/aimeos-symfony", 3 | "description": "Professional, full-featured and high performance Symfony e-commerce bundle for online shops and complex B2B projects", 4 | "homepage": "https://aimeos.org/Symfony", 5 | "type": "symfony-bundle", 6 | "license": "MIT", 7 | "keywords": ["aimeos", "symfony", "e-commerce", "ecommerce", "shop", "B2B", "portal", "market place"], 8 | "support": { 9 | "source": "https://github.com/Aimeos/aimeos-symfony", 10 | "issues": "https://github.com/Aimeos/aimeos-symfony/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 | "php": "^8.0.11", 18 | "composer-runtime-api": "^2.1", 19 | "aimeos/aimeos-core": "dev-master", 20 | "aimeos/ai-monolog": "dev-master", 21 | "aimeos/ai-symfony": "dev-master", 22 | "aimeos/ai-admin-jqadm": "dev-master", 23 | "aimeos/ai-admin-jsonadm": "dev-master", 24 | "aimeos/ai-controller-jobs": "dev-master", 25 | "aimeos/ai-controller-frontend": "dev-master", 26 | "aimeos/ai-client-jsonapi": "dev-master", 27 | "aimeos/ai-client-html": "dev-master", 28 | "aimeos/ai-fosuser": "dev-master", 29 | "aimeos/ai-twig": "dev-master", 30 | "doctrine/common": "^3.0", 31 | "symfony/asset": "~6.0", 32 | "symfony/monolog-bundle": "~3.0", 33 | "symfony/form": "~6.0", 34 | "symfony/framework-bundle": "~6.0", 35 | "symfony/security-bundle": "~6.0", 36 | "symfony/mailer": "~6.0", 37 | "symfony/templating": "~6.0", 38 | "symfony/twig-bundle": "~6.0", 39 | "symfony/psr-http-message-bridge": "~2.0", 40 | "friendsofsymfony/user-bundle": "^3.1", 41 | "nyholm/psr7": "^1.0" 42 | }, 43 | "require-dev": { 44 | "phpunit/phpunit": "~10.0", 45 | "php-coveralls/php-coveralls": "~2.0", 46 | "doctrine/doctrine-bundle": "~2.0", 47 | "doctrine/orm": "^2.2.3", 48 | "symfony/browser-kit": "~6.0", 49 | "symfony/css-selector": "~6.0", 50 | "symfony/test-pack": "^1.0" 51 | }, 52 | "autoload": { 53 | "psr-4": { "Aimeos\\ShopBundle\\": "src/" } 54 | }, 55 | "autoload-dev": { 56 | "psr-4": { "Aimeos\\ShopBundle\\Tests\\": "tests/" } 57 | }, 58 | "scripts": { 59 | "post-update-cmd": [ 60 | "cp -r vendor/aimeos/ai-client-html/themes/client/html/* Resources/public/themes/" 61 | ] 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/Controller/GraphqlController.php: -------------------------------------------------------------------------------- 1 | get( 'site', 'default' ); 38 | $lang = $request->get( 'locale', 'en' ); 39 | 40 | $context = $this->container->get( 'aimeos.context' )->get( false, 'backend' ); 41 | $context->setI18n( $this->container->get( 'aimeos.i18n' )->get( array( $lang, 'en' ) ) ); 42 | $context->setLocale( $this->container->get( 'aimeos.locale' )->getBackend( $context, $site ) ); 43 | $context->setView( $this->container->get( 'aimeos.view' )->create( $context, [], $lang ) ); 44 | 45 | return $this->createResponse( \Aimeos\Admin\Graphql::execute( $context, $this->createRequest( $request ) ) ); 46 | } 47 | 48 | 49 | protected function createRequest( Request $reqest ) : \Psr\Http\Message\RequestInterface 50 | { 51 | $psr17Factory = new Psr17Factory(); 52 | $psrHttpFactory = new PsrHttpFactory( $psr17Factory, $psr17Factory, $psr17Factory, $psr17Factory ); 53 | 54 | return $psrHttpFactory->createRequest( $reqest ); 55 | } 56 | 57 | 58 | protected function createResponse( \Psr\Http\Message\ResponseInterface $response ) : Response 59 | { 60 | $httpFoundationFactory = new HttpFoundationFactory(); 61 | return $httpFoundationFactory->createResponse( $response ); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Resources/public/themes/default/basket-standard.css: -------------------------------------------------------------------------------- 1 | /* Standard basket */ 2 | 3 | .basket-standard { 4 | padding: 2rem 0; 5 | } 6 | 7 | .basket-standard .header { 8 | align-items: center; 9 | padding: 0 1rem; 10 | } 11 | 12 | .basket-standard .header h1 { 13 | margin: 0; 14 | } 15 | 16 | .basket-standard .basket-save.input-group { 17 | border-bottom: 1px solid var(--ai-secondary); 18 | width: auto; 19 | } 20 | 21 | .basket-standard .basket-save .basket-name { 22 | border: none; 23 | } 24 | 25 | .basket-standard .basket-save .btn { 26 | font-weight: bold; 27 | font-size: 110%; 28 | border: none; 29 | width: 8rem; 30 | } 31 | 32 | .basket-standard-main { 33 | border: 1px solid var(--ai-tertiary); 34 | padding: 1rem; 35 | margin: 0; 36 | } 37 | 38 | .basket-standard-main quantity a, 39 | .basket-standard-main action a { 40 | text-decoration: none; 41 | } 42 | 43 | .basket-standard-coupon { 44 | padding: 1rem !important; 45 | align-items: center; 46 | text-align: center; 47 | margin: 0; 48 | } 49 | 50 | .basket-standard-coupon .header h2 { 51 | font-size: 1rem; 52 | margin: 10px 0; 53 | } 54 | 55 | .basket-standard-coupon .coupon-detail { 56 | align-items: center; 57 | } 58 | 59 | .basket-standard-coupon .attr-item .coupon-code, 60 | .basket-standard-coupon .attr-item .change { 61 | font-weight: bold; 62 | font-size: 133%; 63 | padding: 0.5rem; 64 | } 65 | 66 | .basket-standard-coupon .btn-primary, 67 | .basket-standard-coupon .btn-primary:hover { 68 | background: none; 69 | border: none; 70 | color: var(--ai-primary); 71 | font-weight: bold; 72 | font-size: 110%; 73 | } 74 | 75 | .basket-standard-coupon .input-group { 76 | border-bottom: 1px solid var(--ai-secondary); 77 | } 78 | 79 | .basket-standard-coupon .coupon-new .btn { 80 | width: 8rem; 81 | } 82 | 83 | .basket-standard-coupon .coupon-new .coupon-code { 84 | width: calc(100% - 8rem); 85 | border: none; 86 | } 87 | 88 | .basket-standard-coupon .coupon-detail { 89 | font-size: 125%; 90 | } 91 | 92 | .basket-standard-coupon .coupon-detail .name { 93 | text-align: start; 94 | padding: 0 0.75rem; 95 | } 96 | 97 | .basket-standard-coupon .coupon-detail .coupon-codes { 98 | text-align: end; 99 | } 100 | 101 | .basket-standard-coupon .minibutton.delete:after { 102 | display: inline-block; 103 | } 104 | -------------------------------------------------------------------------------- /public/themes/default/basket-standard.css: -------------------------------------------------------------------------------- 1 | /* Standard basket */ 2 | 3 | .basket-standard { 4 | padding: 2rem 0; 5 | } 6 | 7 | .basket-standard .header { 8 | align-items: center; 9 | padding: 0 1rem; 10 | } 11 | 12 | .basket-standard .header h1 { 13 | margin: 0; 14 | } 15 | 16 | .basket-standard .basket-save.input-group { 17 | border-bottom: 1px solid var(--ai-secondary); 18 | width: auto; 19 | } 20 | 21 | .basket-standard .basket-save .basket-name { 22 | border: none; 23 | } 24 | 25 | .basket-standard .basket-save .btn { 26 | border: none; 27 | width: 5rem; 28 | } 29 | 30 | .basket-standard-main { 31 | border: 1px solid var(--ai-tertiary); 32 | padding: 1rem; 33 | margin: 0; 34 | } 35 | 36 | .basket-standard-main quantity a, 37 | .basket-standard-main action a { 38 | text-decoration: none; 39 | } 40 | 41 | .basket-standard-coupon { 42 | padding: 1rem !important; 43 | text-align: center; 44 | margin: 0; 45 | } 46 | 47 | .basket-standard-coupon .header, 48 | .basket-standard-coupon .content { 49 | vertical-align: middle; 50 | display: inline-block; 51 | width: 49%; 52 | } 53 | 54 | .basket-standard-coupon .header h2 { 55 | font-size: 1rem; 56 | margin: 10px 0; 57 | } 58 | 59 | .basket-standard-coupon .attr-list { 60 | display: inline-block; 61 | font-weight: bold; 62 | list-style: none; 63 | margin: 0.5rem; 64 | } 65 | 66 | .basket-standard-coupon .attr-item .coupon-code, 67 | .basket-standard-coupon .attr-item .change { 68 | font-weight: bold; 69 | font-size: 133%; 70 | padding: 0.5rem; 71 | } 72 | 73 | .basket-standard-coupon .btn-primary, 74 | .basket-standard-coupon .btn-primary:hover { 75 | background: none; 76 | border: none; 77 | color: var(--ai-primary); 78 | font-weight: bold; 79 | font-size: 125%; 80 | } 81 | 82 | .basket-standard-coupon .input-group { 83 | border-bottom: 1px solid var(--ai-secondary); 84 | } 85 | 86 | .basket-standard-coupon .coupon-new .btn { 87 | width: 5rem; 88 | } 89 | 90 | .basket-standard-coupon .coupon-new .coupon-code { 91 | width: calc(100% - 5rem); 92 | border: none; 93 | } 94 | 95 | .basket-standard-coupon .minibutton.delete:after { 96 | display: inline-block; 97 | font-size: 125%; 98 | } 99 | 100 | @media (max-width: 480px) { 101 | .basket-standard-coupon .header, 102 | .basket-standard-coupon .content { 103 | display: block; 104 | width: 100%; 105 | } 106 | } 107 | -------------------------------------------------------------------------------- /Resources/views/Admin/index.html.twig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Aimeos administration interface 8 | 9 | 10 | 11 | 12 | 13 | 17 | 18 | 32 | 33 | 34 | 35 | {% if error %} 36 |
37 | 40 |
41 | {% endif %} 42 | 43 | 44 | 45 | 46 |
47 | 48 | 49 |
50 |
51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /src/Service/Locale.php: -------------------------------------------------------------------------------- 1 | requestStack = $requestStack; 38 | $this->container = $container; 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 ) 49 | { 50 | if( $this->locale === null ) 51 | { 52 | $status = $this->container->getParameter( 'aimeos_shop.disable_sites' ); 53 | $request = $this->requestStack->getCurrentRequest(); 54 | 55 | $site = $request->get( 'site', 'default' ); 56 | $currency = $request->get( 'currency', '' ); 57 | $lang = $request->get( 'locale', '' ); 58 | 59 | $localeManager = \Aimeos\MShop::create( $context, 'locale' ); 60 | $this->locale = $localeManager->bootstrap( $site, $lang, $currency, $status ); 61 | } 62 | 63 | return $this->locale; 64 | } 65 | 66 | 67 | /** 68 | * Returns the locale item for the current request 69 | * 70 | * @param \Aimeos\MShop\ContextIface $context Context object 71 | * @param string $site Unique site code 72 | * @return \Aimeos\MShop\Locale\Item\Iface Locale item object 73 | */ 74 | public function getBackend( \Aimeos\MShop\ContextIface $context, $site ) 75 | { 76 | $localeManager = \Aimeos\MShop::create( $context, 'locale' ); 77 | 78 | try { 79 | $localeItem = $localeManager->bootstrap( $site, '', '', false, null, true ); 80 | } catch( \Aimeos\MShop\Exception $e ) { 81 | $localeItem = $localeManager->create(); 82 | } 83 | 84 | return $localeItem->setCurrencyId( null )->setLanguageId( null ); 85 | } 86 | } 87 | -------------------------------------------------------------------------------- /Resources/public/themes/default/account-profile.css: -------------------------------------------------------------------------------- 1 | .account-profile { 2 | padding: 2rem 0; 3 | } 4 | 5 | .account-profile h2.header { 6 | text-transform: uppercase; 7 | text-align: start; 8 | font-weight: normal; 9 | padding: 0.5rem 1rem; 10 | color: var(--ai-secondary); 11 | border-bottom: 1px solid var(--ai-secondary); 12 | } 13 | 14 | .account-profile .account-profile-address form { 15 | margin: 1rem; 16 | } 17 | 18 | .account-profile .account-salutation { 19 | padding: 4rem 0 1.5rem; 20 | margin-bottom: 3rem; 21 | border-bottom: 1px solid var(--ai-secondary-dark); 22 | display: flex; 23 | align-items: center; 24 | } 25 | 26 | .account-profile .account-salutation .header.profile { 27 | font-size: 180%; 28 | margin: 0 2rem 0 1rem; 29 | font-weight: 600; 30 | } 31 | 32 | .account-profile .profile-salutation { 33 | margin: 0; 34 | } 35 | 36 | .account-profile .profile-salutation .logout { 37 | margin-left: 1rem; 38 | } 39 | 40 | .account-profile .profile-salutation::before { 41 | content: "\f4e1"; 42 | font: normal normal normal 14px/1 bootstrap-icons; 43 | text-decoration: none; 44 | font-size: 165%; 45 | color: var(--ai-primary-dark); 46 | display: inline-block; 47 | position: relative; 48 | text-align: center; 49 | border: 1px solid var(--ai-primary-dark); 50 | height: 2rem; 51 | width: 2rem; 52 | border-radius: 50%; 53 | vertical-align: middle; 54 | margin-right: .5rem; 55 | } 56 | 57 | .account-profile .account-salutation .btn { 58 | margin: 0 1rem 0 auto; 59 | } 60 | 61 | .account-profile-address h3 { 62 | margin: 0.5rem 1rem; 63 | } 64 | 65 | .account-profile-address .address-item { 66 | border: 1px solid var(--ai-tertiary); 67 | border-radius: 0; 68 | margin: 0.5rem 0; 69 | padding: 1%; 70 | } 71 | 72 | .account-profile-address .header { 73 | justify-content: space-between; 74 | display: flex; 75 | padding: 1rem; 76 | } 77 | 78 | .account-profile-address .header .act-show:after { 79 | font: normal normal normal 14px/1 bootstrap-icons; 80 | content: "\f4cb"; 81 | font-size: 130%; 82 | } 83 | 84 | .account-profile-address .header .act-hide:after { 85 | font: normal normal normal 14px/1 bootstrap-icons; 86 | content: "\f62a"; 87 | font-size: 130%; 88 | } 89 | 90 | .account-profile .form-list .error, 91 | .account-profile .form-list .error a { 92 | color: var(--ai-danger); 93 | } 94 | 95 | .account-profile .form-list .error input, 96 | .account-profile .form-list .error select { 97 | border: 1px solid var(--ai-danger); 98 | } 99 | 100 | .account-profile .form-item.mandatory label { 101 | font-weight: bold; 102 | } 103 | 104 | .account-profile .form-item label { 105 | margin: 0.875rem 0; 106 | } 107 | 108 | .account-profile .form-item .form-control { 109 | margin: 0.5rem 0; 110 | } 111 | -------------------------------------------------------------------------------- /src/Controller/CheckoutController.php: -------------------------------------------------------------------------------- 1 | container->get( 'shop' ); 34 | 35 | foreach( $this->container->getParameter( 'aimeos_shop.page' )['checkout-confirm'] as $name ) 36 | { 37 | $params['aiheader'][$name] = $shop->get( $name )->header(); 38 | $params['aibody'][$name] = $shop->get( $name )->body(); 39 | } 40 | 41 | return new Response( 42 | $twig->render( '@AimeosShop/Checkout/confirm.html.twig', $params ), 43 | 200, ['Cache-Control' => 'no-store, , max-age=0'] 44 | ); 45 | } 46 | 47 | 48 | /** 49 | * Returns the html for the standard checkout page. 50 | * 51 | * @return Response Response object containing the generated output 52 | */ 53 | public function indexAction( \Twig\Environment $twig ) : Response 54 | { 55 | $params = []; 56 | $shop = $this->container->get( 'shop' ); 57 | 58 | foreach( $this->container->getParameter( 'aimeos_shop.page' )['checkout-index'] as $name ) 59 | { 60 | $params['aiheader'][$name] = $shop->get( $name )->header(); 61 | $params['aibody'][$name] = $shop->get( $name )->body(); 62 | } 63 | 64 | return new Response( 65 | $twig->render( '@AimeosShop/Checkout/index.html.twig', $params ), 66 | 200, ['Cache-Control' => 'no-store, , max-age=0'] 67 | ); 68 | } 69 | 70 | 71 | /** 72 | * Returns the view for the order update page. 73 | * 74 | * @return Response Response object containing the generated output 75 | */ 76 | public function updateAction( \Twig\Environment $twig ) : Response 77 | { 78 | $params = []; 79 | $shop = $this->container->get( 'shop' ); 80 | 81 | foreach( $this->container->getParameter( 'aimeos_shop.page' )['checkout-update'] as $name ) 82 | { 83 | $params['aiheader'][$name] = $shop->get( $name )->header(); 84 | $params['aibody'][$name] = $shop->get( $name )->body(); 85 | } 86 | 87 | return new Response( 88 | $twig->render( '@AimeosShop/Checkout/update.html.twig', $params ), 89 | 200, ['Cache-Control' => 'no-store, , max-age=0'] 90 | ); 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /public/themes/default/email.css: -------------------------------------------------------------------------------- 1 | /* 2 | * Shared CSS between website and e-mails 3 | * 4 | * @license LGPLv3, https://opensource.org/licenses/LGPL-3.0 5 | * @copyright Aimeos (aimeos.org), 2014 6 | */ 7 | 8 | a { 9 | color: #282828; 10 | } 11 | 12 | .logo img { 13 | max-width: 300px; 14 | margin: auto; 15 | } 16 | 17 | 18 | li.attr-item { 19 | list-style: none; 20 | padding: 0; 21 | margin: 0; 22 | } 23 | 24 | 25 | /* Account creation */ 26 | 27 | .account-login .btn-primary tr { 28 | background: #282828; 29 | } 30 | 31 | 32 | /* Common summary */ 33 | .common-summary .item { 34 | vertical-align: top; 35 | } 36 | 37 | .common-summary .content { 38 | padding: 0.5em; 39 | margin: 10px; 40 | } 41 | 42 | .common-summary .item h3 { 43 | border-bottom: 1px solid #282828; 44 | padding: 0.5em; 45 | margin: 10px; 46 | } 47 | 48 | .common-summary .item h4 { 49 | vertical-align: middle; 50 | display: inline-block; 51 | font-size: 1em; 52 | margin: 0.5em 0; 53 | padding: 0; 54 | } 55 | 56 | .common-summary .item li { 57 | vertical-align: top; 58 | padding: 0; 59 | } 60 | 61 | .common-summary .item .name { 62 | padding: 0.25em 0; 63 | display: block; 64 | } 65 | 66 | .common-summary .item .value { 67 | display: block; 68 | } 69 | 70 | .common-summary .item .attr-list { 71 | list-style: none; 72 | padding: 0; 73 | margin: 0; 74 | margin-bottom: 0.5; 75 | } 76 | 77 | .basket { 78 | padding: 10px !important; 79 | } 80 | 81 | .basket th, 82 | .basket td { 83 | vertical-align: middle; 84 | padding: 0.5em; 85 | } 86 | 87 | .basket .header { 88 | font-weight: bold; 89 | background-color: #F6F6F6; 90 | border-bottom: 1px solid #CCC; 91 | } 92 | 93 | .basket .body { 94 | border-bottom: 1px solid #CCC; 95 | } 96 | 97 | .basket th.label { 98 | text-align: start; 99 | } 100 | 101 | .basket td.quantity { 102 | white-space: nowrap; 103 | text-align: center; 104 | } 105 | 106 | .basket td.price { 107 | text-align: end; 108 | white-space: nowrap; 109 | } 110 | 111 | .basket .product .product-image { 112 | max-height: 150px; 113 | } 114 | 115 | .basket .product .product-name { 116 | margin: 0.5em 0; 117 | display: block; 118 | } 119 | 120 | .basket .product .code, 121 | .basket .product .timeframe { 122 | margin: 0.5em; 123 | } 124 | 125 | .basket .product .attr-list { 126 | vertical-align: top; 127 | margin: 0.5em; 128 | padding: 0; 129 | } 130 | 131 | .basket .product li.attr-item { 132 | display: inline; 133 | } 134 | 135 | .basket .product li.attr-item:not(:last-of-type) .value:after { 136 | content: ","; 137 | } 138 | 139 | .basket .footer { 140 | vertical-align: bottom; 141 | } 142 | 143 | .basket .subtotal { 144 | font-weight: bold; 145 | } 146 | 147 | .basket .total { 148 | border-top: 1px solid #CCC; 149 | background-color: #F6F6F6; 150 | font-weight: bold; 151 | } 152 | --------------------------------------------------------------------------------