#magento #magento2 #magento2.4
Вопрос:
Я хочу вставить некоторые данные при первой установке модуля.
Это моя структура папок
Navien/Custom -- Setup/InstallData.php -- Model/ -- StateData.php -- StateMaster.php -- ResourceModel/ -- StateMaster.php -- StateMaster/ -- Collection.php
Вот содержание моего сценария InstallData.php
use MagentoFrameworkSetupInstallDataInterface; use MagentoFrameworkSetupModuleContextInterface; use MagentoFrameworkSetupModuleDataSetupInterface; use MagentoEavSetupEavSetup; use MagentoEavSetupEavSetupFactory; use MagentoEavModelConfig; use NavienCustomModelStateData; class InstallData implements InstallDataInterface { private $eavSetupFactory; private $eavConfig; private $stateDataMaster; public function __construct(EavSetupFactory $eavSetupFactory, Config $eavConfig, StateData $stateData) { $this-gt;eavSetupFactory = $eavSetupFactory; $this-gt;eavConfig = $eavConfig; $this-gt;stateDataMaster = $stateData; } public function install( ModuleDataSetupInterface $setup, ModuleContextInterface $context ) { $data = [ ['code' =gt; 'AL', 'name' =gt; 'Alabama', 'abbreviation' =gt; 'Ala.', 'country' =gt; 'US'], ['code' =gt; 'AK', 'name' =gt; 'Alaska', 'abbreviation' =gt; 'Alaska', 'country' =gt; 'US'] ]; $this-gt;stateDataMaster-gt;insertStates($data); } }
Model/StateData.php
namespace NavienCustomModel; use NavienCustomModelResourceModelStateMaster; use PsrLogLoggerInterface; use MagentoFrameworkViewElementTemplateContext; // class StateData extends MagentoFrameworkViewElementTemplate class StateData { protected $_logger; protected $_stateMaster; protected $_objectManager; public function __construct( LoggerInterface $logger, StateMaster $stateMaster, Context $context, array $data = [] ) { // parent::__construct($context, $data); $this-gt;_objectManager = MagentoFrameworkAppObjectManager::getInstance(); $this-gt;_logger = $logger; } public function insertStates($states) { if( !empty( $states ) ) { $stateMasterRepository = $this-gt;_objectManager-gt;get('NavienCustomModelStateMaster'); $stateData = $stateMasterRepository-gt;getCollection()-gt;getData(); foreach( $states as $key =gt; $state ) { if( (array_search($state['code'], array_column($stateData, 'code')) === FALSE) ) { $stateMaster = $this-gt;_objectManager-gt;get('NavienCustomModelStateMaster'); $stateMaster-gt;setData( $state ); $stateMaster-gt;save(); } } } } public function execute() { } }
Model/StateMaster.php
namespace NavienCustomModel; use MagentoFrameworkModelAbstractModel; use PsrLogLoggerInterface; class StateMaster extends AbstractModel { protected $_logger; public function __construct( LoggerInterface $logger ) { $this-gt;_init('NavienCustomModelResourceModelStateMaster'); } }
Model/ResourceModel/StateMaster.php
namespace NavienCustomModelResourceModel; use PsrLogLoggerInterface; class StateMaster extends MagentoFrameworkModelResourceModelDbAbstractDb { protected function _construct() { $this-gt;_init('navien_states','ID'); } }
NavienCustomModelResourceModelStateMaster
namespace NavienCustomModelResourceModelStateMaster; class Collection extends MagentoFrameworkModelResourceModelDbCollectionAbstractCollection { public function __construct( MagentoFrameworkDataCollectionEntityFactory $entityFactory, PsrLogLoggerInterface $logger, MagentoFrameworkDataCollectionDbFetchStrategyInterface $fetchStrategy, MagentoFrameworkEventManagerInterface $eventManager, MagentoCatalogModelResourceModelProductOptionValueCollectionFactory $optionValueCollectionFactory, MagentoStoreModelStoreManagerInterface $storeManager, MagentoFrameworkDBAdapterAdapterInterface $connection = null, MagentoFrameworkModelResourceModelDbAbstractDb $resource = null ) { $this-gt;_optionValueCollectionFactory = $optionValueCollectionFactory; $this-gt;_storeManager = $storeManager; parent::__construct( $entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource ); $this-gt;logger = $logger; } protected function _construct() { $this-gt;_init('NavienCustomModelStateMaster','NavienCustomModelResourceModelStateMaster'); } }
Теперь я получаю эту ошибку
Error: Call to a member function dispatch() on null in /var/www/dev/vendor/magento/framework/Model/AbstractModel.php:701 Stack trace: #0 /var/www/dev/vendor/magento/framework/Model/ResourceModel/Db/AbstractDb.php(412): MagentoFrameworkModelAbstractModel-gt;beforeSave() #1 /var/www/dev/vendor/magento/framework/Model/AbstractModel.php(655): MagentoFrameworkModelResourceModelDbAbstractDb-gt;save() #2 /var/www/dev/app/code/Navien/Custom/Model/StateData.php(62): MagentoFrameworkModelAbstractModel-gt;save()
Ответ №1:
Это потому, что ваш конструктор не соответствует конструктору родительского блока.
Model/StateMaster.php
namespace NavienCustomModel; use MagentoFrameworkModelAbstractModel;
класс StateMaster расширяет абстрактную модель
{ public function __construct( MagentoFrameworkModelContext $context, MagentoFrameworkRegistry $registry, MagentoFrameworkModelResourceModelAbstractResource $resource = null, MagentoFrameworkDataCollectionAbstractDb $resourceCollection = null, array $data = [] ) { parent::__construct($context, $registry, $resource, $resourceCollection, $data); } protected function _construct() { $this-gt;_init(NavienCustomModelResourceModelStateMaster::class); } }