From afcb68723c2f09ee92f8007f2b7a1b80c5bcb22c Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 4 Aug 2021 12:18:18 +0200 Subject: [PATCH] import done --- ...ril2021_Datentabelle baueradvance.com.xlsx | Bin 0 -> 28464 bytes httpdocs/composer.json | 3 +- httpdocs/composer.lock | 536 +++++++++++++++++- httpdocs/config/routing.yaml | 7 + httpdocs/config/services.yaml | 46 ++ httpdocs/src/Controller/BackendController.php | 164 ++++++ .../src/EventListener/BackendMenuListener.php | 50 ++ .../templates/backend/data_menu.html.twig | 65 +++ 8 files changed, 868 insertions(+), 3 deletions(-) create mode 100644 documents/April2021_Datentabelle baueradvance.com.xlsx create mode 100644 httpdocs/config/routing.yaml create mode 100644 httpdocs/config/services.yaml create mode 100644 httpdocs/src/Controller/BackendController.php create mode 100644 httpdocs/src/EventListener/BackendMenuListener.php create mode 100644 httpdocs/templates/backend/data_menu.html.twig diff --git a/documents/April2021_Datentabelle baueradvance.com.xlsx b/documents/April2021_Datentabelle baueradvance.com.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..84f8d155f96064cf4bd0cc8a7ed04b7d67ff5f9e GIT binary patch literal 28464 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 Wa){8``tuHo4WkSdO9yR#p8XGND(dk7 literal 0 HcmV?d00001 diff --git a/httpdocs/composer.json b/httpdocs/composer.json index 607e4e7..c722b75 100644 --- a/httpdocs/composer.json +++ b/httpdocs/composer.json @@ -16,7 +16,8 @@ "oveleon/contao-component-style-manager": "^2.4", "terminal42/contao-changelanguage": "^3.1", "terminal42/contao-node": "^1.3", - "terminal42/dc_multilingual": "^4.1" + "terminal42/dc_multilingual": "^4.1", + "onurb/excel-bundle": "^1.0" }, "extra": { "contao-component-dir": "assets" diff --git a/httpdocs/composer.lock b/httpdocs/composer.lock index baea335..c53eea7 100644 --- a/httpdocs/composer.lock +++ b/httpdocs/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "bb8176e4b84151a2b3e04303c69ddae5", + "content-hash": "cecc1016949c9828ae57f7ec14197a87", "packages": [ { "name": "alnv/catalog-manager", @@ -4214,6 +4214,60 @@ ], "time": "2021-04-01T18:37:14+00:00" }, + { + "name": "ezyang/htmlpurifier", + "version": "v4.13.0", + "source": { + "type": "git", + "url": "https://github.com/ezyang/htmlpurifier.git", + "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ezyang/htmlpurifier/zipball/08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "reference": "08e27c97e4c6ed02f37c5b2b20488046c8d90d75", + "shasum": "" + }, + "require": { + "php": ">=5.2" + }, + "require-dev": { + "simpletest/simpletest": "dev-master#72de02a7b80c6bb8864ef9bf66d41d2f58f826bd" + }, + "type": "library", + "autoload": { + "psr-0": { + "HTMLPurifier": "library/" + }, + "files": [ + "library/HTMLPurifier.composer.php" + ], + "exclude-from-classmap": [ + "/library/HTMLPurifier/Language/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1-or-later" + ], + "authors": [ + { + "name": "Edward Z. Yang", + "email": "admin@htmlpurifier.org", + "homepage": "http://ezyang.com" + } + ], + "description": "Standards compliant HTML filter written in PHP", + "homepage": "http://htmlpurifier.org/", + "keywords": [ + "html" + ], + "support": { + "issues": "https://github.com/ezyang/htmlpurifier/issues", + "source": "https://github.com/ezyang/htmlpurifier/tree/master" + }, + "time": "2020-06-29T00:56:53+00:00" + }, { "name": "friendsofsymfony/http-cache", "version": "2.10.0", @@ -5421,6 +5475,246 @@ ], "time": "2021-03-29T14:13:42+00:00" }, + { + "name": "maennchen/zipstream-php", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", + "shasum": "" + }, + "require": { + "myclabs/php-enum": "^1.5", + "php": ">= 7.1", + "psr/http-message": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "ext-zip": "*", + "guzzlehttp/guzzle": ">= 6.3", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": ">= 7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" + }, + "funding": [ + { + "url": "https://opencollective.com/zipstream", + "type": "open_collective" + } + ], + "time": "2020-05-30T13:11:16+00:00" + }, + { + "name": "markbaker/complex", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPComplex.git", + "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/6f724d7e04606fd8adaa4e3bb381c3e9db09c946", + "reference": "6f724d7e04606fd8adaa4e3bb381c3e9db09c946", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Complex\\": "classes/src/" + }, + "files": [ + "classes/src/functions/abs.php", + "classes/src/functions/acos.php", + "classes/src/functions/acosh.php", + "classes/src/functions/acot.php", + "classes/src/functions/acoth.php", + "classes/src/functions/acsc.php", + "classes/src/functions/acsch.php", + "classes/src/functions/argument.php", + "classes/src/functions/asec.php", + "classes/src/functions/asech.php", + "classes/src/functions/asin.php", + "classes/src/functions/asinh.php", + "classes/src/functions/atan.php", + "classes/src/functions/atanh.php", + "classes/src/functions/conjugate.php", + "classes/src/functions/cos.php", + "classes/src/functions/cosh.php", + "classes/src/functions/cot.php", + "classes/src/functions/coth.php", + "classes/src/functions/csc.php", + "classes/src/functions/csch.php", + "classes/src/functions/exp.php", + "classes/src/functions/inverse.php", + "classes/src/functions/ln.php", + "classes/src/functions/log2.php", + "classes/src/functions/log10.php", + "classes/src/functions/negative.php", + "classes/src/functions/pow.php", + "classes/src/functions/rho.php", + "classes/src/functions/sec.php", + "classes/src/functions/sech.php", + "classes/src/functions/sin.php", + "classes/src/functions/sinh.php", + "classes/src/functions/sqrt.php", + "classes/src/functions/tan.php", + "classes/src/functions/tanh.php", + "classes/src/functions/theta.php", + "classes/src/operations/add.php", + "classes/src/operations/subtract.php", + "classes/src/operations/multiply.php", + "classes/src/operations/divideby.php", + "classes/src/operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@lange.demon.co.uk" + } + ], + "description": "PHP Class for working with complex numbers", + "homepage": "https://github.com/MarkBaker/PHPComplex", + "keywords": [ + "complex", + "mathematics" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPComplex/issues", + "source": "https://github.com/MarkBaker/PHPComplex/tree/2.0.3" + }, + "time": "2021-06-02T09:44:11+00:00" + }, + { + "name": "markbaker/matrix", + "version": "2.1.3", + "source": { + "type": "git", + "url": "https://github.com/MarkBaker/PHPMatrix.git", + "reference": "174395a901b5ba0925f1d790fa91bab531074b61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/MarkBaker/PHPMatrix/zipball/174395a901b5ba0925f1d790fa91bab531074b61", + "reference": "174395a901b5ba0925f1d790fa91bab531074b61", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "phpcompatibility/php-compatibility": "^9.0", + "phpdocumentor/phpdocumentor": "2.*", + "phploc/phploc": "^4.0", + "phpmd/phpmd": "2.*", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.3", + "sebastian/phpcpd": "^4.0", + "squizlabs/php_codesniffer": "^3.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Matrix\\": "classes/src/" + }, + "files": [ + "classes/src/Functions/adjoint.php", + "classes/src/Functions/antidiagonal.php", + "classes/src/Functions/cofactors.php", + "classes/src/Functions/determinant.php", + "classes/src/Functions/diagonal.php", + "classes/src/Functions/identity.php", + "classes/src/Functions/inverse.php", + "classes/src/Functions/minors.php", + "classes/src/Functions/trace.php", + "classes/src/Functions/transpose.php", + "classes/src/Operations/add.php", + "classes/src/Operations/directsum.php", + "classes/src/Operations/subtract.php", + "classes/src/Operations/multiply.php", + "classes/src/Operations/divideby.php", + "classes/src/Operations/divideinto.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mark Baker", + "email": "mark@demon-angel.eu" + } + ], + "description": "PHP Class for working with matrices", + "homepage": "https://github.com/MarkBaker/PHPMatrix", + "keywords": [ + "mathematics", + "matrix", + "vector" + ], + "support": { + "issues": "https://github.com/MarkBaker/PHPMatrix/issues", + "source": "https://github.com/MarkBaker/PHPMatrix/tree/2.1.3" + }, + "time": "2021-05-25T15:42:17+00:00" + }, { "name": "matthiasmullie/minify", "version": "1.3.66", @@ -5751,6 +6045,66 @@ ], "time": "2020-12-14T12:56:38+00:00" }, + { + "name": "myclabs/php-enum", + "version": "1.8.3", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "b942d263c641ddb5190929ff840c68f78713e937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", + "reference": "b942d263c641ddb5190929ff840c68f78713e937", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.3" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2021-07-05T08:18:36+00:00" + }, { "name": "nelmio/cors-bundle", "version": "2.1.0", @@ -6209,6 +6563,79 @@ ], "time": "2020-07-13T19:23:57+00:00" }, + { + "name": "onurb/excel-bundle", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/Nono1971/excel-bundle.git", + "reference": "ebd4e5ebfd683d54d0b94834e514619128434f41" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Nono1971/excel-bundle/zipball/ebd4e5ebfd683d54d0b94834e514619128434f41", + "reference": "ebd4e5ebfd683d54d0b94834e514619128434f41", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "phpoffice/phpspreadsheet": "~1.0", + "symfony/config": "~4.2", + "symfony/dependency-injection": "~3.2|~4.0", + "symfony/framework-bundle": "~3.2|~4.0", + "symfony/http-foundation": "~3.2|~4.0", + "symfony/http-kernel": "~3.2|~4.0" + }, + "require-dev": { + "php": ">=7.0", + "phpunit/phpunit": "~6.5", + "sensio/framework-extra-bundle": "~3.2|~4.0", + "squizlabs/php_codesniffer": "~2" + }, + "suggest": { + "onurb/doctrine-yuml-bundle": "Use this bundle to generate mapping graph from your entities" + }, + "type": "symfony-bundle", + "extra": { + "symfony": { + "allow-contrib": "true" + } + }, + "autoload": { + "psr-4": { + "Onurb\\Bundle\\": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Giulio De Donato", + "email": "liuggio@gmail.com" + }, + { + "name": "Bruno Heron", + "email": "herobrun@gmail.com" + } + ], + "description": "Symfony Bundle to read or write Excel file (including pdf, xlsx, odt), using phpoffice/phpspreadsheet library (replacement of phpoffice/phpexcel, abandonned)", + "keywords": [ + "PHPExcel", + "bundle", + "excel", + "spreadsheet", + "symfony", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/Nono1971/excel-bundle/issues", + "source": "https://github.com/Nono1971/excel-bundle/tree/1.0.2" + }, + "time": "2019-06-24T20:41:00+00:00" + }, { "name": "oveleon/contao-component-style-manager", "version": "2.4.4", @@ -6818,6 +7245,110 @@ ], "time": "2020-07-07T09:29:14+00:00" }, + { + "name": "phpoffice/phpspreadsheet", + "version": "1.18.0", + "source": { + "type": "git", + "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", + "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/418cd304e8e6b417ea79c3b29126a25dc4b1170c", + "reference": "418cd304e8e6b417ea79c3b29126a25dc4b1170c", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-dom": "*", + "ext-fileinfo": "*", + "ext-gd": "*", + "ext-iconv": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-simplexml": "*", + "ext-xml": "*", + "ext-xmlreader": "*", + "ext-xmlwriter": "*", + "ext-zip": "*", + "ext-zlib": "*", + "ezyang/htmlpurifier": "^4.13", + "maennchen/zipstream-php": "^2.1", + "markbaker/complex": "^2.0", + "markbaker/matrix": "^2.0", + "php": "^7.2 || ^8.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0", + "psr/simple-cache": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "dev-master", + "dompdf/dompdf": "^1.0", + "friendsofphp/php-cs-fixer": "^2.18", + "jpgraph/jpgraph": "^4.0", + "mpdf/mpdf": "^8.0", + "phpcompatibility/php-compatibility": "^9.3", + "phpstan/phpstan": "^0.12.82", + "phpstan/phpstan-phpunit": "^0.12.18", + "phpunit/phpunit": "^8.5", + "squizlabs/php_codesniffer": "^3.5", + "tecnickcom/tcpdf": "^6.3" + }, + "suggest": { + "dompdf/dompdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)", + "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", + "mpdf/mpdf": "Option for rendering PDF with PDF Writer", + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer (doesn't yet support PHP8)" + }, + "type": "library", + "autoload": { + "psr-4": { + "PhpOffice\\PhpSpreadsheet\\": "src/PhpSpreadsheet" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maarten Balliauw", + "homepage": "https://blog.maartenballiauw.be" + }, + { + "name": "Mark Baker", + "homepage": "https://markbakeruk.net" + }, + { + "name": "Franck Lefevre", + "homepage": "https://rootslabs.net" + }, + { + "name": "Erik Tilt" + }, + { + "name": "Adrien Crivelli" + } + ], + "description": "PHPSpreadsheet - Read, Create and Write Spreadsheet documents in PHP - Spreadsheet engine", + "homepage": "https://github.com/PHPOffice/PhpSpreadsheet", + "keywords": [ + "OpenXML", + "excel", + "gnumeric", + "ods", + "php", + "spreadsheet", + "xls", + "xlsx" + ], + "support": { + "issues": "https://github.com/PHPOffice/PhpSpreadsheet/issues", + "source": "https://github.com/PHPOffice/PhpSpreadsheet/tree/1.18.0" + }, + "time": "2021-05-31T18:21:15+00:00" + }, { "name": "phpspec/php-diff", "version": "v1.1.3", @@ -12728,5 +13259,6 @@ "prefer-stable": false, "prefer-lowest": false, "platform": [], - "platform-dev": [] + "platform-dev": [], + "plugin-api-version": "2.0.0" } diff --git a/httpdocs/config/routing.yaml b/httpdocs/config/routing.yaml new file mode 100644 index 0000000..90f06d4 --- /dev/null +++ b/httpdocs/config/routing.yaml @@ -0,0 +1,7 @@ +# config/routing.yml +app.controller: + resource: ../src/Controller + type: annotation + +#ContaoCoreBundle: +# resource: "@ContaoCoreBundle/Resources/config/routing.yml" \ No newline at end of file diff --git a/httpdocs/config/services.yaml b/httpdocs/config/services.yaml new file mode 100644 index 0000000..3a2c079 --- /dev/null +++ b/httpdocs/config/services.yaml @@ -0,0 +1,46 @@ +# This file is the entry point to configure your own services. +# Files in the packages/ subdirectory configure your dependencies. + +# Put parameters here that don't need to change on each machine where the app is deployed +# https://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration +parameters: + + +services: + # default configuration for services in *this* file + _defaults: + autowire: true # Automatically injects dependencies in your services. + autoconfigure: true # Automatically registers your services as commands, event subscribers, etc. + + # makes classes in src/ available to be used as services + # this creates a service per class whose id is the fully-qualified class name + App\: + resource: '../src/' + exclude: + - '../src/DependencyInjection/' + - '../src/Entity/' + - '../src/Kernel.php' + - '../src/Tests/' + + # controllers are imported separately to make sure services can be injected + # as action arguments even if you don't extend any base controller class + App\Controller\: + resource: '../src/Controller/' + tags: ['controller.service_arguments', '%kernel.environment%'] + + App\Command\: + resource: '../src/Command/' + autowire: true + autoconfigure: true + arguments: ['@doctrine.orm.entity_manager', '@service_container'] + tags: + - { name: 'console.command' } + + # add more service definitions when explicit configuration is needed + # please note that last definitions always *replace* previous ones + App\EventListener\BackendMenuListener: + arguments: + - "@router" + - "@request_stack" + tags: + - { name: kernel.event_listener, event: contao.backend_menu_build, method: onContaoBackendMenuBuild, priority: -255 } \ No newline at end of file diff --git a/httpdocs/src/Controller/BackendController.php b/httpdocs/src/Controller/BackendController.php new file mode 100644 index 0000000..72b09b6 --- /dev/null +++ b/httpdocs/src/Controller/BackendController.php @@ -0,0 +1,164 @@ +twig = $twig; + $this->kernel = $kernel; + } + + /** + * @Route("/", name="data_menu") + * + * @param Request $request + * @return Response + * @throws \Twig\Error\LoaderError + * @throws \Twig\Error\RuntimeError + * @throws \Twig\Error\SyntaxError + */ + public function dataMenu(Request $request): Response + { + $res = $this->twig->render( + 'backend/data_menu.html.twig', + [ + 'token' => $this->getToken($request) + ] + ); + return new Response($res); + } + + /** + * @Route("/import-xls", name="import_xls") + * + * @param Request $request + * @return JsonResponse + */ + public function importXls(Request $request) + { + /** @var UploadedFile $xlsFile */ + $xlsFile = $request->files->get('xls'); + + + if ($xlsFile === null || + !($xlsFile->getClientMimeType() === 'application/vnd.ms-excel' || + $xlsFile->getClientMimeType() === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || + $xlsFile->getClientMimeType() === 'application/octet-stream')) { + return new JsonResponse(null, JsonResponse::HTTP_BAD_REQUEST); + } + + + // Save file temporarily + $filename = time().'.xls'; + $path = __DIR__.'/../../xls-imports/'; + + if (!file_exists($path)) { + mkdir($path, 0777, true); + } + + $xlsFile->move( + $path, + $filename + ); + + $excelFactory = new ExcelFactory(); + $spreadsheet = $excelFactory->createSpreadsheet($path . $filename); + $spreadsheet->setActiveSheetIndex(0); + $activesheet = $spreadsheet->getActiveSheet(); + $highestRow = $activesheet->getHighestRow(); + $startRow = 5; + /** @var Connection $connection */ + $connection = $this->getDoctrine()->getConnection(); + + $resultSet = $connection->executeQuery('SELECT * FROM `ctlg_brands`'); + $data = $resultSet->fetchAllAssociative(); + $entriesById = []; + foreach ($data as $entry) { + $entriesById[$entry['id']] = $entry; + } + + $connection->beginTransaction(); + try { + + for ($row = $startRow; $row <= $highestRow; $row++) { + $id = $activesheet->getCell('A'.$row)->getValue(); + if ($id !== null) { + + if (!array_key_exists($id, $entriesById)) { + return new JsonResponse("id $id existiert nicht im System", JsonResponse::HTTP_BAD_REQUEST); + } + $range = (int)$activesheet->getCell('E'.$row)->getCalculatedValue(); + $edition = (int)$activesheet->getCell('G'.$row)->getCalculatedValue(); + $brand_reach = (int)$activesheet->getCell('K'.$row)->getCalculatedValue(); + $social_contacts = (int)$activesheet->getCell('M'.$row)->getCalculatedValue(); + $unique_users = (int)$activesheet->getCell('N'.$row)->getCalculatedValue(); + $page_impressions = (int)$activesheet->getCell('P'.$row)->getCalculatedValue(); + $visits = (int)$activesheet->getCell('R'.$row)->getCalculatedValue(); + + $range = $range !== 0 ? $range : ""; + $edition = $edition !== 0 ? $edition : ""; + $brand_reach = $brand_reach !== 0 ? $brand_reach : ""; + $social_contacts = $social_contacts !== 0 ? $social_contacts : ""; + $unique_users = $unique_users !== 0 ? $unique_users : ""; + $page_impressions = $page_impressions !== 0 ? $page_impressions : ""; + $visits = $visits !== 0 ? $visits : ""; + + $connection->executeStatement( + "UPDATE `ctlg_brands` SET ". + "`range`='$range',". + "`edition`='$edition',". + "`brand_reach`='$brand_reach',". + "`social_contacts`='$social_contacts',". + "`unique_user`='$unique_users',". + "`page_impressions`='$page_impressions',". + "`visits`='$visits'". + " WHERE `id` = $id" + ); + } + } + + } catch (\Exception $e) { + $connection->rollBack(); + unlink($path . $filename); + return new JsonResponse("Es ist ein Fehler aufgetreten: ".$e->getMessage(), JsonResponse::HTTP_BAD_REQUEST); + } + $connection->commit(); + unlink($path . $filename); + return new JsonResponse('done'); + } + + private function getToken(Request $request) + { + return $request->cookies->get($this->kernel->getEnvironment() === 'dev' ? 'csrf_contao_csrf_token' : 'csrf_https-contao_csrf_token'); + } +} \ No newline at end of file diff --git a/httpdocs/src/EventListener/BackendMenuListener.php b/httpdocs/src/EventListener/BackendMenuListener.php new file mode 100644 index 0000000..3adb5a5 --- /dev/null +++ b/httpdocs/src/EventListener/BackendMenuListener.php @@ -0,0 +1,50 @@ +router = $router; + $this->requestStack = $requestStack; + } + + public function onContaoBackendMenuBuild(MenuEvent $event): void + { + $factory = $event->getFactory(); + $tree = $event->getTree(); + + if ('mainMenu' !== $tree->getName()) { + return; + } + + $contentNode = $tree->getChild('content'); + + $node = $factory + ->createItem('Brands Data Import') + ->setUri($this->router->generate('data_menu')) + ->setLabel('Brands Data Import') + ->setLinkAttribute('title', 'Brands Data Import') + ->setLinkAttribute('class', 'brands-import-data') + ->setCurrent($this->requestStack->getCurrentRequest()->get('_controller') === BackendController::class) + ; + + $contentNode->addChild($node); + } +} diff --git a/httpdocs/templates/backend/data_menu.html.twig b/httpdocs/templates/backend/data_menu.html.twig new file mode 100644 index 0000000..9e5c501 --- /dev/null +++ b/httpdocs/templates/backend/data_menu.html.twig @@ -0,0 +1,65 @@ +{% extends "@ContaoCore/Backend/be_page.html.twig" %} + +{% block headline %} + Datenverwaltung +{% endblock %} + +{% block error %} +{% endblock %} + +{% block main %} + + +
+
+
+ + + + + + + + + + + + +
Excel Import
+ + + + + +
+
+
+ + + + +{% endblock %}