从自定义产品类型创建产品
Create a product from custom product type
在 magento 2 下,我创建了一个自定义产品类型。这部分正在工作
<?php
namespace Pack\TransportGratuit\Model\Product\Type;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\Product as Product;
use Magento\Catalog\Model\Product\Type\AbstractType as AbstractType;
/**
* Class TransportGratuit
* @package Pack\TransportGratuit\Model\Product\Type
*/
class TransportGratuit extends AbstractType
{
public function __construct(\Magento\Catalog\Model\Product\Option $catalogProductOption, \Magento\Eav\Model\Config $eavConfig, \Magento\Catalog\Model\Product\Type $catalogProductType, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageDb, \Magento\Framework\Filesystem $filesystem, \Magento\Framework\Registry $coreRegistry, \Psr\Log\LoggerInterface $logger, ProductRepositoryInterface $productRepository, \Magento\Framework\Serialize\Serializer\Json $serializer = null)
{
$this->setTypeId('transport-gratuit');
parent::__construct($catalogProductOption, $eavConfig, $catalogProductType, $eventManager, $fileStorageDb, $filesystem, $coreRegistry, $logger, $productRepository, $serializer);
}
/**
* @param Product $product
*/
public function deleteTypeSpecificData(Product $product)
{
// TODO: Implement deleteTypeSpecificData() method.
}
}
有了这个,我可以在后台创建一个这种类型的产品;但我想在安装模块时创建一个。
所以我做到了
<?php
namespace Pack\TransportGratuit\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Catalog\Model\Product;
class InstallData implements InstallDataInterface
{
/** @var \Magento\Framework\App\State **/
private $state;
public function __construct(\Magento\Framework\App\State $state) {
$this->state = $state;
$this->state->setAreaCode(\Magento\Framework\App\Area::AREA_FRONTEND);
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
// TODO: Implement install() method.
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); // instance of object manager
$product = $objectManager->create(Product::class);
$product->setSku('transport-gratuit');
$product->setTypeId('transport-gratuit');
$product->save();
}
}
问题是创建的产品没有 "TransportGratuit" 类型。
编辑:修复:我应该使用 'transport_gratuit'
如果您想添加新的产品类型,您必须执行两个步骤。
- 创建一个扩展自
Magento\Catalog\Model\Product\Type\AbstractType
的模型
- 创建一个
etc/product_types.xml
,您可以在其中定义新产品类型并引用模型
您似乎忘记了第二步,定义 etc/product_types.xml
并引用您创建的模型。
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
<type label="your-product-type-label" modelInstance="your-product-type-model" name="your-product-type-name" />
</config>
在 magento 2 下,我创建了一个自定义产品类型。这部分正在工作
<?php
namespace Pack\TransportGratuit\Model\Product\Type;
use Magento\Catalog\Api\ProductRepositoryInterface;
use Magento\Catalog\Model\Product as Product;
use Magento\Catalog\Model\Product\Type\AbstractType as AbstractType;
/**
* Class TransportGratuit
* @package Pack\TransportGratuit\Model\Product\Type
*/
class TransportGratuit extends AbstractType
{
public function __construct(\Magento\Catalog\Model\Product\Option $catalogProductOption, \Magento\Eav\Model\Config $eavConfig, \Magento\Catalog\Model\Product\Type $catalogProductType, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageDb, \Magento\Framework\Filesystem $filesystem, \Magento\Framework\Registry $coreRegistry, \Psr\Log\LoggerInterface $logger, ProductRepositoryInterface $productRepository, \Magento\Framework\Serialize\Serializer\Json $serializer = null)
{
$this->setTypeId('transport-gratuit');
parent::__construct($catalogProductOption, $eavConfig, $catalogProductType, $eventManager, $fileStorageDb, $filesystem, $coreRegistry, $logger, $productRepository, $serializer);
}
/**
* @param Product $product
*/
public function deleteTypeSpecificData(Product $product)
{
// TODO: Implement deleteTypeSpecificData() method.
}
}
有了这个,我可以在后台创建一个这种类型的产品;但我想在安装模块时创建一个。
所以我做到了
<?php
namespace Pack\TransportGratuit\Setup;
use Magento\Framework\Setup\InstallDataInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Catalog\Model\Product;
class InstallData implements InstallDataInterface
{
/** @var \Magento\Framework\App\State **/
private $state;
public function __construct(\Magento\Framework\App\State $state) {
$this->state = $state;
$this->state->setAreaCode(\Magento\Framework\App\Area::AREA_FRONTEND);
}
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
// TODO: Implement install() method.
$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); // instance of object manager
$product = $objectManager->create(Product::class);
$product->setSku('transport-gratuit');
$product->setTypeId('transport-gratuit');
$product->save();
}
}
问题是创建的产品没有 "TransportGratuit" 类型。
编辑:修复:我应该使用 'transport_gratuit'
如果您想添加新的产品类型,您必须执行两个步骤。
- 创建一个扩展自
Magento\Catalog\Model\Product\Type\AbstractType
的模型
- 创建一个
etc/product_types.xml
,您可以在其中定义新产品类型并引用模型
您似乎忘记了第二步,定义 etc/product_types.xml
并引用您创建的模型。
<?xml version="1.0" ?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Catalog:etc/product_types.xsd">
<type label="your-product-type-label" modelInstance="your-product-type-model" name="your-product-type-name" />
</config>