X

Magento 2.4.2 - Установка и решение проблем

Решил установить и поиграться с последней Magento 2.4.2-p1. Скачал официальную сборку magento-ee-2.4.2-p1_sample_data-2021-04-21-10-14-41.zip с портала партнеров и принялся устанавливать. В процессе, столкнулся с рядом ошибок. О их решении и пойдет речь..

Началось все с напоминания того, что фронтового инсталятора больше нет, поэтому все делаем через боль консоль.

Вспоминать все параметры инсталла не хотелось, поэтому сходил в DevDocs и нашел инструкцию по установке

  • https://devdocs.magento.com/guides/v2.4/install-gde/composer.html

подправил под себя и попробовал запустить

bin/magento setup:install \
--base-url=http://m242.sv \
--db-host=localhost \
--db-name=m242 \
--db-user=mysql \
--db-password=mysql \
--admin-firstname=Admin \
--admin-lastname=Admin \
--admin-email=admin@admin.com \
--admin-user=admin \
--admin-password="admin123" \
--language=en_AU \
--currency=AUD \
--timezone=Australia/Sydney \
--use-rewrites=1

Получил ошибку, о том, что PHP 7.2 уже не подходит. Сходил, обновил знания по  совместимости версий

  • https://devdocs.magento.com/guides/v2.4/install-gde/system-requirements.html

Пришлось установить php7.4 и перенастроить хост. Попробовал снова, и на этот раз оказалось что у меня не установлено расширение soap. Вот оказывается кому он нужен в 21 году 🙂

Опять же в DevDocs нашел список нужны модулей, правда для CentOs. Но не проблема, конвертировал в убунту версии

sudo apt-get install php7.4-fpm php7.4-cli php7.4-pdo \
php7.4-mysqlnd php7.4-opcache php7.4-xml php7.4-gd \
php7.4-mysql php7.4-intl php7.4-mbstring php7.4-bcmath \
php7.4-json php7.4-iconv php7.4-soap

Подтюнинговал немного команду установки

$ php7.4 bin/magento setup:install \
--base-url=http://m242.sv \
--db-host=localhost \
--db-name=m242 \
--db-user=mysql \
--db-password=mysql \
--admin-firstname=Admin \
--admin-lastname=Admin \
--admin-email=admin@admin.com \
--admin-user=admin \
--admin-password="admin123" \
--language=en_AU \
--currency=AUD \
--timezone=Australia/Sydney \
--use-rewrites=1 \
--session-save=files

Следующий запуск уже был получше, но выдало ошибку о том, что не может создать структуру в Elastic-е.

Установил Elastic: Ubuntu: Как установить Elasticsearch 7 для Magento 2.4

После установки натолкнулся на ошибку "magento2_product_1_v2/document/_mapping contains unrecognized parameter"

In Connection.php line 632:
  {"error":{"root_cause":[{"type":"illegal_argument_exception","reason":"request [/magento2_product_1_v2/document/_mapping] contains unrecognized parameter: [include_type_name]  
  "}],"type":"illegal_argument_exception","reason":"request [/magento2_product_1_v2/document/_mapping] contains unrecognized parameter: [include_type_name]"},"status":400}       

Оказалось, что у меня висел докер с проброшеным на машину портом 9200, а в нем был Elastic 5.x, и запросы улетали туда, вместо свежеустановленного 7.x. Просто потушил докер и смог продолжить.

Подтюнинговал еще немного команду установки

$ php7.4 bin/magento setup:install \
--base-url=http://m242.sv \
--db-host=localhost \
--db-name=m242 \
--db-user=mysql \
--db-password=mysql \
--admin-firstname=Admin \
--admin-lastname=Admin \
--admin-email=admin@admin.com \
--admin-user=admin \
--admin-password="admin123" \
--language=en_AU \
--currency=AUD \
--timezone=Australia/Sydney \
--use-rewrites=1 \
--session-save=files \
--search-engine=elasticsearch7 \
--elasticsearch-host=localhost \
--elasticsearch-port=9200

Далее, столкнулся с ошибкой

In PatchApplier.php line 170:
  Unable to apply data patch Magento\CatalogRuleSampleData\Setup\Patch\Data\InstallCatalogRuleSampleData 
  for module Magento_CatalogRuleSampleData. 
  Original exception message: Rolled back transaction has not been completed correctly.                                                                                                                        

In Mysql.php line 321:                                                             
  Rolled back transaction has not been completed correctly.

Я вспомнил, что я разработчик и хотя мне было лень, все равно пришлось подебажить. Оказалось, что во время импорта сейлс рулов, происходит exception внутри транзакции, что приводит к Rollback-у при коммите транзакции MySQL

Трейс ошибки

Mysql.php:335, Magento\Framework\DB\Adapter\Pdo\Mysql\Interceptor->rollBack()
Interceptor.php:58, Magento\Framework\DB\Adapter\Pdo\Mysql\Interceptor->___callParent()
Interceptor.php:138, Magento\Framework\DB\Adapter\Pdo\Mysql\Interceptor->Magento\Framework\Interception\{closure:public_html/vendor/magento/framework/Interception/Interceptor.php:104-151}()
Interceptor.php:153, Magento\Framework\DB\Adapter\Pdo\Mysql\Interceptor->___callPlugins()
Interceptor.php:41, Magento\Framework\DB\Adapter\Pdo\Mysql\Interceptor->rollBack()
Create.php:148, Magento\Staging\Model\Operation\Create->execute()
EntityManager.php:96, Magento\Framework\EntityManager\EntityManager->save()
Rule.php:382, Magento\SalesRule\Model\ResourceModel\Rule->save()
AbstractModel.php:655, Magento\SalesRule\Model\Rule\Interceptor->save()
Interceptor.php:58, Magento\SalesRule\Model\Rule\Interceptor->___callParent()
Interceptor.php:138, Magento\SalesRule\Model\Rule\Interceptor->Magento\Framework\Interception\{closure:public_html/vendor/magento/framework/Interception/Interceptor.php:104-151}()
Rule.php:48, Magento\AdvancedSalesRule\Model\Plugin\Rule->aroundSave()
Interceptor.php:135, Magento\SalesRule\Model\Rule\Interceptor->Magento\Framework\Interception\{closure:public_html/vendor/magento/framework/Interception/Interceptor.php:104-151}()
Interceptor.php:153, Magento\SalesRule\Model\Rule\Interceptor->___callPlugins()
Interceptor.php:563, Magento\SalesRule\Model\Rule\Interceptor->save()
Rule.php:106, Magento\SalesRuleSampleData\Model\Rule->install()
Installer.php:30, Magento\SalesRuleSampleData\Setup\Installer->install()
State.php:187, call_user_func_array:{public_html/vendor/magento/framework/App/State.php:187}()
State.php:187, Magento\Framework\App\State\Interceptor->emulateAreaCode()
Interceptor.php:68, Magento\Framework\App\State\Interceptor->emulateAreaCode()
Executor.php:54, Magento\Framework\Setup\SampleData\Executor->exec()
InstallSalesRuleSampleData.php:47, Magento\SalesRuleSampleData\Setup\Patch\Data\InstallSalesRuleSampleData->apply()
PatchApplier.php:162, Magento\Framework\Setup\Patch\PatchApplier->applyDataPatch()
Installer.php:1094, Magento\Setup\Model\Installer->handleDBSchemaData()
Installer.php:960, Magento\Setup\Model\Installer->installDataFixtures()
Installer.php:389, call_user_func_array:{public_html/setup/src/Magento/Setup/Model/Installer.php:389}()
Installer.php:389, Magento\Setup\Model\Installer->install()
InstallCommand.php:231, Magento\Setup\Console\Command\InstallCommand->execute()
Command.php:255, Magento\Setup\Console\Command\InstallCommand->run()
Application.php:1009, Magento\Framework\Console\Cli->doRunCommand()
Application.php:273, Magento\Framework\Console\Cli->doRun()
Cli.php:115, Magento\Framework\Console\Cli->doRun()
Application.php:149, Magento\Framework\Console\Cli->run()
magento:23, {main}()

Проблему можно увидеть тут

vendor/magento/module-sales-rule/Model/ResourceModel/Rule.php [method: save]
  vendor/magento/module-staging/Model/Operation/Create.php [method: execute]
   vendor/magento/framework/EntityManager/Observer/BeforeEntitySave.php [method: execute]
    vendor/magento/module-rule/Model/AbstractModel.php [method: beforeSave]
     vendor/magento/module-rule/Model/AbstractModel.php [method: getConditions]

Проблема оказалась в фикстурах, проблемные данные можно отловить тут

  • vendor/magento/module-sales-rule-sample-data/Model/Rule.php [method: install]
  • vendor/magento/module-catalog-rule-sample-data/Model/Rule.php [method: install]

добавив пару проверок

....
$row['conditions_serialized'] = $this->catalogRule->convertSerializedData($row['conditions_serialized']);
$row['actions_serialized'] = $this->catalogRule->convertSerializedData($row['actions_serialized']);

if (!json_decode($row['conditions_serialized'])) {
    $debug = 1; // тут ставим точку останова
}

if (!json_decode($row['actions_serialized'])) {
    $debug = 1; // тут ставим точку останова
}
....

сами фикстуры с данными находятся тут

  • /vendor/magento/module-catalog-rule-sample-data/fixtures/catalog_rules.csv
  • vendor/magento/module-sales-rule-sample-data/fixtures/sales_rules.csv

внутри них есть какие-то переменные, которые должны меняться на значения, но этого не происходит, т.к. функция json_decode не может раскодировать значение полей conditions_serialized и actions_serialized.

Проблемные места в файлах можно найти по тексту "value":%url_key

Я руками подправил два этих файла, чтобы они начали работать, вот они

После этого проблема ушла, но появилась другая: SQLSTATE [42502]: Base table or view not found: 1146 Table design_config_grid_flat doesn't exist, query was: DELETE FROM design_config_grid_flat

In Mysql.php line 599:
  SQLSTATE [42S02]: Base table or view not found: 1146 Table `design_config_grid_flat` doesn't exist, query was: DELETE FROM `design_config_grid_flat`

In Mysql.php line 110:
  SQLSTATE [42S02]: Base table or view not found: 1146 Table `design_config_grid_flat` doesn't exist, query was: DELETE FROM `design_config_grid_flat`

In Mysql.php line 92:
  SQLSTATE [42S02]: Base table or view not found: 1146 Table `design_config_grid_flat` doesn't exist

Такую ошибку я встречал ранее, и обычно на существующих установках ее решают реиндексом. Но, у нас же она случилось посреди импорта данных, на шаге 1395 из 1846.

Я не стал разбираться и просто создал таблицу до запуска инсталла, предварительно удалив в базе все что было.

CREATE TABLE `design_config_grid_flat` (
  `entity_id` int(10) unsigned NOT NULL COMMENT 'Entity ID',
  `store_website_id` int(11) DEFAULT NULL COMMENT 'Store_website_id',
  `store_group_id` int(11) DEFAULT NULL COMMENT 'Store_group_id',
  `store_id` int(11) DEFAULT NULL COMMENT 'Store_id',
  `theme_theme_id` varchar(255) DEFAULT NULL COMMENT 'Theme_theme_id',
  PRIMARY KEY (`entity_id`),
  KEY `DESIGN_CONFIG_GRID_FLAT_STORE_WEBSITE_ID` (`store_website_id`),
  KEY `DESIGN_CONFIG_GRID_FLAT_STORE_GROUP_ID` (`store_group_id`),
  KEY `DESIGN_CONFIG_GRID_FLAT_STORE_ID` (`store_id`),
  FULLTEXT KEY `DESIGN_CONFIG_GRID_FLAT_THEME_THEME_ID` (`theme_theme_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='design_config_grid_flat';

После этого, установщик отработал до конца, но все равно с ошибками о SampleData

...
[Progress: 1846 / 1846]
[SUCCESS]: Magento installation complete.
[SUCCESS]: Magento Admin URI: /admin
Sample Data is installed with errors. See log file for details
Nothing to import.

Я заглянул в логи и увидел следующее

  • var/log/system.log
[2021-07-01 17:15:43] report.ERROR: Sample Data error: Notice: Undefined offset: 7 in vendor/magento/module-catalog-rule-sample-data/Model/Rule.php on line 105 [] []
[2021-07-01 17:16:16] report.ERROR: Sample Data error: Notice: Undefined offset: 15 in vendor/magento/module-sales-rule-sample-data/Model/Rule.php on line 90 [] []

по всей видимости, все же нужно еще разбираться с тем, что там в фикстурах.

Желания у меня не было, поэтому я решил, что пока и так сойдет, лишь бы запустилось.

И так сойдет

Фронтенд заработал

Magento 2.4 frontend

Я попробовал войти в админку и система попыталась скинуть мне данные для авторизации по 2FA, но тк sendmail не настроен ничего у нее не получилось

Magento 2.4 двухфакторная аутентификация

Mailsend мне пока не нужен, поэтому просто отключил модуль

php bin/magento module:disable Magento_TwoFactorAuth
php bin/magento setup:di:compile
php bin/magento cache:clean

После этого я смог попасть в админку

Magento 2.4 Админка

К сожалению за всеми этими манипуляциями время быстро пролетело и на игры внутри его не осталось, отложим на другой раз 🙂

Категории: Magento Бездна
Тэги: magento 2